From 021bbfaeddaa781988c38a27fcb4e47f35f52931 Mon Sep 17 00:00:00 2001 From: jenniferjiangkells Date: Tue, 12 Aug 2025 19:30:06 +0100 Subject: [PATCH 1/4] Update cookbook docs --- cookbook/notereader_clinical_coding_fhir.py | 173 ++++++++++++ docs/assets/images/medplum_client.png | Bin 0 -> 116010 bytes docs/cookbook/cds_sandbox.md | 203 -------------- docs/cookbook/clinical_coding.md | 259 ++++++++++++++++++ docs/cookbook/discharge_summarizer.md | 226 +++++++++++++++ docs/cookbook/index.md | 4 +- docs/cookbook/notereader_sandbox.md | 75 ----- .../prebuilt_pipelines/summarization.md | 2 +- mkdocs.yml | 4 +- 9 files changed, 663 insertions(+), 283 deletions(-) create mode 100644 cookbook/notereader_clinical_coding_fhir.py create mode 100644 docs/assets/images/medplum_client.png delete mode 100644 docs/cookbook/cds_sandbox.md create mode 100644 docs/cookbook/clinical_coding.md create mode 100644 docs/cookbook/discharge_summarizer.md delete mode 100644 docs/cookbook/notereader_sandbox.md diff --git a/cookbook/notereader_clinical_coding_fhir.py b/cookbook/notereader_clinical_coding_fhir.py new file mode 100644 index 00000000..34570a6c --- /dev/null +++ b/cookbook/notereader_clinical_coding_fhir.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 +""" +HealthChain Clinical Documentation Improvement Service +===================================================== + +A complete CDI service that processes clinical notes and extracts billing codes. +Demonstrates FHIR-native pipelines, legacy system integration, and multi-source data handling. + +Requirements: +- pip install healthchain +- pip install scispacy +- pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.5.4/en_core_sci_sm-0.5.4.tar.gz +- pip install python-dotenv + +Run: +- python notereader_clinical_coding_fhir.py # Demo and start server +""" + +import os +import uvicorn +from datetime import datetime, timezone + +import healthchain as hc +from fhir.resources.documentreference import DocumentReference +from fhir.resources.meta import Meta +from spacy.tokens import Span +from dotenv import load_dotenv + +from healthchain.fhir import create_document_reference +from healthchain.gateway.api import HealthChainAPI +from healthchain.gateway.fhir import FHIRGateway +from healthchain.gateway.soap import NoteReaderService +from healthchain.io import CdaAdapter, Document +from healthchain.models import CdaRequest +from healthchain.pipeline.medicalcodingpipeline import MedicalCodingPipeline +from healthchain.sandbox.use_cases import ClinicalDocumentation + + +load_dotenv() + + +BILLING_URL = ( + f"fhir://api.medplum.com/fhir/R4/" + f"?client_id={os.environ.get('MEDPLUM_CLIENT_ID')}" + f"&client_secret={os.environ.get('MEDPLUM_CLIENT_SECRET')}" + f"&token_url={os.environ.get('MEDPLUM_TOKEN_URL', 'https://api.medplum.com/oauth2/token')}" + f"&scope={os.environ.get('MEDPLUM_SCOPE', 'openid')}" +) + + +def create_pipeline(): + """Build FHIR-native ML pipeline with automatic problem extraction.""" + pipeline = MedicalCodingPipeline.from_model_id("en_core_sci_sm", source="spacy") + + # Add custom entity linking + @pipeline.add_node(position="after", reference="SpacyNLP") + def link_entities(doc: Document) -> Document: + """Add CUI codes to medical entities for problem extraction""" + if not Span.has_extension("cui"): + Span.set_extension("cui", default=None) + + spacy_doc = doc.nlp.get_spacy_doc() + + # Simple dummy linker for demo purposes + dummy_linker = { + "pneumonia": "233604007", + "type 2 diabetes mellitus": "44054006", + "congestive heart failure": "42343007", + "chronic kidney disease": "431855005", + "hypertension": "38341003", + "community acquired pneumonia": "385093006", + "ventilator associated pneumonia": "233717007", + "anaphylaxis": "39579001", + "delirium": "2776000", + "depression": "35489007", + "asthma": "195967001", + "copd": "13645005", + } + + for ent in spacy_doc.ents: + if ent.text.lower() in dummy_linker: + ent._.cui = dummy_linker[ent.text.lower()] + + return doc + + return pipeline + + +def create_app(): + """Create production healthcare API.""" + pipeline = create_pipeline() + cda_adapter = CdaAdapter() + + # Modern FHIR sources + fhir_gateway = FHIRGateway() + fhir_gateway.add_source("billing", BILLING_URL) + + # Legacy CDA processing + note_service = NoteReaderService() + + @note_service.method("ProcessDocument") + def ai_coding_workflow(request: CdaRequest): + doc = cda_adapter.parse(request) + doc = pipeline(doc) + + for condition in doc.fhir.problem_list: + # Add basic provenance tracking + condition.meta = Meta( + source="urn:healthchain:pipeline:cdi", + lastUpdated=datetime.now(timezone.utc).isoformat(), + ) + fhir_gateway.create(condition, source="billing") + + cda_response = cda_adapter.format(doc) + + return cda_response + + # Register services + app = HealthChainAPI(title="Epic CDI Service with FHIR integration") + app.register_gateway(fhir_gateway, path="/fhir") + app.register_service(note_service, path="/notereader") + + return app + + +def create_sandbox(): + @hc.sandbox(base_url="http://localhost:8000/") + class NotereaderSandbox(ClinicalDocumentation): + """Sandbox for testing clinical documentation workflows""" + + def __init__(self): + super().__init__() + self.data_path = "./resources/uclh_cda.xml" + + @hc.ehr(workflow="sign-note-inpatient") + def load_clinical_document(self) -> DocumentReference: + """Load a sample CDA document for processing""" + with open(self.data_path, "r") as file: + xml_content = file.read() + + return create_document_reference( + data=xml_content, + content_type="text/xml", + description="Sample CDA document from sandbox", + ) + + return NotereaderSandbox() + + +# Create the app +app = create_app() + + +if __name__ == "__main__": + import threading + from time import sleep + + # Start server + def run_server(): + uvicorn.run(app, port=8000, log_level="warning") + + server_thread = threading.Thread(target=run_server, daemon=True) + server_thread.start() + sleep(2) # Wait for startup + + # Test sandbox + sandbox = create_sandbox() + sandbox.start_sandbox() + + try: + server_thread.join() + except KeyboardInterrupt: + pass diff --git a/docs/assets/images/medplum_client.png b/docs/assets/images/medplum_client.png new file mode 100644 index 0000000000000000000000000000000000000000..db9aa32c806166ae33c95e07fdcd907646ec2b70 GIT binary patch literal 116010 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 xe-FBC`V5;s!=}%$=`;M}CjIk+?CoOjtu)Pt CDSResponse: - result = self.pipeline.process_request(request) - return result -``` - -## Add a data generator - -Now that we have our service function defined, we'll need to generate some test data for the sandbox to send to our service. We can use the `CdsDataGenerator` to generate synthetic FHIR data for testing. - -By default, the generator generates a random single patient with structured FHIR resources. To pass in free-text discharge notes for our `SummarizationPipeline`, we can set the `free_text_path` and `column_name` parameters. - -```python -from healthchain.data_generators import CdsDataGenerator - -data_generator = CdsDataGenerator() -data = data_generator.generate( - free_text_path="data/discharge_notes.csv", column_name="text" -) -print(data.model_dump()) -# { -# "prefetch": { -# "entry": [ -# { -# "resource": { -# "resourceType": "Bundle", -# ... -# } -# } -# ] -# } -``` - -The data generator returns a `Prefetch` object, which ensures that the data is parsed correctly inside the sandbox. - -## Define client workflow - -To finish our sandbox, we'll define a client function that loads the data generator into the sandbox. We'll use the `@hc.ehr` decorator and pass in the CDS hook workflow that we want to use - in this case, `encounter-discharge`. This will automatically send the generated test data to our service method when a request is made, using the workflow format that we specified. - -```python -import healthchain as hc - -from healthchain.sandbox.use_cases import ClinicalDecisionSupport -from healthchain.models import CDSRequest, CDSResponse, Prefetch - -@hc.sandbox -class DischargeNoteSummarizer(ClinicalDecisionSupport): - def __init__(self): - self.pipeline = pipeline - self.data_generator = data_generator - - @hc.api - def my_service(self, request: CDSRequest) -> CDSResponse: - result = self.pipeline.process_request(request) - return result - - @hc.ehr(workflow="encounter-discharge") - def load_data_in_client(self) -> Prefetch: - data = self.data_generator.generate_prefetch() - return data -``` - -## Run the sandbox - -Start the sandbox by running the `start_sandbox()` method on your class instance. - -```python -summarizer = DischargeNoteSummarizer() -summarizer.start_sandbox() -``` - -Then run the sandbox using the HealthChain CLI: - -```bash -healthchain run discharge_summarizer.py -``` - -The sandbox will: - -- Start a FastAPI server with your service method mounted to CDS endpoints at `http://localhost:8000/` -- Generate synthetic data and send it to your service method -- Save the processed request and response to the `output/requests` and `output/responses` folders of your current working directory - -An example response containing CDS cards might look like this: - -```json -{ - "cards": [ - { - "summary": "Action Item 1", - "indicator": "info", - "source": { - "label": "Card Generated by HealthChain" - }, - "detail": "- Transport arranged for 11:00 HRs, requires bariatric ambulance and 2 crew members (confirmed)." - }, - { - "summary": "Action Item 2", - "indicator": "info", - "source": { - "label": "Card Generated by HealthChain" - }, - "detail": "- Medication reconciliation completed, discharge medications prepared (Apixaban 5mg, Baclofen 20mg MR, new anticoagulation card) for collection by daughter" - } - ] -} -``` diff --git a/docs/cookbook/clinical_coding.md b/docs/cookbook/clinical_coding.md new file mode 100644 index 00000000..5cb2a7c8 --- /dev/null +++ b/docs/cookbook/clinical_coding.md @@ -0,0 +1,259 @@ +# Build a NoteReader Service with FHIR Integration + +This tutorial shows you how to build a NoteReader clinical coding service that connects legacy CDA systems with modern FHIR servers. We'll process clinical notes, extract billing codes, and handle both old and new healthcare data formats. We'll use [Epic NoteReader](https://www.leidos.com/products/epic-note-reader) as the legacy system and [Medplum](https://www.medplum.com/) as the FHIR server. + +Check out the full working example [here](https://github.com/dotimplement/HealthChain/tree/main/cookbook/notereader_clinical_coding_fhir.py)! + +## Setup + +We'll use [scispacy](https://allenai.github.io/scispacy/) for medical entity extraction in this example. Make sure to install the required dependencies: + +```bash +pip install healthchain +pip install scispacy python-dotenv +pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.5.4/en_core_sci_sm-0.5.4.tar.gz +``` + +If you'd like to test the FHIR integration with Medplum, make sure you have the following environment variables set. To setup Medplum, register an account on [Medplum](https://www.medplum.com/docs/tutorials/register) and obtain your [Client Credentials](https://www.medplum.com/docs/auth/methods/client-credentials). + +![Medplum Client Application](../assets/images/medplum_client.png) + +```bash +# .env file +MEDPLUM_CLIENT_ID=your_client_id +MEDPLUM_CLIENT_SECRET=your_client_secret +``` + +## Initialize the pipeline + +First, we'll create a [medical coding pipeline](../reference/pipeline/pipeline.md) with a custom entity linking node for extracting conditions from clinical text. + +The example below just uses a dummy mapping of medical concepts to [SNOMED CT](https://www.snomed.org/), but you can do more fancy stuff with it if you want. + +```python +from healthchain.pipeline.medicalcodingpipeline import MedicalCodingPipeline +from healthchain.io import Document +from spacy.tokens import Span + +def create_pipeline(): + """Build FHIR-native ML pipeline with automatic problem extraction.""" + pipeline = MedicalCodingPipeline.from_model_id("en_core_sci_sm", source="spacy") + + # Add custom entity linking + @pipeline.add_node(position="after", reference="SpacyNLP") + def link_entities(doc: Document) -> Document: + """Add CUI codes to medical entities for problem extraction""" + if not Span.has_extension("cui"): + Span.set_extension("cui", default=None) + + spacy_doc = doc.nlp.get_spacy_doc() + + # Dummy medical concept mapping to SNOMED CT codes + medical_concepts = { + "pneumonia": "233604007", + "type 2 diabetes mellitus": "44054006", + "congestive heart failure": "42343007", + "chronic kidney disease": "431855005", + "hypertension": "38341003", + # Add more mappings as needed + } + + for ent in spacy_doc.ents: + if ent.text.lower() in medical_concepts: + ent._.cui = medical_concepts[ent.text.lower()] + + return doc + + return pipeline +``` + +The `MedicalCodingPipeline` automatically: + +- Extracts medical entities using the `scispacy` model +- Converts entities to FHIR [Condition](https://www.hl7.org/fhir/condition.html) resources +- Populates the document's `problem_list` for downstream processing + +## Add the CDA Adapter + +The [CdaAdapter](../reference/pipeline/adapters/cdaadapter.md) converts CDA documents to HealthChain's [Document](../reference/pipeline/data_container.md) format using an instance of the [InteropEngine](../reference/interop/engine.md). This lets you work with legacy clinical documents without having to leave FHIR. + +```python +from healthchain.io import CdaAdapter +from healthchain.engine import create_interop + +# Create an interop engine with default configuration +interop_engine = create_interop() +cda_adapter = CdaAdapter(engine=interop_engine) + +# Parse the CDA document to a Document object +doc = cda_adapter.parse(request) + +# Access the FHIR resources in the Document object +doc.fhir.problem_list + +# Format the Document object back to a CDA document +response = cda_adapter.format(doc) +``` + +What it does: + +- Parses CDA XML documents +- Extracts clinical text and coded data from the CDA document +- Stores the CDA XML as a [DocumentReference](https://www.hl7.org/fhir/documentreference.html) object in the `fhir` attribute of the `Document` object +- Stores the extracted problems from the CDA document in the `problem_list` attribute of the `Document` object + +## Set up FHIR Gateway + +[FHIR gateways](../reference/gateway/fhir_gateway.md) connect to external FHIR servers. You can add multiple FHIR sources to the gateway via connection strings with the `add_source` method. The gateway will handle authentication and connections for you. + +```python +import os +from healthchain.gateway.fhir import FHIRGateway +from dotenv import load_dotenv + +load_dotenv() + +# Configure FHIR connection with OAuth2 authentication +BILLING_URL = ( + f"fhir://api.medplum.com/fhir/R4/" + f"?client_id={os.environ.get('MEDPLUM_CLIENT_ID')}" + f"&client_secret={os.environ.get('MEDPLUM_CLIENT_SECRET')}" + f"&token_url=https://api.medplum.com/oauth2/token" + f"&scope=openid" +) + +# Initialize FHIR gateway and register external systems +fhir_gateway = FHIRGateway() +fhir_gateway.add_source("billing", BILLING_URL) + +# You can add multiple FHIR sources: +# fhir_gateway.add_source("ehr", "fhir://epic.example.com/fhir/R4/") +# fhir_gateway.add_source("registry", "fhir://registry.example.com/fhir/R4/") +``` + +## Set up the NoteReader Service + +Now let's set up the [NoteReader Service](../reference/gateway/soap_cda.md). This is an Epic specific module that allows third party services to interact with Epic's CDI service via CDA. It's somewhat niche but it be like that sometimes. + +The good thing about NoteReader is that it's already integrated in existing EHR workflows. The bad thing is it's legacy stuff and relatively rigid. + +We can make it more exciting by routing the extracted conditions to a FHIR server using the FHIR gateway inside the NoteReader service method, so you can do other cool stuff to it. + +```python +from healthchain.gateway.soap import NoteReaderService + +# Create the NoteReader service +note_service = NoteReaderService() + +@note_service.method("ProcessDocument") +def ai_coding_workflow(request: CdaRequest): + # Parse CDA document from legacy system + doc = cda_adapter.parse(request) + + # Process through ML pipeline to extract medical entities + doc = pipeline(doc) + + # Access the extracted FHIR resources + for condition in doc.fhir.problem_list: + # Add metadata for audit and provenance tracking + condition.meta = Meta( + source="urn:healthchain:pipeline:cdi", + lastUpdated=datetime.now(timezone.utc).isoformat(), + ) + # Send to external FHIR server via gateway + fhir_gateway.create(condition, source="billing") + + # Return processed CDA response to the legacy system + cda_response = cda_adapter.format(doc) + + return cda_response +``` + +## Build the service + +Time to put it all together! Using [HealthChainAPI](../reference/gateway/api.md), we can create a service with both FHIR and NoteReader endpoints. + +```python +from healthchain.gateway.api import HealthChainAPI + +# Register services with the API gateway +app = HealthChainAPI(title="Healthcare Integration Gateway") + +app.register_gateway(fhir_gateway, path="/fhir") +app.register_service(note_service, path="/notereader") +``` + +## Test with sample documents + +You can test the service with sample clinical documents using the [sandbox utility](../reference/utilities/sandbox.md) so you don't have to go out there and source a real EHR for our neat little demo. Woohoo. + +```python +import healthchain as hc +from healthchain.sandbox.use_cases import ClinicalDocumentation +from healthchain.fhir import create_document_reference +from fhir.resources.documentreference import DocumentReference + +def create_sandbox(): + @hc.sandbox(base_url="http://localhost:8000/") + class NotereaderSandbox(ClinicalDocumentation): + """Sandbox for testing clinical documentation workflows""" + def __init__(self): + super().__init__() + self.data_path = "./resources/uclh_cda.xml" + + @hc.ehr(workflow="sign-note-inpatient") + def load_clinical_document(self) -> DocumentReference: + """Load a sample CDA document for processing""" + with open(self.data_path, "r") as file: + xml_content = file.read() + + return create_document_reference( + data=xml_content, + content_type="text/xml", + description="Sample CDA document from sandbox", + ) + + return NotereaderSandbox() +``` + +## Run the complete example + +Run `HealthChainAPI` with `uvicorn` and start the sandbox to test the service. + +```python +import uvicorn + +uvicorn.run(app) + +sandbox = create_sandbox() +sandbox.start_sandbox() +``` + +## What happens when you run this + +Here's the workflow: + +=== "1. Server Startup" + - **URL:** `http://localhost:8000/` + - **Endpoints:** + - FHIR API: `/fhir/*` + - SOAP API: `/notereader` + - Documentation: `/docs` + +=== "2. Sandbox" + - Loads a sample CDA document from the `resources/` directory. + - Sends a SOAP request to the notereader service at `http://localhost:8000/notereader/ProcessDocument`. + - Receives the processed CDA document in response. + - Saves both the original and processed CDA documents to the `output/` directory. + +=== "3. Pipeline" + - Converts the CDA document to FHIR resources. + - Processes the text data from the CDA document using the pipeline. + - Creates FHIR `Condition` resources from extracted conditions. + - Converts the new FHIR resources back into an updated CDA document. + +=== "4. Output" + - Stores the `Condition` resources in the Medplum FHIR server. + - Returns the processed CDA document to the sandbox/EHR workflow. + +That's it! You can now test the service with sample documents and see the FHIR resources being created in Medplum. 🎉 diff --git a/docs/cookbook/discharge_summarizer.md b/docs/cookbook/discharge_summarizer.md new file mode 100644 index 00000000..e6125f52 --- /dev/null +++ b/docs/cookbook/discharge_summarizer.md @@ -0,0 +1,226 @@ +# Build a CDS Hooks Service for Discharge Summarization + +This tutorial shows you how to build a CDS service that integrates with EHR systems. We'll automatically summarize discharge notes and return actionable recommendations using the [CDS Hooks standard](https://cds-hooks.org/). + +Check out the full working example [here](https://github.com/dotimplement/HealthChain/tree/main/cookbook/cds_discharge_summarizer_hf_chat.py)! + +## Setup + +Make sure you have a [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens) and set it as the `HUGGINGFACEHUB_API_TOKEN` environment variable. + +```python +import getpass +import os + +if not os.getenv("HUGGINGFACEHUB_API_TOKEN"): + os.environ["HUGGINGFACEHUB_API_TOKEN"] = getpass.getpass( + "Enter your token: " + ) +``` + +If you are using a chat model, make sure you have the necessary `langchain` packages installed. + +```bash +pip install langchain langchain-huggingface +``` + +## Initialize the pipeline + +First, we'll create a [summarization pipeline](../reference/pipeline/pipeline.md) with domain-specific prompting for discharge workflows. You can choose between: + +- **Transformer models** fine-tuned for clinical summarization (like `google/pegasus-xsum`) +- **Large Language Models** with custom clinical prompting (like `zephyr-7b-beta`) + +For LLM approaches, we'll use [LangChain](https://python.langchain.com/docs/integrations/chat/huggingface/) for better prompting. + +=== "Non-chat model" + ```python + from healthchain.pipeline import SummarizationPipeline + + pipeline = SummarizationPipeline.from_model_id( + "google/pegasus-xsum", source="huggingface", task="summarization" + ) + ``` + + +=== "Chat model" + ```python + from healthchain.pipeline import SummarizationPipeline + + from langchain_huggingface.llms import HuggingFaceEndpoint + from langchain_huggingface import ChatHuggingFace + from langchain_core.prompts import PromptTemplate + from langchain_core.output_parsers import StrOutputParser + + hf = HuggingFaceEndpoint( + repo_id="HuggingFaceH4/zephyr-7b-beta", + task="text-generation", + max_new_tokens=512, + do_sample=False, + repetition_penalty=1.03, + ) + + model = ChatHuggingFace(llm=hf) + + template = """ + You are a discharge planning assistant for hospital operations. + Provide a concise, objective summary focusing on actionable items + for care coordination, including appointments, medications, and + follow-up instructions. Format as bullet points.\n'''{text}''' + """ + prompt = PromptTemplate.from_template(template) + + chain = prompt | model | StrOutputParser() + + pipeline = SummarizationPipeline.load(chain, source="langchain") + ``` + +The `SummarizationPipeline` automatically: + +- Parses FHIR resources from CDS Hooks requests +- Extracts clinical text from discharge documents +- Formats outputs as CDS cards according to the CDS Hooks specification + +## Add the CDS FHIR Adapter + +The [CdsFhirAdapter](../reference/pipeline/adapters/cdsfhiradapter.md) converts between CDS Hooks requests and HealthChain's [Document](../reference/pipeline/data_container.md) format. This makes it easy to work with FHIR data in CDS workflows. + +```python +from healthchain.io import CdsFhirAdapter + +cds_adapter = CdsFhirAdapter() + +# Parse the CDS request to a Document object +cds_adapter.parse(request) + +# Format the Document object back to a CDS response +cds_adapter.format(doc) +``` + +What it does: + +- Parses FHIR resources from CDS requests +- Extracts text from [DocumentReference](https://www.hl7.org/fhir/documentreference.html) resources +- Formats responses as CDS cards + +## Set up the CDS service + +Now let's create the CDS service. [HealthChainAPI](../reference/gateway/api.md) gives you discovery endpoints, validation, and docs automatically. + +```python +from healthchain.gateway import HealthChainAPI, CDSHooksService +from healthchain.models import CDSRequest, CDSResponse +from healthchain.io import CdsFhirAdapter + +def create_pipeline(): + """Build the discharge summarization pipeline""" + # Configure your pipeline (using previous examples) + return pipeline + +def create_app(): + """Create the CDS Hooks application""" + pipeline = create_pipeline() + adapter = CdsFhirAdapter() + + # Initialize the CDS service + cds_service = CDSHooksService() + + # Define the CDS service function + @cds_service.hook("encounter-discharge", id="discharge-summary") + def handle_discharge_summary(request: CDSRequest) -> CDSResponse: + """Process discharge summaries with AI""" + # Parse CDS request to internal Document format + doc = adapter.parse(request) + + # Process through AI pipeline + processed_doc = pipeline(doc) + + # Format response with CDS cards + response = adapter.format(processed_doc) + return response + + # Register the service with the API gateway + app = HealthChainAPI(title="Discharge Summary CDS Service") + app.register_service(cds_service) + + return app +``` + + +## Test with sample clinical data + +Let's test the service with some sample discharge notes using the [sandbox utility](../reference/utilities/sandbox.md) and the [CdsDataGenerator](../reference/utilities/data_generator.md): + +```python +from healthchain.data_generators import CdsDataGenerator + +data_generator = CdsDataGenerator() +data = data_generator.generate( + free_text_path="data/discharge_notes.csv", column_name="text" +) +print(data.model_dump()) +# { +# "prefetch": { +# "entry": [ +# { +# "resource": { +# "resourceType": "Bundle", +# ... +# } +# } +# ] +# } +``` + +The data generator returns a `Prefetch` object, which ensures that the data is parsed correctly by the CDS service. + +## Run the complete example + +Run the service with `uvicorn`: + +```python +import uvicorn + +app = create_app() + +uvicorn.run(app) +``` + +## What happens when you run this + +## Workflow Overview + +=== "1. Service Startup" + - **URL:** [http://localhost:8000/](http://localhost:8000/) + - **Service discovery:** `/cds-services` + - **CDS endpoint:** `/cds-services/discharge-summary` + - **API docs:** `/docs` + +=== "2. Request Processing" + - Receives CDS Hooks requests from EHR systems + - Summarizes discharge notes using AI + - Returns CDS cards with clinical recommendations + +=== "3. Example CDS Response" + ```json + { + "cards": [ + { + "summary": "Discharge Transportation", + "indicator": "info", + "source": { + "label": "HealthChain Discharge Assistant" + }, + "detail": "• Transport arranged for 11:00 HRs\n• Requires bariatric ambulance and 2 crew members\n• Confirmation number: TR-2024-001" + }, + { + "summary": "Medication Management", + "indicator": "warning", + "source": { + "label": "HealthChain Discharge Assistant" + }, + "detail": "• Discharge medications: Apixaban 5mg, Baclofen 20mg MR\n• New anticoagulation card prepared\n• Collection by daughter scheduled" + } + ] + } + ``` diff --git a/docs/cookbook/index.md b/docs/cookbook/index.md index 94811ffb..ed71d616 100644 --- a/docs/cookbook/index.md +++ b/docs/cookbook/index.md @@ -2,5 +2,5 @@ The best way to learn is by example! Here are some to get you started: -- [Build a CDS sandbox](./cds_sandbox.md): Build a clinical decision support (CDS) system that uses *encounter-discharge* to summarize discharge notes. -- [Build a Clinical Documentation sandbox](./notereader_sandbox.md): Build a NoteReader system which extracts problem, medication, and allergy concepts from free-text clinical notes. +- [Summarize Discharge Notes with CDS Hooks](./discharge_summarizer.md): Implement a CDS Hooks service that listens for `encounter-discharge` events, automatically generates concise summaries of discharge notes, and delivers clinical recommendations directly into EHR workflows. +- [Automate Clinical Coding and FHIR Integration](./clinical_coding.md): Build a system that extracts medical conditions from clinical documentation, maps them to SNOMED CT codes, and synchronizes structured Condition resources with external FHIR servers (Medplum) for billing and analytics. diff --git a/docs/cookbook/notereader_sandbox.md b/docs/cookbook/notereader_sandbox.md deleted file mode 100644 index 1e6cdcc8..00000000 --- a/docs/cookbook/notereader_sandbox.md +++ /dev/null @@ -1,75 +0,0 @@ -# NoteReader Sandbox - -A sandbox example of NoteReader clinical documentation improvement which extracts problems, medications, and allergies entries from the progress note section of a pre-configured CDA document using [scispacy](https://github.com/allenai/scispacy) with a custom entity linker component. - -Full example coming soon! - -```python -import healthchain as hc - -from healthchain.io import Document -from healthchain.models.requests import CdaRequest -from healthchain.models.responses import CdaResponse -from healthchain.pipeline import MedicalCodingPipeline -from healthchain.sandbox.use_cases import ClinicalDocumentation -from healthchain.fhir import create_document_reference - -from spacy.tokens import Span - -from fhir.resources.documentreference import DocumentReference - -pipeline = MedicalCodingPipeline.from_model_id("en_core_sci_sm", source="spacy") - -@pipeline.add_node(position="after", reference="SpacyNLP") -def link_entities(doc: Document) -> Document: - # Register the extension if it doesn't exist already - if not Span.has_extension("cui"): - Span.set_extension("cui", default=None) - spacy_doc = doc.nlp.get_spacy_doc() - - dummy_linker = {"fever": "C0006477", - "cough": "C0006477", - "cold": "C0006477", - "flu": "C0006477", - "headache": "C0006477", - "sore throat": "C0006477", - } - - for ent in spacy_doc.ents: - if ent.text in dummy_linker: - ent._.cui = dummy_linker[ent.text] - - doc.update_problem_list_from_nlp() - - return doc - - -@hc.sandbox -class NotereaderSandbox(ClinicalDocumentation): - def __init__(self): - self.pipeline = pipeline - - @hc.ehr(workflow="sign-note-inpatient") - def load_data_in_client(self) -> DocumentReference: - with open("./resources/uclh_cda.xml", "r") as file: - xml_string = file.read() - - cda_document_reference = create_document_reference( - data=xml_string, - content_type="text/xml", - description="Original CDA Document loaded from my sandbox", - ) - - return cda_document_reference - - @hc.api - def my_service(self, request: CdaRequest) -> CdaResponse: - result = self.pipeline.process_request(request) - - return result - - -if __name__ == "__main__": - clindoc = NotereaderSandbox() - clindoc.start_sandbox() -``` diff --git a/docs/reference/pipeline/prebuilt_pipelines/summarization.md b/docs/reference/pipeline/prebuilt_pipelines/summarization.md index 0182cc91..ebba8ec3 100644 --- a/docs/reference/pipeline/prebuilt_pipelines/summarization.md +++ b/docs/reference/pipeline/prebuilt_pipelines/summarization.md @@ -1,3 +1,3 @@ # SummarizationPipeline -Full documentation coming soon! Check out this [cookbook example](../../../cookbook/cds_sandbox.md) for now. +Full documentation coming soon! Check out this [cookbook example](../../../cookbook/discharge_summarizer.md) for now. diff --git a/mkdocs.yml b/mkdocs.yml index 90c13394..2002192e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -14,8 +14,8 @@ nav: - Licence: distribution.md - Cookbook: - cookbook/index.md - - CDS Sandbox: cookbook/cds_sandbox.md - - NoteReader Sandbox: cookbook/notereader_sandbox.md + - Discharge Summarizer: cookbook/discharge_summarizer.md + - Clinical Coding: cookbook/clinical_coding.md - Docs: - Welcome: reference/index.md - Gateway: From 32c54c47b9b38cf1a6991f52680964706f0e3999 Mon Sep 17 00:00:00 2001 From: jenniferjiangkells Date: Wed, 13 Aug 2025 18:27:25 +0100 Subject: [PATCH 2/4] Update cookbooks --- README.md | 2 +- cookbook/cds_discharge_summarizer_hf_chat.py | 70 ++++++++++++++------ cookbook/cds_discharge_summarizer_hf_trf.py | 49 +++++++++++--- cookbook/notereader_clinical_coding_fhir.py | 5 +- docs/cookbook/clinical_coding.md | 31 ++++++--- docs/cookbook/discharge_summarizer.md | 2 +- 6 files changed, 113 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 0cc76743..f4b8bfd8 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ First time here? Check out our [Docs](https://dotimplement.github.io/HealthChain ## Why use HealthChain? - **EHR integrations are manual and time-consuming** - **HealthChainAPI** abstracts away complexities so you can focus on AI development, not learning FHIR APIs, CDS Hooks, and authentication schemes. - **Healthcare data is fragmented and complex** - **InteropEngine** handles the conversion between FHIR, CDA, and HL7v2 so you don't have to become an expert in healthcare data standards. -- [**Most healthcare data is unstructured**](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6372467/) - HealthChain **Pipelines** are optimized for real-time AI and NLP applications that deal with realistic healthcare data. +- [**Most healthcare data is unstructured**](https://pmc.ncbi.nlm.nih.gov/articles/PMC10566734/) - HealthChain **Pipelines** are optimized for real-time AI and NLP applications that deal with realistic healthcare data. - **Built by health tech developers, for health tech developers** - HealthChain is tech stack agnostic, modular, and easily extensible with built-in compliance and audit features. ## HealthChainAPI diff --git a/cookbook/cds_discharge_summarizer_hf_chat.py b/cookbook/cds_discharge_summarizer_hf_chat.py index 259a1341..72df60d3 100644 --- a/cookbook/cds_discharge_summarizer_hf_chat.py +++ b/cookbook/cds_discharge_summarizer_hf_chat.py @@ -1,13 +1,12 @@ import healthchain as hc - +from healthchain.gateway import HealthChainAPI, CDSHooksService from healthchain.pipeline import SummarizationPipeline -from healthchain.models import CDSRequest, CDSResponse, Prefetch -from healthchain.data_generators import CdsDataGenerator from healthchain.sandbox.use_cases import ClinicalDecisionSupport +from healthchain.models import Prefetch, CDSRequest, CDSResponse +from healthchain.data_generators import CdsDataGenerator from langchain_huggingface.llms import HuggingFaceEndpoint from langchain_huggingface import ChatHuggingFace - from langchain_core.prompts import PromptTemplate from langchain_core.output_parsers import StrOutputParser @@ -21,47 +20,76 @@ def create_summarization_chain(): hf = HuggingFaceEndpoint( - repo_id="HuggingFaceH4/zephyr-7b-beta", + repo_id="deepseek-ai/DeepSeek-R1-0528", task="text-generation", max_new_tokens=512, do_sample=False, repetition_penalty=1.03, ) + model = ChatHuggingFace(llm=hf) + template = """ - You are a bed planner for a hospital. Provide a concise, objective summary of the input text in short bullet points separated by new lines, - focusing on key actions such as appointments and medication dispense instructions, without using second or third person pronouns.\n'''{text}''' + You are a discharge planning assistant for hospital operations. + Provide a concise, objective summary focusing on actionable items + for care coordination, including appointments, medications, and + follow-up instructions. Format as bullet points with no preamble.\n'''{text}''' """ prompt = PromptTemplate.from_template(template) + return prompt | model | StrOutputParser() -@hc.sandbox +# Create the healthcare application +app = HealthChainAPI( + title="Discharge Note Summarizer", + description="AI-powered discharge note summarization service", +) + +chain = create_summarization_chain() +pipeline = SummarizationPipeline.load( + chain, source="langchain", template_path="templates/cds_card_template.json" +) + +# Create CDS Hooks service +cds = CDSHooksService() + + +@cds.hook("encounter-discharge", id="discharge-summarizer") +def discharge_summarizer(request: CDSRequest) -> CDSResponse: + result = pipeline.process_request(request) + return result + + +# Register the CDS service +app.register_service(cds, path="/cds") + + +@hc.sandbox(api="http://localhost:8000") class DischargeNoteSummarizer(ClinicalDecisionSupport): def __init__(self): - # Initialize pipeline and data generator - chain = create_summarization_chain() - self.pipeline = SummarizationPipeline.load( - chain, source="langchain", template_path="templates/cds_card_template.json" - ) + super().__init__(path="/cds/cds-services/discharge-summarizer") self.data_generator = CdsDataGenerator() @hc.ehr(workflow="encounter-discharge") def load_data_in_client(self) -> Prefetch: - # Generate synthetic FHIR data for testing data = self.data_generator.generate_prefetch( free_text_path="data/discharge_notes.csv", column_name="text" ) return data - @hc.api - def my_service(self, request: CDSRequest) -> CDSResponse: - # Process the request through our pipeline - result = self.pipeline.process_request(request) - return result - if __name__ == "__main__": - # Start the sandbox server + import uvicorn + import threading + + # Start the API server in a separate thread + def start_api(): + uvicorn.run(app, port=8000) + + api_thread = threading.Thread(target=start_api, daemon=True) + api_thread.start() + + # Start the sandbox summarizer = DischargeNoteSummarizer() summarizer.start_sandbox() diff --git a/cookbook/cds_discharge_summarizer_hf_trf.py b/cookbook/cds_discharge_summarizer_hf_trf.py index 36ee119f..e65e9916 100644 --- a/cookbook/cds_discharge_summarizer_hf_trf.py +++ b/cookbook/cds_discharge_summarizer_hf_trf.py @@ -1,5 +1,5 @@ import healthchain as hc - +from healthchain.gateway import HealthChainAPI, CDSHooksService from healthchain.pipeline import SummarizationPipeline from healthchain.sandbox.use_cases import ClinicalDecisionSupport from healthchain.models import Prefetch, CDSRequest, CDSResponse @@ -13,12 +13,35 @@ os.environ["HUGGINGFACEHUB_API_TOKEN"] = getpass.getpass("Enter your token: ") -@hc.sandbox +# Create the healthcare application +app = HealthChainAPI( + title="Discharge Note Summarizer", + description="AI-powered discharge note summarization service", +) + +# Initialize pipeline +pipeline = SummarizationPipeline.from_model_id( + "google/pegasus-xsum", source="huggingface", task="summarization" +) + +# Create CDS Hooks service +cds = CDSHooksService() + + +@cds.hook("encounter-discharge", id="discharge-summarizer") +def discharge_summarizer(request: CDSRequest) -> CDSResponse: + result = pipeline.process_request(request) + return result + + +# Register the CDS service +app.register_service(cds, path="/cds") + + +@hc.sandbox(api="http://localhost:8000") class DischargeNoteSummarizer(ClinicalDecisionSupport): def __init__(self): - self.pipeline = SummarizationPipeline.from_model_id( - "google/pegasus-xsum", source="huggingface", task="summarization" - ) + super().__init__(path="/cds/cds-services/discharge-summarizer") self.data_generator = CdsDataGenerator() @hc.ehr(workflow="encounter-discharge") @@ -28,12 +51,18 @@ def load_data_in_client(self) -> Prefetch: ) return data - @hc.api - def my_service(self, request: CDSRequest) -> CDSResponse: - result = self.pipeline.process_request(request) - return result - if __name__ == "__main__": + import uvicorn + import threading + + # Start the API server in a separate thread + def start_api(): + uvicorn.run(app, port=8000) + + api_thread = threading.Thread(target=start_api, daemon=True) + api_thread.start() + + # Start the sandbox summarizer = DischargeNoteSummarizer() summarizer.start_sandbox() diff --git a/cookbook/notereader_clinical_coding_fhir.py b/cookbook/notereader_clinical_coding_fhir.py index 34570a6c..45af7f0a 100644 --- a/cookbook/notereader_clinical_coding_fhir.py +++ b/cookbook/notereader_clinical_coding_fhir.py @@ -1,8 +1,5 @@ #!/usr/bin/env python3 """ -HealthChain Clinical Documentation Improvement Service -===================================================== - A complete CDI service that processes clinical notes and extracts billing codes. Demonstrates FHIR-native pipelines, legacy system integration, and multi-source data handling. @@ -124,7 +121,7 @@ def ai_coding_workflow(request: CdaRequest): def create_sandbox(): - @hc.sandbox(base_url="http://localhost:8000/") + @hc.sandbox(api="http://localhost:8000/") class NotereaderSandbox(ClinicalDocumentation): """Sandbox for testing clinical documentation workflows""" diff --git a/docs/cookbook/clinical_coding.md b/docs/cookbook/clinical_coding.md index 5cb2a7c8..36537a91 100644 --- a/docs/cookbook/clinical_coding.md +++ b/docs/cookbook/clinical_coding.md @@ -1,6 +1,6 @@ # Build a NoteReader Service with FHIR Integration -This tutorial shows you how to build a NoteReader clinical coding service that connects legacy CDA systems with modern FHIR servers. We'll process clinical notes, extract billing codes, and handle both old and new healthcare data formats. We'll use [Epic NoteReader](https://www.leidos.com/products/epic-note-reader) as the legacy system and [Medplum](https://www.medplum.com/) as the FHIR server. +This tutorial shows you how to build a clinical coding service that connects legacy [CDA](https://hl7.org/cda/) systems with modern [FHIR servers](https://build.fhir.org/http.html). We'll process clinical notes, extract billing codes, and handle both old and new healthcare data formats. We'll use [Epic NoteReader](https://discovery.hgdata.com/product/epic-notereader-cdi) as the legacy system and [Medplum](https://www.medplum.com/) as the FHIR server. Check out the full working example [here](https://github.com/dotimplement/HealthChain/tree/main/cookbook/notereader_clinical_coding_fhir.py)! @@ -9,8 +9,7 @@ Check out the full working example [here](https://github.com/dotimplement/Health We'll use [scispacy](https://allenai.github.io/scispacy/) for medical entity extraction in this example. Make sure to install the required dependencies: ```bash -pip install healthchain -pip install scispacy python-dotenv +pip install healthchain scispacy python-dotenv pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.5.4/en_core_sci_sm-0.5.4.tar.gz ``` @@ -28,7 +27,7 @@ MEDPLUM_CLIENT_SECRET=your_client_secret First, we'll create a [medical coding pipeline](../reference/pipeline/pipeline.md) with a custom entity linking node for extracting conditions from clinical text. -The example below just uses a dummy mapping of medical concepts to [SNOMED CT](https://www.snomed.org/), but you can do more fancy stuff with it if you want. +The example below just uses a dictionary lookup of medical concepts to a [SNOMED CT](https://www.snomed.org/) code for demo purposes, but you can obviously do more fancy stuff with it if you want. ```python from healthchain.pipeline.medicalcodingpipeline import MedicalCodingPipeline @@ -71,7 +70,20 @@ The `MedicalCodingPipeline` automatically: - Extracts medical entities using the `scispacy` model - Converts entities to FHIR [Condition](https://www.hl7.org/fhir/condition.html) resources -- Populates the document's `problem_list` for downstream processing +- Populates the Document's `fhir.problem_list` for downstream processing + +It is equivalent to building a pipeline with the following components: + +```python +from healthchain.pipeline import Pipeline +from healthchain.pipeline.components import SpacyNLP, FHIRProblemListExtractor +from healthchain.io.containers import Document + +pipeline = Pipeline[Document]() + +pipeline.add_node(SpacyNLP.from_model_id("en_core_sci_sm")) +pipeline.add_node(FHIRProblemListExtractor()) +``` ## Add the CDA Adapter @@ -99,8 +111,9 @@ What it does: - Parses CDA XML documents - Extracts clinical text and coded data from the CDA document -- Stores the CDA XML as a [DocumentReference](https://www.hl7.org/fhir/documentreference.html) object in the `fhir` attribute of the `Document` object -- Stores the extracted problems from the CDA document in the `problem_list` attribute of the `Document` object +- Stores the text data in `doc.text` +- Stores the CDA XML as a [DocumentReference](https://www.hl7.org/fhir/documentreference.html) resource in `doc.fhir.bundle` +- Stores the extracted [Condition](https://www.hl7.org/fhir/condition.html) resources from the CDA document in `doc.fhir.problem_list` ## Set up FHIR Gateway @@ -137,7 +150,7 @@ Now let's set up the [NoteReader Service](../reference/gateway/soap_cda.md). Thi The good thing about NoteReader is that it's already integrated in existing EHR workflows. The bad thing is it's legacy stuff and relatively rigid. -We can make it more exciting by routing the extracted conditions to a FHIR server using the FHIR gateway inside the NoteReader service method, so you can do other cool stuff to it. +We can make it more exciting by routing the extracted conditions to a FHIR server inside the NoteReader service method, so you can do other cool modern stuff to it. ```python from healthchain.gateway.soap import NoteReaderService @@ -194,7 +207,7 @@ from healthchain.fhir import create_document_reference from fhir.resources.documentreference import DocumentReference def create_sandbox(): - @hc.sandbox(base_url="http://localhost:8000/") + @hc.sandbox(api="http://localhost:8000/") class NotereaderSandbox(ClinicalDocumentation): """Sandbox for testing clinical documentation workflows""" def __init__(self): diff --git a/docs/cookbook/discharge_summarizer.md b/docs/cookbook/discharge_summarizer.md index e6125f52..22ab33b6 100644 --- a/docs/cookbook/discharge_summarizer.md +++ b/docs/cookbook/discharge_summarizer.md @@ -53,7 +53,7 @@ For LLM approaches, we'll use [LangChain](https://python.langchain.com/docs/inte from langchain_core.output_parsers import StrOutputParser hf = HuggingFaceEndpoint( - repo_id="HuggingFaceH4/zephyr-7b-beta", + repo_id="deepseek-ai/DeepSeek-R1-0528", task="text-generation", max_new_tokens=512, do_sample=False, From 797abffc64852429e8c85ba2907fca6d73e66fb1 Mon Sep 17 00:00:00 2001 From: jenniferjiangkells Date: Wed, 13 Aug 2025 18:27:49 +0100 Subject: [PATCH 3/4] Minor docstring and error message fix --- healthchain/pipeline/medicalcodingpipeline.py | 28 +++++-------------- healthchain/pipeline/summarizationpipeline.py | 7 +++-- healthchain/sandbox/clients/ehr.py | 9 ++++-- healthchain/sandbox/environment.py | 1 + 4 files changed, 20 insertions(+), 25 deletions(-) diff --git a/healthchain/pipeline/medicalcodingpipeline.py b/healthchain/pipeline/medicalcodingpipeline.py index 0ea3758f..fc1aac5f 100644 --- a/healthchain/pipeline/medicalcodingpipeline.py +++ b/healthchain/pipeline/medicalcodingpipeline.py @@ -1,41 +1,27 @@ from healthchain.pipeline.base import BasePipeline, ModelConfig from healthchain.pipeline.mixins import ModelRoutingMixin -from healthchain.pipeline.components.fhirproblemextractor import ( - FHIRProblemListExtractor, -) +from healthchain.pipeline.components import FHIRProblemListExtractor class MedicalCodingPipeline(BasePipeline, ModelRoutingMixin): """ Pipeline for extracting and coding medical concepts from clinical documents using NLP models. + Only extracts conditions to problems list for now. Stages: 1. NER+L: Extracts and links medical concepts from document text. 2. Problem Extraction (last): Converts medical entities to FHIR problem list. + Attributes: + extract_problems: Whether to automatically extract FHIR problem list (default: True) + patient_ref: Patient reference for created conditions (default: "Patient/123") + code_attribute: Name of the spaCy extension attribute containing medical codes (default: "cui") + Usage Examples: - # Basic usage - extracts CUI codes to SNOMED conditions >>> pipeline = MedicalCodingPipeline.from_model_id("en_core_sci_sm", source="spacy") - # Custom patient reference - >>> pipeline = MedicalCodingPipeline.from_model_id( - ... "en_core_sci_sm", source="spacy", patient_ref="Patient/demo-123" - ... ) - - # Different code attribute (e.g., for models that output SNOMED IDs) - >>> pipeline = MedicalCodingPipeline.from_model_id( - ... "en_core_sci_sm", source="spacy", code_attribute="snomed_id" - ... ) - - # Skip automatic problem extraction - >>> pipeline = MedicalCodingPipeline.from_model_id( - ... "en_core_sci_sm", source="spacy", extract_problems=False - ... ) - - # With Hugging Face >>> pipeline = MedicalCodingPipeline.from_model_id("bert-base-uncased", task="ner") - # With LangChain >>> chain = ChatPromptTemplate.from_template("Extract medical codes: {text}") | ChatOpenAI() >>> pipeline = MedicalCodingPipeline.load(chain) """ diff --git a/healthchain/pipeline/summarizationpipeline.py b/healthchain/pipeline/summarizationpipeline.py index 4aa3a7ea..f04b857f 100644 --- a/healthchain/pipeline/summarizationpipeline.py +++ b/healthchain/pipeline/summarizationpipeline.py @@ -12,11 +12,14 @@ class SummarizationPipeline(BasePipeline, ModelRoutingMixin): 1. Summarization: Generates summaries from document text. 2. Card Creation: Formats summaries into CDS Hooks cards. + Attributes: + output_template: Template for the output summary (default: "{text}") + output_template_path: Path to the output template file (default: None) + delimiter: Delimiter for the output summary (default: "\n") + Usage Examples: - # With Hugging Face >>> pipeline = SummarizationPipeline.from_model_id("facebook/bart-large-cnn", source="huggingface") - # With LangChain >>> chain = ChatPromptTemplate.from_template("Summarize: {text}") | ChatOpenAI() >>> pipeline = SummarizationPipeline.load(chain) """ diff --git a/healthchain/sandbox/clients/ehr.py b/healthchain/sandbox/clients/ehr.py index 30c2cfe9..4cadaf71 100644 --- a/healthchain/sandbox/clients/ehr.py +++ b/healthchain/sandbox/clients/ehr.py @@ -68,7 +68,7 @@ async def send_request(self, url: str) -> List[Dict]: Notes: This method logs errors rather than raising them, to avoid interrupting the batch processing of requests. """ - async with httpx.AsyncClient() as client: + async with httpx.AsyncClient(follow_redirects=True) as client: responses: List[Dict] = [] timeout = httpx.Timeout(self.timeout, read=None) for request in self.request_data: @@ -86,6 +86,7 @@ async def send_request(self, url: str) -> List[Dict]: responses.append(response_model.model_dump_xml()) else: # TODO: use model_dump_json() once Pydantic V2 timezone serialization issue is resolved + log.debug(f"Making POST request to: {url}") response = await client.post( url=url, json=request.model_dump(exclude_none=True), @@ -100,8 +101,12 @@ async def send_request(self, url: str) -> List[Dict]: # Fallback to raw response if parsing fails responses.append(response_data) except httpx.HTTPStatusError as exc: + try: + error_content = exc.response.json() + except Exception: + error_content = exc.response.text log.error( - f"Error response {exc.response.status_code} while requesting {exc.request.url!r}: {exc.response.json()}" + f"Error response {exc.response.status_code} while requesting {exc.request.url!r}: {error_content}" ) responses.append({}) except httpx.TimeoutException as exc: diff --git a/healthchain/sandbox/environment.py b/healthchain/sandbox/environment.py index 2a852eb3..09af3d5e 100644 --- a/healthchain/sandbox/environment.py +++ b/healthchain/sandbox/environment.py @@ -83,6 +83,7 @@ def start_sandbox( log.info( f"Sending {len(self._client.request_data)} requests generated by {self._client.__class__.__name__} to {endpoint}" ) + log.debug(f"API: {self.api}, Path: {self.path}, Endpoint: {endpoint}") try: self.responses = asyncio.run(self._client.send_request(url=endpoint)) From 905937d66c9ac81a9085669bedd9e0871c3b3392 Mon Sep 17 00:00:00 2001 From: jenniferjiangkells Date: Wed, 13 Aug 2025 18:28:02 +0100 Subject: [PATCH 4/4] poetry.lock --- poetry.lock | 805 ++++++++++++++++++++++++++-------------------------- 1 file changed, 403 insertions(+), 402 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3047e90a..031c5edd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "anyio" -version = "4.9.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" +version = "4.10.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" files = [ - {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, - {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, + {file = "anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1"}, + {file = "anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6"}, ] [package.dependencies] @@ -29,8 +29,6 @@ sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -145,13 +143,13 @@ files = [ [[package]] name = "certifi" -version = "2025.7.14" +version = "2025.8.3" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" files = [ - {file = "certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2"}, - {file = "certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995"}, + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, ] [[package]] @@ -246,103 +244,90 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.3" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" files = [ - {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"}, + {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, + {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, ] [[package]] @@ -515,37 +500,37 @@ files = [ [[package]] name = "debugpy" -version = "1.8.15" +version = "1.8.16" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.15-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e9a8125c85172e3ec30985012e7a81ea5e70bbb836637f8a4104f454f9b06c97"}, - {file = "debugpy-1.8.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd0b6b5eccaa745c214fd240ea82f46049d99ef74b185a3517dad3ea1ec55d9"}, - {file = "debugpy-1.8.15-cp310-cp310-win32.whl", hash = "sha256:8181cce4d344010f6bfe94a531c351a46a96b0f7987750932b2908e7a1e14a55"}, - {file = "debugpy-1.8.15-cp310-cp310-win_amd64.whl", hash = "sha256:af2dcae4e4cd6e8b35f982ccab29fe65f7e8766e10720a717bc80c464584ee21"}, - {file = "debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3"}, - {file = "debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53"}, - {file = "debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702"}, - {file = "debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b"}, - {file = "debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba"}, - {file = "debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc"}, - {file = "debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327"}, - {file = "debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa"}, - {file = "debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf"}, - {file = "debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6"}, - {file = "debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709"}, - {file = "debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683"}, - {file = "debugpy-1.8.15-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:054cd4935bd2e4964dfe1aeee4d6bca89d0c833366776fc35387f8a2f517dd00"}, - {file = "debugpy-1.8.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21c4288e662997df3176c4b9d93ee1393913fbaf320732be332d538000c53208"}, - {file = "debugpy-1.8.15-cp38-cp38-win32.whl", hash = "sha256:aaa8ce6a37d764f93fe583d7c6ca58eb7550b36941387483db113125f122bb0d"}, - {file = "debugpy-1.8.15-cp38-cp38-win_amd64.whl", hash = "sha256:71cdf7f676af78e70f005c7fad2ef9da0edc2a24befbf3ab146a51f0d58048c2"}, - {file = "debugpy-1.8.15-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:085b6d0adb3eb457c2823ac497a0690b10a99eff8b01c01a041e84579f114b56"}, - {file = "debugpy-1.8.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd546a405381d17527814852642df0a74b7da8acc20ae5f3cfad0b7c86419511"}, - {file = "debugpy-1.8.15-cp39-cp39-win32.whl", hash = "sha256:ae0d445fe11ff4351428e6c2389e904e1cdcb4a47785da5a5ec4af6c5b95fce5"}, - {file = "debugpy-1.8.15-cp39-cp39-win_amd64.whl", hash = "sha256:de7db80189ca97ab4b10a87e4039cfe4dd7ddfccc8f33b5ae40fcd33792fc67a"}, - {file = "debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d"}, - {file = "debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00"}, + {file = "debugpy-1.8.16-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2a3958fb9c2f40ed8ea48a0d34895b461de57a1f9862e7478716c35d76f56c65"}, + {file = "debugpy-1.8.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5ca7314042e8a614cc2574cd71f6ccd7e13a9708ce3c6d8436959eae56f2378"}, + {file = "debugpy-1.8.16-cp310-cp310-win32.whl", hash = "sha256:8624a6111dc312ed8c363347a0b59c5acc6210d897e41a7c069de3c53235c9a6"}, + {file = "debugpy-1.8.16-cp310-cp310-win_amd64.whl", hash = "sha256:fee6db83ea5c978baf042440cfe29695e1a5d48a30147abf4c3be87513609817"}, + {file = "debugpy-1.8.16-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67371b28b79a6a12bcc027d94a06158f2fde223e35b5c4e0783b6f9d3b39274a"}, + {file = "debugpy-1.8.16-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2abae6dd02523bec2dee16bd6b0781cccb53fd4995e5c71cc659b5f45581898"}, + {file = "debugpy-1.8.16-cp311-cp311-win32.whl", hash = "sha256:f8340a3ac2ed4f5da59e064aa92e39edd52729a88fbde7bbaa54e08249a04493"}, + {file = "debugpy-1.8.16-cp311-cp311-win_amd64.whl", hash = "sha256:70f5fcd6d4d0c150a878d2aa37391c52de788c3dc680b97bdb5e529cb80df87a"}, + {file = "debugpy-1.8.16-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:b202e2843e32e80b3b584bcebfe0e65e0392920dc70df11b2bfe1afcb7a085e4"}, + {file = "debugpy-1.8.16-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64473c4a306ba11a99fe0bb14622ba4fbd943eb004847d9b69b107bde45aa9ea"}, + {file = "debugpy-1.8.16-cp312-cp312-win32.whl", hash = "sha256:833a61ed446426e38b0dd8be3e9d45ae285d424f5bf6cd5b2b559c8f12305508"}, + {file = "debugpy-1.8.16-cp312-cp312-win_amd64.whl", hash = "sha256:75f204684581e9ef3dc2f67687c3c8c183fde2d6675ab131d94084baf8084121"}, + {file = "debugpy-1.8.16-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:85df3adb1de5258dca910ae0bb185e48c98801ec15018a263a92bb06be1c8787"}, + {file = "debugpy-1.8.16-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee89e948bc236a5c43c4214ac62d28b29388453f5fd328d739035e205365f0b"}, + {file = "debugpy-1.8.16-cp313-cp313-win32.whl", hash = "sha256:cf358066650439847ec5ff3dae1da98b5461ea5da0173d93d5e10f477c94609a"}, + {file = "debugpy-1.8.16-cp313-cp313-win_amd64.whl", hash = "sha256:b5aea1083f6f50023e8509399d7dc6535a351cc9f2e8827d1e093175e4d9fa4c"}, + {file = "debugpy-1.8.16-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:2801329c38f77c47976d341d18040a9ac09d0c71bf2c8b484ad27c74f83dc36f"}, + {file = "debugpy-1.8.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687c7ab47948697c03b8f81424aa6dc3f923e6ebab1294732df1ca9773cc67bc"}, + {file = "debugpy-1.8.16-cp38-cp38-win32.whl", hash = "sha256:a2ba6fc5d7c4bc84bcae6c5f8edf5988146e55ae654b1bb36fecee9e5e77e9e2"}, + {file = "debugpy-1.8.16-cp38-cp38-win_amd64.whl", hash = "sha256:d58c48d8dbbbf48a3a3a638714a2d16de537b0dace1e3432b8e92c57d43707f8"}, + {file = "debugpy-1.8.16-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:135ccd2b1161bade72a7a099c9208811c137a150839e970aeaf121c2467debe8"}, + {file = "debugpy-1.8.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:211238306331a9089e253fd997213bc4a4c65f949271057d6695953254095376"}, + {file = "debugpy-1.8.16-cp39-cp39-win32.whl", hash = "sha256:88eb9ffdfb59bf63835d146c183d6dba1f722b3ae2a5f4b9fc03e925b3358922"}, + {file = "debugpy-1.8.16-cp39-cp39-win_amd64.whl", hash = "sha256:c2c47c2e52b40449552843b913786499efcc3dbc21d6c49287d939cd0dbc49fd"}, + {file = "debugpy-1.8.16-py2.py3-none-any.whl", hash = "sha256:19c9521962475b87da6f673514f7fd610328757ec993bf7ec0d8c96f9a325f9e"}, + {file = "debugpy-1.8.16.tar.gz", hash = "sha256:31e69a1feb1cf6b51efbed3f6c9b0ef03bc46ff050679c4be7ea6d2e23540870"}, ] [[package]] @@ -739,13 +724,13 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "griffe" -version = "1.9.0" +version = "1.11.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" files = [ - {file = "griffe-1.9.0-py3-none-any.whl", hash = "sha256:bcf90ee3ad42bbae70a2a490c782fc8e443de9b84aa089d857c278a4e23215fc"}, - {file = "griffe-1.9.0.tar.gz", hash = "sha256:b5531cf45e9b73f0842c2121cc4d4bcbb98a55475e191fc9830e7aef87a920a0"}, + {file = "griffe-1.11.1-py3-none-any.whl", hash = "sha256:5799cf7c513e4b928cfc6107ee6c4bc4a92e001f07022d97fd8dee2f612b6064"}, + {file = "griffe-1.11.1.tar.gz", hash = "sha256:d54ffad1ec4da9658901eb5521e9cddcdb7a496604f67d8ae71077f03f549b7e"}, ] [package.dependencies] @@ -810,13 +795,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.12" +version = "2.6.13" description = "File identification library for Python" optional = false python-versions = ">=3.9" files = [ - {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"}, - {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"}, + {file = "identify-2.6.13-py2.py3-none-any.whl", hash = "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b"}, + {file = "identify-2.6.13.tar.gz", hash = "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32"}, ] [package.extras] @@ -894,13 +879,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.30.0" +version = "6.30.1" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.9" files = [ - {file = "ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e"}, - {file = "ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c"}, + {file = "ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4"}, + {file = "ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b"}, ] [package.dependencies] @@ -2420,90 +2405,103 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "27.0.0" +version = "27.0.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" files = [ - {file = "pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413"}, - {file = "pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b"}, - {file = "pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c"}, - {file = "pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198"}, - {file = "pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e"}, - {file = "pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff"}, - {file = "pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed"}, - {file = "pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38"}, - {file = "pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be"}, - {file = "pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4"}, - {file = "pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371"}, - {file = "pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e"}, - {file = "pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef"}, - {file = "pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad"}, - {file = "pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f"}, - {file = "pyzmq-27.0.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:f4162dbbd9c5c84fb930a36f290b08c93e35fce020d768a16fc8891a2f72bab8"}, - {file = "pyzmq-27.0.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4e7d0a8d460fba526cc047333bdcbf172a159b8bd6be8c3eb63a416ff9ba1477"}, - {file = "pyzmq-27.0.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:29f44e3c26b9783816ba9ce274110435d8f5b19bbd82f7a6c7612bb1452a3597"}, - {file = "pyzmq-27.0.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e435540fa1da54667f0026cf1e8407fe6d8a11f1010b7f06b0b17214ebfcf5e"}, - {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51f5726de3532b8222e569990c8aa34664faa97038304644679a51d906e60c6e"}, - {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:42c7555123679637c99205b1aa9e8f7d90fe29d4c243c719e347d4852545216c"}, - {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a979b7cf9e33d86c4949df527a3018767e5f53bc3b02adf14d4d8db1db63ccc0"}, - {file = "pyzmq-27.0.0-cp38-cp38-win32.whl", hash = "sha256:26b72c5ae20bf59061c3570db835edb81d1e0706ff141747055591c4b41193f8"}, - {file = "pyzmq-27.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:55a0155b148fe0428285a30922f7213539aa84329a5ad828bca4bbbc665c70a4"}, - {file = "pyzmq-27.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:100f6e5052ba42b2533011d34a018a5ace34f8cac67cb03cfa37c8bdae0ca617"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bf6c6b061efd00404b9750e2cfbd9507492c8d4b3721ded76cb03786131be2ed"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee05728c0b0b2484a9fc20466fa776fffb65d95f7317a3419985b8c908563861"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7cdf07fe0a557b131366f80727ec8ccc4b70d89f1e3f920d94a594d598d754f0"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90252fa2ff3a104219db1f5ced7032a7b5fc82d7c8d2fec2b9a3e6fd4e25576b"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ea6d441c513bf18c578c73c323acf7b4184507fc244762193aa3a871333c9045"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ae2b34bcfaae20c064948a4113bf8709eee89fd08317eb293ae4ebd69b4d9740"}, - {file = "pyzmq-27.0.0-cp39-cp39-win32.whl", hash = "sha256:5b10bd6f008937705cf6e7bf8b6ece5ca055991e3eb130bca8023e20b86aa9a3"}, - {file = "pyzmq-27.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:00387d12a8af4b24883895f7e6b9495dc20a66027b696536edac35cb988c38f3"}, - {file = "pyzmq-27.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:4c19d39c04c29a6619adfeb19e3735c421b3bfee082f320662f52e59c47202ba"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c86ea8fe85e2eb0ffa00b53192c401477d5252f6dd1db2e2ed21c1c30d17e5e"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c45fee3968834cd291a13da5fac128b696c9592a9493a0f7ce0b47fa03cc574d"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cae73bb6898c4e045fbed5024cb587e4110fddb66f6163bcab5f81f9d4b9c496"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26d542258c7a1f35a9cff3d887687d3235006134b0ac1c62a6fe1ad3ac10440e"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:04cd50ef3b28e35ced65740fb9956a5b3f77a6ff32fcd887e3210433f437dd0f"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39ddd3ba0a641f01d8f13a3cfd4c4924eb58e660d8afe87e9061d6e8ca6f7ac3"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8ca7e6a0388dd9e1180b14728051068f4efe83e0d2de058b5ff92c63f399a73f"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2524c40891be6a3106885a3935d58452dd83eb7a5742a33cc780a1ad4c49dec0"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a56e3e5bd2d62a01744fd2f1ce21d760c7c65f030e9522738d75932a14ab62a"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:096af9e133fec3a72108ddefba1e42985cb3639e9de52cfd336b6fc23aa083e9"}, - {file = "pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf"}, + {file = "pyzmq-27.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:90a4da42aa322de8a3522461e3b5fe999935763b27f69a02fced40f4e3cf9682"}, + {file = "pyzmq-27.0.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e648dca28178fc879c814cf285048dd22fd1f03e1104101106505ec0eea50a4d"}, + {file = "pyzmq-27.0.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bca8abc31799a6f3652d13f47e0b0e1cab76f9125f2283d085a3754f669b607"}, + {file = "pyzmq-27.0.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:092f4011b26d6b0201002f439bd74b38f23f3aefcb358621bdc3b230afc9b2d5"}, + {file = "pyzmq-27.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f02f30a4a6b3efe665ab13a3dd47109d80326c8fd286311d1ba9f397dc5f247"}, + {file = "pyzmq-27.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f293a1419266e3bf3557d1f8778f9e1ffe7e6b2c8df5c9dca191caf60831eb74"}, + {file = "pyzmq-27.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ce181dd1a7c6c012d0efa8ab603c34b5ee9d86e570c03415bbb1b8772eeb381c"}, + {file = "pyzmq-27.0.1-cp310-cp310-win32.whl", hash = "sha256:f65741cc06630652e82aa68ddef4986a3ab9073dd46d59f94ce5f005fa72037c"}, + {file = "pyzmq-27.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:44909aa3ed2234d69fe81e1dade7be336bcfeab106e16bdaa3318dcde4262b93"}, + {file = "pyzmq-27.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:4401649bfa0a38f0f8777f8faba7cd7eb7b5b8ae2abc7542b830dd09ad4aed0d"}, + {file = "pyzmq-27.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9729190bd770314f5fbba42476abf6abe79a746eeda11d1d68fd56dd70e5c296"}, + {file = "pyzmq-27.0.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:696900ef6bc20bef6a242973943574f96c3f97d2183c1bd3da5eea4f559631b1"}, + {file = "pyzmq-27.0.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f96a63aecec22d3f7fdea3c6c98df9e42973f5856bb6812c3d8d78c262fee808"}, + {file = "pyzmq-27.0.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c512824360ea7490390566ce00bee880e19b526b312b25cc0bc30a0fe95cb67f"}, + {file = "pyzmq-27.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfb2bb5e0f7198eaacfb6796fb0330afd28f36d985a770745fba554a5903595a"}, + {file = "pyzmq-27.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4f6886c59ba93ffde09b957d3e857e7950c8fe818bd5494d9b4287bc6d5bc7f1"}, + {file = "pyzmq-27.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b99ea9d330e86ce1ff7f2456b33f1bf81c43862a5590faf4ef4ed3a63504bdab"}, + {file = "pyzmq-27.0.1-cp311-cp311-win32.whl", hash = "sha256:571f762aed89025ba8cdcbe355fea56889715ec06d0264fd8b6a3f3fa38154ed"}, + {file = "pyzmq-27.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee16906c8025fa464bea1e48128c048d02359fb40bebe5333103228528506530"}, + {file = "pyzmq-27.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:ba068f28028849da725ff9185c24f832ccf9207a40f9b28ac46ab7c04994bd41"}, + {file = "pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd"}, + {file = "pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd"}, + {file = "pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a"}, + {file = "pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577"}, + {file = "pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e"}, + {file = "pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb"}, + {file = "pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55"}, + {file = "pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb"}, + {file = "pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686"}, + {file = "pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed"}, + {file = "pyzmq-27.0.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:497bd8af534ae55dc4ef67eebd1c149ff2a0b0f1e146db73c8b5a53d83c1a5f5"}, + {file = "pyzmq-27.0.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:a066ea6ad6218b4c233906adf0ae67830f451ed238419c0db609310dd781fbe7"}, + {file = "pyzmq-27.0.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:72d235d6365ca73d8ce92f7425065d70f5c1e19baa458eb3f0d570e425b73a96"}, + {file = "pyzmq-27.0.1-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:313a7b374e3dc64848644ca348a51004b41726f768b02e17e689f1322366a4d9"}, + {file = "pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:119ce8590409702394f959c159d048002cbed2f3c0645ec9d6a88087fc70f0f1"}, + {file = "pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45c3e00ce16896ace2cd770ab9057a7cf97d4613ea5f2a13f815141d8b6894b9"}, + {file = "pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:678e50ec112bdc6df5a83ac259a55a4ba97a8b314c325ab26b3b5b071151bc61"}, + {file = "pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d0b96c30be9f9387b18b18b6133c75a7b1b0065da64e150fe1feb5ebf31ece1c"}, + {file = "pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88dc92d9eb5ea4968123e74db146d770b0c8d48f0e2bfb1dbc6c50a8edb12d64"}, + {file = "pyzmq-27.0.1-cp313-cp313t-win32.whl", hash = "sha256:6dcbcb34f5c9b0cefdfc71ff745459241b7d3cda5b27c7ad69d45afc0821d1e1"}, + {file = "pyzmq-27.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9fd0fda730461f510cfd9a40fafa5355d65f5e3dbdd8d6dfa342b5b3f5d1949"}, + {file = "pyzmq-27.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:56a3b1853f3954ec1f0e91085f1350cc57d18f11205e4ab6e83e4b7c414120e0"}, + {file = "pyzmq-27.0.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f98f6b7787bd2beb1f0dde03f23a0621a0c978edf673b7d8f5e7bc039cbe1b60"}, + {file = "pyzmq-27.0.1-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:351bf5d8ca0788ca85327fda45843b6927593ff4c807faee368cc5aaf9f809c2"}, + {file = "pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5268a5a9177afff53dc6d70dffe63114ba2a6e7b20d9411cc3adeba09eeda403"}, + {file = "pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4aca06ba295aa78bec9b33ec028d1ca08744c36294338c41432b7171060c808"}, + {file = "pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1c363c6dc66352331d5ad64bb838765c6692766334a6a02fdb05e76bd408ae18"}, + {file = "pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:87aebf4acd7249bdff8d3df03aed4f09e67078e6762cfe0aecf8d0748ff94cde"}, + {file = "pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e4f22d67756518d71901edf73b38dc0eb4765cce22c8fe122cc81748d425262b"}, + {file = "pyzmq-27.0.1-cp314-cp314t-win32.whl", hash = "sha256:8c62297bc7aea2147b472ca5ca2b4389377ad82898c87cabab2a94aedd75e337"}, + {file = "pyzmq-27.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:bee5248d5ec9223545f8cc4f368c2d571477ae828c99409125c3911511d98245"}, + {file = "pyzmq-27.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0fc24bf45e4a454e55ef99d7f5c8b8712539200ce98533af25a5bfa954b6b390"}, + {file = "pyzmq-27.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:9d16fdfd7d70a6b0ca45d36eb19f7702fa77ef6256652f17594fc9ce534c9da6"}, + {file = "pyzmq-27.0.1-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d0356a21e58c3e99248930ff73cc05b1d302ff50f41a8a47371aefb04327378a"}, + {file = "pyzmq-27.0.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a27fa11ebaccc099cac4309c799aa33919671a7660e29b3e465b7893bc64ec81"}, + {file = "pyzmq-27.0.1-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b25e72e115399a4441aad322258fa8267b873850dc7c276e3f874042728c2b45"}, + {file = "pyzmq-27.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f8c3b74f1cd577a5a9253eae7ed363f88cbb345a990ca3027e9038301d47c7f4"}, + {file = "pyzmq-27.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:19dce6c93656f9c469540350d29b128cd8ba55b80b332b431b9a1e9ff74cfd01"}, + {file = "pyzmq-27.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:da81512b83032ed6cdf85ca62e020b4c23dda87f1b6c26b932131222ccfdbd27"}, + {file = "pyzmq-27.0.1-cp38-cp38-win32.whl", hash = "sha256:7418fb5736d0d39b3ecc6bec4ff549777988feb260f5381636d8bd321b653038"}, + {file = "pyzmq-27.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:af2ee67b3688b067e20fea3fe36b823a362609a1966e7e7a21883ae6da248804"}, + {file = "pyzmq-27.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:05a94233fdde585eb70924a6e4929202a747eea6ed308a6171c4f1c715bbe39e"}, + {file = "pyzmq-27.0.1-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c96702e1082eab62ae583d64c4e19c9b848359196697e536a0c57ae9bd165bd5"}, + {file = "pyzmq-27.0.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c9180d1f5b4b73e28b64e63cc6c4c097690f102aa14935a62d5dd7426a4e5b5a"}, + {file = "pyzmq-27.0.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e971d8680003d0af6020713e52f92109b46fedb463916e988814e04c8133578a"}, + {file = "pyzmq-27.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe632fa4501154d58dfbe1764a0495734d55f84eaf1feda4549a1f1ca76659e9"}, + {file = "pyzmq-27.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4c3874344fd5fa6d58bb51919708048ac4cab21099f40a227173cddb76b4c20b"}, + {file = "pyzmq-27.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ec09073ed67ae236785d543df3b322282acc0bdf6d1b748c3e81f3043b21cb5"}, + {file = "pyzmq-27.0.1-cp39-cp39-win32.whl", hash = "sha256:f44e7ea288d022d4bf93b9e79dafcb4a7aea45a3cbeae2116792904931cefccf"}, + {file = "pyzmq-27.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ffe6b809a97ac6dea524b3b837d5b28743d8c2f121141056d168ff0ba8f614ef"}, + {file = "pyzmq-27.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:fde26267416c8478c95432c81489b53f57b0b5d24cd5c8bfaebf5bbaac4dc90c"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:544b995a6a1976fad5d7ff01409b4588f7608ccc41be72147700af91fd44875d"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0f772eea55cccce7f45d6ecdd1d5049c12a77ec22404f6b892fae687faa87bee"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9d63d66059114a6756d09169c9209ffceabacb65b9cb0f66e6fc344b20b73e6"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1da8e645c655d86f0305fb4c65a0d848f461cd90ee07d21f254667287b5dbe50"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1843fd0daebcf843fe6d4da53b8bdd3fc906ad3e97d25f51c3fed44436d82a49"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7fb0ee35845bef1e8c4a152d766242164e138c239e3182f558ae15cb4a891f94"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f379f11e138dfd56c3f24a04164f871a08281194dd9ddf656a278d7d080c8ad0"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b978c0678cffbe8860ec9edc91200e895c29ae1ac8a7085f947f8e8864c489fb"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ebccf0d760bc92a4a7c751aeb2fef6626144aace76ee8f5a63abeb100cae87f"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:77fed80e30fa65708546c4119840a46691290efc231f6bfb2ac2a39b52e15811"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9d7b6b90da7285642f480b48c9efd1d25302fd628237d8f6f6ee39ba6b2d2d34"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d2976b7079f09f48d59dc123293ed6282fca6ef96a270f4ea0364e4e54c8e855"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2852f67371918705cc18b321695f75c5d653d5d8c4a9b946c1eec4dab2bd6fdf"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be45a895f98877271e8a0b6cf40925e0369121ce423421c20fa6d7958dc753c2"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64ca3c7c614aefcdd5e358ecdd41d1237c35fe1417d01ec0160e7cdb0a380edc"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d97b59cbd8a6c8b23524a8ce237ff9504d987dc07156258aa68ae06d2dd5f34d"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:27a78bdd384dbbe7b357af95f72efe8c494306b5ec0a03c31e2d53d6763e5307"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b007e5dcba684e888fbc90554cb12a2f4e492927c8c2761a80b7590209821743"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95594b2ceeaa94934e3e94dd7bf5f3c3659cf1a26b1fb3edcf6e42dad7e0eaf2"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:70b719a130b81dd130a57ac0ff636dc2c0127c5b35ca5467d1b67057e3c7a4d2"}, + {file = "pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b"}, ] [package.dependencies] @@ -2511,98 +2509,98 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "regex" -version = "2025.7.31" +version = "2025.7.34" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.9" files = [ - {file = "regex-2025.7.31-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b40a8f8064c3b8032babb2049b7ab40812cbb394179556deb7c40c1e3b28630f"}, - {file = "regex-2025.7.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6aef1895f27875421e6d8047747702d6e512793c6d95614c56479a375541edb"}, - {file = "regex-2025.7.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f124ff95b4cbedfd762897d4bd9da2b20b7574df1d60d498f16a42d398d524e9"}, - {file = "regex-2025.7.31-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea5b162c50745694606f50170cc7cc84c14193ac5fd6ecb26126e826a7c12bd6"}, - {file = "regex-2025.7.31-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f970a3e058f587988a18ed4ddff6a6363fa72a41dfb29077d0efe8dc4df00da"}, - {file = "regex-2025.7.31-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2dadf5788af5b10a78b996d24263e352e5f99dbfce9db4c48e9c875a9a7d051c"}, - {file = "regex-2025.7.31-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f67f9f8216a8e645c568daf104abc52cd5387127af8e8b17c7bc11b014d88fcb"}, - {file = "regex-2025.7.31-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:407da7504642830d4211d39dc23b8a9d400913b3f2d242774b8d17ead3487e00"}, - {file = "regex-2025.7.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff7753bd717a9f2286d2171d758eebf11b3bfb21e6520b201e01169ec9cd5ec0"}, - {file = "regex-2025.7.31-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:de088fe37d4c58a42401bf4ce2328b00a760c7d85473ccf6e489094e13452510"}, - {file = "regex-2025.7.31-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:67d708f8bfb89dcd57c3190cb5c343c7f40d3c81319a00c8188982a08c64b977"}, - {file = "regex-2025.7.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3fe81cd00ef1eaef1ef00d61200bacb55b1a130570cd9be2e793b98981c6cd9c"}, - {file = "regex-2025.7.31-cp310-cp310-win32.whl", hash = "sha256:8542ee1fd8c8be4db1c58902956a220bdbe7c38362decec989f57ace0e37f14c"}, - {file = "regex-2025.7.31-cp310-cp310-win_amd64.whl", hash = "sha256:77be56e167e2685828ab0abc1bdf38db3ab385e624c3ea2694b0d4ea70a2b7bc"}, - {file = "regex-2025.7.31-cp310-cp310-win_arm64.whl", hash = "sha256:7ddc7ab76d917cb680a3b0fa53fc2971d40cc17415539007e15fa31c829dcf2b"}, - {file = "regex-2025.7.31-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:55dc9f4094656d273562718d68cd8363f688e0b813d62696aad346bcd7b1c7d4"}, - {file = "regex-2025.7.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8ff37cac0e1c7ba943bf46f6431b0c86cbe42d42ae862ff7b152b4ccc232bdd"}, - {file = "regex-2025.7.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:622aa4ca90d7cf38433d425a4f00543b08d3b109cca379df8f31827cf5e2ecb3"}, - {file = "regex-2025.7.31-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cbd4ee61dddfcff625f8642e940ba61121b28e98d0eca24d79114209e3e8ce1b"}, - {file = "regex-2025.7.31-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca7c9af8f33540b51f1b76092e732b62211092af947239e5db471323ae39ead4"}, - {file = "regex-2025.7.31-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:beda88db2cae5dc82a64cba465f7e8686392d96116f87e664af46c4dfcdd9cbc"}, - {file = "regex-2025.7.31-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055baef91bb31474bd919fd245cf154db00cbac449596952d3e6bc1e1b226808"}, - {file = "regex-2025.7.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:02e660c2d02854eed41b13f0e2c98d24efce4fb439aa316742f8d32aeda2803b"}, - {file = "regex-2025.7.31-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4372ca5c43d0e255e68a9aa6812d9be3447c4ce7ba7cb1429c7b96d2c63ee9b1"}, - {file = "regex-2025.7.31-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:481f069facacb4f40bf37a51748a88952f5dd5707dd849f216d53bf5522c8add"}, - {file = "regex-2025.7.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e8b4896ec5a9d0ae73d04e260ff6e1f366985b46505b2fa36d91501e4a7a98f0"}, - {file = "regex-2025.7.31-cp311-cp311-win32.whl", hash = "sha256:47ceaa1e5eb243595306dfd5e5e294e251900aa94a0e2e1037fce125f432d2fb"}, - {file = "regex-2025.7.31-cp311-cp311-win_amd64.whl", hash = "sha256:c4f6b34f509bb26507509b6f9ba85debcc6ca512d2d4a6fd5e96b9de2c187c83"}, - {file = "regex-2025.7.31-cp311-cp311-win_arm64.whl", hash = "sha256:75f74892df1593036e83b48ba50d1e1951af650b6fabbfcf7531e7082e3561d4"}, - {file = "regex-2025.7.31-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1af64eed343f19e1f09da9e9e8cfb82570050c4ed9fec400f9f118aab383da4b"}, - {file = "regex-2025.7.31-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eab98712c0a6d053fb67b021fae43422f7eab8fa2aaa25034f5ef01585112cc7"}, - {file = "regex-2025.7.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34dcb7c4d89b83e7e3cb5a2679595f6f97d253815ed9402edbdfc56780668b89"}, - {file = "regex-2025.7.31-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52f1925d123338835e5b13e5ef8e6a744c02aef8e538e661ad5c76185e6ad87a"}, - {file = "regex-2025.7.31-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:569c2b6812d223ae82a2a13c36362ca5933b88011ba869111eba8fb769ccf492"}, - {file = "regex-2025.7.31-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:27f17ade67d06ce4abff48f2ee99c6419f73e70882fe7ca51960916c75844e1f"}, - {file = "regex-2025.7.31-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45622fab3a90590a41a541afea739a732bf110dd081c15c84538b115cf5f59f5"}, - {file = "regex-2025.7.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:defab878ce91944baf2ade775895a097ad7eeeab3618d87b4c29753aad98a5c4"}, - {file = "regex-2025.7.31-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8ae02caf994a0a0d958b9b0fc5aebbdb48fa93491a582dd00db3733d258a6ac4"}, - {file = "regex-2025.7.31-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7c40ab21112711363d7612f35781c8b2d2d59c27e0a057a6486eea60ee01e54"}, - {file = "regex-2025.7.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4723c01dd28c1b1de5f463bba8672e3d0dc3d94d5db056e4bbc3cbc84bf23c1c"}, - {file = "regex-2025.7.31-cp312-cp312-win32.whl", hash = "sha256:3ebf32b2b2f60aecd6f8d375ff310849251946cf953aac69b8b5b10e3ccebaf9"}, - {file = "regex-2025.7.31-cp312-cp312-win_amd64.whl", hash = "sha256:12f9ab65b4cc771dd6d8af806ded7425ca50d2a188d2fc3a5aba3dc49f5684b7"}, - {file = "regex-2025.7.31-cp312-cp312-win_arm64.whl", hash = "sha256:fd454ed1fe245f983c2376b6f01948d6ec4a1e5869a8c883e320e1739cc63e57"}, - {file = "regex-2025.7.31-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ead2cf9d92f90d2fd7c5eb84b383a82154298742011b8f892fdee2f724f76106"}, - {file = "regex-2025.7.31-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:81d865d195f9c94b7e7f043c973a7ee1003b29f6e75caa9125aa5a92cf6b334d"}, - {file = "regex-2025.7.31-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e58b95f62df0300496a2244ac5818312a80a5f786c9727125d62b49deede1b9"}, - {file = "regex-2025.7.31-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc2939e3e1837822803afebe38f42aab739e1135ea63ba0fdfe499672b21fc39"}, - {file = "regex-2025.7.31-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:51211fd9bfe544f7ad543a683bd2546636ce5b55ab65752e8f8ebe477378dfa2"}, - {file = "regex-2025.7.31-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff1359141a378d8fa1ade7ca8a7a94988c830e5e588d232eded0e5900fa953cf"}, - {file = "regex-2025.7.31-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a57aacb1974bd04a5ace8f93c9ab7fa49b868091032b38afd79b2c1ac70da35a"}, - {file = "regex-2025.7.31-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2784d4afa58a87f5f522037d10cf96c05d3a91ab82b2152a66e8ccea55e703f6"}, - {file = "regex-2025.7.31-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:339d1c579cea1d525ef2b2fefdc1f108596b8252acca6ef012a51206d3f01ac4"}, - {file = "regex-2025.7.31-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb9bf5a0c1c1c353bc5da6cb58db8a12b1ec76a9e8dc8a23ce56d63ee867392"}, - {file = "regex-2025.7.31-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a7bedc5b499bd0a5cc05b3407ab0aa09f224fb9cd13c52253ecb1619957a6b4"}, - {file = "regex-2025.7.31-cp313-cp313-win32.whl", hash = "sha256:c8ae328524e7bb67ae12a9e314d935e7bb67eb5135e57196b0faa4ecab3f2999"}, - {file = "regex-2025.7.31-cp313-cp313-win_amd64.whl", hash = "sha256:8ab2d9cd1c13e7127194b5cb36ecfb323fec0b80845195842d8e8ac9fb581e1b"}, - {file = "regex-2025.7.31-cp313-cp313-win_arm64.whl", hash = "sha256:5560b6c9fb428281b472b665e4d046eaaaf37523135cb1ee3dc699f3e82dae7a"}, - {file = "regex-2025.7.31-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:45fd783fd91ec849c64ebd5c0498ded966e829b8d2ea44daba2a2c35b6b5f4a8"}, - {file = "regex-2025.7.31-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:81a193e6138b61976903357fc7a67dd9e256cf98f73bbfb2758abf3b8d396c35"}, - {file = "regex-2025.7.31-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fccac19e5f1053e4da34ae5a651b938dba12e5f54f04def1cd349b24fd5f28cf"}, - {file = "regex-2025.7.31-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f6755afaed9948dd4dda4d093663fe60e9a8784993b733697551bf6b0921d7c"}, - {file = "regex-2025.7.31-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c7eea6eb0f4c1ff7eee051a6780acc40717be9736bf67873c3c932b7ac5743a2"}, - {file = "regex-2025.7.31-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:89358d48fbc33614185c18b3a397b870e388f13d882f379b9a33c970a4945dcc"}, - {file = "regex-2025.7.31-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b284b8042d97f4eb9caf4d9423307ee1c9ff9c2abd14c781d44aef070ac7cc9"}, - {file = "regex-2025.7.31-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2348cedab6adee1a7649e2a157d219196044588a58024509def2b8b30c0f63f8"}, - {file = "regex-2025.7.31-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:833292f5ebfbe4f104e02718f0e2d05d51ac43cdc023a217672119989c4a0be6"}, - {file = "regex-2025.7.31-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:74f348e26ff09bb2684c67535f516cec362624566127d9f4158cd7ab5038c1fe"}, - {file = "regex-2025.7.31-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b2d5523c236594c055e5752e088406dfe3214c4e986abeceaea24967371ad890"}, - {file = "regex-2025.7.31-cp314-cp314-win32.whl", hash = "sha256:144d7550d13770ab994ef6616cff552ed01c892499eb1df74b6775e9b6f6a571"}, - {file = "regex-2025.7.31-cp314-cp314-win_amd64.whl", hash = "sha256:5792ff4bb2836ca2b041321eada3a1918f8ba05bceac4f6e9f06f0fefa1b8e44"}, - {file = "regex-2025.7.31-cp314-cp314-win_arm64.whl", hash = "sha256:59b94c02b435d7d5a9621381bf338a36c7efa6d9025a888cc39aa256b2869299"}, - {file = "regex-2025.7.31-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ac97385aadafe3a2f7cb9c48c5ca3cabb91c1f89e47fdf5a55945c61b186254f"}, - {file = "regex-2025.7.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1b600ff5e80d2b4cf2cabc451dab5b9a3ed7e1e5aa845dd5cf41eabefb957179"}, - {file = "regex-2025.7.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1282de93a20d143180bd3500488877d888185a5e78ef02f7cd410140299f0941"}, - {file = "regex-2025.7.31-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b1329dcb4cd688ebabd2560d5a82567e1e3d05885169f6bece40ca9e7dcfe3d"}, - {file = "regex-2025.7.31-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56508bf5da86c96b7f87da70ee28019a1bdd4c0ec31adfcd62300c4a08e927e4"}, - {file = "regex-2025.7.31-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1778b27e2d4e07cf1e3350f1e74dae5d0511d1ca2b001f4d985b0739182ba2a8"}, - {file = "regex-2025.7.31-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60162442fd631ead1ca58c16f6f9d6b1aa32d2a2f749b51a7b4262fc294105e1"}, - {file = "regex-2025.7.31-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc9eb820140126219ac9d6b488176cfdde2f5e8891b0fbf2cbd2526c0d441d37"}, - {file = "regex-2025.7.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b2b0f700237b73ec0df2e13e2b1c10d36b8ea45c7a3c7eb6d99843c39feaa0e6"}, - {file = "regex-2025.7.31-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:46572b60e9cc5c09e17d5ecb648dc9fb1c44c12274ae791921350f0f6d0eebea"}, - {file = "regex-2025.7.31-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:019ad36e4ea89af6abd2915ffc06b4e109234655148a45f8f32b42ea9b503514"}, - {file = "regex-2025.7.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:261f9a6dcb1fd9dc204cc587fceac2e071720a15fc4fa36156651c886e574ad0"}, - {file = "regex-2025.7.31-cp39-cp39-win32.whl", hash = "sha256:f7858175abee523c5b04cc1de5d3d03168aed4805aad747641752c027aaa6335"}, - {file = "regex-2025.7.31-cp39-cp39-win_amd64.whl", hash = "sha256:097c2adaedf5fba5819df298750cd3966da94fdd549e2d9e5040d7e315de97dd"}, - {file = "regex-2025.7.31-cp39-cp39-win_arm64.whl", hash = "sha256:c28c00fbe30dd5e99162b88765c8d014d06581927ceab8fa851267041e48820c"}, - {file = "regex-2025.7.31.tar.gz", hash = "sha256:80a1af156ea8670ae63184e5c112b481326ece1879e09447f6fbb49d1b49330b"}, + {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d856164d25e2b3b07b779bfed813eb4b6b6ce73c2fd818d46f47c1eb5cd79bd6"}, + {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d15a9da5fad793e35fb7be74eec450d968e05d2e294f3e0e77ab03fa7234a83"}, + {file = "regex-2025.7.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95b4639c77d414efa93c8de14ce3f7965a94d007e068a94f9d4997bb9bd9c81f"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7de1ceed5a5f84f342ba4a9f4ae589524adf9744b2ee61b5da884b5b659834"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02e5860a250cd350c4933cf376c3bc9cb28948e2c96a8bc042aee7b985cfa26f"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a5966220b9a1a88691282b7e4350e9599cf65780ca60d914a798cb791aa1177"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48fb045bbd4aab2418dc1ba2088a5e32de4bfe64e1457b948bb328a8dc2f1c2e"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:20ff8433fa45e131f7316594efe24d4679c5449c0ca69d91c2f9d21846fdf064"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c436fd1e95c04c19039668cfb548450a37c13f051e8659f40aed426e36b3765f"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0b85241d3cfb9f8a13cefdfbd58a2843f208f2ed2c88181bf84e22e0c7fc066d"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:075641c94126b064c65ab86e7e71fc3d63e7ff1bea1fb794f0773c97cdad3a03"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:70645cad3407d103d1dbcb4841839d2946f7d36cf38acbd40120fee1682151e5"}, + {file = "regex-2025.7.34-cp310-cp310-win32.whl", hash = "sha256:3b836eb4a95526b263c2a3359308600bd95ce7848ebd3c29af0c37c4f9627cd3"}, + {file = "regex-2025.7.34-cp310-cp310-win_amd64.whl", hash = "sha256:cbfaa401d77334613cf434f723c7e8ba585df162be76474bccc53ae4e5520b3a"}, + {file = "regex-2025.7.34-cp310-cp310-win_arm64.whl", hash = "sha256:bca11d3c38a47c621769433c47f364b44e8043e0de8e482c5968b20ab90a3986"}, + {file = "regex-2025.7.34-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da304313761b8500b8e175eb2040c4394a875837d5635f6256d6fa0377ad32c8"}, + {file = "regex-2025.7.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:35e43ebf5b18cd751ea81455b19acfdec402e82fe0dc6143edfae4c5c4b3909a"}, + {file = "regex-2025.7.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96bbae4c616726f4661fe7bcad5952e10d25d3c51ddc388189d8864fbc1b3c68"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9feab78a1ffa4f2b1e27b1bcdaad36f48c2fed4870264ce32f52a393db093c78"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f14b36e6d4d07f1a5060f28ef3b3561c5d95eb0651741474ce4c0a4c56ba8719"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85c3a958ef8b3d5079c763477e1f09e89d13ad22198a37e9d7b26b4b17438b33"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37555e4ae0b93358fa7c2d240a4291d4a4227cc7c607d8f85596cdb08ec0a083"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee38926f31f1aa61b0232a3a11b83461f7807661c062df9eb88769d86e6195c3"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a664291c31cae9c4a30589bd8bc2ebb56ef880c9c6264cb7643633831e606a4d"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f3e5c1e0925e77ec46ddc736b756a6da50d4df4ee3f69536ffb2373460e2dafd"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d428fc7731dcbb4e2ffe43aeb8f90775ad155e7db4347a639768bc6cd2df881a"}, + {file = "regex-2025.7.34-cp311-cp311-win32.whl", hash = "sha256:e154a7ee7fa18333ad90b20e16ef84daaeac61877c8ef942ec8dfa50dc38b7a1"}, + {file = "regex-2025.7.34-cp311-cp311-win_amd64.whl", hash = "sha256:24257953d5c1d6d3c129ab03414c07fc1a47833c9165d49b954190b2b7f21a1a"}, + {file = "regex-2025.7.34-cp311-cp311-win_arm64.whl", hash = "sha256:3157aa512b9e606586900888cd469a444f9b898ecb7f8931996cb715f77477f0"}, + {file = "regex-2025.7.34-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7f7211a746aced993bef487de69307a38c5ddd79257d7be83f7b202cb59ddb50"}, + {file = "regex-2025.7.34-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fb31080f2bd0681484b275461b202b5ad182f52c9ec606052020fe13eb13a72f"}, + {file = "regex-2025.7.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0200a5150c4cf61e407038f4b4d5cdad13e86345dac29ff9dab3d75d905cf130"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:739a74970e736df0773788377969c9fea3876c2fc13d0563f98e5503e5185f46"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4fef81b2f7ea6a2029161ed6dea9ae13834c28eb5a95b8771828194a026621e4"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea74cf81fe61a7e9d77989050d0089a927ab758c29dac4e8e1b6c06fccf3ebf0"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e4636a7f3b65a5f340ed9ddf53585c42e3ff37101d383ed321bfe5660481744b"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cef962d7834437fe8d3da6f9bfc6f93f20f218266dcefec0560ed7765f5fe01"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cbe1698e5b80298dbce8df4d8d1182279fbdaf1044e864cbc9d53c20e4a2be77"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:32b9f9bcf0f605eb094b08e8da72e44badabb63dde6b83bd530580b488d1c6da"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:524c868ba527eab4e8744a9287809579f54ae8c62fbf07d62aacd89f6026b282"}, + {file = "regex-2025.7.34-cp312-cp312-win32.whl", hash = "sha256:d600e58ee6d036081c89696d2bdd55d507498a7180df2e19945c6642fac59588"}, + {file = "regex-2025.7.34-cp312-cp312-win_amd64.whl", hash = "sha256:9a9ab52a466a9b4b91564437b36417b76033e8778e5af8f36be835d8cb370d62"}, + {file = "regex-2025.7.34-cp312-cp312-win_arm64.whl", hash = "sha256:c83aec91af9c6fbf7c743274fd952272403ad9a9db05fe9bfc9df8d12b45f176"}, + {file = "regex-2025.7.34-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3c9740a77aeef3f5e3aaab92403946a8d34437db930a0280e7e81ddcada61f5"}, + {file = "regex-2025.7.34-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:69ed3bc611540f2ea70a4080f853741ec698be556b1df404599f8724690edbcd"}, + {file = "regex-2025.7.34-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d03c6f9dcd562c56527c42b8530aad93193e0b3254a588be1f2ed378cdfdea1b"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6164b1d99dee1dfad33f301f174d8139d4368a9fb50bf0a3603b2eaf579963ad"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1e4f4f62599b8142362f164ce776f19d79bdd21273e86920a7b604a4275b4f59"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72a26dcc6a59c057b292f39d41465d8233a10fd69121fa24f8f43ec6294e5415"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5273fddf7a3e602695c92716c420c377599ed3c853ea669c1fe26218867002f"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c1844be23cd40135b3a5a4dd298e1e0c0cb36757364dd6cdc6025770363e06c1"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dde35e2afbbe2272f8abee3b9fe6772d9b5a07d82607b5788e8508974059925c"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f6e8e7af516a7549412ce57613e859c3be27d55341a894aacaa11703a4c31a"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:469142fb94a869beb25b5f18ea87646d21def10fbacb0bcb749224f3509476f0"}, + {file = "regex-2025.7.34-cp313-cp313-win32.whl", hash = "sha256:da7507d083ee33ccea1310447410c27ca11fb9ef18c95899ca57ff60a7e4d8f1"}, + {file = "regex-2025.7.34-cp313-cp313-win_amd64.whl", hash = "sha256:9d644de5520441e5f7e2db63aec2748948cc39ed4d7a87fd5db578ea4043d997"}, + {file = "regex-2025.7.34-cp313-cp313-win_arm64.whl", hash = "sha256:7bf1c5503a9f2cbd2f52d7e260acb3131b07b6273c470abb78568174fe6bde3f"}, + {file = "regex-2025.7.34-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:8283afe7042d8270cecf27cca558873168e771183d4d593e3c5fe5f12402212a"}, + {file = "regex-2025.7.34-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6c053f9647e3421dd2f5dff8172eb7b4eec129df9d1d2f7133a4386319b47435"}, + {file = "regex-2025.7.34-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a16dd56bbcb7d10e62861c3cd000290ddff28ea142ffb5eb3470f183628011ac"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69c593ff5a24c0d5c1112b0df9b09eae42b33c014bdca7022d6523b210b69f72"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98d0ce170fcde1a03b5df19c5650db22ab58af375aaa6ff07978a85c9f250f0e"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d72765a4bff8c43711d5b0f5b452991a9947853dfa471972169b3cc0ba1d0751"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4494f8fd95a77eb434039ad8460e64d57baa0434f1395b7da44015bef650d0e4"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4f42b522259c66e918a0121a12429b2abcf696c6f967fa37bdc7b72e61469f98"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:aaef1f056d96a0a5d53ad47d019d5b4c66fe4be2da87016e0d43b7242599ffc7"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:656433e5b7dccc9bc0da6312da8eb897b81f5e560321ec413500e5367fcd5d47"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e91eb2c62c39705e17b4d42d4b86c4e86c884c0d15d9c5a47d0835f8387add8e"}, + {file = "regex-2025.7.34-cp314-cp314-win32.whl", hash = "sha256:f978ddfb6216028c8f1d6b0f7ef779949498b64117fc35a939022f67f810bdcb"}, + {file = "regex-2025.7.34-cp314-cp314-win_amd64.whl", hash = "sha256:4b7dc33b9b48fb37ead12ffc7bdb846ac72f99a80373c4da48f64b373a7abeae"}, + {file = "regex-2025.7.34-cp314-cp314-win_arm64.whl", hash = "sha256:4b8c4d39f451e64809912c82392933d80fe2e4a87eeef8859fcc5380d0173c64"}, + {file = "regex-2025.7.34-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fd5edc3f453de727af267c7909d083e19f6426fc9dd149e332b6034f2a5611e6"}, + {file = "regex-2025.7.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa1cdfb8db96ef20137de5587954c812821966c3e8b48ffc871e22d7ec0a4938"}, + {file = "regex-2025.7.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:89c9504fc96268e8e74b0283e548f53a80c421182a2007e3365805b74ceef936"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33be70d75fa05a904ee0dc43b650844e067d14c849df7e82ad673541cd465b5f"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57d25b6732ea93eeb1d090e8399b6235ca84a651b52d52d272ed37d3d2efa0f1"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:baf2fe122a3db1c0b9f161aa44463d8f7e33eeeda47bb0309923deb743a18276"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a764a83128af9c1a54be81485b34dca488cbcacefe1e1d543ef11fbace191e1"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7f663ccc4093877f55b51477522abd7299a14c5bb7626c5238599db6a0cb95d"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4913f52fbc7a744aaebf53acd8d3dc1b519e46ba481d4d7596de3c862e011ada"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:efac4db9e044d47fd3b6b0d40b6708f4dfa2d8131a5ac1d604064147c0f552fd"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7373afae7cfb716e3b8e15d0184510d518f9d21471f2d62918dbece85f2c588f"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9960d162f3fecf6af252534a1ae337e9c2e20d74469fed782903b24e2cc9d3d7"}, + {file = "regex-2025.7.34-cp39-cp39-win32.whl", hash = "sha256:95d538b10eb4621350a54bf14600cc80b514211d91a019dc74b8e23d2159ace5"}, + {file = "regex-2025.7.34-cp39-cp39-win_amd64.whl", hash = "sha256:f7f3071b5faa605b0ea51ec4bb3ea7257277446b053f4fd3ad02b1dcb4e64353"}, + {file = "regex-2025.7.34-cp39-cp39-win_arm64.whl", hash = "sha256:716a47515ba1d03f8e8a61c5013041c8c90f2e21f055203498105d7571b44531"}, + {file = "regex-2025.7.34.tar.gz", hash = "sha256:9ead9765217afd04a86822dfcd4ed2747dfe426e887da413b15ff0ac2457e21a"}, ] [[package]] @@ -3088,23 +3086,23 @@ files = [ [[package]] name = "tornado" -version = "6.5.1" +version = "6.5.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.9" files = [ - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7"}, - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331"}, - {file = "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"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a"}, - {file = "tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365"}, - {file = "tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b"}, - {file = "tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7"}, - {file = "tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c"}, + {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6"}, + {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882"}, + {file = "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"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04"}, + {file = "tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0"}, + {file = "tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f"}, + {file = "tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af"}, + {file = "tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0"}, ] [[package]] @@ -3220,19 +3218,20 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "virtualenv" -version = "20.32.0" +version = "20.34.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" files = [ - {file = "virtualenv-20.32.0-py3-none-any.whl", hash = "sha256:2c310aecb62e5aa1b06103ed7c2977b81e042695de2697d01017ff0f1034af56"}, - {file = "virtualenv-20.32.0.tar.gz", hash = "sha256:886bf75cadfdc964674e6e33eb74d787dff31ca314ceace03ca5810620f4ecf0"}, + {file = "virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026"}, + {file = "virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" +typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] @@ -3329,90 +3328,92 @@ wasabi = ">=0.9.1,<1.2.0" [[package]] name = "wrapt" -version = "1.17.2" +version = "1.17.3" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" files = [ - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, - {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, - {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, - {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, - {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, - {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, - {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, - {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, - {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, - {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, - {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, - {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, - {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, - {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, - {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, - {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, - {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, + {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88bbae4d40d5a46142e70d58bf664a89b6b4befaea7b2ecc14e03cedb8e06c04"}, + {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b13af258d6a9ad602d57d889f83b9d5543acd471eee12eb51f5b01f8eb1bc2"}, + {file = "wrapt-1.17.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd341868a4b6714a5962c1af0bd44f7c404ef78720c7de4892901e540417111c"}, + {file = "wrapt-1.17.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f9b2601381be482f70e5d1051a5965c25fb3625455a2bf520b5a077b22afb775"}, + {file = "wrapt-1.17.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:343e44b2a8e60e06a7e0d29c1671a0d9951f59174f3709962b5143f60a2a98bd"}, + {file = "wrapt-1.17.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:33486899acd2d7d3066156b03465b949da3fd41a5da6e394ec49d271baefcf05"}, + {file = "wrapt-1.17.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e6f40a8aa5a92f150bdb3e1c44b7e98fb7113955b2e5394122fa5532fec4b418"}, + {file = "wrapt-1.17.3-cp310-cp310-win32.whl", hash = "sha256:a36692b8491d30a8c75f1dfee65bef119d6f39ea84ee04d9f9311f83c5ad9390"}, + {file = "wrapt-1.17.3-cp310-cp310-win_amd64.whl", hash = "sha256:afd964fd43b10c12213574db492cb8f73b2f0826c8df07a68288f8f19af2ebe6"}, + {file = "wrapt-1.17.3-cp310-cp310-win_arm64.whl", hash = "sha256:af338aa93554be859173c39c85243970dc6a289fa907402289eeae7543e1ae18"}, + {file = "wrapt-1.17.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:273a736c4645e63ac582c60a56b0acb529ef07f78e08dc6bfadf6a46b19c0da7"}, + {file = "wrapt-1.17.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5531d911795e3f935a9c23eb1c8c03c211661a5060aab167065896bbf62a5f85"}, + {file = "wrapt-1.17.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0610b46293c59a3adbae3dee552b648b984176f8562ee0dba099a56cfbe4df1f"}, + {file = "wrapt-1.17.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b32888aad8b6e68f83a8fdccbf3165f5469702a7544472bdf41f582970ed3311"}, + {file = "wrapt-1.17.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cccf4f81371f257440c88faed6b74f1053eef90807b77e31ca057b2db74edb1"}, + {file = "wrapt-1.17.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8a210b158a34164de8bb68b0e7780041a903d7b00c87e906fb69928bf7890d5"}, + {file = "wrapt-1.17.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:79573c24a46ce11aab457b472efd8d125e5a51da2d1d24387666cd85f54c05b2"}, + {file = "wrapt-1.17.3-cp311-cp311-win32.whl", hash = "sha256:c31eebe420a9a5d2887b13000b043ff6ca27c452a9a22fa71f35f118e8d4bf89"}, + {file = "wrapt-1.17.3-cp311-cp311-win_amd64.whl", hash = "sha256:0b1831115c97f0663cb77aa27d381237e73ad4f721391a9bfb2fe8bc25fa6e77"}, + {file = "wrapt-1.17.3-cp311-cp311-win_arm64.whl", hash = "sha256:5a7b3c1ee8265eb4c8f1b7d29943f195c00673f5ab60c192eba2d4a7eae5f46a"}, + {file = "wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0"}, + {file = "wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba"}, + {file = "wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd"}, + {file = "wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828"}, + {file = "wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9"}, + {file = "wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396"}, + {file = "wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc"}, + {file = "wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe"}, + {file = "wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c"}, + {file = "wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6"}, + {file = "wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0"}, + {file = "wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77"}, + {file = "wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7"}, + {file = "wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277"}, + {file = "wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d"}, + {file = "wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa"}, + {file = "wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050"}, + {file = "wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8"}, + {file = "wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb"}, + {file = "wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16"}, + {file = "wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39"}, + {file = "wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235"}, + {file = "wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c"}, + {file = "wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b"}, + {file = "wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa"}, + {file = "wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7"}, + {file = "wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4"}, + {file = "wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10"}, + {file = "wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6"}, + {file = "wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58"}, + {file = "wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a"}, + {file = "wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067"}, + {file = "wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454"}, + {file = "wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e"}, + {file = "wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f"}, + {file = "wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056"}, + {file = "wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804"}, + {file = "wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977"}, + {file = "wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116"}, + {file = "wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6"}, + {file = "wrapt-1.17.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:70d86fa5197b8947a2fa70260b48e400bf2ccacdcab97bb7de47e3d1e6312225"}, + {file = "wrapt-1.17.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df7d30371a2accfe4013e90445f6388c570f103d61019b6b7c57e0265250072a"}, + {file = "wrapt-1.17.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:caea3e9c79d5f0d2c6d9ab96111601797ea5da8e6d0723f77eabb0d4068d2b2f"}, + {file = "wrapt-1.17.3-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:758895b01d546812d1f42204bd443b8c433c44d090248bf22689df673ccafe00"}, + {file = "wrapt-1.17.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02b551d101f31694fc785e58e0720ef7d9a10c4e62c1c9358ce6f63f23e30a56"}, + {file = "wrapt-1.17.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:656873859b3b50eeebe6db8b1455e99d90c26ab058db8e427046dbc35c3140a5"}, + {file = "wrapt-1.17.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a9a2203361a6e6404f80b99234fe7fb37d1fc73487b5a78dc1aa5b97201e0f22"}, + {file = "wrapt-1.17.3-cp38-cp38-win32.whl", hash = "sha256:55cbbc356c2842f39bcc553cf695932e8b30e30e797f961860afb308e6b1bb7c"}, + {file = "wrapt-1.17.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad85e269fe54d506b240d2d7b9f5f2057c2aa9a2ea5b32c66f8902f768117ed2"}, + {file = "wrapt-1.17.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ce38e66630599e1193798285706903110d4f057aab3168a34b7fdc85569afc"}, + {file = "wrapt-1.17.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:65d1d00fbfb3ea5f20add88bbc0f815150dbbde3b026e6c24759466c8b5a9ef9"}, + {file = "wrapt-1.17.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7c06742645f914f26c7f1fa47b8bc4c91d222f76ee20116c43d5ef0912bba2d"}, + {file = "wrapt-1.17.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e18f01b0c3e4a07fe6dfdb00e29049ba17eadbc5e7609a2a3a4af83ab7d710a"}, + {file = "wrapt-1.17.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f5f51a6466667a5a356e6381d362d259125b57f059103dd9fdc8c0cf1d14139"}, + {file = "wrapt-1.17.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:59923aa12d0157f6b82d686c3fd8e1166fa8cdfb3e17b42ce3b6147ff81528df"}, + {file = "wrapt-1.17.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:46acc57b331e0b3bcb3e1ca3b421d65637915cfcd65eb783cb2f78a511193f9b"}, + {file = "wrapt-1.17.3-cp39-cp39-win32.whl", hash = "sha256:3e62d15d3cfa26e3d0788094de7b64efa75f3a53875cdbccdf78547aed547a81"}, + {file = "wrapt-1.17.3-cp39-cp39-win_amd64.whl", hash = "sha256:1f23fa283f51c890eda8e34e4937079114c74b4c81d2b2f1f1d94948f5cc3d7f"}, + {file = "wrapt-1.17.3-cp39-cp39-win_arm64.whl", hash = "sha256:24c2ed34dc222ed754247a2702b1e1e89fdbaa4016f324b4b8f1a802d4ffe87f"}, + {file = "wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22"}, + {file = "wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0"}, ] [[package]]