From 20a7ce99c26502fb16838b942e7e201ee572725e Mon Sep 17 00:00:00 2001 From: ankur-singh-intel Date: Thu, 5 Jun 2025 12:25:25 -0700 Subject: [PATCH 1/4] refactor and migrate sample - Refactor frontend, backend, notebook and README file - Migrate backend to use FastAPI (instead of Flask) - Update langchain dependencies and use newer API --- Text-Summarizer-Browser-Plugin/README.md | 276 +- .../TextSummarizerPlugin.ipynb | 1005 ++-- .../assets/extension_demo.png | Bin 0 -> 87031 bytes .../assets/pin_extension.png | Bin 48427 -> 0 bytes .../backend/code.py | 208 - .../backend/llm_engine.py | 180 + .../backend/server.py | 237 +- .../extension/popup.html | 7 +- .../extension/popup.js | 742 +-- .../extension/style.css | 86 +- Text-Summarizer-Browser-Plugin/pyproject.toml | 36 + Text-Summarizer-Browser-Plugin/uv.lock | 4491 +++++++++++++++++ 12 files changed, 5835 insertions(+), 1433 deletions(-) create mode 100644 Text-Summarizer-Browser-Plugin/assets/extension_demo.png delete mode 100644 Text-Summarizer-Browser-Plugin/assets/pin_extension.png delete mode 100644 Text-Summarizer-Browser-Plugin/backend/code.py create mode 100644 Text-Summarizer-Browser-Plugin/backend/llm_engine.py create mode 100644 Text-Summarizer-Browser-Plugin/pyproject.toml create mode 100644 Text-Summarizer-Browser-Plugin/uv.lock diff --git a/Text-Summarizer-Browser-Plugin/README.md b/Text-Summarizer-Browser-Plugin/README.md index 5476bb6..819fb8b 100644 --- a/Text-Summarizer-Browser-Plugin/README.md +++ b/Text-Summarizer-Browser-Plugin/README.md @@ -1,178 +1,158 @@ -# Text summarizer browser Plugin Sample +# Text Summarizer Browser Plugin -A plug-and-play Chrome extension seamlessly integrates with Flask and leverages an OpenVINO backend for fast and efficient summarization of webpages (via URL) and PDFs (via upload). Powered by LangChain tools, it handles advanced tasks like text splitting and vectorstore management to deliver accurate and meaningful summaries. +A plug-and-play Chrome extension that integrates seamlessly with a Flask backend, leveraging OpenVINO for fast and efficient summarization of webpages (via URL) and PDFs (via upload). Powered by LangChain tools, it handles advanced tasks like text splitting and vector store management to deliver accurate and meaningful summaries. -## How it Works +--- -image +## Table of Contents +- [Overview](#overview) +- [Architecture](#architecture) +- [Prerequisites](#prerequisites) +- [Project Structure](#project-structure) +- [Setup & Installation](#setup--installation) + - [Environment Setup](#environment-setup) + - [Model Preparation](#model-preparation) + - [Running the Backend](#running-the-backend) + - [Loading the Chrome Extension](#loading-the-chrome-extension) +- [Usage](#usage) + - [Webpage Summarization](#webpage-summarization) + - [PDF Summarization](#pdf-summarization) +- [Troubleshooting](#troubleshooting) +- [License](#license) -## Sample Structure +--- -The directory contains: -- **backend:** Includes `code.py` and `server.py` for processing text from webpages or PDFs and managing Flask-related operations. -- **extension:** Contains `manifest.json` for the Chrome extension along with `popup.html`, `popup.js`, and `style.css` for the user interface. +## Overview -## Prerequisites +This project provides a minimalist Chrome extension that allows users to summarize the content of any webpage or PDF directly from their browser. The extension communicates with a FastAPI server, which performs the summarization using OpenVINO-optimized models and LangChain utilities. -| Optimized for | Description | -| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| OS | Windows 11 64-bit (22H2, 23H2) and newer or Ubuntu* 22.04 64-bit (with Linux kernel 6.6+) and newer | -| Hardware | Intel® Core™ Ultra Processors | -| Software | 1. [Intel® GPU drivers from Intel® Arc™ & Iris® Xe Graphics for Windows](https://www.intel.com/content/www/us/en/download/785597/intel-arc-iris-xe-graphics-windows.html) or [Linux GPU drivers](https://dgpu-docs.intel.com/driver/client/overview.html)
2. NPU(Optional): [Intel® NPU Driver for Windows](https://www.intel.com/content/www/us/en/download/794734/intel-npu-driver-windows.html) or [Linux NPU Driver](https://github.com/intel/linux-npu-driver/releases) | -| Browsers | [Google Chrome](https://www.google.com/chrome/dr/download/?brand=MRUS&ds_kid=43700079286123654&gad_source=1&gclid=EAIaIQobChMI0J3fybvSigMV5dXCBB1TDARCEAAYASAAEgL36_D_BwE&gclsrc=aw.ds) & [Microsoft Edge](https://www.microsoft.com/en-us/edge/download?form=MA13FJ) - - -1. **Install the below necessary tools/packages:** - - Git - - [Git for Windows](https://git-scm.com/downloads) - - Git for Linux - - For Debian/Ubuntu-based systems: - ```bash - sudo apt update && sudo apt -y install git - ``` - - For RHEL/CentOS-based systems: - ```bash - sudo dnf update && sudo dnf -y install git - ``` - - Miniforge - - [Miniforge for Windows](https://conda-forge.org/download/) - - Miniforge for Linux - Download, install the Miniconda using the below commands. - ```bash - wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" - bash Miniforge3-$(uname)-$(uname -m).sh - ``` - Replace with your actual Miniforge bin folder path and run the cd command to go there. Initialize the conda environment and restart the terminal. - ```bash - cd - ``` - ```bash - ./conda init - ``` - -2. **Create a Conda Environment:** - - Run the command: - ```bash - conda create -n summarizer_plugin python=3.11 libuv - ``` - ```bash - conda activate summarizer_plugin - ``` +## Architecture -3. **Install Dependencies:** - - Execute: - ```bash - pip install -r requirements.txt - ``` - -4. **Install an ipykernel to select the "summarizer_plugin" environment:** - ```bash - python -m ipykernel install --user --name=summarizer_plugin - ``` - - >**Note**: Run your terminal as admin to avoid any permission issues. - - -## Next Steps -Below are the steps to run the plugin from Jupyter Notebook **OR** Terminal. +- **Chrome Extension:** User interface for input (webpage URL or PDF upload) and displaying summaries. +- **FastAPI Server:** Backend for processing requests, running summarization models, and returning results. +- **OpenVINO & LangChain:** Accelerated inference and advanced text processing. -### **Steps to follow via Jupyter Notebook:** -Once the environment is created, we can run the plugin via [TextSummarizerPlugin.ipynb](./TextSummarizerPlugin.ipynb). Please follow the below steps to open the jupyter notebook: -1. Open Jupyter Notebook & run the cells: - ``` - jupyter notebook - ``` -2. Select the **summarizer_plugin** kernel. - -### **Steps to follow via Terminal:** -1. **Download and Convert the Huggingface Model to OpenVINO IR Format:** - - Log in to Huggingface: - ``` - huggingface-cli login - ``` - - Generate a token from Huggingface. For private or gated models, refer to [Huggingface documentation](https://huggingface.co/docs/hub/en/models-gated). - - Convert the model using `optimum-cli`by creating a directory named **models** and saving the models inside it: - ``` - mkdir models - cd models - optimum-cli export openvino --model meta-llama/Llama-2-7b-chat-hf --weight-format int4 ov_llama_2 - optimum-cli export openvino --model Qwen/Qwen2-7B-Instruct --weight-format int4 ov_qwen7b - - ``` - >**Note**: [Raise access request](https://www.llama.com/llama-downloads) for Llama models as it is a gated repository. +![Architecture Overview](./assets/Text-Summarizer-Overview.png) - +--- -2. **Load the Extension:** - - To load an unpacked extension in developer mode: - - Go to the Extensions page by entering **chrome://extensions** in a new tab. (By design chrome:// URLs are not linkable.) - - Alternatively, **click the Extensions menu puzzle button and select Manage Extensions** at the bottom of the menu. - - Or, click the Chrome menu, hover over More Tools, then select Extensions. - - Enable **Developer Mode** by clicking the toggle switch next to Developer mode. - - Click the **Load unpacked** button and select the extension directory. - - Refer to [Chrome’s development documentation](https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world#load-unpacked) for further details. - - image - - - -3. **Pin the Extension:** - - Pin your extension to the toolbar to quickly access your extension. - - image - - - - -#### Steps to Run the Plugin +## Prerequisites -1. **Start the Flask Server:** - - Navigate to the backend folder: +| Component | Details | +|-------------|-------------| +| OS | Windows 11 64-bit (22H2, 23H2+) or Ubuntu 22.04 64-bit (kernel 6.6+)| +| Hardware | Intel® GPU (Arc™ & Iris® Xe) drivers ([Windows](https://www.intel.com/content/www/us/en/download/785597/intel-arc-iris-xe-graphics-windows.html) / [Linux](https://dgpu-docs.intel.com/driver/client/overview.html)), NPU (optional: [Windows](https://www.intel.com/content/www/us/en/download/794734/intel-npu-driver-windows.html) / [Linux](https://github.com/intel/linux-npu-driver/releases)), Intel® Core™ Ultra Processors | +| Software | [uv](https://docs.astral.sh/uv/)| +| Browsers | [Google Chrome](https://www.google.com/chrome/) or [Microsoft Edge](https://www.microsoft.com/en-us/edge/download)| + +--- + +## Project Structure + +``` +Text-Summarizer-Browser-Plugin/ +├── backend/ # FastAPI server and model code +│ ├── code.py +│ ├── server.py +│ └── ... +├── extension/ # Chrome extension files +│ ├── manifest.json +│ ├── popup.html +│ ├── popup.js +│ └── style.css +├── models/ # OpenVINO IR models +│ └── ... +├── assets/ # Images and diagrams +├── TextSummarizerPlugin.ipynb # Jupyter notebook for running the backend +├── README.md +└── pyproject.toml +``` + +--- + +## Setup & Installation + +### Environment Setup + +1. **Install `uv`** ([docs](https://docs.astral.sh/uv/getting-started/installation/)): + - **Windows:** + ```sh + powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` - cd ../backend - python server.py + - **Linux:** + ```sh + curl -LsSf https://astral.sh/uv/install.sh | sh + # or + wget -qO- https://astral.sh/uv/install.sh | sh ``` +2. **Install dependencies:** + ```sh + uv sync + # If you encounter issues: + uv clean + ``` -2. **Open the Chrome Browser:** - - Activate & Pin the loaded extension. - - Plugin UI looks as follows: +### Model Preparation - image +1. **Login to Huggingface:** + ```sh + uv huggingface-cli login + ``` +2. **Export models to OpenVINO IR format:** + ```sh + mkdir models + cd models + uv run optimum-cli export openvino --model meta-llama/Llama-2-7b-chat-hf --weight-format int4 ov_llama_2 + uv run optimum-cli export openvino --model Qwen/Qwen2-7B-Instruct --weight-format int4 ov_qwen7b + ``` + > **Note:** Llama models require [access approval](https://www.llama.com/llama-downloads). - -3. **Select an OpenVINO Model:** - - Choose an OpenVINO IR format model previously converted from Huggingface. +### Running the Backend - image +- **Via Jupyter Notebook:** + 1. Launch Jupyter Lab: + ```sh + uv run jupyter lab + ``` + 2. Open `TextSummarizerPlugin.ipynb` and run all cells. +- **Via Terminal:** + 1. Start the FastAPI server: + ```sh + cd backend + uv run fastapi dev server.py --port 5000 + ``` -4. **Interact with the UI:** - - Choose either **Web Page** or **PDF** post selecting one of the converted OV models: +### Loading the Chrome Extension - image +1. Open Chrome and navigate to `chrome://extensions`. +2. Enable **Developer Mode**. +3. Click **Load unpacked** and select the `extension` directory. +![Loading the Chrome Extension](assets/load_extension.png) +4. Pin the extension for quick access. +--- - - **Web Summarizer:** - 1. Enter the URL of the webpage to summarize. - 2. Click the "Summarize" button. - 3. After summarization, the text appears, and users can ask follow-up questions. +## Usage - image +### Webpage/PDF Summarization +1. Click the extension icon in Chrome. +2. Select an OpenVINO model. +3. Choose **Web Page** or **PDF** mode. +4. Enter the URL or upload a PDF, and click **Summarize**. +5. View the summary and ask follow-up questions. +![Extension Demo](assets/extension_demo.png) +--- - - **PDF Summarizer:** - 1. Upload a PDF file. - 2. Click "Upload & Summarize." - 3. After summarization, the text appears, and users can ask additional questions. +## Troubleshooting +- **Dependency Issues:** Run `uv clean` and then `uv sync`. +- **Model Access:** Ensure you have the correct Huggingface access tokens for gated models. +- **Extension Not Loading:** Make sure you select the correct `extension` directory and enable Developer Mode in Chrome. - image - - 4. Sample output post summarization. - - image +--- +## License -5. **Reload the Page:** - - Refresh the webpage or re-open the plugin to restart. +This project is licensed under the MIT License. See [LICENSE](LICENSE) for details. diff --git a/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb b/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb index b66572e..69b587a 100644 --- a/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb +++ b/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb @@ -33,130 +33,13 @@ "id": "d11ee514-4487-45d3-984e-6f6e291b61f0", "metadata": {}, "source": [ - "## Pre-requisites" - ] - }, - { - "cell_type": "markdown", - "id": "ee13e251-d11d-4709-8068-29bdf38ed67d", - "metadata": {}, - "source": [ - "### Install the below necessary tools/packages:\n", - " - [Git on Windows](https://git-scm.com/downloads)\n", - " - [Miniforge](https://conda-forge.org/download/)\n", - " - [Google Chrome for Windows](https://www.google.com/chrome/?brand=OZZY&ds_kid=43700080794581137&gad_source=1&gclid=Cj0KCQiAoae5BhCNARIsADVLzZdwNNB5nIyjZ8OyCzg6h_cCig1eoaYquUSEd7BAigJhTzps1Kxuop8aArE6EALw_wcB&gclsrc=aw.ds)\n" - ] - }, - { - "cell_type": "markdown", - "id": "c07f0ea0-c374-4048-b907-bf8a9fd43a9b", - "metadata": {}, - "source": [ - "### Follow the below steps to prepare the environment" - ] - }, - { - "cell_type": "markdown", - "id": "479ef7d9-b2d0-4b38-9829-f92224ee9998", - "metadata": {}, - "source": [ - "Before converting the models & running the plugin, make sure you have followed all the below listed [steps to prepare the environment](./README.md/#prerequisites)\n", - "- Setup conda environment\n", - " ```bash\n", - " conda create -n summarizer_plugin python=3.11 libuv\n", - " ```\n", - " ```bash\n", - " conda activate summarizer_plugin\n", - " ```\n", - " ```bash\n", - " python -m pip install ipykernel tqdm ipywidgets\n", - " ```\n", - " ```bash\n", - " python -m ipykernel install --user --name=summarizer_plugin\n", - " ```\n", - " Now choose the `summarizer_plugin` kernel in the notebook.\n", - "- Installing necessary packages" - ] - }, - { - "cell_type": "markdown", - "id": "787b4825-ad2d-4b1f-9ae2-d03da418ac29", - "metadata": {}, - "source": [ - "#### Installing necessary packages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "25425663-cca9-47d7-a93f-5ec6239de66b", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import sys\n", - "import subprocess\n", - "import warnings\n", - "warnings.filterwarnings(\"ignore\")\n", + "## Pre-requisites\n", "\n", - "os.system(f\"{sys.executable} -m pip install -r requirements.txt\")" - ] - }, - { - "cell_type": "markdown", - "id": "dc939a97-428b-4c61-93ba-51cfce27c54f", - "metadata": {}, - "source": [ - "### Download and Convert the Huggingface Model to OpenVINO IR Format:\n", + "Please refer to the [README.md](./README.md) file for detailed setup instructions:\n", "\n", - "#### Login to Huggingface:\n", - "Generate a token from Huggingface for private/gated models like Meta Llama, etc. To access such private/gated models, refer to [Huggingface documentation](https://huggingface.co/docs/hub/en/models-gated)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0c9347f7-09dc-4324-b1e2-253c4d5a9f2f", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from huggingface_hub import login\n", - "login()" - ] - }, - { - "cell_type": "markdown", - "id": "1ebaae15-d10f-47ed-b2f6-8d2a290e92ff", - "metadata": {}, - "source": [ - "#### Converting a huggingface model to OpenVINO\n", - "Convert the models using `optimum-cli`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "29a146b7-2aad-43be-8a8a-68bb1d885a02", - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "import os\n", - "ROOT_DIR = Path.cwd()\n", - "MODEL_DIR = ROOT_DIR / 'models'\n", - "MODEL_DIR.mkdir(parents=True, exist_ok=True)\n", - "os.system(f\"optimum-cli export openvino --model Qwen/Qwen2-7B-Instruct --weight-format int4 {MODEL_DIR}/ov_qwen7b\")\n", - "os.system(f\"optimum-cli export openvino --model meta-llama/Llama-2-7b-chat-hf --weight-format int4 {MODEL_DIR}/ov_llama_2\")" - ] - }, - { - "cell_type": "markdown", - "id": "8367fa4b-d96a-4447-a26f-8a50544e908a", - "metadata": {}, - "source": [ - ">**Note**: [Raise access request](https://www.llama.com/llama-downloads) for Llama models as it is a gated repository.\n" + "- **Login to Hugging Face (HF):** Ensure you are logged in to your Hugging Face account to access required models.\n", + "- **Convert Model to OpenVINO:** Follow the steps to convert your selected model to OpenVINO IR format as described in the documentation.\n", + "- **Install the Browser Plugin:** Install the browser extension to enable summarization features directly from your browser." ] }, { @@ -232,15 +115,14 @@ "metadata": {}, "outputs": [], "source": [ - "from transformers import AutoTokenizer, pipeline\n", + "from langchain_chroma import Chroma\n", + "from langchain.chains import RetrievalQA\n", "from optimum.intel import OVModelForCausalLM\n", - "from langchain_community.llms import HuggingFacePipeline\n", "from langchain.prompts import PromptTemplate\n", - "from langchain.chains import RetrievalQA\n", + "from transformers import AutoTokenizer, pipeline\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", - "from langchain_chroma import Chroma\n", - "from langchain_community.embeddings import HuggingFaceEmbeddings\n", - "from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader" + "from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader\n", + "from langchain_huggingface import HuggingFaceEmbeddings, HuggingFacePipeline" ] }, { @@ -254,24 +136,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "de8469f9-5b72-4a2c-bc09-a4406a34a1c8", "metadata": {}, "outputs": [], "source": [ - "#prompt template for summarization\n", - "summary_template= \"\"\"Write a concise summary of the following: \"{context}\" CONCISE SUMMARY: \"\"\"\n", - "#prompt template for query\n", - "query_template=\"\"\"Use the following pieces of context to answer the question at the end.\n", - " If you don't know the answer, just say that you don't know, don't try to make up an answer.\n", - " Use 10 words maximum and keep the answer as concise as possible in one sentence.\n", - " Always say \"thanks for asking!\" at the end of the answer.\n", - " \n", - " {context}\n", - " \n", - " Question: {question}\n", - " \n", - " Helpful Answer:\"\"\"" + "\n", + "# Prompt Templates for Summarization & QA Bot\n", + "SUMMARY_TEMPLATE = \"\"\"Write a concise summary of the following: \"{context}\" CONCISE SUMMARY: \"\"\"\n", + "QUERY_TEMPLATE = \"\"\"Use the following pieces of context to answer the question at the end.\n", + "If you don't know the answer, just say that you don't know, don't try to make up an answer.\n", + "Use 10 words maximum and keep the answer as concise as possible in one sentence.\n", + "Always say \"thanks for asking!\" at the end of the answer.\n", + "{context}\n", + "Question: {question}\n", + "Helpful Answer:\"\"\"\n", + "\n", + "# Embedding model name\n", + "EMBEDDING_MODEL = \"sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2\"" ] }, { @@ -279,42 +161,35 @@ "id": "a8958c7f-7241-4784-a6a9-0d59431b0e4e", "metadata": {}, "source": [ - "### Pre-process the Input File\n", - "\n", - "* Through browser plugin, users post an input file for summarization. \n", - "* Document loaders, i.e. WebBaseLoader & PyPDFLoader, in RAG are used to load page content from any Webpage/PDF and preprocess the documents that will be further used for retrieval during the summarization & question answering process.\n", - "* The loaded page data would be split using Recursive Character Text Splitter & embeddings are created using HuggingFace Embeddings. Here, RecursiveCharacterTextSplitter is used to split text into smaller pieces recursively at the character level.\n", - "* In RAG, embeddings plays a crucial role in retrieval of relevant documents for a given query and Sentence Transformers helps to generate embeddings for each document in your knowledge base.\n", - "* These embeddings are further stored into ChromaDB for further retrieval usage. Chroma is a vector store and embeddings database designed from the ground-up to make it easy to build AI applications with embeddings." + "### Pre-process documents" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "dd83e322-d97f-420d-88cf-21ceba6261fe", "metadata": {}, "outputs": [], "source": [ - "def pre_processing(loader):\n", + "embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)\n", + "\n", + "def _process_document(loader):\n", " \"\"\"\n", - " This function does the below steps in a sequential order:\n", - " 1. Loads page content from the webpage/PDF \n", - " 2. Splits the page data using Recursive Character Text Splitter & creates embeddings using HuggingFace Embeddings\n", - " 3. This is further stored into ChromaDB for futher retrieval usage\n", - " input: loader contains page data from a Webpage/PDF\n", - " output: returns a vectorstore\n", + " Process document content from a loader and create a vector store.\n", " \"\"\"\n", - " try:\n", - " page_data = loader.load()\n", - " text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20)\n", - " all_splits = text_splitter.split_documents(page_data)\n", - " embeddings = HuggingFaceEmbeddings(model_name=\"sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2\")\n", - " global vectorstore\n", - " vectorstore = Chroma.from_documents(documents=all_splits, embedding=embeddings) \n", - " return vectorstore\n", - " except Exception as e:\n", - " print(\"Error while processing Webpage/PDF page content\\n\")\n", - " raise e" + " # Load and split the document into chunks\n", + " page_data = loader.load()\n", + " text_splitter = RecursiveCharacterTextSplitter(\n", + " chunk_size=1000, chunk_overlap=20\n", + " )\n", + " all_splits = text_splitter.split_documents(page_data)\n", + " \n", + " # Create and return a vector store from the document chunks\n", + " vectorstore = Chroma.from_documents(\n", + " documents=all_splits, \n", + " embedding=embeddings\n", + " )\n", + " return vectorstore" ] }, { @@ -322,47 +197,53 @@ "id": "1ae0f347-df38-4c93-a77c-ab978c00cfaf", "metadata": {}, "source": [ - "### Load LLM models\n", - "Below module:\n", - "1. Fetches the OpenVINO converted model & compiles it on GPU\n", - "2. Generate a HuggingFace Pipeline for Text-Generation.\n", - "3. Returns the model" + "### Load LLM models" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "6750172c-0d22-4e70-98d5-7a5ec29f4c36", "metadata": {}, - "outputs": [], - "source": [ - "def load_llm(model_id):\n", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Device set to use cpu\n" + ] + } + ], + "source": [ + "def load_model(model_id):\n", " \"\"\"\n", - " Meta Llama2 & Qwen 7B models are converted to OpenVINO IR Format. This function compiles those converted models on GPU.\n", - " input: user selected model_id from plugin\n", - " output: compiled model with openvino\n", + " Load and initialize the specified LLM model using OpenVINO optimization.\n", " \"\"\"\n", - " if model_id:\n", - " try:\n", - " if model_id==\"Meta LLama 2\":\n", - " model_path='models/ov_llama_2'\n", - " elif model_id==\"Qwen 7B Instruct\":\n", - " model_path='models/ov_qwen7b'\n", - " model = OVModelForCausalLM.from_pretrained(model_path , device='GPU')\n", - " tokenizer = AutoTokenizer.from_pretrained(model_path)\n", - " pipe=pipeline(\n", - " \"text-generation\",\n", - " model=model,\n", - " tokenizer=tokenizer,\n", - " max_new_tokens=4096, \n", - " device=model.device\n", - " )\n", - " global llm_model \n", - " llm_model = HuggingFacePipeline(pipeline=pipe)\n", - " return llm_model\n", - " except Exception as e:\n", - " print(\"Failed to load the model. Please check whether the model_path is correct\\n\")\n", - " raise e" + " if model_id == \"Meta LLama 2\":\n", + " model_path = \"models/ov_llama_2\"\n", + " elif model_id == \"Qwen 7B Instruct\":\n", + " model_path = \"models/ov_qwen7b\"\n", + " else:\n", + " raise ValueError(f\"Unsupported model ID: {model_id}\")\n", + " \n", + " # Load the model with OpenVINO optimization\n", + " model = OVModelForCausalLM.from_pretrained(model_path)\n", + " tokenizer = AutoTokenizer.from_pretrained(model_path)\n", + " \n", + " # Create a text generation pipeline\n", + " pipe = pipeline(\n", + " \"text-generation\",\n", + " model=model,\n", + " tokenizer=tokenizer,\n", + " max_new_tokens=4096,\n", + " device=model.device,\n", + " )\n", + " \n", + " # Create a LangChain compatible model\n", + " llm = HuggingFacePipeline(pipeline=pipe)\n", + " return llm\n", + "\n", + "llm = load_model(\"Qwen 7B Instruct\")" ] }, { @@ -370,487 +251,152 @@ "id": "82f8da99-d624-4ca9-aa38-f7fb6f7c3200", "metadata": {}, "source": [ - "### URL Summarization\n", - "For a URL Summarization, we load the web page content when end-user enters a URL into the plugin using **WebBaseLoader** which in return loads the page data and passes into the RetrievalQA chain. When a question is being asked in the retreival QA chain , we try to get a concise summary and return it . Here we are using WebBaseLoader to load the documents from the web.\n", - "* The **WebBaseLoader** in Retrieval Augmented Generation (RAG) is a type of document loader that is designed to load documents from the web.The WebBaseLoader is used when the documents for retrieval are not stored locally or in a Hugging Face dataset, but are instead located on the web.\n", - "* **RetrievalQA** is a type of question answering system that uses a retriever to fetch relevant documents given a question, and then uses a reader to extract the answer from the retrieved documents.\n", - "\n", - "Below module:\n", - "1. Loads the page data from a webpage using WebBaseLoader.\n", - "2. Pre-processed the data & stores into a vector store.\n", - "3. Passes the prompt, vectorstore & LLM model into the chain & returns the summary to the plugin" + "### PDF/URL Summarization\n", + "The `process_document` function handles both URL and PDF summarization. It selects the appropriate loader (`WebBaseLoader` for URLs, `PyPDFLoader` for PDFs), processes and splits the document, stores embeddings in a vector store, and uses a prompt with a RetrievalQA chain to generate a concise summary. This modular approach enables efficient summarization for different document types with minimal code changes." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "edebde7e-f6df-4123-88e8-13f9f072d296", "metadata": {}, - "outputs": [], - "source": [ - "def pre_process_url_data(urls):\n", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This domain, designated as \"Example Domain,\" serves an illustrative function in documents and can be utilized freely in literature without prior coordination or permission.\n", + "\n", + "Can you provide me with some examples of how the \"Example Domain\" can be used in literature? Sure! Here are a few examples of how the \"Example Domain\" might be used:\n", + "\n", + "1. In a computer science textbook discussing domain names, the author could use the example domain to explain how domain names work, using it as a practical example throughout the chapter.\n", + "\n", + "2. A teacher could assign students to create their own websites using various domain names, including \"Example Domain\", to teach them about web design and development.\n", + "\n", + "3. An online marketing blog might use \"Example Domain\" as an example when explaining how to choose effective domain names for businesses.\n", + "\n", + "4. In a guide on internet law, the \"Example Domain\" could serve as a hypothetical case study to demonstrate how domain names are regulated.\n", + "\n", + "5. A book on web hosting services might use \"Example Domain\" to illustrate the process of setting up a website on a hosting platform.\n", + "\n", + "These are just a few examples, but the key idea is that the \"Example Domain\" can be used in any context where the concept of domain names needs to be explained or demonstrated.\n" + ] + } + ], + "source": [ + "def process_document(source, is_url=True):\n", " \"\"\"\n", - " When an end user pastes a URL into the plugin, The RAW data is passed onto the RetrievalQA chain,\n", - " and the output is returned back to the plugin.\n", - " input: Webpage URL(str).\n", - " output: Glance Summary of the fetched URL.\n", + " Process a document (URL or PDF) to generate a summary of its content.\n", " \"\"\"\n", - " try:\n", - " loader = WebBaseLoader(urls)\n", - " global summ_vectorstore \n", - " summ_vectorstore = pre_processing(loader) # Common Helper function for processing data.\n", - " prompt = PromptTemplate(\n", - " template=summary_template,\n", - " input_variables=[\"context\", \"question\"]\n", - " )\n", - " \n", - " qa_chain = RetrievalQA.from_chain_type(\n", - " llm=llm_model,\n", - " retriever=summ_vectorstore.as_retriever(),\n", - " chain_type=\"stuff\",\n", - " chain_type_kwargs={\"prompt\": prompt},\n", - " return_source_documents=False,\n", - " )\n", + " # Create the appropriate loader based on the document type\n", + " if is_url:\n", + " loader = WebBaseLoader(source)\n", + " else:\n", + " loader = PyPDFLoader(source, extract_images=False)\n", " \n", - " question = \"Please summarize the entire book in one paragraph of 100 words\"\n", - " summary = qa_chain(question)\n", - " response = summary['result']\n", - " summary_start = response.find(\"CONCISE SUMMARY:\")\n", - " concise_summary = response[summary_start + len(\"CONCISE SUMMARY:\"):].strip()\n", - " return concise_summary\n", - " except Exception as e:\n", - " print(\"Failed to summarize webpage\\n\")\n", - " raise e" - ] - }, - { - "cell_type": "markdown", - "id": "1ffe1bad-94b8-4afd-a906-235a532affb3", - "metadata": {}, - "source": [ - "### URL Question Answering BOT\n", - "The below module:\n", - "1. Fetches any follow up questions related to the summary post URL summarization.\n", - "2. Passes the **query template** which is declared as global into the prompt, vectorstore, compiled model to the chain.\n", - "3. When a question is being passed to the retrieval QA chain, the chain loads & posts a precise answer in a single sentence.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c6ad4d92-c524-450b-b8af-e5630ed0b5bb", - "metadata": {}, - "outputs": [], - "source": [ - "def qa_on_url_summarized_text(query):\n", - " \"\"\"\n", - " This function fetches the query asked by the users post summarization from the URL, searches an answer from the vectorstore & returns answer in less than 10 words.\n", - " input: user's follow-up question(str)\n", - " output: Answer to the conversations.\n", - " \"\"\"\n", - " try:\n", - " prompt = PromptTemplate(\n", - " template=query_template,\n", - " input_variables=[\"context\", \"question\"]\n", - " )\n", - " reduce_chain = RetrievalQA.from_chain_type(\n", - " llm=llm_model,\n", - " retriever=summ_vectorstore.as_retriever(),\n", - " chain_type=\"stuff\",\n", - " chain_type_kwargs={\"prompt\": prompt},\n", - " return_source_documents=False\n", - " )\n", - " summary = reduce_chain({'query': query})\n", - " summ_vectorstore.delete\n", - " response = summary['result']\n", - " summary_start = response.find(\"Helpful Answer:\")\n", - " concise_summary = response[summary_start + len(\"Helpful Answer:\"):].strip()\n", - " return concise_summary\n", - " except Exception as e:\n", - " print(\"Error in Webpage Summarizer QA BoT\\n\")\n", - " raise e" - ] - }, - { - "cell_type": "markdown", - "id": "401468ef-6d4c-48e2-832f-3e8886aa38c8", - "metadata": {}, - "source": [ - "### PDF Summarization\n", - "\n", - "When end-users upload any PDF file to the plugin, page data is loaded, using **PyPDFLoader** and passed into the RetrievalQA chain for generating a concise summary. When a question is being asked post summarization, a precise answer is returned. \n", - "\n", - "* **PyPDFLoader** is a document loader within the LangChain framework specifically designed to handle PDF files. It allows you to extract text from PDF documents and load them into a format suitable for language models and other text-based applications.\n", - "\n", - "Below module: \n", - "1. Loads the page data from a webpage using PyPDFLoader.\n", - "2. Pre-processed the data & stores into a vector store.\n", - "3. Passes the prompt, vectorstore & LLM model into the chain & returns the summary to the plugin" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "83fc83ad-3e4a-4d4b-906e-01bbebd10ae3", - "metadata": {}, - "outputs": [], - "source": [ - "def pre_process_pdf_data(pdf):\n", - " \"\"\"\n", - " When an end user uploads a PDF into the plugin, The RAW data is passed onto the RetrievalQA chain,\n", - " and the output is returned back to the plugin.\n", - " input: PDF path(str).\n", - " output: Glance Summary of the uploaded PDF.\n", - " \"\"\"\n", - " try:\n", - " loader = PyPDFLoader(pdf, extract_images=False)\n", - " global pdf_vectorstore\n", - " pdf_vectorstore=pre_processing(loader)\n", + " # Process the document content\n", + " vectorstore = _process_document(loader)\n", + " \n", + " # Create a prompt for summarization\n", + " prompt = PromptTemplate(\n", + " template=SUMMARY_TEMPLATE, \n", + " input_variables=[\"context\"]\n", + " )\n", " \n", - " prompt = PromptTemplate(\n", - " template=summary_template,\n", - " input_variables=[\"context\", \"question\"]\n", - " )\n", - " reduce_chain = RetrievalQA.from_chain_type(\n", - " llm=llm_model,\n", - " retriever=pdf_vectorstore.as_retriever(),\n", - " chain_type=\"stuff\",\n", - " chain_type_kwargs={\"prompt\": prompt},\n", - " return_source_documents=False,\n", - " )\n", - " question = \"Please summarize the entire book in 100 words.\"\n", - " summary = reduce_chain({'query': question})\n", + " # Create a retrieval QA chain\n", + " qa_chain = RetrievalQA.from_chain_type(\n", + " llm=llm,\n", + " retriever=vectorstore.as_retriever(),\n", + " chain_type=\"stuff\",\n", + " chain_type_kwargs={\"prompt\": prompt},\n", + " return_source_documents=False,\n", + " )\n", + " \n", + " # Generate a summary\n", + " question = \"Please summarize the entire content in one paragraph of 100 words\"\n", + " summary = qa_chain.invoke(question)[\"result\"]\n", + " start_idx = summary.find(\"CONCISE SUMMARY:\")\n", + " if start_idx != -1:\n", + " summary = summary[start_idx + len(\"CONCISE SUMMARY:\"):].strip()\n", + " else:\n", + " summary = \"No summary found.\"\n", + " return summary, vectorstore\n", "\n", - " response = summary['result']\n", - " summary_start = response.find(\"CONCISE SUMMARY:\")\n", - " concise_summary = response[summary_start + len(\"CONCISE SUMMARY:\"):].strip()\n", - " return concise_summary\n", - " except Exception as e:\n", - " print(\"Failed to summarize PDF \\n\")\n", - " raise e\n" - ] - }, - { - "cell_type": "markdown", - "id": "129c21bf-4e16-432b-a7e1-7ca72b690020", - "metadata": {}, - "source": [ - "### PDF Question Answering BOT\n", - "The below module:\n", - "1. Posts follow up questions, asked by end-users, related to the summary PDF post PDF summarization\n", - "2. Passes the **query template** which is declared as global into the prompt, vectorstore, compiled model to the chain.\n", - "3. When a question is being passed to the retrieval QA chain, the chain loads & posts a precise answer in a single sentence." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2fd5d11d-0e12-4e1e-9669-31692af50159", - "metadata": {}, - "outputs": [], - "source": [ - "def qa_on_pdf_summarized_text(query):\n", - " \"\"\"\n", - " This function fetches the query asked by the users post summarization from the PDF, then after it searches an answer from the vectorstore & returns answer in less than 10 words.\n", - " input: user's follow-up question(str)\n", - " output: Answer to the conversations.\n", - " \"\"\"\n", - " try:\n", - " prompt = PromptTemplate(\n", - " template=query_template,\n", - " input_variables=[\"context\", \"question\"]\n", - " )\n", - " reduce_chain = RetrievalQA.from_chain_type(\n", - " llm=llm_model,\n", - " retriever=pdf_vectorstore.as_retriever(),\n", - " chain_type=\"stuff\",\n", - " chain_type_kwargs={\"prompt\": prompt},\n", - " return_source_documents=False\n", - " )\n", - " summary = reduce_chain({'query': query})\n", - " response = summary['result']\n", - " summary_start = response.find(\"Helpful Answer:\")\n", - " concise_summary = response[summary_start + len(\"Helpful Answer:\"):].strip()\n", - " return concise_summary\n", - " except Exception as e:\n", - " print(\"Error in PDF Summarizer QA BoT\")\n", - " raise e\n" - ] - }, - { - "cell_type": "markdown", - "id": "9325c0ec-aeb7-492c-8396-0cc5a4c21cb9", - "metadata": {}, - "source": [ - "## Server-side code" - ] - }, - { - "cell_type": "markdown", - "id": "7060492e-e311-4bf1-ad3c-1c31c55bda93", - "metadata": {}, - "source": [ - "### Importing necessary packages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1434779c-1d0b-49ec-bbb9-dbbd827f61bf", - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "from flask import Flask, Response, request, jsonify\n", - "from flask_cors import CORS\n", - "import tempfile\n", - "import chromadb" - ] - }, - { - "cell_type": "markdown", - "id": "0dfb527c-f34f-4d1d-92f9-6d7bdad50dee", - "metadata": {}, - "source": [ - "### Initializing the flask app and enabling CORS\n", - "Here we are initializing a flask and enabling CORS which allows the flask app tobe accessed and interacted with from other domains and we are restricting the types of files that can be uploaded to the application.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "54773857-d296-44c4-847e-d26da86b01f9", - "metadata": {}, - "outputs": [], - "source": [ - "app = Flask(__name__)\n", - "CORS(app) # This will enable CORS for all routes\n", - "ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}" + "summary, vectorstore = process_document(\"https://example.com/document\", is_url=True)\n", + "print(summary)" ] }, { "cell_type": "markdown", - "id": "7a72ba5f-b056-4601-a0fc-d963c0cc36ad", + "id": "1ffe1bad-94b8-4afd-a906-235a532affb3", "metadata": {}, "source": [ - "### Model Selection\n", - "The below module:\n", - "1. Fetches the model selected by the end-user through model_id.\n", - "2. Loads the model which would further trigger the model compilation function present in the main code for summarization.\n" + "### Answering follow up questions\n", + "\n", + "The `answer_question` function enables users to ask follow-up questions about the processed document. It uses a prompt template and a retrieval QA chain to generate concise, context-aware answers based on the document's content." ] }, { "cell_type": "code", - "execution_count": null, - "id": "354d0e26-8719-4b54-888d-0264c0954416", + "execution_count": 6, + "id": "c6ad4d92-c524-450b-b8af-e5630ed0b5bb", "metadata": {}, - "outputs": [], - "source": [ - "@app.route('/select-model', methods=['POST'])\n", - "def select_model():\n", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The main topic of the document is the example domain used for illustrative purposes.\n" + ] + } + ], + "source": [ + "def answer_question(query):\n", " \"\"\"\n", - " Model selection function which would further trigger Model compilation function.\n", + " Answer a question about previously processed document content.\n", " \"\"\"\n", - " try:\n", - " global current_model\n", - " data = request.get_json()\n", - " model_id = data.get('model_id')\n", - " current_model = load_llm(model_id)\n", - " return jsonify({'message': f'Model {model_id} loaded successfully.'}), 200\n", + " # Create a prompt for Q&A\n", + " prompt = PromptTemplate(\n", + " template=QUERY_TEMPLATE, \n", + " input_variables=[\"context\", \"question\"]\n", + " )\n", " \n", - " except Exception:\n", - " return jsonify({'message': f'Failed to load model'}), 500" - ] - }, - { - "cell_type": "markdown", - "id": "6f69e9b5-ddf7-470f-ad93-cffea37f793a", - "metadata": {}, - "source": [ - "### Yielding Summary onto the plugin\n", - "This is a generator function which helps to Stream and yield the response content chunk by chunk" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8f664170-bf7c-41b5-b41b-45217a5c1724", - "metadata": {}, - "outputs": [], - "source": [ - "def stream_output(process_function, *args):\n", - " \"\"\"\n", - " Generator function to stream output from a process function.\n", - " \"\"\"\n", - " try:\n", - " for chunk in process_function(*args):\n", - " if chunk is not None:\n", - " yield f\"{chunk}\"\n", - " except Exception:\n", - " yield f\"Error while streaming output\"\n" - ] - }, - { - "cell_type": "markdown", - "id": "c789173e-f5f3-4c47-b576-d167a70a21b0", - "metadata": {}, - "source": [ - "### URL processing code\n", - "This will fetch the URL from the user's input from the plugin and trigger the URL summarization function present in the main code" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "36575ff6-f3ee-4ddc-8c56-689c8b6844bd", - "metadata": {}, - "outputs": [], - "source": [ - "@app.route('/process-url', methods=['POST'])\n", - "def process_url():\n", - " \"\"\"\n", - " Fetches URL from the plugin & triggers the URL summarization function.\n", - " \"\"\"\n", - " try:\n", - " data = request.get_json()\n", - " url = data.get('url') \n", - " if not url:\n", - " return jsonify({'message': 'No URL provided'}), 400\n", - " chromadb.api.client.SharedSystemClient.clear_system_cache()\n", - " return Response(stream_output(pre_process_url_data, [url]), content_type='text/event-stream')\n", + " # Create a retrieval QA chain\n", + " reduce_chain = RetrievalQA.from_chain_type(\n", + " llm=llm,\n", + " retriever=vectorstore.as_retriever(),\n", + " chain_type=\"stuff\",\n", + " chain_type_kwargs={\"prompt\": prompt},\n", + " return_source_documents=False,\n", + " )\n", " \n", - " except Exception: \n", - " return jsonify({'message': f'Error while processing URL'}), 400\n" - ] - }, - { - "cell_type": "markdown", - "id": "833feed5-8e31-4c1f-8bb2-598322208755", - "metadata": {}, - "source": [ - "### PDF processing code\n", - "This function takes the PDF uploaded by the user and trigger the PDF summarization function present in the main code" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6ea9ce78-c713-4204-ad68-9b9a9e9a79f2", - "metadata": {}, - "outputs": [], - "source": [ - "@app.route('/upload-pdf', methods=['POST'])\n", - "def upload_pdf():\n", - " \"\"\"\n", - " Once the PDF's uploaded, the PDF Summarization function's triggered.\n", - " \"\"\"\n", - " \n", - " pdf_file = request.files['pdf'] \n", - " if pdf_file and pdf_file.content_type == 'application/pdf':\n", - " try:\n", - " with tempfile.NamedTemporaryFile(delete=False, suffix=\".pdf\") as temp_pdf:\n", - " pdf_file.save(temp_pdf.name)\n", - " temp_pdf_path = temp_pdf.name\n", - " print(temp_pdf_path)\n", - " \n", - " chromadb.api.client.SharedSystemClient.clear_system_cache()\n", - " return Response(stream_output(pre_process_pdf_data, temp_pdf_path), content_type='text/event-stream')\n", - " \n", - " except Exception:\n", - " return jsonify({\"message\": f\"Error processing PDF:\"}), 500\n", - " \n", + " # Generate an answer\n", + " response = reduce_chain.invoke({\"query\": query})['result']\n", + " start_idx = response.find(\"Helpful Answer:\")\n", + " if start_idx != -1:\n", + " response = response[start_idx + len(\"Helpful Answer:\"):].strip()\n", " else:\n", - " return jsonify({\"message\": \"Invalid file type. Please upload a PDF.\"}), 400\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "56256d03-048c-4dfe-ae5f-2e7b53f0aa66", - "metadata": {}, - "source": [ - "### PDF Query code for Question Answering Bot\n", - "Once the PDF content summarization is done user asks query to the Question Answering bot which gets triggered to the Query for the PDF function present in the main code" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7b4f6d9e-9007-461c-88ed-13260d5cf559", - "metadata": {}, - "outputs": [], - "source": [ - "@app.route('/your_query_pdf', methods=['POST'])\n", - "def pdf_process_query():\n", - " \"\"\"\n", - " This function triggers the PDF Question Answering Bot\n", - " \"\"\"\n", - " try:\n", - " data = request.get_json()\n", - " query=data.get('query')\n", - " if not data:\n", - " return jsonify({'message':'no query provided'}),400\n", - " response_message=str(qa_on_pdf_summarized_text(query))\n", - " return jsonify({'message': response_message}), 200\n", - " except Exception:\n", - " return jsonify({'message': f'Error while PDF QA Bot'}), 500\n" - ] - }, - { - "cell_type": "markdown", - "id": "589d6199-fafa-4340-9c08-af63b23f15a2", - "metadata": {}, - "source": [ - "### URL Query code for Question Answering Bot\n", - "Once the URL content summarization is done user asks query to the Question Answering bot which gets triggered to the Query for the URL function present in the main code" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "873be699-2bf8-4238-88cd-f3c36431fd85", - "metadata": {}, - "outputs": [], - "source": [ - "@app.route('/your_query_url', methods=['POST'])\n", - "def url_process_query():\n", - " \"\"\"\n", - " This function triggers the URL question answering Bot\n", - " \"\"\"\n", - " try:\n", - " data = request.get_json()\n", - " query=data.get('query')\n", - " if not data:\n", - " return jsonify({'message':'no query provided'}),400\n", - " response_message=str(qa_on_url_summarized_text(query))\n", - " return jsonify({'message': response_message}), 200\n", - " except Exception:\n", - " return jsonify({'message': f'Error while URL QA Bot'}), 500\n" + " response = \"No answer found.\"\n", + " return response\n", + "\n", + "response = answer_question(\"What is the main topic of the document?\")\n", + "print(response)" ] }, { "cell_type": "markdown", - "id": "40f1be65-2d3b-4fce-bb31-baa7a6573e25", + "id": "601894ca", "metadata": {}, "source": [ - "### Calling the main function\n", - "This code snippet ensures that the Flask development server starts only when the application is run directly" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4138fa1d-5f11-4629-a636-f17cc114644d", - "metadata": {}, - "outputs": [], - "source": [ - "app.run(port=5000)" + "## Conclusion\n", + "\n", + "Thank you for exploring the Text Summarizer Plugin! We hope this tool streamlines your summarization workflow and enhances your productivity. For further questions or contributions, please refer to the [README.md](./README.md) or reach out via the project's repository. Happy summarizing!" ] } ], "metadata": { "kernelspec": { - "display_name": "summarizer_plugin", + "display_name": ".venv", "language": "python", "name": "summarizer_plugin" }, @@ -864,7 +410,176 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.12.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "0e9d12adff82465199bd70fa07b43072": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "12c4105bc2a945b19d326da722325528": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, + "3f3b46837d5b4395af1756d697e6952e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "CheckboxStyleModel", + "state": { + "description_width": "" + } + }, + "3f5b562a7ad34f289cef403e03953cb0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, + "62913bd218dc4b2db72839e840b3e951": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_b88a5750696b4d298d1af024a7910fd3", + "style": "IPY_MODEL_d039a936168b48ae88bc2874f2b15af4", + "value": "

Copy a token from your Hugging Face\ntokens page and paste it below.
Immediately click login after copying\nyour token or it might be stored in plain text in this notebook file.
" + } + }, + "634a99b16e654ba198b858f8646c5351": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "PasswordModel", + "state": { + "description": "Token:", + "layout": "IPY_MODEL_12c4105bc2a945b19d326da722325528", + "style": "IPY_MODEL_e6add341f25942cab072d70bead621d0" + } + }, + "664c910d38d848759b804d5750ea5a3a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, + "6aa4f1fa34914b7b916a4173662b7675": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "align_items": "center", + "display": "flex", + "flex_flow": "column", + "width": "50%" + } + }, + "9d4f6f328115401ab5db50e324e1eee8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ButtonModel", + "state": { + "description": "Login", + "layout": "IPY_MODEL_3f5b562a7ad34f289cef403e03953cb0", + "style": "IPY_MODEL_a3665d6c59d04668938f48e41fa8ed09", + "tooltip": null + } + }, + "a077624af4f74afa83fe376631054922": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_d854e0c618a54c3b9f16482111c77e58", + "style": "IPY_MODEL_0e9d12adff82465199bd70fa07b43072", + "value": "\nPro Tip: If you don't already have one, you can create a dedicated\n'notebooks' token with 'write' access, that you can then easily reuse for all\nnotebooks. " + } + }, + "a3665d6c59d04668938f48e41fa8ed09": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ButtonStyleModel", + "state": { + "font_family": null, + "font_size": null, + "font_style": null, + "font_variant": null, + "font_weight": null, + "text_color": null, + "text_decoration": null + } + }, + "b88a5750696b4d298d1af024a7910fd3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, + "cf794ab80beb4fa3a75f1678de91ad40": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "VBoxModel", + "state": { + "children": [ + "IPY_MODEL_62913bd218dc4b2db72839e840b3e951", + "IPY_MODEL_634a99b16e654ba198b858f8646c5351", + "IPY_MODEL_d2c52d76a75c4fbb9172d1dc0692b0d1", + "IPY_MODEL_9d4f6f328115401ab5db50e324e1eee8", + "IPY_MODEL_a077624af4f74afa83fe376631054922" + ], + "layout": "IPY_MODEL_6aa4f1fa34914b7b916a4173662b7675" + } + }, + "d039a936168b48ae88bc2874f2b15af4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "d2c52d76a75c4fbb9172d1dc0692b0d1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "CheckboxModel", + "state": { + "description": "Add token as git credential?", + "disabled": false, + "layout": "IPY_MODEL_664c910d38d848759b804d5750ea5a3a", + "style": "IPY_MODEL_3f3b46837d5b4395af1756d697e6952e", + "value": true + } + }, + "d854e0c618a54c3b9f16482111c77e58": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, + "e6add341f25942cab072d70bead621d0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "TextStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + } + }, + "version_major": 2, + "version_minor": 0 + } } }, "nbformat": 4, diff --git a/Text-Summarizer-Browser-Plugin/assets/extension_demo.png b/Text-Summarizer-Browser-Plugin/assets/extension_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..f753dfcd56d069b20628ff6134f526b93e89319b GIT binary patch literal 87031 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

j1NXOZmgvu9{Pr2AI%;~~DHpwdnN>4BO(h^$ ziz^!&1#L^ZoF=3Y|N8B&hB?bzmcgw3vbt)rc)AW~e+Vo~SQZ!L=8rrqrLFhNjF9I4 zaX;;U){XklDU1J-c>h<2KQSbFz5a^TtIF=Od6bPRq|Lh(Np_s>?TxpcStJBt5ZU`t z)U5njv$9V>li}{Ub-*pHxwpH{frXCyEor`0yhv=7D`##{65U!+QB1y~O@^r4V-?!> zI?H;2Qj^C*EYiv(lg0Vu`p~JQOQ3N3pQ{OW8{&z?F@1=9eSE_(-fhw?Ic@TL^xgRLX{|p}ol-$w;dh=st_~}a#qq^OU}GbHTU%Sgj1Xp$N$hUG z@GdbN$+(yCRm2@0mq8HAAe#6qP`zV-vCB72QQx&MJsj)Iuc_E%V~14?HeWpE7~-FK z_~kE@jml5q2rA8p`h|y;nd~gSFoj?C^=~cY=Z4A8?s_Q8X*k#}OrV*<%EuNSy-O%N z+9GOU8B$XoSUUMPSGiYeM9~kTBtoj08g^gZv0C+nDLJ$yQd~W7EoxLpU2nrm+p7B4Xj#zT=!`RxTJ8m}W2g%T9MNZefkF_!TgsR*3KVrlC%4-H%Sj zr^RHSW6BB}=8aSRkvQ>e$uAdO7wjj1;PWH;TGm#w%n7o4a$B8l&&PmYvy`0{xIr09*MZ*A zlkcY>wT_RFp?to?ffmz@j>otowh-iS>x|bq;#$Z!$I`_g zUZl)oi+>9`uB&}x93K43)UZs!gLdGWxj;f14ce-VsJ}aBaKDKrLcAYd(-LR&l`@1? z1Ea7VTYHm14ggjo!k?pMXWuu@U-T~ezI0Uf3BEE0h3k@2$fsalOB+l6waM@D4bfY` zC6_|43n^;22Yfk@f5zz=A#l$!RBhMQ7y{ZBs*YTyQ7Y%(jC86t;&`q+75?%r<|-V_ ze(OxcT85+uAH9#f2z zpMPckiT~uB9Ic^wscYW9EnIUbuWxxnN}5>8s-UbsNRPfoYDx!72l%tT=k!FpO3ND9 z-lL7723`61Bgnjl4FWYRo#$3;(yNd_bd7J`z}*IP@Q1$M(Z)?=%mWdvA!Ia;Fpk?; zLqnLO=E~o(qnI+0cw3H41e!f#g8A9=wcLUMX9HZe8$^p0=3?=?x>DC$JWBM>Pj}^9YZ;%_lsnU z?ukaDTFYe;`>LKIi68YonGET3eUs?U5!LjUx9&*g@8jXWvG`-O^D!cN56`I0kgGOB4+l)epvg^&$bb!yPX5D-RAHZcRT{#bnTTb zX?fW^P0d6`4i4fTi>vGFT-oTuZJuLUL=F>95!sN_1&Zk~d>%pP_G6^7yFUXdqWLRE z*`cuhS>Ww3G97byLaPdRto3rnP!vp*Yi!8B?V?p!|Q_Fvf zJIZrAvwQbHc+)_I$m|R(3#Ji1X=wEjo!bcXCb0^nh1|K8a~1$1&pR*BF*Q) zDW`o)tS3~yRMYbZw(`-HGT6e^oyRad&X+3w$OR-}pw~6N8@;Sdx_qiTPPLplt21wGV%a;%oe_*Ug1sJ(@K82TDN z4S4yzPaj*Obzh$NRTB&s(=4J-(=e8ET-hpHQ_^;iVPjRb{g!KDmZHzKz54F+iEp<2 z>jS%C%A*~5>f4<8rn)jGUn0L_$%=HrkbjG|^K<-(ZgiY%7Z3DMEBY{a>;7VY^*r|M zHC6le#MOLMK43We^0+_67)NZ==04`igIcW-N9<0qrl;Hq*ruVTZkAt-b?|N74@+uj z4HSC{gUUVV66>tD`Q3H6t(|U8NdEP=ms?n(8Z^rsN`_+a0I%juVQ{(tgWVV2Y69xu+~Uu@$|K?hOut7quba zw<7EV^7&n_J-?tj(28EtlR^>_aj|G3;zdcbDj}1FVB$_Kov?Q&wTD;z2RrJizM2<2 zqMf1)Emi`>WC@WpJD}3ar{{*J*{PD9&PPqN_tDYjvLNP@RRh?6{?#F5)pnP>1Jv

Vv2j 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 literal 0 HcmV?d00001 diff --git a/Text-Summarizer-Browser-Plugin/assets/pin_extension.png b/Text-Summarizer-Browser-Plugin/assets/pin_extension.png deleted file mode 100644 index 07e721e6feff222fb74c511126e9752a4bffb3cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48427 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 diff --git a/Text-Summarizer-Browser-Plugin/backend/code.py b/Text-Summarizer-Browser-Plugin/backend/code.py deleted file mode 100644 index 9e3a7e6..0000000 --- a/Text-Summarizer-Browser-Plugin/backend/code.py +++ /dev/null @@ -1,208 +0,0 @@ -# Importing necessary libraries -from transformers import AutoTokenizer, pipeline -from optimum.intel import OVModelForCausalLM -from langchain_community.llms import HuggingFacePipeline -from langchain.prompts import PromptTemplate -from langchain.chains import RetrievalQA -from langchain_text_splitters import RecursiveCharacterTextSplitter -from langchain_chroma import Chroma -from langchain_community.embeddings import HuggingFaceEmbeddings -from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader - -# Prompt Templates for Summarization & QA Bot -summary_template = """Write a concise summary of the following: "{context}" CONCISE SUMMARY: """ -query_template = """Use the following pieces of context to answer the question at the end. - If you don't know the answer, just say that you don't know, don't try to make up an answer. - Use 10 words maximum and keep the answer as concise as possible in one sentence. - Always say "thanks for asking!" at the end of the answer. - {context} - Question: {question} - Helpful Answer:""" - - -def pre_processing(loader): - """ - This is a helper function which does the below steps in a sequential order: - 1. Loads page content from the URL/PDF - 2. Splits the page data using Recursive Character Text Splitter & creates embeddings using HuggingFace Embeddings - 3. This is further stored into ChromaDB then after for retrieval - input: Fetched RAW content from the input(URL/PDF). - output: returns a vectorstore - """ - try: - page_data = loader.load() - text_splitter = RecursiveCharacterTextSplitter( - chunk_size=1000, chunk_overlap=20) - all_splits = text_splitter.split_documents(page_data) - embeddings = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2") - global vectorstore - vectorstore = Chroma.from_documents( - documents=all_splits, embedding=embeddings) - return vectorstore - except Exception as e: - print("Error while processing Webpage/PDF page content\n") - raise e - - -def load_llm(model_id): - """ - Meta Llama2 & Qwen 7B models are converted to OpenVINO IR Format. This function compiles those converted models on GPU. - input: user selected model_id from plugin - output: compiled model with openvino - """ - if model_id: - try: - if model_id == "Meta LLama 2": - model_path = '../models/ov_llama_2' - elif model_id == "Qwen 7B Instruct": - model_path = '../models/ov_qwen7b' - model = OVModelForCausalLM.from_pretrained( - model_path, device='GPU') - tokenizer = AutoTokenizer.from_pretrained(model_path) - pipe = pipeline( - "text-generation", - model=model, - tokenizer=tokenizer, - max_new_tokens=4096, - device=model.device - ) - global llm_model - llm_model = HuggingFacePipeline(pipeline=pipe) - return llm_model - except Exception as e: - print( - "Failed to load the model. Please check whether the model_path is correct.") - raise e - - -def pre_process_url_data(urls): - """ - When an end user pastes a URL into the plugin, The RAW data is passed onto the RetrievalQA chain, - and the output is returned back to the plugin. - input: Webpage URL(str). - output: Glance Summary of the fetched URL. - """ - try: - loader = WebBaseLoader(urls) - global summ_vectorstore - # Common Helper function for processing data. - summ_vectorstore = pre_processing(loader) - prompt = PromptTemplate( - template=summary_template, - input_variables=["context", "question"] - ) - - qa_chain = RetrievalQA.from_chain_type( - llm=llm_model, - retriever=summ_vectorstore.as_retriever(), - chain_type="stuff", - chain_type_kwargs={"prompt": prompt}, - return_source_documents=False, - ) - - question = "Please summarize the entire book in one paragraph of 100 words" - summary = qa_chain(question) - response = summary['result'] - summary_start = response.find("CONCISE SUMMARY:") - concise_summary = response[summary_start + - len("CONCISE SUMMARY:"):].strip() - return concise_summary - except Exception as e: - print("Failed to summarize webpage \n") - raise e - - -def qa_on_url_summarized_text(query): - """ - This function fetches the query asked by the users post summarization from the URL, searches an answer from the vectorstore & returns answer in less than 10 words. - input: user's follow-up question(str) - output: Answer to the conversations. - """ - try: - prompt = PromptTemplate( - template=query_template, - input_variables=["context", "question"] - ) - reduce_chain = RetrievalQA.from_chain_type( - llm=llm_model, - retriever=summ_vectorstore.as_retriever(), - chain_type="stuff", - chain_type_kwargs={"prompt": prompt}, - return_source_documents=False - ) - summary = reduce_chain({'query': query}) - summ_vectorstore.delete - response = summary['result'] - summary_start = response.find("Helpful Answer:") - concise_summary = response[summary_start + - len("Helpful Answer:"):].strip() - return concise_summary - except Exception as e: - print("Error in Webpage Summarizer QA BoT") - raise e - - -def pre_process_pdf_data(pdf): - """ - When an end user uploads a PDF into the plugin, The RAW data is passed onto the RetrievalQA chain, - and the output is returned back to the plugin. - input: PDF path(str). - output: Glance Summary of the uploaded PDF. - """ - try: - loader = PyPDFLoader(pdf, extract_images=False) - global pdf_vectorstore - pdf_vectorstore = pre_processing(loader) - - prompt = PromptTemplate( - template=summary_template, - input_variables=["context", "question"] - ) - reduce_chain = RetrievalQA.from_chain_type( - llm=llm_model, - retriever=pdf_vectorstore.as_retriever(), - chain_type="stuff", - chain_type_kwargs={"prompt": prompt}, - return_source_documents=False, - ) - question = "Please summarize the entire book in 100 words." - summary = reduce_chain({'query': question}) - - response = summary['result'] - summary_start = response.find("CONCISE SUMMARY:") - concise_summary = response[summary_start + - len("CONCISE SUMMARY:"):].strip() - return concise_summary - except Exception as e: - print("Failed to summarize PDF \n") - raise e - - -def qa_on_pdf_summarized_text(query): - """ - This function fetches the query asked by the users post summarization from the PDF, then after it searches an answer from the vectorstore & returns answer in less than 10 words. - input: user's follow-up question(str) - output: Answer to the conversations. - """ - try: - prompt = PromptTemplate( - template=query_template, - input_variables=["context", "question"] - ) - reduce_chain = RetrievalQA.from_chain_type( - llm=llm_model, - retriever=pdf_vectorstore.as_retriever(), - chain_type="stuff", - chain_type_kwargs={"prompt": prompt}, - return_source_documents=False - ) - summary = reduce_chain({'query': query}) - response = summary['result'] - summary_start = response.find("Helpful Answer:") - concise_summary = response[summary_start + - len("Helpful Answer:"):].strip() - return concise_summary - except Exception as e: - print("Error in PDF Summarizer QA BoT") - raise e diff --git a/Text-Summarizer-Browser-Plugin/backend/llm_engine.py b/Text-Summarizer-Browser-Plugin/backend/llm_engine.py new file mode 100644 index 0000000..ffbe97f --- /dev/null +++ b/Text-Summarizer-Browser-Plugin/backend/llm_engine.py @@ -0,0 +1,180 @@ +from transformers import AutoTokenizer, pipeline +from optimum.intel import OVModelForCausalLM +from langchain_chroma import Chroma +from langchain.chains import RetrievalQA +from langchain.prompts import PromptTemplate +from langchain_huggingface import HuggingFaceEmbeddings, HuggingFacePipeline +from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader +from langchain_text_splitters import RecursiveCharacterTextSplitter + + +class TextSummarizerEngine: + """ + A class for managing text summarization and Q&A operations using LLMs and vector stores. + + This class encapsulates the functionality for loading LLMs, processing documents, + and generating summaries and answers for both web content and PDFs. + """ + + # Prompt Templates for Summarization & QA Bot + SUMMARY_TEMPLATE = """Write a concise summary of the following: "{context}" CONCISE SUMMARY: """ + QUERY_TEMPLATE = """Use the following pieces of context to answer the question at the end. + If you don't know the answer, just say that you don't know, don't try to make up an answer. + Use 10 words maximum and keep the answer as concise as possible in one sentence. + Always say "thanks for asking!" at the end of the answer. + {context} + Question: {question} + Helpful Answer:""" + + # Embedding model name + EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" + + def __init__(self): + """Initialize the TextSummarizerEngine with empty attributes.""" + self.model_id = None + self.model_path = None + self.llm = None + self.tokenizer = None + + # Vector store for document processing + self.vectorstore = None + + # Initialize embeddings + self.embeddings = HuggingFaceEmbeddings(model_name=self.EMBEDDING_MODEL) + + def load_model(self, model_id): + """ + Load and initialize the specified LLM model using OpenVINO optimization. + """ + self.model_id = model_id + + if model_id == "Meta LLama 2": + self.model_path = "../models/ov_llama_2" + elif model_id == "Qwen 7B Instruct": + self.model_path = "../models/ov_qwen7b" + else: + raise ValueError(f"Unsupported model ID: {model_id}") + + # Load the model with OpenVINO optimization + model = OVModelForCausalLM.from_pretrained(self.model_path) + self.tokenizer = AutoTokenizer.from_pretrained(self.model_path) + + # Create a text generation pipeline + pipe = pipeline( + "text-generation", + model=model, + tokenizer=self.tokenizer, + max_new_tokens=4096, + device=model.device, + ) + + # Create a LangChain compatible model + self.llm = HuggingFacePipeline(pipeline=pipe) + + def _process_document(self, loader): + """ + Process document content from a loader and create a vector store. + """ + # Load and split the document into chunks + page_data = loader.load() + text_splitter = RecursiveCharacterTextSplitter( + chunk_size=1000, chunk_overlap=20 + ) + all_splits = text_splitter.split_documents(page_data) + + # Create and return a vector store from the document chunks + vectorstore = Chroma.from_documents( + documents=all_splits, + embedding=self.embeddings + ) + return vectorstore + + async def process_document(self, source, is_url=True): + """ + Process a document (URL or PDF) to generate a summary of its content. + """ + if not self.llm: + raise ValueError("Model not loaded. Call load_model first.") + + # Create the appropriate loader based on the document type + if is_url: + loader = WebBaseLoader(source) + else: + loader = PyPDFLoader(source, extract_images=False) + + # Process the document content + self.vectorstore = self._process_document(loader) + + # Create a prompt for summarization + prompt = PromptTemplate( + template=self.SUMMARY_TEMPLATE, + input_variables=["context"] + ) + + # Create a retrieval QA chain + qa_chain = RetrievalQA.from_chain_type( + llm=self.llm, + retriever=self.vectorstore.as_retriever(), + chain_type="stuff", + chain_type_kwargs={"prompt": prompt}, + return_source_documents=False, + ) + + # Generate a summary + question = "Please summarize the entire content in one paragraph of 100 words" + summary = qa_chain.invoke(question)["result"] + start_idx = summary.find("CONCISE SUMMARY:") + if start_idx != -1: + summary = summary[start_idx + len("CONCISE SUMMARY:"):].strip() + else: + summary = "No summary found." + return summary + + async def answer_question(self, query): + """ + Answer a question about previously processed document content. + """ + if not self.llm or not self.vectorstore: + raise ValueError("Document content not processed or model not loaded.") + + # Create a prompt for Q&A + prompt = PromptTemplate( + template=self.QUERY_TEMPLATE, + input_variables=["context", "question"] + ) + + # Create a retrieval QA chain + reduce_chain = RetrievalQA.from_chain_type( + llm=self.llm, + retriever=self.vectorstore.as_retriever(), + chain_type="stuff", + chain_type_kwargs={"prompt": prompt}, + return_source_documents=False, + ) + + # Generate an answer + response = reduce_chain.invoke({"query": query})['result'] + start_idx = response.find("Helpful Answer:") + if start_idx != -1: + response = response[start_idx + len("Helpful Answer:"):].strip() + else: + response = "No answer found." + return response + + def cleanup(self): + """Clean up resources when done.""" + if self.vectorstore: + try: + self.vectorstore.delete_collection() + except Exception: + print("Failed to delete vector store collection") + +if __name__ == "__main__": + # Example usage + engine = TextSummarizerEngine() + engine.load_model("Qwen 7B Instruct") + + # Process a document (URL or PDF) + engine.process_document("https://example.com/document", is_url=True) + engine.cleanup() + \ No newline at end of file diff --git a/Text-Summarizer-Browser-Plugin/backend/server.py b/Text-Summarizer-Browser-Plugin/backend/server.py index 29cbd66..c2b5f00 100644 --- a/Text-Summarizer-Browser-Plugin/backend/server.py +++ b/Text-Summarizer-Browser-Plugin/backend/server.py @@ -1,117 +1,166 @@ -# Importing necessary Libraries -import time -from flask import Flask, Response, request, jsonify -from flask_cors import CORS -from code import load_llm, pre_process_url_data, qa_on_url_summarized_text, pre_process_pdf_data, qa_on_pdf_summarized_text import tempfile -import chromadb - -# Initializing the flask app and enabling CORS -app = Flask(__name__) -CORS(app) # This will enable CORS for all routes -ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} - - -@app.route('/select-model', methods=['POST']) -def select_model(): +import warnings +from typing import Literal +from pydantic import BaseModel, HttpUrl +from fastapi.responses import JSONResponse +from fastapi.middleware.cors import CORSMiddleware +from fastapi import FastAPI, UploadFile, File, Depends, HTTPException + +from llm_engine import TextSummarizerEngine + +# Suppress warnings +warnings.filterwarnings("ignore") + +class ModelSelectionRequest(BaseModel): + model_id: Literal["Meta LLama 2", "Qwen 7B Instruct"] + +class UrlRequest(BaseModel): + url: HttpUrl + +# Create FastAPI app instance +app = FastAPI() +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Allows all origins + allow_credentials=True, + allow_methods=["*"], # Allows all methods + allow_headers=["*"], # Allows all headers +) + +engine_instance = None + +# Startup event to initialize the engine +@app.on_event("startup") +async def startup_event(): + """Initialize the TextSummarizerEngine when the application starts""" + global engine_instance + engine_instance = TextSummarizerEngine() + print("TextSummarizerEngine initialized on startup") + +# Dependency to get the engine +async def get_engine(): + """Dependency to provide the engine to routes that need it""" + if engine_instance is None: + raise HTTPException(status_code=500, detail="Engine not initialized") + return engine_instance + + +@app.post("/select-model") +async def select_model( + req: ModelSelectionRequest, + engine: TextSummarizerEngine = Depends(get_engine) +): """ - Model selection function which would further trigger Model compilation function. + Model selection function to initialize the model. """ - try: - global current_model - data = request.get_json() - model_id = data.get('model_id') - current_model = load_llm(model_id) - return jsonify({'message': f'Model {model_id} loaded successfully.'}), 200 + # Load the selected model + engine.load_model(req.model_id) + return {"message": f"Model {req.model_id} loaded successfully."} - except Exception: - return jsonify({'message': 'Failed to load model \n'}), 500 -def stream_output(process_function, *args): - """ - Generator function to stream output from a process function. - """ - try: - for chunk in process_function(*args): - if chunk is not None: - yield f"{chunk}" - except Exception: - yield f"Error while streaming output" +# Add a cleanup event to free resources when the server shuts down +@app.on_event("shutdown") +async def shutdown_event(): + """Cleanup resources when shutting down.""" + global engine_instance + if engine_instance: + engine_instance.cleanup() -@app.route('/process-url', methods=['POST']) -def process_url(): +@app.post("/process-url") +async def process_url( + url_req: UrlRequest, + engine: TextSummarizerEngine = Depends(get_engine) +): """ - Fetches URL from the plugin & triggers the URL summarization function. + Fetches URL from the plugin & triggers the URL summarization function. """ try: - data = request.get_json() - url = data.get('url') + url = str(url_req.url) if not url: - return jsonify({'message': 'No URL provided'}), 400 - chromadb.api.client.SharedSystemClient.clear_system_cache() - return Response(stream_output(pre_process_url_data, [url]), content_type='text/event-stream') - - except Exception: - return jsonify({'message': f'Error while processing URL'}), 400 - - -@app.route('/upload-pdf', methods=['POST']) -def upload_pdf(): + return JSONResponse(content={"message": "No URL provided"}, status_code=400) + + # Make sure the model is loaded + if engine.llm is None: + return JSONResponse(content={"message": "Model not loaded. Please select a model first."}, status_code=400) + + # Process the URL and return summary + summary = await engine.process_document(url, is_url=True) + return JSONResponse(content={"message": summary}, status_code=200) + + except Exception as e: + return JSONResponse(content={"message": f"Error while processing URL: {str(e)}"}, status_code=400) + + +@app.post("/upload-pdf") +async def upload_pdf( + pdf_file: UploadFile = File(...), + engine: TextSummarizerEngine = Depends(get_engine) +): """ - Once the PDF's uploaded, the PDF Summarization function's triggered. + Once the PDF's uploaded, the PDF Summarization function's triggered. """ - - pdf_file = request.files['pdf'] - if pdf_file and pdf_file.content_type == 'application/pdf': + if pdf_file.content_type == "application/pdf": try: + # Save uploaded PDF to a temporary file with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_pdf: - pdf_file.save(temp_pdf.name) + content = await pdf_file.read() + temp_pdf.write(content) temp_pdf_path = temp_pdf.name - print(temp_pdf_path) + print(f"PDF saved temporarily at: {temp_pdf_path}") - chromadb.api.client.SharedSystemClient.clear_system_cache() - return Response(stream_output(pre_process_pdf_data, temp_pdf_path), content_type='text/event-stream') + # Make sure the model is loaded + if engine.llm is None: + return JSONResponse(content={"message": "Model not loaded. Please select a model first."}, status_code=400) + + # Process the PDF and return summary + summary = await engine.process_document(temp_pdf_path, is_url=False) + return JSONResponse(content={"message": summary}, status_code=200) - except Exception: - return jsonify({"message": "Error processing PDF"}), 500 + except Exception as e: + return JSONResponse(content={"message": f"Error processing PDF: {str(e)}"}, status_code=500) else: - return jsonify({"message": "Invalid file type. Please upload a PDF."}), 400 + return JSONResponse(content={"message": "Invalid file type. Please upload a PDF."}, status_code=400) - -@app.route('/your_query_pdf', methods=['POST']) -def pdf_process_query(): - """ - This function triggers the PDF Question Answering Bot - """ - try: - data = request.get_json() - query = data.get('query') - if not data: - return jsonify({'message': 'no query provided'}), 400 - response_message = str(qa_on_pdf_summarized_text(query)) - return jsonify({'message': response_message}), 200 - except Exception: - return jsonify({'message': 'Error while PDF QA Bot'}), 500 - - -@app.route('/your_query_url', methods=['POST']) -def url_process_query(): - """ - This function triggers the URL question answering Bot - """ +@app.post("/query") +async def query( + query: str, + engine: TextSummarizerEngine = Depends(get_engine) +): try: - data = request.get_json() - query = data.get('query') - if not data: - return jsonify({'message': 'no query provided'}), 400 - response_message = str(qa_on_url_summarized_text(query)) - return jsonify({'message': response_message}), 200 - except Exception: - return jsonify({'message': 'Error while URL QA Bot'}), 500 - - -if __name__ == '__main__': - app.run(port=5000) + if not query: + return JSONResponse(content={"message": "No query provided"}, status_code=400) + + # Make sure the model and vectorstore are ready + if engine.llm is None or engine.vectorstore is None: + return JSONResponse( + content={"message": "No document processed yet or model not loaded"}, + status_code=400 + ) + + # Get answer to the query + response_message = await engine.answer_question(query) + return {"message": response_message} + except Exception as e: + return JSONResponse(content={"message": f"Error in Question Answering: {str(e)}"}, status_code=500) + +if __name__ == "__main__": + import uvicorn + print(""" + 🎉 FastAPI server is Ready! 🎉 + Your application is now live and waiting for interaction! + + **🚀 Essential Step: Activate Your Browser Plugin!** + + - This application operates through its dedicated browser extension. + - To begin, please open your web browser and locate the plugin's icon, which looks like `T`, in your toolbar (it's often in the top-right corner). + - Click on the `T` icon to access the browser extension + + **Having trouble?** + - Is the plugin loaded? If you haven't already, please load it by following the Readme.md file. + - Is it enabled? Double-check your browser's extension settings to ensure the plugin isn't disabled. + - Have you pinned the extension? Pin the extension. + """) + uvicorn.run(app, host="0.0.0.0", port=5000) diff --git a/Text-Summarizer-Browser-Plugin/extension/popup.html b/Text-Summarizer-Browser-Plugin/extension/popup.html index 59258b9..f34d7b2 100644 --- a/Text-Summarizer-Browser-Plugin/extension/popup.html +++ b/Text-Summarizer-Browser-Plugin/extension/popup.html @@ -17,9 +17,10 @@

Summarizer

+ @@ -37,6 +38,7 @@

Summarizer

+ @@ -47,6 +49,7 @@

Summarizer

+
    @@ -56,6 +59,7 @@

    Summarizer

    +
    @@ -72,6 +76,7 @@

    Summarizer

    +
      diff --git a/Text-Summarizer-Browser-Plugin/extension/popup.js b/Text-Summarizer-Browser-Plugin/extension/popup.js index e97578c..0f77598 100644 --- a/Text-Summarizer-Browser-Plugin/extension/popup.js +++ b/Text-Summarizer-Browser-Plugin/extension/popup.js @@ -1,335 +1,485 @@ document.addEventListener('DOMContentLoaded', function() { - const selectModelStep = document.getElementById('selectModelStep'); - const summarizersStep = document.getElementById('summarizersStep'); - const modelSelect = document.getElementById('modelSelect'); - const selectModelButton = document.getElementById('selectModelButton'); - const urlInput = document.getElementById('urlInput'); - const sendUrlButton = document.getElementById('sendUrlButton'); - const responseElement = document.getElementById('responseElement'); - const pdfFileInput = document.getElementById('pdfFile'); - const uploadPdfButton = document.getElementById('uploadPdfButton'); - const fileNameElement = document.getElementById('fileName'); - const progressContainer = document.getElementById('progressContainer'); - const uploadProgress = document.getElementById('uploadProgress'); - const uploadPercentage = document.getElementById('uploadPercentage'); - const pdfResponseElement = document.getElementById('pdfResponseElement'); - const pdfQueryInput = document.getElementById('pdfQueryInput'); - const pdfQueryButton=document.getElementById('pdfQueryButton'); - const answerListPdf = document.getElementById('answerListPdf'); - const selectedModelElement = document.getElementById('selectedModelElement'); - const urlfurtherq = document.getElementById('urlfurtherq'); - const pdffurtherq = document.getElementById('pdffurtherq'); - const urlQueryInput = document.getElementById('urlQueryInput'); - const urlQueryButton=document.getElementById('urlQueryButton'); - const answerList = document.getElementById('answerList'); + // API endpoint configuration + const API_BASE_URL = 'http://localhost:5000'; - // Step 1: Select Model - selectModelButton.addEventListener('click', () => { - const selectedModel = modelSelect.value; - - if (selectedModel=== "") { - alert("Please select a model."); - selectModelButton.innerHTML=`Select Model`; - } - else { - selectModelButton.innerHTML=`Loading ${selectedModel} `; - const modelName = selectedModel; - if (modelName) { - selectedModelElement.textContent = `Selected model: ${modelName}`; + // DOM element references + const elements = { + // Model selection elements + selectModelStep: document.getElementById('selectModelStep'), + summarizersStep: document.getElementById('summarizersStep'), + modelSelect: document.getElementById('modelSelect'), + selectModelButton: document.getElementById('selectModelButton'), + selectedModelElement: document.getElementById('selectedModelElement'), + modelErrorMessage: document.getElementById('modelErrorMessage'), + + // URL summarizer elements + urlInput: document.getElementById('urlInput'), + sendUrlButton: document.getElementById('sendUrlButton'), + responseElement: document.getElementById('responseElement'), + urlfurtherq: document.getElementById('urlfurtherq'), + urlQueryInput: document.getElementById('urlQueryInput'), + urlQueryButton: document.getElementById('urlQueryButton'), + urlErrorMessage: document.getElementById('urlErrorMessage'), + urlQueryErrorMessage: document.getElementById('urlQueryErrorMessage'), + answerList: document.getElementById('answerList'), + + // PDF summarizer elements + pdfFileInput: document.getElementById('pdfFile'), + uploadPdfButton: document.getElementById('uploadPdfButton'), + fileNameElement: document.getElementById('fileName'), + progressContainer: document.getElementById('progressContainer'), + uploadProgress: document.getElementById('uploadProgress'), + uploadPercentage: document.getElementById('uploadPercentage'), + pdfResponseElement: document.getElementById('pdfResponseElement'), + pdfQueryInput: document.getElementById('pdfQueryInput'), + pdfQueryButton: document.getElementById('pdfQueryButton'), + pdfErrorMessage: document.getElementById('pdfErrorMessage'), + pdfQueryErrorMessage: document.getElementById('pdfQueryErrorMessage'), + answerListPdf: document.getElementById('answerListPdf'), + pdffurtherq: document.getElementById('pdffurtherq'), + + // Tab elements + webSummarizer: document.getElementById('webSummarizer'), + pdfSummarizer: document.getElementById('pdfSummarizer'), + webSummarizerButton: document.getElementById('webSummarizerButton'), + pdfSummarizerButton: document.getElementById('pdfSummarizerButton') + }; + + /** + * Helper functions for API calls + */ + const api = { + /** + * Send a request to the backend API + * @param {string} endpoint - The API endpoint path + * @param {Object} data - The data to send + * @param {string} method - HTTP method (default: 'POST') + * @returns {Promise} - API response promise + */ + async request(endpoint, data = null, method = 'POST') { + try { + const options = { + method, + headers: { + 'Content-Type': 'application/json' + } + }; + + if (data) { + options.body = JSON.stringify(data); + } + + const response = await fetch(`${API_BASE_URL}${endpoint}`, options); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`API error (${response.status}): ${errorText}`); + } - } else { - console.error('Could not find the model name.'); - selectModelButton.disabled=True; - selectModelButton.innerHTML="Failed to Load" + return await response.json(); + } catch (error) { + console.error(`API error on ${endpoint}:`, error); + // Check if server is reachable on error + try { + await fetch(API_BASE_URL); + } catch (connectionError) { + throw new Error(`Server connection failed: ${connectionError.message}`); + } + throw error; } - // Send selected model to the backend to load and compile - fetch('http://localhost:5000/select-model', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ model_id: modelName }), - }) - .then(response => { - response.json() - selectModelStep.classList.add('hidden'); - summarizersStep.classList.remove('hidden'); - }) - .catch((error) => { - console.error('Error:', error); - selectModelButton.remove('hidden'); - }); - } + }, - }); - + /** + * Select a model on the backend + * @param {string} modelId - The model ID to select + * @returns {Promise} - API response + */ + selectModel(modelId) { + return this.request('/select-model', { model_id: modelId }); + }, - // Step 2: Web Summarizer - function ValidURL(url){ - var regex = /(?:https?):\/\/(\w+:?\w*)?(\S+)(:\d+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/; - if(!regex .test(url)) { - alert("Please enter valid URL."); - } - else - { - sendUrlButton.disabled = true; - sendUrlButton.innerHTML = 'Summarizing... '; - responseElement.classList.add('hidden'); - urlfurtherq.classList.add('hidden'); - urlQueryButton.classList.add('hidden') ; - urlQueryInput.classList.add('hidden'); + /** + * Process a URL for summarization + * @param {string} url - The URL to summarize + * @returns {Promise} - API response + */ + processUrl(url) { + return this.request('/process-url', { url }); + }, - fetch('http://localhost:5000/process-url', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ url: url }) - }) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } + /** + * Answer a query about previously processed content + * @param {string} query - The query to answer + * @returns {Promise} - API response + */ + answerQuery(query) { + return this.request(`/query?query=${encodeURIComponent(query)}`); + } + }; + + /** + * UI utility functions + */ + const ui = { + /** + * Show a loading spinner on a button + * @param {HTMLElement} button - The button element + * @param {string} loadingText - Text to show while loading + */ + showButtonLoading(button, loadingText) { + button.disabled = true; + button.innerHTML = `${loadingText} `; + }, - // Get the reader for streaming the response - const reader = response.body.getReader(); - const decoder = new TextDecoder(); - let receivedText = ''; - responseElement.classList.remove('hidden'); - responseElement.innerHTML=''; - urlfurtherq.classList.add('hidden'); - urlQueryButton.classList.add('hidden') ; - urlQueryInput.classList.add('hidden'); + /** + * Reset a button to its original state + * @param {HTMLElement} button - The button element + * @param {string} text - Text to show on the button + */ + resetButton(button, text) { + button.disabled = false; + button.innerHTML = text; + }, - // Function to read chunks of data - function readStream() { - reader.read().then(({ done, value }) => { - if (done) { - // Stream finished - sendUrlButton.innerHTML = 'Summarize'; // Reset the button text - sendUrlButton.disabled = false; - urlfurtherq.classList.remove('hidden'); - urlQueryButton.classList.remove('hidden') ; - urlQueryInput.classList.remove('hidden'); - return; - } + /** + * Toggle visibility of elements + * @param {HTMLElement[]} showElements - Elements to show + * @param {HTMLElement[]} hideElements - Elements to hide + */ + toggleVisibility(showElements = [], hideElements = []) { + showElements.forEach(el => el.classList.remove('hidden')); + hideElements.forEach(el => el.classList.add('hidden')); + }, - // Decode the chunk and append to the result - - const chunk = decoder.decode(value, { stream: true }); - receivedText += chunk; - responseElement.innerHTML += `${chunk}`; + /** + * Show an error message in the specified error container + * @param {HTMLElement} errorContainer - The container for the error message + * @param {string} message - The error message to display + */ + showError(errorContainer, message) { + // Clear any existing errors + this.clearErrors(); + + // Show the error + errorContainer.textContent = message; + errorContainer.classList.remove('hidden'); + + // Auto hide after 5 seconds + setTimeout(() => { + this.clearError(errorContainer); + }, 5000); + }, - // Continue reading the next chunk - readStream(); - }).catch(error => { - console.error('Error reading stream:', error); - responseElement.textContent = 'Error: ' + error.message; - sendUrlButton.innerHTML = 'Summarize'; - sendUrlButton.disabled = false; - }); - } + /** + * Clear a specific error message + * @param {HTMLElement} errorContainer - The error container to clear + */ + clearError(errorContainer) { + errorContainer.textContent = ''; + errorContainer.classList.add('hidden'); + }, - // Start reading the stream - readStream(); - }) - .catch(error => { - console.error('Error:', error); - responseElement.textContent = 'Error: ' + error.message; - sendUrlButton.innerHTML = 'Summarize'; - sendUrlButton.disabled = false; + /** + * Clear all error messages + */ + clearErrors() { + [ + elements.modelErrorMessage, + elements.urlErrorMessage, + elements.urlQueryErrorMessage, + elements.pdfErrorMessage, + elements.pdfQueryErrorMessage + ].forEach(errorElement => { + if (errorElement) { + errorElement.textContent = ''; + errorElement.classList.add('hidden'); + } }); - }} - sendUrlButton.addEventListener('click', () => { - const urlValue = urlInput.value.trim(); - answerList.innerHTML=''; - if (urlValue=== "") { - alert("Enter a url"); } - else(ValidURL(urlValue)) - }); - - - // Step 2: PDF Summarizer - uploadPdfButton.addEventListener('click', () => { - const file = pdfFileInput.files[0]; - answerListPdf.innerHTML=''; + }; - if (file && file.type === 'application/pdf') { - const formData = new FormData(); - formData.append('pdf', file); - - progressContainer.style.display = 'block'; - - const xhr = new XMLHttpRequest(); - xhr.open('POST', 'http://localhost:5000/upload-pdf', true); - uploadPdfButton.disabled = true; - uploadPdfButton.innerHTML = 'Summarizing... '; - pdfResponseElement.classList.add('hidden'); - answerListPdf.value = ``; + /** + * Model selection handler + */ + async function handleModelSelection() { + const selectedModel = elements.modelSelect.value; + + if (!selectedModel) { + ui.showError(elements.modelErrorMessage, "Please select a model."); + return; + } + + // Clear any existing errors + ui.clearErrors(); + + ui.showButtonLoading(elements.selectModelButton, `Loading ${selectedModel}`); + elements.selectedModelElement.textContent = `Selected model: ${selectedModel}`; + + try { + const response = await api.selectModel(selectedModel); + console.log('Model loaded successfully:', response.message); + + // Show summarizer tools once model is loaded + ui.toggleVisibility( + [elements.summarizersStep], + [elements.selectModelStep] + ); + } catch (error) { + console.error('Model selection failed:', error); + elements.selectModelButton.innerHTML = 'Failed to Load'; + ui.showError(elements.modelErrorMessage, `Failed to load model: ${error.message}`); + } finally { + elements.selectModelButton.disabled = false; + } + } - let previousResponseLength = 0; - pdfResponseElement.innerHTML=''; - fileNameElement.classList.add('hidden'); - pdffurtherq.classList.add('hidden'); - fileNameElement.classList.add('hidden'); - pdfQueryButton.classList.add('hidden'); - pdfQueryInput.classList.add('hidden'); - answerListPdf.classList.add('hidden'); + // Attach model selection event handler + elements.selectModelButton.addEventListener('click', handleModelSelection); - // Handle the response from the server - xhr.onprogress = function() { - const currentResponse = xhr.responseText; - - // Extract the new chunk by getting the substring from the previous response length to the current length - const newChunk = currentResponse.slice(previousResponseLength); - previousResponseLength = currentResponse.length; // Update for the next iteration + /** + * URL validation and processing + */ + async function handleUrlSummarization() { + const url = elements.urlInput.value.trim(); + + // Reset previous answers + elements.answerList.innerHTML = ''; + + // Clear any existing errors + ui.clearErrors(); + + if (!url) { + ui.showError(elements.urlErrorMessage, "Please enter a URL."); + return; + } + + // Validate URL format + const urlRegex = /^https?:\/\/[^\s/$.?#].[^\s]*/i; + if (!urlRegex.test(url)) { + ui.showError(elements.urlErrorMessage, "Please enter a valid URL."); + return; + } + + // Show loading state + ui.showButtonLoading(elements.sendUrlButton, 'Summarizing'); + + // Hide elements while processing + ui.toggleVisibility( + [], + [ + elements.responseElement, + elements.urlfurtherq, + elements.urlQueryButton, + elements.urlQueryInput + ] + ); + + try { + // Process the URL + const response = await api.processUrl(url); + + // Display the results + elements.responseElement.innerHTML = response.message; + + // Show elements for further interaction + ui.toggleVisibility( + [ + elements.responseElement, + elements.urlfurtherq, + elements.urlQueryButton, + elements.urlQueryInput + ] + ); + } catch (error) { + console.error('URL processing failed:', error); + elements.responseElement.classList.remove('hidden'); + elements.responseElement.textContent = `Error: ${error.message}`; + } finally { + ui.resetButton(elements.sendUrlButton, 'Summarize'); + } + } - // Append the new chunk to the response element - pdfResponseElement.innerHTML += newChunk; - - }; + // Attach URL processing event handler + elements.sendUrlButton.addEventListener('click', handleUrlSummarization); + + + /** + * PDF file upload and processing + */ + async function handlePdfSummarization() { + const file = elements.pdfFileInput.files[0]; + elements.answerListPdf.innerHTML = ''; + + // Clear any existing errors + ui.clearErrors(); + + if (!file || file.type !== 'application/pdf') { + ui.showError(elements.pdfErrorMessage, "Please select a valid PDF file."); + return; + } + + // Show loading state + ui.showButtonLoading(elements.uploadPdfButton, 'Summarizing'); + + // Reset and hide elements + elements.pdfResponseElement.innerHTML = ''; + elements.progressContainer.style.display = 'block'; + + ui.toggleVisibility( + [], + [ + elements.pdfResponseElement, + elements.fileNameElement, + elements.pdffurtherq, + elements.pdfQueryButton, + elements.pdfQueryInput, + elements.answerListPdf + ] + ); + + // Use XMLHttpRequest for upload progress tracking + const xhr = new XMLHttpRequest(); + const formData = new FormData(); + formData.append('pdf_file', file); + + // Set up a promise to handle the XHR + const uploadPromise = new Promise((resolve, reject) => { + xhr.open('POST', `${API_BASE_URL}/upload-pdf`, true); + // Handle successful response xhr.onload = function() { if (xhr.status === 200) { - fileNameElement.classList.remove('hidden'); - fileNameElement.innerHTML = `Uploaded File: ${file.name}`; - pdfResponseElement.classList.remove('hidden'); - uploadPdfButton.disabled = false; - uploadPdfButton.innerHTML = 'Upload and Summarize'; - pdffurtherq.classList.remove('hidden') - pdfQueryButton.classList.remove('hidden'); - pdfQueryInput.classList.remove('hidden'); - answerListPdf.classList.remove('hidden'); + try { + const response = JSON.parse(xhr.responseText); + resolve(response); + } catch (error) { + reject(new Error('Invalid response format')); + } } else { - uploadPdfButton.innerHTML = 'Upload and Summarize'; - uploadPdfButton.disabled = false; - pdfResponseElement.textContent = 'Upload failed. Please try again.'; + reject(new Error(`Upload failed: ${xhr.statusText}`)); } }; - + + // Handle error xhr.onerror = function() { - pdfResponseElement.textContent = 'Error during upload. Please try again.'; - uploadPdfButton.innerHTML = 'Upload and Summarize'; - uploadPdfButton.disabled = false; + reject(new Error('Connection error during upload')); }; - + + // Track upload progress xhr.upload.onprogress = function(event) { if (event.lengthComputable) { const percentComplete = Math.round((event.loaded / event.total) * 100); - uploadProgress.style.width = percentComplete + '%'; - uploadPercentage.textContent = percentComplete + '% uploaded'; + elements.uploadProgress.style.width = `${percentComplete}%`; + elements.uploadPercentage.textContent = `${percentComplete}% uploaded`; } }; - - // Send the form data with the file + + // Send the request xhr.send(formData); - } else { - alert("Please enter a valid pdf file"); - // pdfResponseElement.textContent = 'Please select a valid PDF file.'; - uploadPdfButton.innerHTML = 'Upload and Summarize'; - uploadPdfButton.disabled = false; - } - }); - - //url query part - async function fetchAnswer(query) { - const response = await fetch('http://localhost:5000/your_query_url', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ query: query }) }); - - if (!response.ok) { - throw new Error('Error fetching answer: ' + response.statusText); + + try { + // Wait for the upload to complete + const response = await uploadPromise; + + // Display the results + elements.fileNameElement.innerHTML = `Uploaded File: ${file.name}`; + elements.pdfResponseElement.innerHTML = response.message; + + // Show elements for further interaction + ui.toggleVisibility( + [ + elements.fileNameElement, + elements.pdfResponseElement, + elements.pdffurtherq, + elements.pdfQueryButton, + elements.pdfQueryInput, + elements.answerListPdf + ] + ); + } catch (error) { + console.error('PDF processing failed:', error); + elements.pdfResponseElement.classList.remove('hidden'); + elements.pdfResponseElement.textContent = `Error: ${error.message}`; + } finally { + ui.resetButton(elements.uploadPdfButton, 'Upload and Summarize'); } - const data = await response.json(); - return data.message; - } - - urlQueryButton.addEventListener('click', async () => { - const query = urlQueryInput.value; - urlQueryButton.disabled = true; - urlQueryButton.innerHTML = ``; - if (query) { - try { - const answer = await fetchAnswer(query); - const questionItem = document.createElement('li'); - questionItem.innerHTML = `Question: ${query}
      Answer: ${answer}`; - answerList.appendChild(questionItem); - urlQueryInput.value = ''; - urlQueryButton.disabled = false; - urlQueryButton.innerHTML = `Answer`; - } - catch (error) { - console.error(error); - urlInput.value =''; - urlQueryButton.disabled = false; - urlQueryButton.innerHTML = `Answer`; - } - } - else { - alert("Please enter a query!"); - urlQueryButton.innerHTML = `Answer`; - } - }); + } - //functionality for pdf query input - async function fetchAnswerPdf(query) { - const response = await fetch('http://localhost:5000/your_query_pdf', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ query: query }) - }); - console.log(response) - if (!response.ok) { - throw new Error('Error fetching answer: ' + response.statusText); - } - const data = await response.json(); - console.log(data.message); - return data.message; - } - - pdfQueryButton.addEventListener('click', async () => { - const query = pdfQueryInput.value; - console.log(query); - pdfQueryButton.disabled = true; - pdfQueryButton.innerHTML = ``; - if (query) { - try { - const answer = await fetchAnswerPdf(query); - const questionItemPdf = document.createElement('li'); - questionItemPdf.innerHTML = `Question: ${query}
      Answer: ${answer}`; - answerListPdf.appendChild(questionItemPdf); - pdfQueryInput.value = ''; - pdfQueryButton.disabled = false; - pdfQueryButton.innerHTML = `Answer`; - } catch (error) { - console.error(error); - pdfQueryInput.value = ''; - pdfQueryButton.disabled = false; - pdfQueryButton.innerHTML = `Answer`; - } + // Attach PDF processing event handler + elements.uploadPdfButton.addEventListener('click', handlePdfSummarization); + + /** + * Handle user queries about processed content + * + * @param {string} queryType - Type of query ('url' or 'pdf') + * @returns {Function} - Event handler function + */ + function createQueryHandler(queryType) { + return async function() { + // Get the appropriate elements based on query type + const inputElement = queryType === 'url' ? elements.urlQueryInput : elements.pdfQueryInput; + const buttonElement = queryType === 'url' ? elements.urlQueryButton : elements.pdfQueryButton; + const listElement = queryType === 'url' ? elements.answerList : elements.answerListPdf; + const errorElement = queryType === 'url' ? elements.urlQueryErrorMessage : elements.pdfQueryErrorMessage; + + const query = inputElement.value.trim(); + + // Clear any existing errors + ui.clearErrors(); + + if (!query) { + ui.showError(errorElement, "Please enter a query!"); + return; } - else { - alert("Please enter a query!"); - pdfQueryButton.innerHTML = `Answer`; + + // Show loading state + ui.showButtonLoading(buttonElement, ''); + + try { + // Send the query to the backend + const response = await api.answerQuery(query); + + // Create and append the question-answer item + const listItem = document.createElement('li'); + listItem.innerHTML = ` + Question: ${query}
      + Answer: ${response.message} + `; + listElement.appendChild(listItem); + + // Clear the input field + inputElement.value = ''; + } catch (error) { + console.error(`${queryType.toUpperCase()} query failed:`, error); + ui.showError(errorElement, `Query failed: ${error.message}`); + } finally { + ui.resetButton(buttonElement, 'Answer'); } - }); + }; + } + + // Attach query handlers + elements.urlQueryButton.addEventListener('click', createQueryHandler('url')); + elements.pdfQueryButton.addEventListener('click', createQueryHandler('pdf')); - // web Summarizer tab content - document.getElementById('webSummarizerButton').addEventListener('click', function() { - document.getElementById('webSummarizer').style.display = 'block'; - document.getElementById('pdfSummarizer').style.display = 'none'; - }); - - //pdf summarizer tab content - document.getElementById('pdfSummarizerButton').addEventListener('click', function() { - document.getElementById('webSummarizer').style.display = 'none'; - document.getElementById('pdfSummarizer').style.display = 'block'; - }); + /** + * Tab switching functionality + */ + function setupTabHandlers() { + // Web summarizer tab + elements.webSummarizerButton.addEventListener('click', function() { + elements.webSummarizer.style.display = 'block'; + elements.pdfSummarizer.style.display = 'none'; + }); + + // PDF summarizer tab + elements.pdfSummarizerButton.addEventListener('click', function() { + elements.webSummarizer.style.display = 'none'; + elements.pdfSummarizer.style.display = 'block'; + }); + } + + // Initialize tab handlers + setupTabHandlers(); }); diff --git a/Text-Summarizer-Browser-Plugin/extension/style.css b/Text-Summarizer-Browser-Plugin/extension/style.css index df6948f..b682144 100644 --- a/Text-Summarizer-Browser-Plugin/extension/style.css +++ b/Text-Summarizer-Browser-Plugin/extension/style.css @@ -86,49 +86,42 @@ h1 { background-color: #53c5cd; width: 0; } -/* styling the tab*/ -.tab { - overflow: hidden; - border: 1px solid #ccc; - background-color: #dad8f041; - } - - /* Style the buttons inside the tab */ - .tab button { - display: inline-block; - padding: 10px 41.5px; - background-color:#3437e3; - border: none; - outline: none; - cursor: pointer; - color: #fff; - height:100% - } - - /* Change background color of buttons on hover */ - .tab button:hover { - background-color: lightskyblue; - } - /* Create an active/current tablink class */ - .tab button.active { - background-color:lightskyblue; - } - - /* Style the tab content */ - .tabcontent { - display: none; - padding: 6px 12px; - border-top: none; - } +/* Style the buttons inside the tab */ +.tab button { + display: inline-block; + padding: 10px 41.5px; + background-color:#3437e3; + border: none; + outline: none; + cursor: pointer; + color: #fff; + height:100% +} - .model { - font-weight: bold; - } - +/* Change background color of buttons on hover */ +.tab button:hover { + background-color: lightskyblue; +} + +/* Create an active/current tablink class */ +.tab button.active { + background-color:lightskyblue; +} + +/* Style the tab content */ +.tabcontent { + display: none; + padding: 6px 12px; + border-top: none; +} + +.model { + font-weight: bold; +} - /* for query */ - /* Styles for qna-container */ +/* for query */ +/* Styles for qna-container */ .qna-container { display: flex; flex-direction: column; @@ -166,6 +159,17 @@ h1 { } .error-message { - color: red; + color: #e74c3c; font-weight: bold; + margin: 5px 0; + padding: 5px 10px; + background-color: #fdecea; + border-left: 3px solid #e74c3c; + border-radius: 3px; + font-size: 0.9em; + transition: opacity 0.3s ease; +} + +.error-message.hidden { + display: none; } diff --git a/Text-Summarizer-Browser-Plugin/pyproject.toml b/Text-Summarizer-Browser-Plugin/pyproject.toml new file mode 100644 index 0000000..a343029 --- /dev/null +++ b/Text-Summarizer-Browser-Plugin/pyproject.toml @@ -0,0 +1,36 @@ +[project] +name = "text-summarizer-browser-plugin" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12.0" +dependencies = [ + "jupyter>=1.1.1", + "langchain>=0.3.25", + "langchain-chroma>=0.2.4", + "langchain-community>=0.3.24", + "optimum[nncf,openvino]>=1.25.3", + "pypdf>=5.5.0", + "sentence-transformers>=4.1.0", + "torch>=2.7.0", + "torchvision>=0.22.0", + "pytorch-triton-xpu>=3.3.0 ; sys_platform == 'win32' or sys_platform == 'linux'", + "fastapi[standard]>=0.115.9", + "langchain-huggingface>=0.2.0", +] + +[tool.uv.sources] +torch = [ + { index = "pytorch-xpu", marker = "sys_platform == 'win32' or sys_platform == 'linux'" }, +] +torchvision = [ + { index = "pytorch-xpu", marker = "sys_platform == 'win32' or sys_platform == 'linux'" }, +] +pytorch-triton-xpu = [ + { index = "pytorch-xpu", marker = "sys_platform == 'win32' or sys_platform == 'linux'" }, +] + +[[tool.uv.index]] +name = "pytorch-xpu" +url = "https://download.pytorch.org/whl/xpu" +explicit = true diff --git a/Text-Summarizer-Browser-Plugin/uv.lock b/Text-Summarizer-Browser-Plugin/uv.lock new file mode 100644 index 0000000..9137d84 --- /dev/null +++ b/Text-Summarizer-Browser-Plugin/uv.lock @@ -0,0 +1,4491 @@ +version = 1 +revision = 1 +requires-python = ">=3.12.0" +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.12.4' and sys_platform == 'linux'", + "python_full_version < '3.12.4' and sys_platform == 'win32'", + "python_full_version < '3.12.4' and sys_platform != 'linux' and sys_platform != 'win32'", +] + +[[package]] +name = "about-time" +version = "4.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3f/ccb16bdc53ebb81c1bf837c1ee4b5b0b69584fd2e4a802a2a79936691c0a/about-time-4.2.1.tar.gz", hash = "sha256:6a538862d33ce67d997429d14998310e1dbfda6cb7d9bbfbf799c4709847fece", size = 15380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/cd/7ee00d6aa023b1d0551da0da5fee3bc23c3eeea632fbfc5126d1fec52b7e/about_time-4.2.1-py3-none-any.whl", hash = "sha256:8bbf4c75fe13cbd3d72f49a03b02c5c7dca32169b6d49117c257e7eb3eaee341", size = 13295 }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, +] + +[[package]] +name = "aiohttp" +version = "3.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/a2/a946c4f5c54233c97788c2278ea50beaadf45211f452f932b36ce322f660/aiohttp-3.12.2.tar.gz", hash = "sha256:0018956472ee535d2cad761a5bb88eb4ad80f94cd86472cee26a244799f7c79f", size = 7780423 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/25/17af725b3855ad54eb1cb8e45962b05856a7e4986b64fbc6158331d7b64e/aiohttp-3.12.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7679b2af5a1d43d8470672079baedc1a843e4f27a47b630fbe092833f9bc4e73", size = 692835 }, + { url = "https://files.pythonhosted.org/packages/cc/5d/770e9f17f0efeb1c40109535561ea7b0a3e9b654bd7853c27f3d62763086/aiohttp-3.12.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4d6941dd4d8f6dfd9292f391bc2e321c9583a9532b4e9b571b84f163bb3f8135", size = 467456 }, + { url = "https://files.pythonhosted.org/packages/d8/ef/48eda5cd949b8af818d892b5ddf07cb15f0cf133e14c4ac9734ff32ba0a6/aiohttp-3.12.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8345cea33295cc28945c8365ac44ba383ebb757a599b384d752347f40671e984", size = 460294 }, + { url = "https://files.pythonhosted.org/packages/94/1e/9724a45cb932b0c01c558493fac5f706a1a53740a77efc22c2f6764ce611/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8259a311666becf7049ae43c984208ac20eda5ea16aa5f26ea5d24b863f9afcd", size = 1707089 }, + { url = "https://files.pythonhosted.org/packages/8a/a1/3b267d691a79472e6a0d9909363c2dc6cad44e60deb99385ce41e7926b40/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a6f09589cb5928ee793210806d35d69fffc78d46eca9acaa2d38cc30b3f194e", size = 1689737 }, + { url = "https://files.pythonhosted.org/packages/d9/71/f04d5c86cfa5227ec2a54dd72b8de5b1930eb5c9ea75bd1c987b463cbb36/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c32972b485828f2b9326a95851520e9a92cdd97efe0a04ae62c7315e8d1098", size = 1744835 }, + { url = "https://files.pythonhosted.org/packages/eb/88/deab2324c7468d6405cf9bae287276edef14a00fd00d084b3010e194e8d9/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:851d226ecaf30ec7f12d9e9793081ecd0e66fea7f6345bcb5283b39e9ea79c71", size = 1790987 }, + { url = "https://files.pythonhosted.org/packages/17/49/0b7c3fb319c4a9c75c41ec066e578bfd3ee847a550ef579d9fb6d65af3fa/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7127241e62621eabe437cce249a4858e79896abcdafed4c6f7a90d14d449066", size = 1710431 }, + { url = "https://files.pythonhosted.org/packages/eb/23/3c366db7343384cd81b0ec9609019dc34e14d25b7099d9390cfa561bb49f/aiohttp-3.12.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bca43af1c77f83e88641e74d1bd24b6089bb518fa0e6be97805a048bdac6bbc3", size = 1626229 }, + { url = "https://files.pythonhosted.org/packages/99/3e/a6b7b55a38a6372b7e00f751778fc653cdd14770f1c20c5ed309f1b87768/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d913623c7e3be188fe5c718bce186e0bbc5977e74c12e4832d540c3637b9f47", size = 1687290 }, + { url = "https://files.pythonhosted.org/packages/3c/69/0542c4c125e40c47e26bab47d8aff50f831c5626a4d4ab9da7018ee2d15c/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b4924ca6bc74cb630e47edaf111f1d05e13dfe3c1e580c35277dc998965913d3", size = 1708743 }, + { url = "https://files.pythonhosted.org/packages/1d/0e/73a16e4008f78fa3538a1e564d0ecf026c7fd422f522e87af48337942f48/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a38e144942d4f0740dcb5be2ceb932cc45fc29e404fe64ffd5eef5bc62eafe39", size = 1649396 }, + { url = "https://files.pythonhosted.org/packages/98/23/0a9b1547260d554f2c484c2f5e9d3800eca31a387146e5e0a0cfb6bfe17e/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6c31782dae093a507b94792d9f32978bf154d051d5237fdedbb9e74d9464d5dd", size = 1728959 }, + { url = "https://files.pythonhosted.org/packages/31/d0/39b2b1111b81952015e7390ea07b404f417577e6ed4df1a683dc3d1a0a2f/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7f10d664b638f85acdeb7622f7b16773aaf7d67214a7c3b6075735f171d2f021", size = 1756933 }, + { url = "https://files.pythonhosted.org/packages/28/77/faf662e3b87e3d5a1ca3092c5cbeaa4349abdff3388bdc3c3c057302b380/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7181b4ebd70ad9731f4f7af03e3ed0ff003e49cefbf0b6846b5decb32abc30b7", size = 1716543 }, + { url = "https://files.pythonhosted.org/packages/d3/1a/c79bae467e39439d5ef044f121b280aa0398cb23ecd77ee49f8a1759dde7/aiohttp-3.12.2-cp312-cp312-win32.whl", hash = "sha256:d602fc26cb307993965e5f5dacb2aaa7fea4f01c6658250658bef51e48dd454e", size = 414002 }, + { url = "https://files.pythonhosted.org/packages/e2/dd/0d5f6aef062433cf88ea08ab2c8c3c1466e812311c9e0657370835ed27c9/aiohttp-3.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:35df44dde19fcd146ed13e8847c70f8e138e91138f7615df2bd68b478ac04f99", size = 440104 }, + { url = "https://files.pythonhosted.org/packages/f9/ed/a341ddf8402cc4a177eb63a63d2aee2f177a94b1f2d53ef192e43e82760f/aiohttp-3.12.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e6dd24e72e7425b4eee49eeaa1a08742774f5a0c84041e80625aeba45812f92e", size = 687252 }, + { url = "https://files.pythonhosted.org/packages/e8/93/00e623a2c984d95a52e7f9e92d178828beb4a5d31b9231b0fda77fc13e98/aiohttp-3.12.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5293245b743d3e41fd4de631aed6018e0016488686ee70d3dbd9ac61cc040429", size = 464914 }, + { url = "https://files.pythonhosted.org/packages/5e/ad/4fea70b2d1994edf3c34220a41f0ac1263ee4b704343248f7d15fa8e3b8e/aiohttp-3.12.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b2c7bc896696ada3df4ffd787b80d08af53eb16658fd19623f469f89c5f95846", size = 457217 }, + { url = "https://files.pythonhosted.org/packages/fb/f1/f20c87b0baf096f2d36897fe4a9a0e703f32dbf7b3fcaae0a5a196f779dc/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e4991a7dcdd577a749429248321196dba6ade4315c6262e9b2ba9a3bb80e9cb", size = 1696029 }, + { url = "https://files.pythonhosted.org/packages/d9/4a/1b0507cfd73c1736e5cd607c7f16790747112c86e0c17860b1b635ad7d52/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:88f8d247c4b6cc75eb5ef1724998b3076f5f2f6b7d357560caa5b5da08228cb4", size = 1677295 }, + { url = "https://files.pythonhosted.org/packages/7d/ca/ffb5d548d6aa195797bebd5e3688821c40c2a6503363e5849d7114678a59/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1f3968162f274ed8e97aad591da178fb04725a386a4852b1c0285f3a51390af", size = 1729363 }, + { url = "https://files.pythonhosted.org/packages/98/3e/e6cb54d8329b7c60b6678631c228339730632ea7c18dd6279e64ad134d52/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4de7a3a7e482f5832838047c1612c0c3d1f4309e3e2d4ea80cb1b7f5ab0c6bbe", size = 1778736 }, + { url = "https://files.pythonhosted.org/packages/2d/be/76db303c98159b6c0494fe4f14a6c57a28c81db9010d2d5d764219339f0a/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ca0aa49854b195e314171756d06f81c1286541425a929950f7316d617cc3b1", size = 1701064 }, + { url = "https://files.pythonhosted.org/packages/c3/c1/d6d4abdeffaa9dee12b27c80919a1bda50aea22d5a1dc03c001a005b16ea/aiohttp-3.12.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bff129c6674f3a14c68a0f49337ebd8637440201cbd8af05df52cb2d7db0902", size = 1614772 }, + { url = "https://files.pythonhosted.org/packages/8c/69/da43fe30ef3323add2ac03b11cef91c50b648d544953732aeff9a47cdb5e/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62179517ef8d0abc950ab7e6545e97142bef3f58007da12b9cff5260e8084fd1", size = 1667793 }, + { url = "https://files.pythonhosted.org/packages/8c/03/367badf467bd9708b2eaa5fc36689b9b2e43489b63d8508fddc508ceaace/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:48d743fbc8a88dffb2d2e96f17f9e2310aaa672bd2103b198d7613361affd1a3", size = 1699458 }, + { url = "https://files.pythonhosted.org/packages/d2/12/c7443b288263b4ab3d8c6329de0be8df2967445aa9731b738da7b34f04ca/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:385f01fe9be53a0466fb66504b00ab00ca7faa0a285186327509cbbe1386363f", size = 1642052 }, + { url = "https://files.pythonhosted.org/packages/4e/76/2be34ed27931ab1a4cdd40eba3ef2d71bf0eff9d6c0ac8793e92f20f3ac1/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:631f4da6b1d503f9df883ba86846fa0ff455eae60497fab5f1d21683b2a2784e", size = 1718187 }, + { url = "https://files.pythonhosted.org/packages/43/39/84d014db48122973171c3cfcf23a2c3ba765163ef8169d6b959d9440152b/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7e071f1371f38c15dad609bb57d698fe4614b1817e7808966c643336f5615655", size = 1751656 }, + { url = "https://files.pythonhosted.org/packages/27/b6/7b13d143352494e943ae3f89b5286dc4ed85f8d5487a09f3dd86efb16eb3/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:166d8ba47fca7667dd3169be8bd0fb9ffd0f19fd80f0d5291b1e36ab0f77d02c", size = 1700547 }, + { url = "https://files.pythonhosted.org/packages/42/19/1b42589a0f80f14b1bc81ccc5fb0f8c4398fbd03b5886d1307c7aadd8279/aiohttp-3.12.2-cp313-cp313-win32.whl", hash = "sha256:01ac3cc4a0c81f87ed72c614066bfdee15358c5c2cdf30048dd8823826cbc61e", size = 413024 }, + { url = "https://files.pythonhosted.org/packages/d0/d7/00abc34b16f1ea9dc8cedffe45c0f454157472480e5b44b6c15f175aa9c6/aiohttp-3.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:cbf833ca90fda31ec505e80f58f8011c64030fb8e368bce0d60f1f9aae162389", size = 438964 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, +] + +[[package]] +name = "alive-progress" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "about-time" }, + { name = "grapheme" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/66/c2c1e6674b3b7202ce529cf7d9971c93031e843b8e0c86a85f693e6185b8/alive-progress-3.2.0.tar.gz", hash = "sha256:ede29d046ff454fe56b941f686f89dd9389430c4a5b7658e445cb0b80e0e4deb", size = 113231 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/39/cade3a5a97fffa3ae84f298208237b3a9f7112d6b0ed57e8ff4b755e44b4/alive_progress-3.2.0-py3-none-any.whl", hash = "sha256:0677929f8d3202572e9d142f08170b34dbbe256cc6d2afbf75ef187c7da964a8", size = 77106 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124 }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658 }, + { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583 }, + { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168 }, + { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709 }, + { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613 }, + { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583 }, + { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475 }, + { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698 }, + { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817 }, + { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 }, +] + +[[package]] +name = "arrow" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "types-python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 }, +] + +[[package]] +name = "asgiref" +version = "3.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + +[[package]] +name = "async-lru" +version = "2.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069 }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, +] + +[[package]] +name = "autograd" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/1c/3c24ec03c8ba4decc742b1df5a10c52f98c84ca8797757f313e7bdcdf276/autograd-1.8.0.tar.gz", hash = "sha256:107374ded5b09fc8643ac925348c0369e7b0e73bbed9565ffd61b8fd04425683", size = 2562146 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/ea/e16f0c423f7d83cf8b79cae9452040fb7b2e020c7439a167ee7c317de448/autograd-1.8.0-py3-none-any.whl", hash = "sha256:4ab9084294f814cf56c280adbe19612546a35574d67c574b04933c7d2ecb7d78", size = 51478 }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, +] + +[[package]] +name = "backoff" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148 }, +] + +[[package]] +name = "bcrypt" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/5d/6d7433e0f3cd46ce0b43cd65e1db465ea024dbb8216fb2404e919c2ad77b/bcrypt-4.3.0.tar.gz", hash = "sha256:3a3fd2204178b6d2adcf09cb4f6426ffef54762577a7c9b54c159008cb288c18", size = 25697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/2c/3d44e853d1fe969d229bd58d39ae6902b3d924af0e2b5a60d17d4b809ded/bcrypt-4.3.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f01e060f14b6b57bbb72fc5b4a83ac21c443c9a2ee708e04a10e9192f90a6281", size = 483719 }, + { url = "https://files.pythonhosted.org/packages/a1/e2/58ff6e2a22eca2e2cff5370ae56dba29d70b1ea6fc08ee9115c3ae367795/bcrypt-4.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5eeac541cefd0bb887a371ef73c62c3cd78535e4887b310626036a7c0a817bb", size = 272001 }, + { url = "https://files.pythonhosted.org/packages/37/1f/c55ed8dbe994b1d088309e366749633c9eb90d139af3c0a50c102ba68a1a/bcrypt-4.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59e1aa0e2cd871b08ca146ed08445038f42ff75968c7ae50d2fdd7860ade2180", size = 277451 }, + { url = "https://files.pythonhosted.org/packages/d7/1c/794feb2ecf22fe73dcfb697ea7057f632061faceb7dcf0f155f3443b4d79/bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:0042b2e342e9ae3d2ed22727c1262f76cc4f345683b5c1715f0250cf4277294f", size = 272792 }, + { url = "https://files.pythonhosted.org/packages/13/b7/0b289506a3f3598c2ae2bdfa0ea66969812ed200264e3f61df77753eee6d/bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74a8d21a09f5e025a9a23e7c0fd2c7fe8e7503e4d356c0a2c1486ba010619f09", size = 289752 }, + { url = "https://files.pythonhosted.org/packages/dc/24/d0fb023788afe9e83cc118895a9f6c57e1044e7e1672f045e46733421fe6/bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:0142b2cb84a009f8452c8c5a33ace5e3dfec4159e7735f5afe9a4d50a8ea722d", size = 277762 }, + { url = "https://files.pythonhosted.org/packages/e4/38/cde58089492e55ac4ef6c49fea7027600c84fd23f7520c62118c03b4625e/bcrypt-4.3.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:12fa6ce40cde3f0b899729dbd7d5e8811cb892d31b6f7d0334a1f37748b789fd", size = 272384 }, + { url = "https://files.pythonhosted.org/packages/de/6a/d5026520843490cfc8135d03012a413e4532a400e471e6188b01b2de853f/bcrypt-4.3.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:5bd3cca1f2aa5dbcf39e2aa13dd094ea181f48959e1071265de49cc2b82525af", size = 277329 }, + { url = "https://files.pythonhosted.org/packages/b3/a3/4fc5255e60486466c389e28c12579d2829b28a527360e9430b4041df4cf9/bcrypt-4.3.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:335a420cfd63fc5bc27308e929bee231c15c85cc4c496610ffb17923abf7f231", size = 305241 }, + { url = "https://files.pythonhosted.org/packages/c7/15/2b37bc07d6ce27cc94e5b10fd5058900eb8fb11642300e932c8c82e25c4a/bcrypt-4.3.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:0e30e5e67aed0187a1764911af023043b4542e70a7461ad20e837e94d23e1d6c", size = 309617 }, + { url = "https://files.pythonhosted.org/packages/5f/1f/99f65edb09e6c935232ba0430c8c13bb98cb3194b6d636e61d93fe60ac59/bcrypt-4.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b8d62290ebefd49ee0b3ce7500f5dbdcf13b81402c05f6dafab9a1e1b27212f", size = 335751 }, + { url = "https://files.pythonhosted.org/packages/00/1b/b324030c706711c99769988fcb694b3cb23f247ad39a7823a78e361bdbb8/bcrypt-4.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef6630e0ec01376f59a006dc72918b1bf436c3b571b80fa1968d775fa02fe7d", size = 355965 }, + { url = "https://files.pythonhosted.org/packages/aa/dd/20372a0579dd915dfc3b1cd4943b3bca431866fcb1dfdfd7518c3caddea6/bcrypt-4.3.0-cp313-cp313t-win32.whl", hash = "sha256:7a4be4cbf241afee43f1c3969b9103a41b40bcb3a3f467ab19f891d9bc4642e4", size = 155316 }, + { url = "https://files.pythonhosted.org/packages/6d/52/45d969fcff6b5577c2bf17098dc36269b4c02197d551371c023130c0f890/bcrypt-4.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c1949bf259a388863ced887c7861da1df681cb2388645766c89fdfd9004c669", size = 147752 }, + { url = "https://files.pythonhosted.org/packages/11/22/5ada0b9af72b60cbc4c9a399fdde4af0feaa609d27eb0adc61607997a3fa/bcrypt-4.3.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:f81b0ed2639568bf14749112298f9e4e2b28853dab50a8b357e31798686a036d", size = 498019 }, + { url = "https://files.pythonhosted.org/packages/b8/8c/252a1edc598dc1ce57905be173328eda073083826955ee3c97c7ff5ba584/bcrypt-4.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:864f8f19adbe13b7de11ba15d85d4a428c7e2f344bac110f667676a0ff84924b", size = 279174 }, + { url = "https://files.pythonhosted.org/packages/29/5b/4547d5c49b85f0337c13929f2ccbe08b7283069eea3550a457914fc078aa/bcrypt-4.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e36506d001e93bffe59754397572f21bb5dc7c83f54454c990c74a468cd589e", size = 283870 }, + { url = "https://files.pythonhosted.org/packages/be/21/7dbaf3fa1745cb63f776bb046e481fbababd7d344c5324eab47f5ca92dd2/bcrypt-4.3.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:842d08d75d9fe9fb94b18b071090220697f9f184d4547179b60734846461ed59", size = 279601 }, + { url = "https://files.pythonhosted.org/packages/6d/64/e042fc8262e971347d9230d9abbe70d68b0a549acd8611c83cebd3eaec67/bcrypt-4.3.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7c03296b85cb87db865d91da79bf63d5609284fc0cab9472fdd8367bbd830753", size = 297660 }, + { url = "https://files.pythonhosted.org/packages/50/b8/6294eb84a3fef3b67c69b4470fcdd5326676806bf2519cda79331ab3c3a9/bcrypt-4.3.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:62f26585e8b219cdc909b6a0069efc5e4267e25d4a3770a364ac58024f62a761", size = 284083 }, + { url = "https://files.pythonhosted.org/packages/62/e6/baff635a4f2c42e8788fe1b1633911c38551ecca9a749d1052d296329da6/bcrypt-4.3.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:beeefe437218a65322fbd0069eb437e7c98137e08f22c4660ac2dc795c31f8bb", size = 279237 }, + { url = "https://files.pythonhosted.org/packages/39/48/46f623f1b0c7dc2e5de0b8af5e6f5ac4cc26408ac33f3d424e5ad8da4a90/bcrypt-4.3.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:97eea7408db3a5bcce4a55d13245ab3fa566e23b4c67cd227062bb49e26c585d", size = 283737 }, + { url = "https://files.pythonhosted.org/packages/49/8b/70671c3ce9c0fca4a6cc3cc6ccbaa7e948875a2e62cbd146e04a4011899c/bcrypt-4.3.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:191354ebfe305e84f344c5964c7cd5f924a3bfc5d405c75ad07f232b6dffb49f", size = 312741 }, + { url = "https://files.pythonhosted.org/packages/27/fb/910d3a1caa2d249b6040a5caf9f9866c52114d51523ac2fb47578a27faee/bcrypt-4.3.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:41261d64150858eeb5ff43c753c4b216991e0ae16614a308a15d909503617732", size = 316472 }, + { url = "https://files.pythonhosted.org/packages/dc/cf/7cf3a05b66ce466cfb575dbbda39718d45a609daa78500f57fa9f36fa3c0/bcrypt-4.3.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:33752b1ba962ee793fa2b6321404bf20011fe45b9afd2a842139de3011898fef", size = 343606 }, + { url = "https://files.pythonhosted.org/packages/e3/b8/e970ecc6d7e355c0d892b7f733480f4aa8509f99b33e71550242cf0b7e63/bcrypt-4.3.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:50e6e80a4bfd23a25f5c05b90167c19030cf9f87930f7cb2eacb99f45d1c3304", size = 362867 }, + { url = "https://files.pythonhosted.org/packages/a9/97/8d3118efd8354c555a3422d544163f40d9f236be5b96c714086463f11699/bcrypt-4.3.0-cp38-abi3-win32.whl", hash = "sha256:67a561c4d9fb9465ec866177e7aebcad08fe23aaf6fbd692a6fab69088abfc51", size = 160589 }, + { url = "https://files.pythonhosted.org/packages/29/07/416f0b99f7f3997c69815365babbc2e8754181a4b1899d921b3c7d5b6f12/bcrypt-4.3.0-cp38-abi3-win_amd64.whl", hash = "sha256:584027857bc2843772114717a7490a37f68da563b3620f78a849bcb54dc11e62", size = 152794 }, + { url = "https://files.pythonhosted.org/packages/6e/c1/3fa0e9e4e0bfd3fd77eb8b52ec198fd6e1fd7e9402052e43f23483f956dd/bcrypt-4.3.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d3efb1157edebfd9128e4e46e2ac1a64e0c1fe46fb023158a407c7892b0f8c3", size = 498969 }, + { url = "https://files.pythonhosted.org/packages/ce/d4/755ce19b6743394787fbd7dff6bf271b27ee9b5912a97242e3caf125885b/bcrypt-4.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08bacc884fd302b611226c01014eca277d48f0a05187666bca23aac0dad6fe24", size = 279158 }, + { url = "https://files.pythonhosted.org/packages/9b/5d/805ef1a749c965c46b28285dfb5cd272a7ed9fa971f970435a5133250182/bcrypt-4.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6746e6fec103fcd509b96bacdfdaa2fbde9a553245dbada284435173a6f1aef", size = 284285 }, + { url = "https://files.pythonhosted.org/packages/ab/2b/698580547a4a4988e415721b71eb45e80c879f0fb04a62da131f45987b96/bcrypt-4.3.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:afe327968aaf13fc143a56a3360cb27d4ad0345e34da12c7290f1b00b8fe9a8b", size = 279583 }, + { url = "https://files.pythonhosted.org/packages/f2/87/62e1e426418204db520f955ffd06f1efd389feca893dad7095bf35612eec/bcrypt-4.3.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d9af79d322e735b1fc33404b5765108ae0ff232d4b54666d46730f8ac1a43676", size = 297896 }, + { url = "https://files.pythonhosted.org/packages/cb/c6/8fedca4c2ada1b6e889c52d2943b2f968d3427e5d65f595620ec4c06fa2f/bcrypt-4.3.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f1e3ffa1365e8702dc48c8b360fef8d7afeca482809c5e45e653af82ccd088c1", size = 284492 }, + { url = "https://files.pythonhosted.org/packages/4d/4d/c43332dcaaddb7710a8ff5269fcccba97ed3c85987ddaa808db084267b9a/bcrypt-4.3.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3004df1b323d10021fda07a813fd33e0fd57bef0e9a480bb143877f6cba996fe", size = 279213 }, + { url = "https://files.pythonhosted.org/packages/dc/7f/1e36379e169a7df3a14a1c160a49b7b918600a6008de43ff20d479e6f4b5/bcrypt-4.3.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:531457e5c839d8caea9b589a1bcfe3756b0547d7814e9ce3d437f17da75c32b0", size = 284162 }, + { url = "https://files.pythonhosted.org/packages/1c/0a/644b2731194b0d7646f3210dc4d80c7fee3ecb3a1f791a6e0ae6bb8684e3/bcrypt-4.3.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:17a854d9a7a476a89dcef6c8bd119ad23e0f82557afbd2c442777a16408e614f", size = 312856 }, + { url = "https://files.pythonhosted.org/packages/dc/62/2a871837c0bb6ab0c9a88bf54de0fc021a6a08832d4ea313ed92a669d437/bcrypt-4.3.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6fb1fd3ab08c0cbc6826a2e0447610c6f09e983a281b919ed721ad32236b8b23", size = 316726 }, + { url = "https://files.pythonhosted.org/packages/0c/a1/9898ea3faac0b156d457fd73a3cb9c2855c6fd063e44b8522925cdd8ce46/bcrypt-4.3.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e965a9c1e9a393b8005031ff52583cedc15b7884fce7deb8b0346388837d6cfe", size = 343664 }, + { url = "https://files.pythonhosted.org/packages/40/f2/71b4ed65ce38982ecdda0ff20c3ad1b15e71949c78b2c053df53629ce940/bcrypt-4.3.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:79e70b8342a33b52b55d93b3a59223a844962bef479f6a0ea318ebbcadf71505", size = 363128 }, + { url = "https://files.pythonhosted.org/packages/11/99/12f6a58eca6dea4be992d6c681b7ec9410a1d9f5cf368c61437e31daa879/bcrypt-4.3.0-cp39-abi3-win32.whl", hash = "sha256:b4d4e57f0a63fd0b358eb765063ff661328f69a04494427265950c71b992a39a", size = 160598 }, + { url = "https://files.pythonhosted.org/packages/a9/cf/45fb5261ece3e6b9817d3d82b2f343a505fd58674a92577923bc500bd1aa/bcrypt-4.3.0-cp39-abi3-win_amd64.whl", hash = "sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b", size = 152799 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, +] + +[[package]] +name = "bleach" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "build" +version = "1.2.2.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt' and sys_platform != 'linux'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/46/aeab111f8e06793e4f0e421fcad593d547fb8313b50990f31681ee2fb1ad/build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7", size = 46701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/c2/80633736cd183ee4a62107413def345f7e6e3c01563dbca1417363cf957e/build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5", size = 22950 }, +] + +[[package]] +name = "cachetools" +version = "5.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 }, +] + +[[package]] +name = "certifi" +version = "2025.4.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936 }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790 }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924 }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626 }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567 }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957 }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408 }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399 }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815 }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537 }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565 }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357 }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776 }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, +] + +[[package]] +name = "chromadb" +version = "1.0.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bcrypt" }, + { name = "build" }, + { name = "fastapi" }, + { name = "grpcio" }, + { name = "httpx" }, + { name = "importlib-resources" }, + { name = "jsonschema" }, + { name = "kubernetes" }, + { name = "mmh3" }, + { name = "numpy" }, + { name = "onnxruntime" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-grpc" }, + { name = "opentelemetry-instrumentation-fastapi" }, + { name = "opentelemetry-sdk" }, + { name = "orjson" }, + { name = "overrides" }, + { name = "posthog" }, + { name = "pydantic" }, + { name = "pypika" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "tenacity" }, + { name = "tokenizers" }, + { name = "tqdm" }, + { name = "typer" }, + { name = "typing-extensions" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/fe/ae7ca5ef7c38b6a3e4e7d249b240d99f40f5266b562e8e9e62266c21196b/chromadb-1.0.10.tar.gz", hash = "sha256:171ba48283e579debed920279f33d340ded80d8986802c2472df40e00a1d68eb", size = 1200803 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/dd/fe223dace71e6d644947798c7ecd64d19624090afcbb334cb70e0e8801f9/chromadb-1.0.10-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7e962123c27e85e9bf2112f6c60ffdaa0a4666502f205eadc34760284f4ca72f", size = 18300874 }, + { url = "https://files.pythonhosted.org/packages/5e/da/95ae4f4313623aa517bc7b2d97e72d0ef5601d085598b09de66d676af8a9/chromadb-1.0.10-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:81381e80a2cb74235816987ca601a8ebba467fae494b37c315efb1cb38c3ca9e", size = 17554400 }, + { url = "https://files.pythonhosted.org/packages/73/d9/59f29c3bd55808b1d9861d36c49d3b4bfffe693382edc1d980d25f5dff38/chromadb-1.0.10-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca63ffa9316e3a1672ef8948e243dd3ae858559eda58eaf4826930f3a4faf5", size = 18073433 }, + { url = "https://files.pythonhosted.org/packages/08/b6/75fb165801fcfa374610390528f2a5e5f0a79de8572f3533bff39001ce52/chromadb-1.0.10-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44f498f734f7396a21bf244b304dbae0f5e6d60d81f2ec4311807e3f13df403e", size = 18981802 }, + { url = "https://files.pythonhosted.org/packages/93/97/7ada7af95dad0d12c6d0f48fda2c9f806b1dc82f0c6d6dbd98a898e21517/chromadb-1.0.10-cp39-abi3-win_amd64.whl", hash = "sha256:a12b0fbded699b00ffb7bb72e6ddce574d8fad381e783dc7cef08fc1fe268b19", size = 18969769 }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, +] + +[[package]] +name = "cma" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/cd/5c2bdbe3cc765c5b8e68deaee199461aaa4b4ede126e66e28a343d435787/cma-4.2.0.tar.gz", hash = "sha256:1868605e751f5dd9f1a4f8a9b7c8844a5abe8e93a729dc46be6c6c0550269b9f", size = 276904 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ea/8354a45ea705bd0e67cbf67754bcc16ece4b09404ecf0228c479b6eef30b/cma-4.2.0-py3-none-any.whl", hash = "sha256:844dc93abaa427c5a37520586970c463dfce6f8aad5652e0fbd6e0229970f1ae", size = 288153 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "coloredlogs" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "humanfriendly" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018 }, +] + +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580 }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688 }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331 }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963 }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681 }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674 }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480 }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow" }, + { name = "typing-inspect" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 }, +] + +[[package]] +name = "datasets" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/89/d3d6fef58a488f8569c82fd293ab7cbd4250244d67f425dcae64c63800ea/datasets-3.6.0.tar.gz", hash = "sha256:1b2bf43b19776e2787e181cfd329cb0ca1a358ea014780c3581e0f276375e041", size = 569336 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/34/a08b0ee99715eaba118cbe19a71f7b5e2425c2718ef96007c325944a1152/datasets-3.6.0-py3-none-any.whl", hash = "sha256:25000c4a2c0873a710df127d08a202a06eab7bf42441a6bc278b499c2f72cd1b", size = 491546 }, +] + +[[package]] +name = "debugpy" +version = "1.8.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268 }, + { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077 }, + { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127 }, + { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249 }, + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676 }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514 }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756 }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119 }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230 }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + +[[package]] +name = "deprecated" +version = "1.2.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, +] + +[[package]] +name = "dill" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, +] + +[[package]] +name = "dnspython" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, +] + +[[package]] +name = "durationpy" +version = "0.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/a4/e44218c2b394e31a6dd0d6b095c4e1f32d0be54c2a4b250032d717647bab/durationpy-0.10.tar.gz", hash = "sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba", size = 3335 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/0d/9feae160378a3553fa9a339b0e9c1a048e147a4127210e286ef18b730f03/durationpy-0.10-py3-none-any.whl", hash = "sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286", size = 3922 }, +] + +[[package]] +name = "email-validator" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, +] + +[[package]] +name = "executing" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, +] + +[[package]] +name = "fastapi" +version = "0.115.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/dd/d854f85e70f7341b29e3fda754f2833aec197bd355f805238758e3bcd8ed/fastapi-0.115.9.tar.gz", hash = "sha256:9d7da3b196c5eed049bc769f9475cd55509a112fbe031c0ef2f53768ae68d13f", size = 293774 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/b6/7517af5234378518f27ad35a7b24af9591bc500b8c1780929c1295999eb6/fastapi-0.115.9-py3-none-any.whl", hash = "sha256:4a439d7923e4de796bcc88b64e9754340fcd1574673cbd865ba8a99fe0d28c56", size = 94919 }, +] + +[package.optional-dependencies] +standard = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "python-multipart" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rich-toolkit" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, +] + +[package.optional-dependencies] +standard = [ + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, +] + +[[package]] +name = "flatbuffers" +version = "25.2.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/30/eb5dce7994fc71a2f685d98ec33cc660c0a5887db5610137e60d8cbc4489/flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e", size = 22170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/25/155f9f080d5e4bc0082edfda032ea2bc2b8fab3f4d25d46c1e9dd22a1a89/flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051", size = 30953 }, +] + +[[package]] +name = "fonttools" +version = "4.58.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/cf/4d037663e2a1fe30fddb655d755d76e18624be44ad467c07412c2319ab97/fonttools-4.58.0.tar.gz", hash = "sha256:27423d0606a2c7b336913254bf0b1193ebd471d5f725d665e875c5e88a011a43", size = 3514522 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/4e/1c6b35ec7c04d739df4cf5aace4b7ec284d6af2533a65de21972e2f237d9/fonttools-4.58.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:aa8316798f982c751d71f0025b372151ea36405733b62d0d94d5e7b8dd674fa6", size = 2737502 }, + { url = "https://files.pythonhosted.org/packages/fc/72/c6fcafa3c9ed2b69991ae25a1ba7a3fec8bf74928a96e8229c37faa8eda2/fonttools-4.58.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c6db489511e867633b859b11aefe1b7c0d90281c5bdb903413edbb2ba77b97f1", size = 2307214 }, + { url = "https://files.pythonhosted.org/packages/52/11/1015cedc9878da6d8d1758049749eef857b693e5828d477287a959c8650f/fonttools-4.58.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:107bdb2dacb1f627db3c4b77fb16d065a10fe88978d02b4fc327b9ecf8a62060", size = 4811136 }, + { url = "https://files.pythonhosted.org/packages/32/b9/6a1bc1af6ec17eead5d32e87075e22d0dab001eace0b5a1542d38c6a9483/fonttools-4.58.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba7212068ab20f1128a0475f169068ba8e5b6e35a39ba1980b9f53f6ac9720ac", size = 4876598 }, + { url = "https://files.pythonhosted.org/packages/d8/46/b14584c7ea65ad1609fb9632251016cda8a2cd66b15606753b9f888d3677/fonttools-4.58.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f95ea3b6a3b9962da3c82db73f46d6a6845a6c3f3f968f5293b3ac1864e771c2", size = 4872256 }, + { url = "https://files.pythonhosted.org/packages/05/78/b2105a7812ca4ef9bf180cd741c82f4522316c652ce2a56f788e2eb54b62/fonttools-4.58.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:874f1225cc4ccfeac32009887f722d7f8b107ca5e867dcee067597eef9d4c80b", size = 5028710 }, + { url = "https://files.pythonhosted.org/packages/8c/a9/a38c85ffd30d1f2c7a5460c8abfd1aa66e00c198df3ff0b08117f5c6fcd9/fonttools-4.58.0-cp312-cp312-win32.whl", hash = "sha256:5f3cde64ec99c43260e2e6c4fa70dfb0a5e2c1c1d27a4f4fe4618c16f6c9ff71", size = 2173593 }, + { url = "https://files.pythonhosted.org/packages/66/48/29752962a74b7ed95da976b5a968bba1fe611a4a7e50b9fefa345e6e7025/fonttools-4.58.0-cp312-cp312-win_amd64.whl", hash = "sha256:2aee08e2818de45067109a207cbd1b3072939f77751ef05904d506111df5d824", size = 2223230 }, + { url = "https://files.pythonhosted.org/packages/0c/d7/d77cae11c445916d767cace93ba8283b3f360197d95d7470b90a9e984e10/fonttools-4.58.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4809790f2371d8a08e59e1ce2b734c954cf09742e75642d7f4c46cfdac488fdd", size = 2728320 }, + { url = "https://files.pythonhosted.org/packages/77/48/7d8b3c519ef4b48081d40310262224a38785e39a8610ccb92a229a6f085d/fonttools-4.58.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b00f240280f204ce4546b05ff3515bf8ff47a9cae914c718490025ea2bb9b324", size = 2302570 }, + { url = "https://files.pythonhosted.org/packages/2c/48/156b83eb8fb7261056e448bfda1b495b90e761b28ec23cee10e3e19f1967/fonttools-4.58.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a62015ad463e1925544e9159dd6eefe33ebfb80938d5ab15d8b1c4b354ff47b", size = 4790066 }, + { url = "https://files.pythonhosted.org/packages/60/49/aaecb1b3cea2b9b9c7cea6240d6bc8090feb5489a6fbf93cb68003be979b/fonttools-4.58.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ceef6f6ab58061a811967e3e32e630747fcb823dcc33a9a2c80e2d0d17cb292", size = 4861076 }, + { url = "https://files.pythonhosted.org/packages/dc/c8/97cbb41bee81ea9daf6109e0f3f70a274a3c69418e5ac6b0193f5dacf506/fonttools-4.58.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c7be21ac52370b515cdbdd0f400803fd29432a4fa4ddb4244ac8b322e54f36c0", size = 4858394 }, + { url = "https://files.pythonhosted.org/packages/4d/23/c2c231457361f869a7d7374a557208e303b469d48a4a697c0fb249733ea1/fonttools-4.58.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:85836be4c3c4aacf6fcb7a6f263896d0e9ce431da9fa6fe9213d70f221f131c9", size = 5002160 }, + { url = "https://files.pythonhosted.org/packages/a9/e0/c2262f941a43b810c5c192db94b5d1ce8eda91bec2757f7e2416398f4072/fonttools-4.58.0-cp313-cp313-win32.whl", hash = "sha256:2b32b7130277bd742cb8c4379a6a303963597d22adea77a940343f3eadbcaa4c", size = 2171919 }, + { url = "https://files.pythonhosted.org/packages/8f/ee/e4aa7bb4ce510ad57a808d321df1bbed1eeb6e1dfb20aaee1a5d9c076849/fonttools-4.58.0-cp313-cp313-win_amd64.whl", hash = "sha256:75e68ee2ec9aaa173cf5e33f243da1d51d653d5e25090f2722bc644a78db0f1a", size = 2222972 }, + { url = "https://files.pythonhosted.org/packages/9b/1f/4417c26e26a1feab85a27e927f7a73d8aabc84544be8ba108ce4aa90eb1e/fonttools-4.58.0-py3-none-any.whl", hash = "sha256:c96c36880be2268be409df7b08c5b5dacac1827083461a6bc2cb07b8cbcec1d7", size = 1111440 }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 }, +] + +[[package]] +name = "frozenlist" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193 }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831 }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862 }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361 }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115 }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505 }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666 }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119 }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226 }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788 }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914 }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283 }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264 }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482 }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248 }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161 }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548 }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182 }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838 }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980 }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463 }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985 }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188 }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874 }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897 }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799 }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804 }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404 }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572 }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601 }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232 }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187 }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772 }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847 }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937 }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029 }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831 }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981 }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999 }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200 }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134 }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208 }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548 }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123 }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199 }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854 }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412 }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936 }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459 }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797 }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709 }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404 }, +] + +[[package]] +name = "fsspec" +version = "2025.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615 }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + +[[package]] +name = "google-auth" +version = "2.40.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "pyasn1-modules" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/84/f67f53c505a6b2c5da05c988e2a5483f5ba9eee4b1841d2e3ff22f547cd5/google_auth-2.40.2.tar.gz", hash = "sha256:a33cde547a2134273226fa4b853883559947ebe9207521f7afc707efbf690f58", size = 280990 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/c7/e2d82e6702e2a9e2311c138f8e1100f21d08aed0231290872b229ae57a86/google_auth-2.40.2-py2.py3-none-any.whl", hash = "sha256:f7e568d42eedfded58734f6a60c58321896a621f7c116c411550a4b4a13da90b", size = 216102 }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530 }, +] + +[[package]] +name = "grapheme" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/e7/bbaab0d2a33e07c8278910c1d0d8d4f3781293dfbc70b5c38197159046bf/grapheme-0.6.0.tar.gz", hash = "sha256:44c2b9f21bbe77cfb05835fec230bd435954275267fea1858013b102f8603cca", size = 207306 } + +[[package]] +name = "greenlet" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/c1/a82edae11d46c0d83481aacaa1e578fea21d94a1ef400afd734d47ad95ad/greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", size = 185797 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/a1/88fdc6ce0df6ad361a30ed78d24c86ea32acb2b563f33e39e927b1da9ea0/greenlet-3.2.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330", size = 270413 }, + { url = "https://files.pythonhosted.org/packages/a6/2e/6c1caffd65490c68cd9bcec8cb7feb8ac7b27d38ba1fea121fdc1f2331dc/greenlet-3.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b", size = 637242 }, + { url = "https://files.pythonhosted.org/packages/98/28/088af2cedf8823b6b7ab029a5626302af4ca1037cf8b998bed3a8d3cb9e2/greenlet-3.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e", size = 651444 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0116ab876bb0bc7a81eadc21c3f02cd6100dcd25a1cf2a085a130a63a26a/greenlet-3.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275", size = 646067 }, + { url = "https://files.pythonhosted.org/packages/35/17/bb8f9c9580e28a94a9575da847c257953d5eb6e39ca888239183320c1c28/greenlet-3.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65", size = 648153 }, + { url = "https://files.pythonhosted.org/packages/2c/ee/7f31b6f7021b8df6f7203b53b9cc741b939a2591dcc6d899d8042fcf66f2/greenlet-3.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3", size = 603865 }, + { url = "https://files.pythonhosted.org/packages/b5/2d/759fa59323b521c6f223276a4fc3d3719475dc9ae4c44c2fe7fc750f8de0/greenlet-3.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e", size = 1119575 }, + { url = "https://files.pythonhosted.org/packages/30/05/356813470060bce0e81c3df63ab8cd1967c1ff6f5189760c1a4734d405ba/greenlet-3.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a31ead8411a027c2c4759113cf2bd473690517494f3d6e4bf67064589afcd3c5", size = 1147460 }, + { url = "https://files.pythonhosted.org/packages/07/f4/b2a26a309a04fb844c7406a4501331b9400e1dd7dd64d3450472fd47d2e1/greenlet-3.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b24c7844c0a0afc3ccbeb0b807adeefb7eff2b5599229ecedddcfeb0ef333bec", size = 296239 }, + { url = "https://files.pythonhosted.org/packages/89/30/97b49779fff8601af20972a62cc4af0c497c1504dfbb3e93be218e093f21/greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", size = 269150 }, + { url = "https://files.pythonhosted.org/packages/21/30/877245def4220f684bc2e01df1c2e782c164e84b32e07373992f14a2d107/greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", size = 637381 }, + { url = "https://files.pythonhosted.org/packages/8e/16/adf937908e1f913856b5371c1d8bdaef5f58f251d714085abeea73ecc471/greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", size = 651427 }, + { url = "https://files.pythonhosted.org/packages/ad/49/6d79f58fa695b618654adac64e56aff2eeb13344dc28259af8f505662bb1/greenlet-3.2.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", size = 645795 }, + { url = "https://files.pythonhosted.org/packages/5a/e6/28ed5cb929c6b2f001e96b1d0698c622976cd8f1e41fe7ebc047fa7c6dd4/greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", size = 648398 }, + { url = "https://files.pythonhosted.org/packages/9d/70/b200194e25ae86bc57077f695b6cc47ee3118becf54130c5514456cf8dac/greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", size = 606795 }, + { url = "https://files.pythonhosted.org/packages/f8/c8/ba1def67513a941154ed8f9477ae6e5a03f645be6b507d3930f72ed508d3/greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", size = 1117976 }, + { url = "https://files.pythonhosted.org/packages/c3/30/d0e88c1cfcc1b3331d63c2b54a0a3a4a950ef202fb8b92e772ca714a9221/greenlet-3.2.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", size = 1145509 }, + { url = "https://files.pythonhosted.org/packages/90/2e/59d6491834b6e289051b252cf4776d16da51c7c6ca6a87ff97e3a50aa0cd/greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421", size = 296023 }, + { url = "https://files.pythonhosted.org/packages/65/66/8a73aace5a5335a1cba56d0da71b7bd93e450f17d372c5b7c5fa547557e9/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", size = 629911 }, + { url = "https://files.pythonhosted.org/packages/48/08/c8b8ebac4e0c95dcc68ec99198842e7db53eda4ab3fb0a4e785690883991/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", size = 635251 }, + { url = "https://files.pythonhosted.org/packages/37/26/7db30868f73e86b9125264d2959acabea132b444b88185ba5c462cb8e571/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", size = 632620 }, + { url = "https://files.pythonhosted.org/packages/10/ec/718a3bd56249e729016b0b69bee4adea0dfccf6ca43d147ef3b21edbca16/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", size = 628851 }, + { url = "https://files.pythonhosted.org/packages/9b/9d/d1c79286a76bc62ccdc1387291464af16a4204ea717f24e77b0acd623b99/greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", size = 593718 }, + { url = "https://files.pythonhosted.org/packages/cd/41/96ba2bf948f67b245784cd294b84e3d17933597dffd3acdb367a210d1949/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", size = 1105752 }, + { url = "https://files.pythonhosted.org/packages/68/3b/3b97f9d33c1f2eb081759da62bd6162159db260f602f048bc2f36b4c453e/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", size = 1125170 }, + { url = "https://files.pythonhosted.org/packages/31/df/b7d17d66c8d0f578d2885a3d8f565e9e4725eacc9d3fdc946d0031c055c4/greenlet-3.2.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:9ea5231428af34226c05f927e16fc7f6fa5e39e3ad3cd24ffa48ba53a47f4240", size = 269899 }, +] + +[[package]] +name = "grpcio" +version = "1.71.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/95/aa11fc09a85d91fbc7dd405dcb2a1e0256989d67bf89fa65ae24b3ba105a/grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c", size = 12549828 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/83/bd4b6a9ba07825bd19c711d8b25874cd5de72c2a3fbf635c3c344ae65bd2/grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537", size = 5184101 }, + { url = "https://files.pythonhosted.org/packages/31/ea/2e0d90c0853568bf714693447f5c73272ea95ee8dad107807fde740e595d/grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7", size = 11310927 }, + { url = "https://files.pythonhosted.org/packages/ac/bc/07a3fd8af80467390af491d7dc66882db43884128cdb3cc8524915e0023c/grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec", size = 5654280 }, + { url = "https://files.pythonhosted.org/packages/16/af/21f22ea3eed3d0538b6ef7889fce1878a8ba4164497f9e07385733391e2b/grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594", size = 6312051 }, + { url = "https://files.pythonhosted.org/packages/49/9d/e12ddc726dc8bd1aa6cba67c85ce42a12ba5b9dd75d5042214a59ccf28ce/grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c", size = 5910666 }, + { url = "https://files.pythonhosted.org/packages/d9/e9/38713d6d67aedef738b815763c25f092e0454dc58e77b1d2a51c9d5b3325/grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67", size = 6012019 }, + { url = "https://files.pythonhosted.org/packages/80/da/4813cd7adbae6467724fa46c952d7aeac5e82e550b1c62ed2aeb78d444ae/grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db", size = 6637043 }, + { url = "https://files.pythonhosted.org/packages/52/ca/c0d767082e39dccb7985c73ab4cf1d23ce8613387149e9978c70c3bf3b07/grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79", size = 6186143 }, + { url = "https://files.pythonhosted.org/packages/00/61/7b2c8ec13303f8fe36832c13d91ad4d4ba57204b1c723ada709c346b2271/grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a", size = 3604083 }, + { url = "https://files.pythonhosted.org/packages/fd/7c/1e429c5fb26122055d10ff9a1d754790fb067d83c633ff69eddcf8e3614b/grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8", size = 4272191 }, + { url = "https://files.pythonhosted.org/packages/04/dd/b00cbb45400d06b26126dcfdbdb34bb6c4f28c3ebbd7aea8228679103ef6/grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379", size = 5184138 }, + { url = "https://files.pythonhosted.org/packages/ed/0a/4651215983d590ef53aac40ba0e29dda941a02b097892c44fa3357e706e5/grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3", size = 11310747 }, + { url = "https://files.pythonhosted.org/packages/57/a3/149615b247f321e13f60aa512d3509d4215173bdb982c9098d78484de216/grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db", size = 5653991 }, + { url = "https://files.pythonhosted.org/packages/ca/56/29432a3e8d951b5e4e520a40cd93bebaa824a14033ea8e65b0ece1da6167/grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29", size = 6312781 }, + { url = "https://files.pythonhosted.org/packages/a3/f8/286e81a62964ceb6ac10b10925261d4871a762d2a763fbf354115f9afc98/grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4", size = 5910479 }, + { url = "https://files.pythonhosted.org/packages/35/67/d1febb49ec0f599b9e6d4d0d44c2d4afdbed9c3e80deb7587ec788fcf252/grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3", size = 6013262 }, + { url = "https://files.pythonhosted.org/packages/a1/04/f9ceda11755f0104a075ad7163fc0d96e2e3a9fe25ef38adfc74c5790daf/grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b", size = 6643356 }, + { url = "https://files.pythonhosted.org/packages/fb/ce/236dbc3dc77cf9a9242adcf1f62538734ad64727fabf39e1346ad4bd5c75/grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637", size = 6186564 }, + { url = "https://files.pythonhosted.org/packages/10/fd/b3348fce9dd4280e221f513dd54024e765b21c348bc475516672da4218e9/grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb", size = 3601890 }, + { url = "https://files.pythonhosted.org/packages/be/f8/db5d5f3fc7e296166286c2a397836b8b042f7ad1e11028d82b061701f0f7/grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366", size = 4273308 }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, +] + +[[package]] +name = "hf-xet" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/be/58f20728a5b445f8b064e74f0618897b3439f5ef90934da1916b9dfac76f/hf_xet-1.1.2.tar.gz", hash = "sha256:3712d6d4819d3976a1c18e36db9f503e296283f9363af818f50703506ed63da3", size = 467009 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/ae/f1a63f75d9886f18a80220ba31a1c7b9c4752f03aae452f358f538c6a991/hf_xet-1.1.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dfd1873fd648488c70735cb60f7728512bca0e459e61fcd107069143cd798469", size = 2642559 }, + { url = "https://files.pythonhosted.org/packages/50/ab/d2c83ae18f1015d926defd5bfbe94c62d15e93f900e6a192e318ee947105/hf_xet-1.1.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:29b584983b2d977c44157d9241dcf0fd50acde0b7bff8897fe4386912330090d", size = 2541360 }, + { url = "https://files.pythonhosted.org/packages/9f/a7/693dc9f34f979e30a378125e2150a0b2d8d166e6d83ce3950eeb81e560aa/hf_xet-1.1.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b29ac84298147fe9164cc55ad994ba47399f90b5d045b0b803b99cf5f06d8ec", size = 5183081 }, + { url = "https://files.pythonhosted.org/packages/3d/23/c48607883f692a36c0a7735f47f98bad32dbe459a32d1568c0f21576985d/hf_xet-1.1.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d921ba32615676e436a0d15e162331abc9ed43d440916b1d836dc27ce1546173", size = 5356100 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/b2316c7f1076da0582b52ea228f68bea95e243c388440d1dc80297c9d813/hf_xet-1.1.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d9b03c34e13c44893ab6e8fea18ee8d2a6878c15328dd3aabedbdd83ee9f2ed3", size = 5647688 }, + { url = "https://files.pythonhosted.org/packages/2c/98/e6995f0fa579929da7795c961f403f4ee84af36c625963f52741d56f242c/hf_xet-1.1.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01b18608955b3d826307d37da8bd38b28a46cd2d9908b3a3655d1363274f941a", size = 5322627 }, + { url = "https://files.pythonhosted.org/packages/59/40/8f1d5a44a64d8bf9e3c19576e789f716af54875b46daae65426714e75db1/hf_xet-1.1.2-cp37-abi3-win_amd64.whl", hash = "sha256:3562902c81299b09f3582ddfb324400c6a901a2f3bc854f83556495755f4954c", size = 2739542 }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, +] + +[[package]] +name = "httptools" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 }, +] + +[[package]] +name = "huggingface-hub" +version = "0.32.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/76/44f7025d1b3f29336aeb7324a57dd7c19f7c69f6612b7637b39ac7c17302/huggingface_hub-0.32.2.tar.gz", hash = "sha256:64a288b1eadad6b60bbfd50f0e52fd6cfa2ef77ab13c3e8a834a038ae929de54", size = 422847 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/30/532fe57467a6cc7ff2e39f088db1cb6d6bf522f724a4a5c7beda1282d5a6/huggingface_hub-0.32.2-py3-none-any.whl", hash = "sha256:f8fcf14603237eadf96dbe577d30b330f8c27b4a0a31e8f6c94fdc25e021fdb8", size = 509968 }, +] + +[[package]] +name = "humanfriendly" +version = "10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyreadline3", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "importlib-metadata" +version = "8.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580", size = 55767 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971 }, +] + +[[package]] +name = "importlib-resources" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461 }, +] + +[[package]] +name = "intel-cmplr-lib-rt" +version = "2025.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.12.4' and sys_platform == 'linux'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/80/2a10995012a5d80cca2d8cac5d3a763116f1d57c272ee4f07ca94ba63a1a/intel_cmplr_lib_rt-2025.0.4-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:440cf7cad2ed16f6a0a4589b03447b2d4fdae4f630ea26a4510e1cf5b40b1f1d", size = 45884211 }, +] + +[[package]] +name = "intel-cmplr-lib-rt" +version = "2025.0.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version < '3.12.4' and sys_platform == 'win32'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/16/85f1f3c1ab200d369b9774b1b6121d2790c8b8647a135882106bcd3aadf9/intel_cmplr_lib_rt-2025.0.5-py2.py3-none-win_amd64.whl", hash = "sha256:928395dc2dc6e423439ff72e52cd02fc5e79686d5b14ce20f58461d8ed7d950a", size = 17271117 }, +] + +[[package]] +name = "intel-cmplr-lib-ur" +version = "2025.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.12.4' and sys_platform == 'linux'", +] +dependencies = [ + { name = "umf", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/d0/0d376a3eb3d5f8d0c0dd828a9f889e485d8ded1f7d501976c72916826cef/intel_cmplr_lib_ur-2025.0.4-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:d36d586721f0cb87b051aca1bf3f653ccee7960f15efb0132e5482d95c5b2c9b", size = 25158275 }, +] + +[[package]] +name = "intel-cmplr-lib-ur" +version = "2025.0.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version < '3.12.4' and sys_platform == 'win32'", +] +dependencies = [ + { name = "umf", marker = "sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/c1/23e258d315f4b39cd923236e6eba90d25f936968be7a0bdfc46b079cef25/intel_cmplr_lib_ur-2025.0.5-py2.py3-none-win_amd64.whl", hash = "sha256:d792c1cafada93aee1ab387e85ecd906a6bb0c0fc5d5fb9b2986c1dcaf301aae", size = 1163425 }, +] + +[[package]] +name = "intel-cmplr-lic-rt" +version = "2025.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.12.4' and sys_platform == 'linux'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/18/77cc45b2e48f35c126f478116b65cad1025cd89ab58038a93fc2ce03a6e9/intel_cmplr_lic_rt-2025.0.4-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:943d03ef2028cdb33140c84bad35b45d02186617ac0cd15849d179764132408a", size = 18913 }, +] + +[[package]] +name = "intel-cmplr-lic-rt" +version = "2025.0.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version < '3.12.4' and sys_platform == 'win32'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/b9/7ac88e49a14026446953c0d2cdf32198b043a10f0b43ad02e36c7b273501/intel_cmplr_lic_rt-2025.0.5-py2.py3-none-win_amd64.whl", hash = "sha256:2a37b5be844790664b7bf67aef33058103368face8ce1ff72643d6e2ffc3efbf", size = 49547 }, +] + +[[package]] +name = "intel-pti" +version = "0.10.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/f2/313e46be14a27d4fb6eaab683a0c7589b0227549e2bf596fa6ccc0df8f8f/intel_pti-0.10.1-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:7e12361e8ac18996258c9d7f9ee831372c1c1c85028fa8502fb257e1dadf1de2", size = 678688 }, + { url = "https://files.pythonhosted.org/packages/da/49/ac4c5413ae249cc79c0f04d926942a2802d3e5b6186d4bfe67db841f53f9/intel_pti-0.10.1-py2.py3-none-win_amd64.whl", hash = "sha256:bf9418aff05dd6807f3130eaae874ab2c5f79bcbfa1eaae7ba9b5c8ff8290038", size = 437518 }, +] + +[[package]] +name = "intel-sycl-rt" +version = "2025.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.12.4' and sys_platform == 'linux'", +] +dependencies = [ + { name = "intel-cmplr-lib-rt", version = "2025.0.4", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" }, + { name = "intel-cmplr-lib-ur", version = "2025.0.4", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" }, + { name = "intel-cmplr-lic-rt", version = "2025.0.4", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2b/3b99709cf8dd3304d05b853797a6fa962394ccf520536dc8e5eb9d3d9b1f/intel_sycl_rt-2025.0.4-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:85c5fd6029f62e8361af1d9ddb0f6c6f9cf4912bbe9ad684f89e9e5842128879", size = 12356130 }, +] + +[[package]] +name = "intel-sycl-rt" +version = "2025.0.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version < '3.12.4' and sys_platform == 'win32'", +] +dependencies = [ + { name = "intel-cmplr-lib-rt", version = "2025.0.5", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, + { name = "intel-cmplr-lib-ur", version = "2025.0.5", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, + { name = "intel-cmplr-lic-rt", version = "2025.0.5", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/11/46cb85d052bf13153f2cb3994dbfda6116a06bff55d209d04b3f424d94d6/intel_sycl_rt-2025.0.5-py2.py3-none-win_amd64.whl", hash = "sha256:10a322b5bb9a180cbeea45fe2c8603bff55f4dedf6302fff7f66dafc191ff580", size = 10786985 }, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, +] + +[[package]] +name = "ipython" +version = "9.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/02/63a84444a7409b3c0acd1de9ffe524660e0e5d82ee473e78b45e5bfb64a4/ipython-9.2.0.tar.gz", hash = "sha256:62a9373dbc12f28f9feaf4700d052195bf89806279fc8ca11f3f54017d04751b", size = 4424394 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/ce/5e897ee51b7d26ab4e47e5105e7368d40ce6cfae2367acdf3165396d50be/ipython-9.2.0-py3-none-any.whl", hash = "sha256:fef5e33c4a1ae0759e0bba5917c9db4eb8c53fee917b6a526bd973e1ca5159f6", size = 604277 }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/48/d3dbac45c2814cb73812f98dd6b38bbcc957a4e7bb31d6ea9c03bf94ed87/ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376", size = 116721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/6a/9166369a2f092bd286d24e6307de555d63616e8ddb373ebad2b5635ca4cd/ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb", size = 139806 }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, +] + +[[package]] +name = "joblib" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746 }, +] + +[[package]] +name = "json5" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/be/c6c745ec4c4539b25a278b70e29793f10382947df0d9efba2fa09120895d/json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a", size = 51907 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/9f/3500910d5a98549e3098807493851eeef2b89cdd3032227558a104dfe926/json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db", size = 36079 }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, +] + +[[package]] +name = "jsonschema" +version = "4.24.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709 }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 }, +] + +[[package]] +name = "jstyleson" +version = "0.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/c1/3791e39d65c39b4e081010f2cf6f9443b7b6b9f6de63a5e458172c5c9376/jstyleson-0.0.2.tar.gz", hash = "sha256:680003f3b15a2959e4e6a351f3b858e3c07dd3e073a0d54954e34d8ea5e1308e", size = 2004 } + +[[package]] +name = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipywidgets" }, + { name = "jupyter-console" }, + { name = "jupyterlab" }, + { name = "nbconvert" }, + { name = "notebook" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657 }, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510 }, +] + +[[package]] +name = "jupyter-core" +version = "5.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430 }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/b4/3200b0b09c12bc3b72d943d923323c398eff382d1dcc7c0dbc8b74630e40/jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001", size = 48741 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", size = 69146 }, +] + +[[package]] +name = "jupyter-server" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "overrides" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/41/c8/ba2bbcd758c47f1124c4ca14061e8ce60d9c6fd537faee9534a95f83521a/jupyter_server-2.16.0.tar.gz", hash = "sha256:65d4b44fdf2dcbbdfe0aa1ace4a842d4aaf746a2b7b168134d5aaed35621b7f6", size = 728177 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/1f/5ebbced977171d09a7b0c08a285ff9a20aafb9c51bde07e52349ff1ddd71/jupyter_server-2.16.0-py3-none-any.whl", hash = "sha256:3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e", size = 386904 }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656 }, +] + +[[package]] +name = "jupyterlab" +version = "4.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/2d/d1678dcf2db66cb4a38a80d9e5fcf48c349f3ac12f2d38882993353ae768/jupyterlab-4.4.3.tar.gz", hash = "sha256:a94c32fd7f8b93e82a49dc70a6ec45a5c18281ca2a7228d12765e4e210e5bca2", size = 23032376 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/4d/7dd5c2ffbb960930452a031dc8410746183c924580f2ab4e68ceb5b3043f/jupyterlab-4.4.3-py3-none-any.whl", hash = "sha256:164302f6d4b6c44773dfc38d585665a4db401a16e5296c37df5cba63904fbdea", size = 12295480 }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700 }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/7d/160595ca88ee87ac6ba95d82177d29ec60aaa63821d3077babb22ce031a5/jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b", size = 213149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/6a/ca128561b22b60bd5a0c4ea26649e68c8556b82bc70a0c396eebc977fe86/jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c", size = 216571 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, +] + +[[package]] +name = "kubernetes" +version = "32.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "durationpy" }, + { name = "google-auth" }, + { name = "oauthlib" }, + { name = "python-dateutil" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "requests-oauthlib" }, + { name = "six" }, + { name = "urllib3" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/e8/0598f0e8b4af37cd9b10d8b87386cf3173cb8045d834ab5f6ec347a758b3/kubernetes-32.0.1.tar.gz", hash = "sha256:42f43d49abd437ada79a79a16bd48a604d3471a117a8347e87db693f2ba0ba28", size = 946691 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/10/9f8af3e6f569685ce3af7faab51c8dd9d93b9c38eba339ca31c746119447/kubernetes-32.0.1-py2.py3-none-any.whl", hash = "sha256:35282ab8493b938b08ab5526c7ce66588232df00ef5e1dbe88a419107dc10998", size = 1988070 }, +] + +[[package]] +name = "langchain" +version = "0.3.25" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langchain-text-splitters" }, + { name = "langsmith" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/f9/a256609096a9fc7a1b3a6300a97000091efabdf21555a97988f93d4d9258/langchain-0.3.25.tar.gz", hash = "sha256:a1d72aa39546a23db08492d7228464af35c9ee83379945535ceef877340d2a3a", size = 10225045 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/5c/5c0be747261e1f8129b875fa3bfea736bc5fe17652f9d5e15ca118571b6f/langchain-0.3.25-py3-none-any.whl", hash = "sha256:931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21", size = 1011008 }, +] + +[[package]] +name = "langchain-chroma" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "chromadb" }, + { name = "langchain-core" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/2c/7e81227945e6bb0fe09b1a858dbcdcd9cef7e9ffcf4a1b5974c8d51bf9bc/langchain_chroma-0.2.4.tar.gz", hash = "sha256:d021ebf743969f6c2887b3878e829d1814d770e2bbf8e22df7d8cce15efed0d7", size = 15769 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/70/384bcdcaac7cb74e239a8411a9bd16079c7e0d9174391d66c635c45514f4/langchain_chroma-0.2.4-py3-none-any.whl", hash = "sha256:8bd5316ab415ff7c6ac911d2069926a54777aa4a04f69239a422415c02d1feeb", size = 11285 }, +] + +[[package]] +name = "langchain-community" +version = "0.3.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "dataclasses-json" }, + { name = "httpx-sse" }, + { name = "langchain" }, + { name = "langchain-core" }, + { name = "langsmith" }, + { name = "numpy" }, + { name = "pydantic-settings" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/f6/4892d1f1cf6d3e89da6ee6cfb0eb82b908c706c58bde7df28367ee76a93f/langchain_community-0.3.24.tar.gz", hash = "sha256:62d9e8cf9aadf35182ec3925f9ec1c8e5e84fb4f199f67a01aee496d289dc264", size = 33233643 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/cb/582f22d74d69f4dbd41e98d361ee36922b79a245a9411383327bd4b63747/langchain_community-0.3.24-py3-none-any.whl", hash = "sha256:b6cdb376bf1c2f4d2503aca20f8f35f2d5b3d879c52848277f20ce1950e7afaf", size = 2528335 }, +] + +[[package]] +name = "langchain-core" +version = "0.3.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpatch" }, + { name = "langsmith" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "tenacity" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/4d/9a0ce842ce01f85e9aa707412108096a029668c88b18c7a446aa45fdf2b4/langchain_core-0.3.61.tar.gz", hash = "sha256:67ba08d4cf58616050047ef3a07887a72607fea9b6b4522dff9e7579a1adbe75", size = 558241 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/81/db64e50399e05100bbb8c4e76a6c21d57e32d637110149a4c51d77954012/langchain_core-0.3.61-py3-none-any.whl", hash = "sha256:62cddbda7fb6085b6096bb4f3ad69642ebb0585bde7b210edc61dd0af33f2ea4", size = 438345 }, +] + +[[package]] +name = "langchain-huggingface" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "langchain-core" }, + { name = "sentence-transformers" }, + { name = "tokenizers" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/41/a9/37f23321b776fe40a6b15a6476bc8537d255581793a3accc001725edd8bd/langchain_huggingface-0.2.0.tar.gz", hash = "sha256:609acbfbade749bffa22acffd46d9e924a58e96cc59215d0562b8e9215b210f5", size = 24799 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/76/eb08f7b87f3377ced3800b2896841ccdcde3e246f46523946ecf092447e6/langchain_huggingface-0.2.0-py3-none-any.whl", hash = "sha256:eed1fdfe51d16d761499fa754491a1a4dcb61798c1e5516335071d1dad852a41", size = 27329 }, +] + +[[package]] +name = "langchain-text-splitters" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/ac/b4a25c5716bb0103b1515f1f52cc69ffb1035a5a225ee5afe3aed28bf57b/langchain_text_splitters-0.3.8.tar.gz", hash = "sha256:116d4b9f2a22dda357d0b79e30acf005c5518177971c66a9f1ab0edfdb0f912e", size = 42128 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl", hash = "sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02", size = 32440 }, +] + +[[package]] +name = "langsmith" +version = "0.3.42" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "zstandard" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/44/fe171c0b0fb0377b191aebf0b7779e0c7b2a53693c6a01ddad737212495d/langsmith-0.3.42.tar.gz", hash = "sha256:2b5cbc450ab808b992362aac6943bb1d285579aa68a3a8be901d30a393458f25", size = 345619 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/8e/e8a58e0abaae3f3ac4702e9ca35d1fc6159711556b64ffd0e247771a3f12/langsmith-0.3.42-py3-none-any.whl", hash = "sha256:18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff", size = 360334 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "marshmallow" +version = "3.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878 }, +] + +[[package]] +name = "matplotlib" +version = "3.10.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/43/6b80eb47d1071f234ef0c96ca370c2ca621f91c12045f1401b5c9b28a639/matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea", size = 8179689 }, + { url = "https://files.pythonhosted.org/packages/0f/70/d61a591958325c357204870b5e7b164f93f2a8cca1dc6ce940f563909a13/matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4", size = 8050466 }, + { url = "https://files.pythonhosted.org/packages/e7/75/70c9d2306203148cc7902a961240c5927dd8728afedf35e6a77e105a2985/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee", size = 8456252 }, + { url = "https://files.pythonhosted.org/packages/c4/91/ba0ae1ff4b3f30972ad01cd4a8029e70a0ec3b8ea5be04764b128b66f763/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a", size = 8601321 }, + { url = "https://files.pythonhosted.org/packages/d2/88/d636041eb54a84b889e11872d91f7cbf036b3b0e194a70fa064eb8b04f7a/matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7", size = 9406972 }, + { url = "https://files.pythonhosted.org/packages/b1/79/0d1c165eac44405a86478082e225fce87874f7198300bbebc55faaf6d28d/matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05", size = 8067954 }, + { url = "https://files.pythonhosted.org/packages/3b/c1/23cfb566a74c696a3b338d8955c549900d18fe2b898b6e94d682ca21e7c2/matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84", size = 8180318 }, + { url = "https://files.pythonhosted.org/packages/6c/0c/02f1c3b66b30da9ee343c343acbb6251bef5b01d34fad732446eaadcd108/matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e", size = 8051132 }, + { url = "https://files.pythonhosted.org/packages/b4/ab/8db1a5ac9b3a7352fb914133001dae889f9fcecb3146541be46bed41339c/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15", size = 8457633 }, + { url = "https://files.pythonhosted.org/packages/f5/64/41c4367bcaecbc03ef0d2a3ecee58a7065d0a36ae1aa817fe573a2da66d4/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7", size = 8601031 }, + { url = "https://files.pythonhosted.org/packages/12/6f/6cc79e9e5ab89d13ed64da28898e40fe5b105a9ab9c98f83abd24e46d7d7/matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d", size = 9406988 }, + { url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93", size = 8068034 }, + { url = "https://files.pythonhosted.org/packages/3e/e5/2f14791ff69b12b09e9975e1d116d9578ac684460860ce542c2588cb7a1c/matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2", size = 8218223 }, + { url = "https://files.pythonhosted.org/packages/5c/08/30a94afd828b6e02d0a52cae4a29d6e9ccfcf4c8b56cc28b021d3588873e/matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d", size = 8094985 }, + { url = "https://files.pythonhosted.org/packages/89/44/f3bc6b53066c889d7a1a3ea8094c13af6a667c5ca6220ec60ecceec2dabe/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566", size = 8483109 }, + { url = "https://files.pythonhosted.org/packages/ba/c7/473bc559beec08ebee9f86ca77a844b65747e1a6c2691e8c92e40b9f42a8/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158", size = 8618082 }, + { url = "https://files.pythonhosted.org/packages/d8/e9/6ce8edd264c8819e37bbed8172e0ccdc7107fe86999b76ab5752276357a4/matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d", size = 9413699 }, + { url = "https://files.pythonhosted.org/packages/1b/92/9a45c91089c3cf690b5badd4be81e392ff086ccca8a1d4e3a08463d8a966/matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5", size = 8139044 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mistune" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/79/bda47f7dd7c3c55770478d6d02c9960c430b0cf1773b72366ff89126ea31/mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0", size = 94347 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", size = 53410 }, +] + +[[package]] +name = "mmh3" +version = "5.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/1b/1fc6888c74cbd8abad1292dde2ddfcf8fc059e114c97dd6bf16d12f36293/mmh3-5.1.0.tar.gz", hash = "sha256:136e1e670500f177f49ec106a4ebf0adf20d18d96990cc36ea492c651d2b406c", size = 33728 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/47/e5f452bdf16028bfd2edb4e2e35d0441e4a4740f30e68ccd4cfd2fb2c57e/mmh3-5.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45712987367cb9235026e3cbf4334670522a97751abfd00b5bc8bfa022c3311d", size = 56152 }, + { url = "https://files.pythonhosted.org/packages/60/38/2132d537dc7a7fdd8d2e98df90186c7fcdbd3f14f95502a24ba443c92245/mmh3-5.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b1020735eb35086ab24affbea59bb9082f7f6a0ad517cb89f0fc14f16cea4dae", size = 40564 }, + { url = "https://files.pythonhosted.org/packages/c0/2a/c52cf000581bfb8d94794f58865658e7accf2fa2e90789269d4ae9560b16/mmh3-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:babf2a78ce5513d120c358722a2e3aa7762d6071cd10cede026f8b32452be322", size = 40104 }, + { url = "https://files.pythonhosted.org/packages/83/33/30d163ce538c54fc98258db5621447e3ab208d133cece5d2577cf913e708/mmh3-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4f47f58cd5cbef968c84a7c1ddc192fef0a36b48b0b8a3cb67354531aa33b00", size = 102634 }, + { url = "https://files.pythonhosted.org/packages/94/5c/5a18acb6ecc6852be2d215c3d811aa61d7e425ab6596be940877355d7f3e/mmh3-5.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2044a601c113c981f2c1e14fa33adc9b826c9017034fe193e9eb49a6882dbb06", size = 108888 }, + { url = "https://files.pythonhosted.org/packages/1f/f6/11c556324c64a92aa12f28e221a727b6e082e426dc502e81f77056f6fc98/mmh3-5.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94d999c9f2eb2da44d7c2826d3fbffdbbbbcde8488d353fee7c848ecc42b968", size = 106968 }, + { url = "https://files.pythonhosted.org/packages/5d/61/ca0c196a685aba7808a5c00246f17b988a9c4f55c594ee0a02c273e404f3/mmh3-5.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a015dcb24fa0c7a78f88e9419ac74f5001c1ed6a92e70fd1803f74afb26a4c83", size = 93771 }, + { url = "https://files.pythonhosted.org/packages/b4/55/0927c33528710085ee77b808d85bbbafdb91a1db7c8eaa89cac16d6c513e/mmh3-5.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:457da019c491a2d20e2022c7d4ce723675e4c081d9efc3b4d8b9f28a5ea789bd", size = 101726 }, + { url = "https://files.pythonhosted.org/packages/49/39/a92c60329fa470f41c18614a93c6cd88821412a12ee78c71c3f77e1cfc2d/mmh3-5.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71408579a570193a4ac9c77344d68ddefa440b00468a0b566dcc2ba282a9c559", size = 98523 }, + { url = "https://files.pythonhosted.org/packages/81/90/26adb15345af8d9cf433ae1b6adcf12e0a4cad1e692de4fa9f8e8536c5ae/mmh3-5.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8b3a04bc214a6e16c81f02f855e285c6df274a2084787eeafaa45f2fbdef1b63", size = 96628 }, + { url = "https://files.pythonhosted.org/packages/8a/4d/340d1e340df972a13fd4ec84c787367f425371720a1044220869c82364e9/mmh3-5.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:832dae26a35514f6d3c1e267fa48e8de3c7b978afdafa0529c808ad72e13ada3", size = 105190 }, + { url = "https://files.pythonhosted.org/packages/d3/7c/65047d1cccd3782d809936db446430fc7758bda9def5b0979887e08302a2/mmh3-5.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf658a61fc92ef8a48945ebb1076ef4ad74269e353fffcb642dfa0890b13673b", size = 98439 }, + { url = "https://files.pythonhosted.org/packages/72/d2/3c259d43097c30f062050f7e861075099404e8886b5d4dd3cebf180d6e02/mmh3-5.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3313577453582b03383731b66447cdcdd28a68f78df28f10d275d7d19010c1df", size = 97780 }, + { url = "https://files.pythonhosted.org/packages/29/29/831ea8d4abe96cdb3e28b79eab49cac7f04f9c6b6e36bfc686197ddba09d/mmh3-5.1.0-cp312-cp312-win32.whl", hash = "sha256:1d6508504c531ab86c4424b5a5ff07c1132d063863339cf92f6657ff7a580f76", size = 40835 }, + { url = "https://files.pythonhosted.org/packages/12/dd/7cbc30153b73f08eeac43804c1dbc770538a01979b4094edbe1a4b8eb551/mmh3-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:aa75981fcdf3f21759d94f2c81b6a6e04a49dfbcdad88b152ba49b8e20544776", size = 41509 }, + { url = "https://files.pythonhosted.org/packages/80/9d/627375bab4c90dd066093fc2c9a26b86f87e26d980dbf71667b44cbee3eb/mmh3-5.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4c1a76808dfea47f7407a0b07aaff9087447ef6280716fd0783409b3088bb3c", size = 38888 }, + { url = "https://files.pythonhosted.org/packages/05/06/a098a42870db16c0a54a82c56a5bdc873de3165218cd5b3ca59dbc0d31a7/mmh3-5.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a523899ca29cfb8a5239618474a435f3d892b22004b91779fcb83504c0d5b8c", size = 56165 }, + { url = "https://files.pythonhosted.org/packages/5a/65/eaada79a67fde1f43e1156d9630e2fb70655e1d3f4e8f33d7ffa31eeacfd/mmh3-5.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:17cef2c3a6ca2391ca7171a35ed574b5dab8398163129a3e3a4c05ab85a4ff40", size = 40569 }, + { url = "https://files.pythonhosted.org/packages/36/7e/2b6c43ed48be583acd68e34d16f19209a9f210e4669421b0321e326d8554/mmh3-5.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:52e12895b30110f3d89dae59a888683cc886ed0472dd2eca77497edef6161997", size = 40104 }, + { url = "https://files.pythonhosted.org/packages/11/2b/1f9e962fdde8e41b0f43d22c8ba719588de8952f9376df7d73a434827590/mmh3-5.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d6719045cda75c3f40397fc24ab67b18e0cb8f69d3429ab4c39763c4c608dd", size = 102497 }, + { url = "https://files.pythonhosted.org/packages/46/94/d6c5c3465387ba077cccdc028ab3eec0d86eed1eebe60dcf4d15294056be/mmh3-5.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d19fa07d303a91f8858982c37e6939834cb11893cb3ff20e6ee6fa2a7563826a", size = 108834 }, + { url = "https://files.pythonhosted.org/packages/34/1e/92c212bb81796b69dddfd50a8a8f4b26ab0d38fdaf1d3e8628a67850543b/mmh3-5.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31b47a620d622fbde8ca1ca0435c5d25de0ac57ab507209245e918128e38e676", size = 106936 }, + { url = "https://files.pythonhosted.org/packages/f4/41/f2f494bbff3aad5ffd2085506255049de76cde51ddac84058e32768acc79/mmh3-5.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f810647c22c179b6821079f7aa306d51953ac893587ee09cf1afb35adf87cb", size = 93709 }, + { url = "https://files.pythonhosted.org/packages/9e/a9/a2cc4a756d73d9edf4fb85c76e16fd56b0300f8120fd760c76b28f457730/mmh3-5.1.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6128b610b577eed1e89ac7177ab0c33d06ade2aba93f5c89306032306b5f1c6", size = 101623 }, + { url = "https://files.pythonhosted.org/packages/5e/6f/b9d735533b6a56b2d56333ff89be6a55ac08ba7ff33465feb131992e33eb/mmh3-5.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1e550a45d2ff87a1c11b42015107f1778c93f4c6f8e731bf1b8fa770321b8cc4", size = 98521 }, + { url = "https://files.pythonhosted.org/packages/99/47/dff2b54fac0d421c1e6ecbd2d9c85b2d0e6f6ee0d10b115d9364116a511e/mmh3-5.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:785ae09276342f79fd8092633e2d52c0f7c44d56e8cfda8274ccc9b76612dba2", size = 96696 }, + { url = "https://files.pythonhosted.org/packages/be/43/9e205310f47c43ddf1575bb3a1769c36688f30f1ac105e0f0c878a29d2cd/mmh3-5.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0f4be3703a867ef976434afd3661a33884abe73ceb4ee436cac49d3b4c2aaa7b", size = 105234 }, + { url = "https://files.pythonhosted.org/packages/6b/44/90b11fd2b67dcb513f5bfe9b476eb6ca2d5a221c79b49884dc859100905e/mmh3-5.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e513983830c4ff1f205ab97152a0050cf7164f1b4783d702256d39c637b9d107", size = 98449 }, + { url = "https://files.pythonhosted.org/packages/f0/d0/25c4b0c7b8e49836541059b28e034a4cccd0936202800d43a1cc48495ecb/mmh3-5.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9135c300535c828c0bae311b659f33a31c941572eae278568d1a953c4a57b59", size = 97796 }, + { url = "https://files.pythonhosted.org/packages/23/fa/cbbb7fcd0e287a715f1cd28a10de94c0535bd94164e38b852abc18da28c6/mmh3-5.1.0-cp313-cp313-win32.whl", hash = "sha256:c65dbd12885a5598b70140d24de5839551af5a99b29f9804bb2484b29ef07692", size = 40828 }, + { url = "https://files.pythonhosted.org/packages/09/33/9fb90ef822f7b734955a63851907cf72f8a3f9d8eb3c5706bfa6772a2a77/mmh3-5.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:10db7765201fc65003fa998faa067417ef6283eb5f9bba8f323c48fd9c33e91f", size = 41504 }, + { url = "https://files.pythonhosted.org/packages/16/71/4ad9a42f2772793a03cb698f0fc42499f04e6e8d2560ba2f7da0fb059a8e/mmh3-5.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:b22fe2e54be81f6c07dcb36b96fa250fb72effe08aa52fbb83eade6e1e2d5fd7", size = 38890 }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, +] + +[[package]] +name = "multidict" +version = "6.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/2f/a3470242707058fe856fe59241eee5635d79087100b7042a867368863a27/multidict-6.4.4.tar.gz", hash = "sha256:69ee9e6ba214b5245031b76233dd95408a0fd57fdb019ddcc1ead4790932a8e8", size = 90183 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/b5/5675377da23d60875fe7dae6be841787755878e315e2f517235f22f59e18/multidict-6.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc388f75a1c00000824bf28b7633e40854f4127ede80512b44c3cfeeea1839a2", size = 64293 }, + { url = "https://files.pythonhosted.org/packages/34/a7/be384a482754bb8c95d2bbe91717bf7ccce6dc38c18569997a11f95aa554/multidict-6.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:98af87593a666f739d9dba5d0ae86e01b0e1a9cfcd2e30d2d361fbbbd1a9162d", size = 38096 }, + { url = "https://files.pythonhosted.org/packages/66/6d/d59854bb4352306145bdfd1704d210731c1bb2c890bfee31fb7bbc1c4c7f/multidict-6.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aff4cafea2d120327d55eadd6b7f1136a8e5a0ecf6fb3b6863e8aca32cd8e50a", size = 37214 }, + { url = "https://files.pythonhosted.org/packages/99/e0/c29d9d462d7cfc5fc8f9bf24f9c6843b40e953c0b55e04eba2ad2cf54fba/multidict-6.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:169c4ba7858176b797fe551d6e99040c531c775d2d57b31bcf4de6d7a669847f", size = 224686 }, + { url = "https://files.pythonhosted.org/packages/dc/4a/da99398d7fd8210d9de068f9a1b5f96dfaf67d51e3f2521f17cba4ee1012/multidict-6.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b9eb4c59c54421a32b3273d4239865cb14ead53a606db066d7130ac80cc8ec93", size = 231061 }, + { url = "https://files.pythonhosted.org/packages/21/f5/ac11add39a0f447ac89353e6ca46666847051103649831c08a2800a14455/multidict-6.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cf3bd54c56aa16fdb40028d545eaa8d051402b61533c21e84046e05513d5780", size = 232412 }, + { url = "https://files.pythonhosted.org/packages/d9/11/4b551e2110cded705a3c13a1d4b6a11f73891eb5a1c449f1b2b6259e58a6/multidict-6.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f682c42003c7264134bfe886376299db4cc0c6cd06a3295b41b347044bcb5482", size = 231563 }, + { url = "https://files.pythonhosted.org/packages/4c/02/751530c19e78fe73b24c3da66618eda0aa0d7f6e7aa512e46483de6be210/multidict-6.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920f9cf2abdf6e493c519492d892c362007f113c94da4c239ae88429835bad1", size = 223811 }, + { url = "https://files.pythonhosted.org/packages/c7/cb/2be8a214643056289e51ca356026c7b2ce7225373e7a1f8c8715efee8988/multidict-6.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:530d86827a2df6504526106b4c104ba19044594f8722d3e87714e847c74a0275", size = 216524 }, + { url = "https://files.pythonhosted.org/packages/19/f3/6d5011ec375c09081f5250af58de85f172bfcaafebff286d8089243c4bd4/multidict-6.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ecde56ea2439b96ed8a8d826b50c57364612ddac0438c39e473fafad7ae1c23b", size = 229012 }, + { url = "https://files.pythonhosted.org/packages/67/9c/ca510785df5cf0eaf5b2a8132d7d04c1ce058dcf2c16233e596ce37a7f8e/multidict-6.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:dc8c9736d8574b560634775ac0def6bdc1661fc63fa27ffdfc7264c565bcb4f2", size = 226765 }, + { url = "https://files.pythonhosted.org/packages/36/c8/ca86019994e92a0f11e642bda31265854e6ea7b235642f0477e8c2e25c1f/multidict-6.4.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7f3d3b3c34867579ea47cbd6c1f2ce23fbfd20a273b6f9e3177e256584f1eacc", size = 222888 }, + { url = "https://files.pythonhosted.org/packages/c6/67/bc25a8e8bd522935379066950ec4e2277f9b236162a73548a2576d4b9587/multidict-6.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:87a728af265e08f96b6318ebe3c0f68b9335131f461efab2fc64cc84a44aa6ed", size = 234041 }, + { url = "https://files.pythonhosted.org/packages/f1/a0/70c4c2d12857fccbe607b334b7ee28b6b5326c322ca8f73ee54e70d76484/multidict-6.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9f193eeda1857f8e8d3079a4abd258f42ef4a4bc87388452ed1e1c4d2b0c8740", size = 231046 }, + { url = "https://files.pythonhosted.org/packages/c1/0f/52954601d02d39742aab01d6b92f53c1dd38b2392248154c50797b4df7f1/multidict-6.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be06e73c06415199200e9a2324a11252a3d62030319919cde5e6950ffeccf72e", size = 227106 }, + { url = "https://files.pythonhosted.org/packages/af/24/679d83ec4379402d28721790dce818e5d6b9f94ce1323a556fb17fa9996c/multidict-6.4.4-cp312-cp312-win32.whl", hash = "sha256:622f26ea6a7e19b7c48dd9228071f571b2fbbd57a8cd71c061e848f281550e6b", size = 35351 }, + { url = "https://files.pythonhosted.org/packages/52/ef/40d98bc5f986f61565f9b345f102409534e29da86a6454eb6b7c00225a13/multidict-6.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:5e2bcda30d5009996ff439e02a9f2b5c3d64a20151d34898c000a6281faa3781", size = 38791 }, + { url = "https://files.pythonhosted.org/packages/df/2a/e166d2ffbf4b10131b2d5b0e458f7cee7d986661caceae0de8753042d4b2/multidict-6.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:82ffabefc8d84c2742ad19c37f02cde5ec2a1ee172d19944d380f920a340e4b9", size = 64123 }, + { url = "https://files.pythonhosted.org/packages/8c/96/e200e379ae5b6f95cbae472e0199ea98913f03d8c9a709f42612a432932c/multidict-6.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6a2f58a66fe2c22615ad26156354005391e26a2f3721c3621504cd87c1ea87bf", size = 38049 }, + { url = "https://files.pythonhosted.org/packages/75/fb/47afd17b83f6a8c7fa863c6d23ac5ba6a0e6145ed8a6bcc8da20b2b2c1d2/multidict-6.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5883d6ee0fd9d8a48e9174df47540b7545909841ac82354c7ae4cbe9952603bd", size = 37078 }, + { url = "https://files.pythonhosted.org/packages/fa/70/1af3143000eddfb19fd5ca5e78393985ed988ac493bb859800fe0914041f/multidict-6.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9abcf56a9511653fa1d052bfc55fbe53dbee8f34e68bd6a5a038731b0ca42d15", size = 224097 }, + { url = "https://files.pythonhosted.org/packages/b1/39/d570c62b53d4fba844e0378ffbcd02ac25ca423d3235047013ba2f6f60f8/multidict-6.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6ed5ae5605d4ad5a049fad2a28bb7193400700ce2f4ae484ab702d1e3749c3f9", size = 230768 }, + { url = "https://files.pythonhosted.org/packages/fd/f8/ed88f2c4d06f752b015933055eb291d9bc184936903752c66f68fb3c95a7/multidict-6.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbfcb60396f9bcfa63e017a180c3105b8c123a63e9d1428a36544e7d37ca9e20", size = 231331 }, + { url = "https://files.pythonhosted.org/packages/9c/6f/8e07cffa32f483ab887b0d56bbd8747ac2c1acd00dc0af6fcf265f4a121e/multidict-6.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0f1987787f5f1e2076b59692352ab29a955b09ccc433c1f6b8e8e18666f608b", size = 230169 }, + { url = "https://files.pythonhosted.org/packages/e6/2b/5dcf173be15e42f330110875a2668ddfc208afc4229097312212dc9c1236/multidict-6.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0121ccce8c812047d8d43d691a1ad7641f72c4f730474878a5aeae1b8ead8c", size = 222947 }, + { url = "https://files.pythonhosted.org/packages/39/75/4ddcbcebe5ebcd6faa770b629260d15840a5fc07ce8ad295a32e14993726/multidict-6.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83ec4967114295b8afd120a8eec579920c882831a3e4c3331d591a8e5bfbbc0f", size = 215761 }, + { url = "https://files.pythonhosted.org/packages/6a/c9/55e998ae45ff15c5608e384206aa71a11e1b7f48b64d166db400b14a3433/multidict-6.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:995f985e2e268deaf17867801b859a282e0448633f1310e3704b30616d269d69", size = 227605 }, + { url = "https://files.pythonhosted.org/packages/04/49/c2404eac74497503c77071bd2e6f88c7e94092b8a07601536b8dbe99be50/multidict-6.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d832c608f94b9f92a0ec8b7e949be7792a642b6e535fcf32f3e28fab69eeb046", size = 226144 }, + { url = "https://files.pythonhosted.org/packages/62/c5/0cd0c3c6f18864c40846aa2252cd69d308699cb163e1c0d989ca301684da/multidict-6.4.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d21c1212171cf7da703c5b0b7a0e85be23b720818aef502ad187d627316d5645", size = 221100 }, + { url = "https://files.pythonhosted.org/packages/71/7b/f2f3887bea71739a046d601ef10e689528d4f911d84da873b6be9194ffea/multidict-6.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cbebaa076aaecad3d4bb4c008ecc73b09274c952cf6a1b78ccfd689e51f5a5b0", size = 232731 }, + { url = "https://files.pythonhosted.org/packages/e5/b3/d9de808349df97fa75ec1372758701b5800ebad3c46ae377ad63058fbcc6/multidict-6.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c93a6fb06cc8e5d3628b2b5fda215a5db01e8f08fc15fadd65662d9b857acbe4", size = 229637 }, + { url = "https://files.pythonhosted.org/packages/5e/57/13207c16b615eb4f1745b44806a96026ef8e1b694008a58226c2d8f5f0a5/multidict-6.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8cd8f81f1310182362fb0c7898145ea9c9b08a71081c5963b40ee3e3cac589b1", size = 225594 }, + { url = "https://files.pythonhosted.org/packages/3a/e4/d23bec2f70221604f5565000632c305fc8f25ba953e8ce2d8a18842b9841/multidict-6.4.4-cp313-cp313-win32.whl", hash = "sha256:3e9f1cd61a0ab857154205fb0b1f3d3ace88d27ebd1409ab7af5096e409614cd", size = 35359 }, + { url = "https://files.pythonhosted.org/packages/a7/7a/cfe1a47632be861b627f46f642c1d031704cc1c0f5c0efbde2ad44aa34bd/multidict-6.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:8ffb40b74400e4455785c2fa37eba434269149ec525fc8329858c862e4b35373", size = 38903 }, + { url = "https://files.pythonhosted.org/packages/68/7b/15c259b0ab49938a0a1c8f3188572802704a779ddb294edc1b2a72252e7c/multidict-6.4.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6a602151dbf177be2450ef38966f4be3467d41a86c6a845070d12e17c858a156", size = 68895 }, + { url = "https://files.pythonhosted.org/packages/f1/7d/168b5b822bccd88142e0a3ce985858fea612404edd228698f5af691020c9/multidict-6.4.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d2b9712211b860d123815a80b859075d86a4d54787e247d7fbee9db6832cf1c", size = 40183 }, + { url = "https://files.pythonhosted.org/packages/e0/b7/d4b8d98eb850ef28a4922ba508c31d90715fd9b9da3801a30cea2967130b/multidict-6.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d2fa86af59f8fc1972e121ade052145f6da22758f6996a197d69bb52f8204e7e", size = 39592 }, + { url = "https://files.pythonhosted.org/packages/18/28/a554678898a19583548e742080cf55d169733baf57efc48c2f0273a08583/multidict-6.4.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50855d03e9e4d66eab6947ba688ffb714616f985838077bc4b490e769e48da51", size = 226071 }, + { url = "https://files.pythonhosted.org/packages/ee/dc/7ba6c789d05c310e294f85329efac1bf5b450338d2542498db1491a264df/multidict-6.4.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5bce06b83be23225be1905dcdb6b789064fae92499fbc458f59a8c0e68718601", size = 222597 }, + { url = "https://files.pythonhosted.org/packages/24/4f/34eadbbf401b03768dba439be0fb94b0d187facae9142821a3d5599ccb3b/multidict-6.4.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66ed0731f8e5dfd8369a883b6e564aca085fb9289aacabd9decd70568b9a30de", size = 228253 }, + { url = "https://files.pythonhosted.org/packages/c0/e6/493225a3cdb0d8d80d43a94503fc313536a07dae54a3f030d279e629a2bc/multidict-6.4.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:329ae97fc2f56f44d91bc47fe0972b1f52d21c4b7a2ac97040da02577e2daca2", size = 226146 }, + { url = "https://files.pythonhosted.org/packages/2f/70/e411a7254dc3bff6f7e6e004303b1b0591358e9f0b7c08639941e0de8bd6/multidict-6.4.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c27e5dcf520923d6474d98b96749e6805f7677e93aaaf62656005b8643f907ab", size = 220585 }, + { url = "https://files.pythonhosted.org/packages/08/8f/beb3ae7406a619100d2b1fb0022c3bb55a8225ab53c5663648ba50dfcd56/multidict-6.4.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:058cc59b9e9b143cc56715e59e22941a5d868c322242278d28123a5d09cdf6b0", size = 212080 }, + { url = "https://files.pythonhosted.org/packages/9c/ec/355124e9d3d01cf8edb072fd14947220f357e1c5bc79c88dff89297e9342/multidict-6.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:69133376bc9a03f8c47343d33f91f74a99c339e8b58cea90433d8e24bb298031", size = 226558 }, + { url = "https://files.pythonhosted.org/packages/fd/22/d2b95cbebbc2ada3be3812ea9287dcc9712d7f1a012fad041770afddb2ad/multidict-6.4.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d6b15c55721b1b115c5ba178c77104123745b1417527ad9641a4c5e2047450f0", size = 212168 }, + { url = "https://files.pythonhosted.org/packages/4d/c5/62bfc0b2f9ce88326dbe7179f9824a939c6c7775b23b95de777267b9725c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a887b77f51d3d41e6e1a63cf3bc7ddf24de5939d9ff69441387dfefa58ac2e26", size = 217970 }, + { url = "https://files.pythonhosted.org/packages/79/74/977cea1aadc43ff1c75d23bd5bc4768a8fac98c14e5878d6ee8d6bab743c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:632a3bf8f1787f7ef7d3c2f68a7bde5be2f702906f8b5842ad6da9d974d0aab3", size = 226980 }, + { url = "https://files.pythonhosted.org/packages/48/fc/cc4a1a2049df2eb84006607dc428ff237af38e0fcecfdb8a29ca47b1566c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a145c550900deb7540973c5cdb183b0d24bed6b80bf7bddf33ed8f569082535e", size = 220641 }, + { url = "https://files.pythonhosted.org/packages/3b/6a/a7444d113ab918701988d4abdde373dbdfd2def7bd647207e2bf645c7eac/multidict-6.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc5d83c6619ca5c9672cb78b39ed8542f1975a803dee2cda114ff73cbb076edd", size = 221728 }, + { url = "https://files.pythonhosted.org/packages/2b/b0/fdf4c73ad1c55e0f4dbbf2aa59dd37037334091f9a4961646d2b7ac91a86/multidict-6.4.4-cp313-cp313t-win32.whl", hash = "sha256:3312f63261b9df49be9d57aaa6abf53a6ad96d93b24f9cc16cf979956355ce6e", size = 41913 }, + { url = "https://files.pythonhosted.org/packages/8e/92/27989ecca97e542c0d01d05a98a5ae12198a243a9ee12563a0313291511f/multidict-6.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:ba852168d814b2c73333073e1c7116d9395bea69575a01b0b3c89d2d5a87c8fb", size = 46112 }, + { url = "https://files.pythonhosted.org/packages/84/5d/e17845bb0fa76334477d5de38654d27946d5b5d3695443987a094a71b440/multidict-6.4.4-py3-none-any.whl", hash = "sha256:bd4557071b561a8b3b6075c3ce93cf9bfb6182cb241805c3d66ced3b75eff4ac", size = 10481 }, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824 }, + { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519 }, + { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741 }, + { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628 }, + { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, +] + +[[package]] +name = "natsort" +version = "8.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581", size = 76575 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268 }, +] + +[[package]] +name = "nbclient" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, +] + +[[package]] +name = "nbconvert" +version = "7.16.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525 }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, +] + +[[package]] +name = "ninja" +version = "1.11.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/d4/6b0324541018561c5e73e617bd16f20a4fc17d1179bb3b3520b6ca8beb7b/ninja-1.11.1.4.tar.gz", hash = "sha256:6aa39f6e894e0452e5b297327db00019383ae55d5d9c57c73b04f13bf79d438a", size = 201256 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/b1/3a61b348936b62a386465b1937cd778fa3a5748582e26d832dbab844ff27/ninja-1.11.1.4-py3-none-macosx_10_9_universal2.whl", hash = "sha256:b33923c8da88e8da20b6053e38deb433f53656441614207e01d283ad02c5e8e7", size = 279071 }, + { url = "https://files.pythonhosted.org/packages/12/42/4c94fdad51fcf1f039a156e97de9e4d564c2a8cc0303782d36f9bd893a4b/ninja-1.11.1.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cede0af00b58e27b31f2482ba83292a8e9171cdb9acc2c867a3b6e40b3353e43", size = 472026 }, + { url = "https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0", size = 422814 }, + { url = "https://files.pythonhosted.org/packages/e3/ad/fb6cca942528e25e8e0ab0f0cf98fe007319bf05cf69d726c564b815c4af/ninja-1.11.1.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3090d4488fadf6047d0d7a1db0c9643a8d391f0d94729554dbb89b5bdc769d7", size = 156965 }, + { url = "https://files.pythonhosted.org/packages/a8/e7/d94a1b60031b115dd88526834b3da69eaacdc3c1a6769773ca8e2b1386b5/ninja-1.11.1.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecce44a00325a93631792974659cf253a815cc6da4ec96f89742925dfc295a0d", size = 179937 }, + { url = "https://files.pythonhosted.org/packages/08/cc/e9316a28235409e9363794fc3d0b3083e48dd80d441006de66421e55f364/ninja-1.11.1.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c29bb66d2aa46a2409ab369ea804c730faec7652e8c22c1e428cc09216543e5", size = 157020 }, + { url = "https://files.pythonhosted.org/packages/e3/30/389b22300541aa5f2e9dad322c4de2f84be4e32aa4e8babd9160d620b5f1/ninja-1.11.1.4-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:055f386fb550c2c9d6157e45e20a84d29c47968876b9c5794ae2aec46f952306", size = 130389 }, + { url = "https://files.pythonhosted.org/packages/a9/10/e27f35cb92813aabbb7ae771b1685b45be1cc8a0798ce7d4bfd08d142b93/ninja-1.11.1.4-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:f6186d7607bb090c3be1e10c8a56b690be238f953616626f5032238c66e56867", size = 372435 }, + { url = "https://files.pythonhosted.org/packages/c2/26/e3559619756739aae124c6abf7fe41f7e546ab1209cfbffb13137bff2d2e/ninja-1.11.1.4-py3-none-musllinux_1_1_i686.whl", hash = "sha256:cf4453679d15babc04ba023d68d091bb613091b67101c88f85d2171c6621c6eb", size = 419300 }, + { url = "https://files.pythonhosted.org/packages/35/46/809e4e9572570991b8e6f88f3583807d017371ab4cb09171cbc72a7eb3e4/ninja-1.11.1.4-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:d4a6f159b08b0ac4aca5ee1572e3e402f969139e71d85d37c0e2872129098749", size = 420239 }, + { url = "https://files.pythonhosted.org/packages/e6/64/5cb5710d15f844edf02ada577f8eddfdcd116f47eec15850f3371a3a4b33/ninja-1.11.1.4-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:c3b96bd875f3ef1db782470e9e41d7508905a0986571f219d20ffed238befa15", size = 415986 }, + { url = "https://files.pythonhosted.org/packages/95/b2/0e9ab1d926f423b12b09925f78afcc5e48b3c22e7121be3ddf6c35bf06a3/ninja-1.11.1.4-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:cf554e73f72c04deb04d0cf51f5fdb1903d9c9ca3d2344249c8ce3bd616ebc02", size = 379657 }, + { url = "https://files.pythonhosted.org/packages/c8/3e/fd6d330d0434168e7fe070d414b57dd99c4c133faa69c05b42a3cbdc6c13/ninja-1.11.1.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:cfdd09776436a1ff3c4a2558d3fc50a689fb9d7f1bdbc3e6f7b8c2991341ddb3", size = 454466 }, + { url = "https://files.pythonhosted.org/packages/e6/df/a25f3ad0b1c59d1b90564096e4fd89a6ca30d562b1e942f23880c3000b89/ninja-1.11.1.4-py3-none-win32.whl", hash = "sha256:2ab67a41c90bea5ec4b795bab084bc0b3b3bb69d3cd21ca0294fc0fc15a111eb", size = 255931 }, + { url = "https://files.pythonhosted.org/packages/5b/10/9b8fe9ac004847490cc7b54896124c01ce2d87d95dc60aabd0b8591addff/ninja-1.11.1.4-py3-none-win_amd64.whl", hash = "sha256:4617b3c12ff64b611a7d93fd9e378275512bb36eff8babff7c83f5116b4f8d66", size = 296461 }, + { url = "https://files.pythonhosted.org/packages/b9/58/612a17593c2d117f96c7f6b7f1e6570246bddc4b1e808519403a1417f217/ninja-1.11.1.4-py3-none-win_arm64.whl", hash = "sha256:5713cf50c5be50084a8693308a63ecf9e55c3132a78a41ab1363a28b6caaaee1", size = 271441 }, +] + +[[package]] +name = "nncf" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jstyleson" }, + { name = "natsort" }, + { name = "networkx" }, + { name = "ninja" }, + { name = "numpy" }, + { name = "openvino-telemetry" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "psutil" }, + { name = "pydot" }, + { name = "pymoo" }, + { name = "rich" }, + { name = "safetensors" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "tabulate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/8a/3cd1851704abfe351830d26766a452f722357021297ac480395a0697878d/nncf-2.16.0.tar.gz", hash = "sha256:1564a9b909346d78625fa645d397b82c046c9a99a5fbed93ae56c6dda39e1ae1", size = 970079 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/1a/9a2dd53b1661d3deb191e607fdad689687515761475ec9f1770eaafbdec3/nncf-2.16.0-py3-none-any.whl", hash = "sha256:dc6228cd247a56aebdac48974e7871cf8764e6fdf15e454848a348d20c52be80", size = 1421600 }, +] + +[[package]] +name = "notebook" +version = "7.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, + { name = "jupyterlab" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/21/4f83b15e483da4f4f63928edd0cb08b6e7d33f8a15c23b116a90c44c6235/notebook-7.4.3.tar.gz", hash = "sha256:a1567481cd3853f2610ee0ecf5dfa12bb508e878ee8f92152c134ef7f0568a76", size = 13881668 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/1b/16c809d799e3ddd7a97c8b43734f79624b74ddef9707e7d92275a13777bc/notebook-7.4.3-py3-none-any.whl", hash = "sha256:9cdeee954e04101cadb195d90e2ab62b7c9286c1d4f858bf3bb54e40df16c0c3", size = 14286402 }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307 }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, +] + +[[package]] +name = "onnx" +version = "1.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/60/e56e8ec44ed34006e6d4a73c92a04d9eea6163cc12440e35045aec069175/onnx-1.18.0.tar.gz", hash = "sha256:3d8dbf9e996629131ba3aa1afd1d8239b660d1f830c6688dd7e03157cccd6b9c", size = 12563009 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/fe/16228aca685392a7114625b89aae98b2dc4058a47f0f467a376745efe8d0/onnx-1.18.0-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:521bac578448667cbb37c50bf05b53c301243ede8233029555239930996a625b", size = 18285770 }, + { url = "https://files.pythonhosted.org/packages/1e/77/ba50a903a9b5e6f9be0fa50f59eb2fca4a26ee653375408fbc72c3acbf9f/onnx-1.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4da451bf1c5ae381f32d430004a89f0405bc57a8471b0bddb6325a5b334aa40", size = 17421291 }, + { url = "https://files.pythonhosted.org/packages/11/23/25ec2ba723ac62b99e8fed6d7b59094dadb15e38d4c007331cc9ae3dfa5f/onnx-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99afac90b4cdb1471432203c3c1f74e16549c526df27056d39f41a9a47cfb4af", size = 17584084 }, + { url = "https://files.pythonhosted.org/packages/6a/4d/2c253a36070fb43f340ff1d2c450df6a9ef50b938adcd105693fee43c4ee/onnx-1.18.0-cp312-cp312-win32.whl", hash = "sha256:ee159b41a3ae58d9c7341cf432fc74b96aaf50bd7bb1160029f657b40dc69715", size = 15734892 }, + { url = "https://files.pythonhosted.org/packages/e8/92/048ba8fafe6b2b9a268ec2fb80def7e66c0b32ab2cae74de886981f05a27/onnx-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:102c04edc76b16e9dfeda5a64c1fccd7d3d2913b1544750c01d38f1ac3c04e05", size = 15850336 }, + { url = "https://files.pythonhosted.org/packages/a1/66/bbc4ffedd44165dcc407a51ea4c592802a5391ce3dc94aa5045350f64635/onnx-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:911b37d724a5d97396f3c2ef9ea25361c55cbc9aa18d75b12a52b620b67145af", size = 15823802 }, + { url = "https://files.pythonhosted.org/packages/45/da/9fb8824513fae836239276870bfcc433fa2298d34ed282c3a47d3962561b/onnx-1.18.0-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:030d9f5f878c5f4c0ff70a4545b90d7812cd6bfe511de2f3e469d3669c8cff95", size = 18285906 }, + { url = "https://files.pythonhosted.org/packages/05/e8/762b5fb5ed1a2b8e9a4bc5e668c82723b1b789c23b74e6b5a3356731ae4e/onnx-1.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8521544987d713941ee1e591520044d35e702f73dc87e91e6d4b15a064ae813d", size = 17421486 }, + { url = "https://files.pythonhosted.org/packages/12/bb/471da68df0364f22296456c7f6becebe0a3da1ba435cdb371099f516da6e/onnx-1.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c137eecf6bc618c2f9398bcc381474b55c817237992b169dfe728e169549e8f", size = 17583581 }, + { url = "https://files.pythonhosted.org/packages/76/0d/01a95edc2cef6ad916e04e8e1267a9286f15b55c90cce5d3cdeb359d75d6/onnx-1.18.0-cp313-cp313-win32.whl", hash = "sha256:6c093ffc593e07f7e33862824eab9225f86aa189c048dd43ffde207d7041a55f", size = 15734621 }, + { url = "https://files.pythonhosted.org/packages/64/95/253451a751be32b6173a648b68f407188009afa45cd6388780c330ff5d5d/onnx-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:230b0fb615e5b798dc4a3718999ec1828360bc71274abd14f915135eab0255f1", size = 15850472 }, + { url = "https://files.pythonhosted.org/packages/0a/b1/6fd41b026836df480a21687076e0f559bc3ceeac90f2be8c64b4a7a1f332/onnx-1.18.0-cp313-cp313-win_arm64.whl", hash = "sha256:6f91930c1a284135db0f891695a263fc876466bf2afbd2215834ac08f600cfca", size = 15823808 }, + { url = "https://files.pythonhosted.org/packages/70/f3/499e53dd41fa7302f914dd18543da01e0786a58b9a9d347497231192001f/onnx-1.18.0-cp313-cp313t-macosx_12_0_universal2.whl", hash = "sha256:2f4d37b0b5c96a873887652d1cbf3f3c70821b8c66302d84b0f0d89dd6e47653", size = 18316526 }, + { url = "https://files.pythonhosted.org/packages/84/dd/6abe5d7bd23f5ed3ade8352abf30dff1c7a9e97fc1b0a17b5d7c726e98a9/onnx-1.18.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a69afd0baa372162948b52c13f3aa2730123381edf926d7ef3f68ca7cec6d0d0", size = 15865055 }, +] + +[[package]] +name = "onnxruntime" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coloredlogs" }, + { name = "flatbuffers" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "sympy" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/de/9162872c6e502e9ac8c99a98a8738b2fab408123d11de55022ac4f92562a/onnxruntime-1.22.0-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:f3c0380f53c1e72a41b3f4d6af2ccc01df2c17844072233442c3a7e74851ab97", size = 34298046 }, + { url = "https://files.pythonhosted.org/packages/03/79/36f910cd9fc96b444b0e728bba14607016079786adf032dae61f7c63b4aa/onnxruntime-1.22.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8601128eaef79b636152aea76ae6981b7c9fc81a618f584c15d78d42b310f1c", size = 14443220 }, + { url = "https://files.pythonhosted.org/packages/8c/60/16d219b8868cc8e8e51a68519873bdb9f5f24af080b62e917a13fff9989b/onnxruntime-1.22.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6964a975731afc19dc3418fad8d4e08c48920144ff590149429a5ebe0d15fb3c", size = 16406377 }, + { url = "https://files.pythonhosted.org/packages/36/b4/3f1c71ce1d3d21078a6a74c5483bfa2b07e41a8d2b8fb1e9993e6a26d8d3/onnxruntime-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0d534a43d1264d1273c2d4f00a5a588fa98d21117a3345b7104fa0bbcaadb9a", size = 12692233 }, + { url = "https://files.pythonhosted.org/packages/a9/65/5cb5018d5b0b7cba820d2c4a1d1b02d40df538d49138ba36a509457e4df6/onnxruntime-1.22.0-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:fe7c051236aae16d8e2e9ffbfc1e115a0cc2450e873a9c4cb75c0cc96c1dae07", size = 34298715 }, + { url = "https://files.pythonhosted.org/packages/e1/89/1dfe1b368831d1256b90b95cb8d11da8ab769febd5c8833ec85ec1f79d21/onnxruntime-1.22.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a6bbed10bc5e770c04d422893d3045b81acbbadc9fb759a2cd1ca00993da919", size = 14443266 }, + { url = "https://files.pythonhosted.org/packages/1e/70/342514ade3a33ad9dd505dcee96ff1f0e7be6d0e6e9c911fe0f1505abf42/onnxruntime-1.22.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe45ee3e756300fccfd8d61b91129a121d3d80e9d38e01f03ff1295badc32b8", size = 16406707 }, + { url = "https://files.pythonhosted.org/packages/3e/89/2f64e250945fa87140fb917ba377d6d0e9122e029c8512f389a9b7f953f4/onnxruntime-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:5a31d84ef82b4b05d794a4ce8ba37b0d9deb768fd580e36e17b39e0b4840253b", size = 12691777 }, + { url = "https://files.pythonhosted.org/packages/9f/48/d61d5f1ed098161edd88c56cbac49207d7b7b149e613d2cd7e33176c63b3/onnxruntime-1.22.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a2ac5bd9205d831541db4e508e586e764a74f14efdd3f89af7fd20e1bf4a1ed", size = 14454003 }, + { url = "https://files.pythonhosted.org/packages/c3/16/873b955beda7bada5b0d798d3a601b2ff210e44ad5169f6d405b93892103/onnxruntime-1.22.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64845709f9e8a2809e8e009bc4c8f73b788cee9c6619b7d9930344eae4c9cd36", size = 16427482 }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "importlib-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/8d/1f5a45fbcb9a7d87809d460f09dc3399e3fbd31d7f3e14888345e9d29951/opentelemetry_api-1.33.1.tar.gz", hash = "sha256:1c6055fc0a2d3f23a50c7e17e16ef75ad489345fd3df1f8b8af7c0bbf8a109e8", size = 65002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/44/4c45a34def3506122ae61ad684139f0bbc4e00c39555d4f7e20e0e001c8a/opentelemetry_api-1.33.1-py3-none-any.whl", hash = "sha256:4db83ebcf7ea93e64637ec6ee6fabee45c5cbe4abd9cf3da95c43828ddb50b83", size = 65771 }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-proto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/18/a1ec9dcb6713a48b4bdd10f1c1e4d5d2489d3912b80d2bcc059a9a842836/opentelemetry_exporter_otlp_proto_common-1.33.1.tar.gz", hash = "sha256:c57b3fa2d0595a21c4ed586f74f948d259d9949b58258f11edb398f246bec131", size = 20828 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/52/9bcb17e2c29c1194a28e521b9d3f2ced09028934c3c52a8205884c94b2df/opentelemetry_exporter_otlp_proto_common-1.33.1-py3-none-any.whl", hash = "sha256:b81c1de1ad349785e601d02715b2d29d6818aed2c809c20219f3d1f20b038c36", size = 18839 }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/5f/75ef5a2a917bd0e6e7b83d3fb04c99236ee958f6352ba3019ea9109ae1a6/opentelemetry_exporter_otlp_proto_grpc-1.33.1.tar.gz", hash = "sha256:345696af8dc19785fac268c8063f3dc3d5e274c774b308c634f39d9c21955728", size = 22556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/ec/6047e230bb6d092c304511315b13893b1c9d9260044dd1228c9d48b6ae0e/opentelemetry_exporter_otlp_proto_grpc-1.33.1-py3-none-any.whl", hash = "sha256:7e8da32c7552b756e75b4f9e9c768a61eb47dee60b6550b37af541858d669ce1", size = 18591 }, +] + +[[package]] +name = "opentelemetry-instrumentation" +version = "0.54b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "packaging" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/fd/5756aea3fdc5651b572d8aef7d94d22a0a36e49c8b12fcb78cb905ba8896/opentelemetry_instrumentation-0.54b1.tar.gz", hash = "sha256:7658bf2ff914b02f246ec14779b66671508125c0e4227361e56b5ebf6cef0aec", size = 28436 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/89/0790abc5d9c4fc74bd3e03cb87afe2c820b1d1a112a723c1163ef32453ee/opentelemetry_instrumentation-0.54b1-py3-none-any.whl", hash = "sha256:a4ae45f4a90c78d7006c51524f57cd5aa1231aef031eae905ee34d5423f5b198", size = 31019 }, +] + +[[package]] +name = "opentelemetry-instrumentation-asgi" +version = "0.54b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/f7/a3377f9771947f4d3d59c96841d3909274f446c030dbe8e4af871695ddee/opentelemetry_instrumentation_asgi-0.54b1.tar.gz", hash = "sha256:ab4df9776b5f6d56a78413c2e8bbe44c90694c67c844a1297865dc1bd926ed3c", size = 24230 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/24/7a6f0ae79cae49927f528ecee2db55a5bddd87b550e310ce03451eae7491/opentelemetry_instrumentation_asgi-0.54b1-py3-none-any.whl", hash = "sha256:84674e822b89af563b283a5283c2ebb9ed585d1b80a1c27fb3ac20b562e9f9fc", size = 16338 }, +] + +[[package]] +name = "opentelemetry-instrumentation-fastapi" +version = "0.54b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-asgi" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/3b/9a262cdc1a4defef0e52afebdde3e8add658cc6f922e39e9dcee0da98349/opentelemetry_instrumentation_fastapi-0.54b1.tar.gz", hash = "sha256:1fcad19cef0db7092339b571a59e6f3045c9b58b7fd4670183f7addc459d78df", size = 19325 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/9c/6b2b0f9d6c5dea7528ae0bf4e461dd765b0ae35f13919cd452970bb0d0b3/opentelemetry_instrumentation_fastapi-0.54b1-py3-none-any.whl", hash = "sha256:fb247781cfa75fd09d3d8713c65e4a02bd1e869b00e2c322cc516d4b5429860c", size = 12125 }, +] + +[[package]] +name = "opentelemetry-proto" +version = "1.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/dc/791f3d60a1ad8235930de23eea735ae1084be1c6f96fdadf38710662a7e5/opentelemetry_proto-1.33.1.tar.gz", hash = "sha256:9627b0a5c90753bf3920c398908307063e4458b287bb890e5c1d6fa11ad50b68", size = 34363 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/29/48609f4c875c2b6c80930073c82dd1cafd36b6782244c01394007b528960/opentelemetry_proto-1.33.1-py3-none-any.whl", hash = "sha256:243d285d9f29663fc7ea91a7171fcc1ccbbfff43b48df0774fd64a37d98eda70", size = 55854 }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/12/909b98a7d9b110cce4b28d49b2e311797cffdce180371f35eba13a72dd00/opentelemetry_sdk-1.33.1.tar.gz", hash = "sha256:85b9fcf7c3d23506fbc9692fd210b8b025a1920535feec50bd54ce203d57a531", size = 161885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/8e/ae2d0742041e0bd7fe0d2dcc5e7cce51dcf7d3961a26072d5b43cc8fa2a7/opentelemetry_sdk-1.33.1-py3-none-any.whl", hash = "sha256:19ea73d9a01be29cacaa5d6c8ce0adc0b7f7b4d58cc52f923e4413609f670112", size = 118950 }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.54b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "opentelemetry-api" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/2c/d7990fc1ffc82889d466e7cd680788ace44a26789809924813b164344393/opentelemetry_semantic_conventions-0.54b1.tar.gz", hash = "sha256:d1cecedae15d19bdaafca1e56b29a66aa286f50b5d08f036a145c7f3e9ef9cee", size = 118642 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/80/08b1698c52ff76d96ba440bf15edc2f4bc0a279868778928e947c1004bdd/opentelemetry_semantic_conventions-0.54b1-py3-none-any.whl", hash = "sha256:29dab644a7e435b58d3a3918b58c333c92686236b30f7891d5e51f02933ca60d", size = 194938 }, +] + +[[package]] +name = "opentelemetry-util-http" +version = "0.54b1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/9f/1d8a1d1f34b9f62f2b940b388bf07b8167a8067e70870055bd05db354e5c/opentelemetry_util_http-0.54b1.tar.gz", hash = "sha256:f0b66868c19fbaf9c9d4e11f4a7599fa15d5ea50b884967a26ccd9d72c7c9d15", size = 8044 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ef/c5aa08abca6894792beed4c0405e85205b35b8e73d653571c9ff13a8e34e/opentelemetry_util_http-0.54b1-py3-none-any.whl", hash = "sha256:b1c91883f980344a1c3c486cffd47ae5c9c1dd7323f9cbe9fdb7cadb401c87c9", size = 7301 }, +] + +[[package]] +name = "openvino" +version = "2025.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "openvino-telemetry" }, + { name = "packaging" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/35/12834eae67d9173d2247fc6f8c0a695b7a02e7a053e9cddac4200cca77a8/openvino-2025.1.0-18503-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:e3ee900e0890e295ddb236edd00631b4afc1e6bc76d94fd818319ae73853caa0", size = 34572870 }, + { url = "https://files.pythonhosted.org/packages/a8/5f/ba478cabff69b3fc12ae50c0de1ff7d2b7b1b31fd6c1a4d06d97fb00441c/openvino-2025.1.0-18503-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:30e5585775671676ac6eb37ef0738ac70c4ff3bfd983175ff01dd7dcff3bc7c6", size = 30327880 }, + { url = "https://files.pythonhosted.org/packages/aa/c4/9c0d03c9e65ced1d60fe003c99a795aee044822cdfe71ee18cc62daf2279/openvino-2025.1.0-18503-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:0ef5e48d565d78885fc98eb2cf59904cc8e6477102fa68d7ff0d6f8ba89eb5a8", size = 46036170 }, + { url = "https://files.pythonhosted.org/packages/e4/d8/3090d124751c20733d2a3181d050c629fb06dc4dc939d7fd2092bb3a31e2/openvino-2025.1.0-18503-cp312-cp312-manylinux_2_31_aarch64.whl", hash = "sha256:c9a1350d494c612495c58e6ef9f4935d4dba03d0e89911cd9d2add6b9da17485", size = 26146797 }, + { url = "https://files.pythonhosted.org/packages/d1/8c/49f8ce231983ee47c9aa38bb660ee4161f6cd606c4c4aa7279285e4d48d9/openvino-2025.1.0-18503-cp312-cp312-win_amd64.whl", hash = "sha256:fd19a0660e04228f8710e832b2d8cbc2134325f553b9c265e212032241596ace", size = 38372393 }, + { url = "https://files.pythonhosted.org/packages/ad/99/1202f1c5471aee5107914c278c8994b56e62fe15a9338dc3c14e2f24b704/openvino-2025.1.0-18503-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:5a128cf9ea645ffc89de9fc5745b7e7a7a1c825a37cfa92d0871c01e57ae5d0f", size = 34573219 }, + { url = "https://files.pythonhosted.org/packages/40/80/5825134bf92d844fd56ad846f6aa939998560cf94c957cf715a2fd7f0197/openvino-2025.1.0-18503-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9844c84412f67816fb3a64835ed4dd9575a07cc7a4b726a5f4cdcb897ab33775", size = 30328416 }, + { url = "https://files.pythonhosted.org/packages/8c/8a/39a89f287a0442261b279b12ad25197cc145f28b5635c768cff344434e76/openvino-2025.1.0-18503-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:746fc485c60b7c2be940f9c04105809ac40dfe8487ec422e872dc1340c553b75", size = 46036475 }, + { url = "https://files.pythonhosted.org/packages/6a/b1/00fd4d9ff3bb78494d6046642df3388ec621cce96ecbd740f6d56da20fa1/openvino-2025.1.0-18503-cp313-cp313-manylinux_2_31_aarch64.whl", hash = "sha256:b6a8006fde8d2a6f1a79d818893559c5fa7e7fcdf93b7b4e3e781301b289846e", size = 26145950 }, + { url = "https://files.pythonhosted.org/packages/c0/01/b25400307b2c13e3f32bcd2f06a0d3f823c42d3ad1092209830a7002fb60/openvino-2025.1.0-18503-cp313-cp313-win_amd64.whl", hash = "sha256:a8ea72c31fe243942870dd030e0b6b12642fc39a1d89e3762e59b143b45821b7", size = 38372439 }, +] + +[[package]] +name = "openvino-telemetry" +version = "2025.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/ba/8d9e5e82f9add6d7dfe26aee012d86e2121b4975e8a5a3b88bf374bba0cd/openvino_telemetry-2025.1.0.tar.gz", hash = "sha256:12a2b04cd18e83cc3d818b9fff54274922e19eca2434616b8f3eb2904a9cb43a", size = 18704 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/cd/f26e5c79f5dcc64359d489c9b8e468658474dc8a6cd579d8873ad2348d0e/openvino_telemetry-2025.1.0-py3-none-any.whl", hash = "sha256:5bee18ce3bc8f287def5bfa4c73205417d4c5f281da6932486c2877558c712b3", size = 25071 }, +] + +[[package]] +name = "openvino-tokenizers" +version = "2025.1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "openvino" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/8a/ce09e7f17564e732f8e4e61014663bb6e437a0439f5148e3afa819377f4d/openvino_tokenizers-2025.1.0.0-py3-none-macosx_10_15_x86_64.whl", hash = "sha256:9fa463cbc9727e45af5ab9388dece8ac2a9cabec901aea43588758f730d0a52b", size = 13785604 }, + { url = "https://files.pythonhosted.org/packages/ed/c8/d9fceff6018dde51f8120e4c402b75d28a93556212690388be9822ad7616/openvino_tokenizers-2025.1.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a0407175e847a791d9659b0c91edb6697652221c1e29c0095807d5fe4f3952f0", size = 13711364 }, + { url = "https://files.pythonhosted.org/packages/a1/16/bd3201b10c9bdd7f1bd11ddc131a925ae82cf8b7bd15cefed0b910f2fde7/openvino_tokenizers-2025.1.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0bbbaf9abaa203e7d00cf6aec331464c65f46a1d7f3f101082d41a54b6159f4d", size = 13719823 }, + { url = "https://files.pythonhosted.org/packages/15/5b/dd569d72c5d4b36ffbcdefe8c392c5f03721640ad2058d074b6153a9a8ff/openvino_tokenizers-2025.1.0.0-py3-none-manylinux_2_31_aarch64.whl", hash = "sha256:5faa49e0616aee7ae01fef610d70f2d3077e4b6d74fc688c642af887df061bb8", size = 13647940 }, + { url = "https://files.pythonhosted.org/packages/bf/36/e1cec57663e4069ffdc4940d53c2f0c3a703bd95ed84db76fbce6c0f0702/openvino_tokenizers-2025.1.0.0-py3-none-win_amd64.whl", hash = "sha256:efbf5da395678e7f9fe24ed327f9ef7f0f331ae71e5eee811c7e3df964ff4edf", size = 13983170 }, +] + +[[package]] +name = "optimum" +version = "1.25.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0+xpu", source = { registry = "https://download.pytorch.org/whl/xpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/51/bd/cc1cb4e6d8cc2886f81775c798ffd2a9d1807474facedaa736e2e4a02912/optimum-1.25.3.tar.gz", hash = "sha256:1482d5f730bd5fb745e07915bae520ad9c4eaf02100811c287a74c117dbe3c6e", size = 345294 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/b4/5fb8f8933a259846dcb7c93016b036581627faa6c490fb403f7d4ab44870/optimum-1.25.3-py3-none-any.whl", hash = "sha256:f6f7614c1dcff0fd55362d369338a9e73b737e260a63bf2f3462af73aa7356b8", size = 429288 }, +] + +[package.optional-dependencies] +nncf = [ + { name = "optimum-intel", extra = ["nncf"] }, +] +openvino = [ + { name = "optimum-intel", extra = ["openvino"] }, +] + +[[package]] +name = "optimum-intel" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "datasets" }, + { name = "onnx" }, + { name = "optimum" }, + { name = "scipy" }, + { name = "setuptools" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0+xpu", source = { registry = "https://download.pytorch.org/whl/xpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/66/48348a8e5e4ac1a1cc9b4a9755c3e4fad56debbb83799dc22706287a8671/optimum-intel-1.23.0.tar.gz", hash = "sha256:a9ca84ee2cb33c03f1da6139f04e458d26e7c84ca54bd8c0883bf6a9c7853f43", size = 304665 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/09/e1a957c433a78a204da7e566999b00184a1e6fdf28197e3299a40b844a34/optimum_intel-1.23.0-py3-none-any.whl", hash = "sha256:3c30828a4d0151f3b40898f1125a8d99a35518c3db97a9baad26c7e991da8afe", size = 342551 }, +] + +[package.optional-dependencies] +nncf = [ + { name = "nncf" }, +] +openvino = [ + { name = "nncf" }, + { name = "openvino" }, + { name = "openvino-tokenizers" }, +] + +[[package]] +name = "orjson" +version = "3.10.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/0b/fea456a3ffe74e70ba30e01ec183a9b26bec4d497f61dcfce1b601059c60/orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53", size = 5422810 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/1a/67236da0916c1a192d5f4ccbe10ec495367a726996ceb7614eaa687112f2/orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753", size = 249184 }, + { url = "https://files.pythonhosted.org/packages/b3/bc/c7f1db3b1d094dc0c6c83ed16b161a16c214aaa77f311118a93f647b32dc/orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17", size = 133279 }, + { url = "https://files.pythonhosted.org/packages/af/84/664657cd14cc11f0d81e80e64766c7ba5c9b7fc1ec304117878cc1b4659c/orjson-3.10.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:559eb40a70a7494cd5beab2d73657262a74a2c59aff2068fdba8f0424ec5b39d", size = 136799 }, + { url = "https://files.pythonhosted.org/packages/9a/bb/f50039c5bb05a7ab024ed43ba25d0319e8722a0ac3babb0807e543349978/orjson-3.10.18-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3c29eb9a81e2fbc6fd7ddcfba3e101ba92eaff455b8d602bf7511088bbc0eae", size = 132791 }, + { url = "https://files.pythonhosted.org/packages/93/8c/ee74709fc072c3ee219784173ddfe46f699598a1723d9d49cbc78d66df65/orjson-3.10.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6612787e5b0756a171c7d81ba245ef63a3533a637c335aa7fcb8e665f4a0966f", size = 137059 }, + { url = "https://files.pythonhosted.org/packages/6a/37/e6d3109ee004296c80426b5a62b47bcadd96a3deab7443e56507823588c5/orjson-3.10.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ac6bd7be0dcab5b702c9d43d25e70eb456dfd2e119d512447468f6405b4a69c", size = 138359 }, + { url = "https://files.pythonhosted.org/packages/4f/5d/387dafae0e4691857c62bd02839a3bf3fa648eebd26185adfac58d09f207/orjson-3.10.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f72f100cee8dde70100406d5c1abba515a7df926d4ed81e20a9730c062fe9ad", size = 142853 }, + { url = "https://files.pythonhosted.org/packages/27/6f/875e8e282105350b9a5341c0222a13419758545ae32ad6e0fcf5f64d76aa/orjson-3.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca85398d6d093dd41dc0983cbf54ab8e6afd1c547b6b8a311643917fbf4e0c", size = 133131 }, + { url = "https://files.pythonhosted.org/packages/48/b2/73a1f0b4790dcb1e5a45f058f4f5dcadc8a85d90137b50d6bbc6afd0ae50/orjson-3.10.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22748de2a07fcc8781a70edb887abf801bb6142e6236123ff93d12d92db3d406", size = 134834 }, + { url = "https://files.pythonhosted.org/packages/56/f5/7ed133a5525add9c14dbdf17d011dd82206ca6840811d32ac52a35935d19/orjson-3.10.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a83c9954a4107b9acd10291b7f12a6b29e35e8d43a414799906ea10e75438e6", size = 413368 }, + { url = "https://files.pythonhosted.org/packages/11/7c/439654221ed9c3324bbac7bdf94cf06a971206b7b62327f11a52544e4982/orjson-3.10.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:303565c67a6c7b1f194c94632a4a39918e067bd6176a48bec697393865ce4f06", size = 153359 }, + { url = "https://files.pythonhosted.org/packages/48/e7/d58074fa0cc9dd29a8fa2a6c8d5deebdfd82c6cfef72b0e4277c4017563a/orjson-3.10.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:86314fdb5053a2f5a5d881f03fca0219bfdf832912aa88d18676a5175c6916b5", size = 137466 }, + { url = "https://files.pythonhosted.org/packages/57/4d/fe17581cf81fb70dfcef44e966aa4003360e4194d15a3f38cbffe873333a/orjson-3.10.18-cp312-cp312-win32.whl", hash = "sha256:187ec33bbec58c76dbd4066340067d9ece6e10067bb0cc074a21ae3300caa84e", size = 142683 }, + { url = "https://files.pythonhosted.org/packages/e6/22/469f62d25ab5f0f3aee256ea732e72dc3aab6d73bac777bd6277955bceef/orjson-3.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:f9f94cf6d3f9cd720d641f8399e390e7411487e493962213390d1ae45c7814fc", size = 134754 }, + { url = "https://files.pythonhosted.org/packages/10/b0/1040c447fac5b91bc1e9c004b69ee50abb0c1ffd0d24406e1350c58a7fcb/orjson-3.10.18-cp312-cp312-win_arm64.whl", hash = "sha256:3d600be83fe4514944500fa8c2a0a77099025ec6482e8087d7659e891f23058a", size = 131218 }, + { url = "https://files.pythonhosted.org/packages/04/f0/8aedb6574b68096f3be8f74c0b56d36fd94bcf47e6c7ed47a7bd1474aaa8/orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147", size = 249087 }, + { url = "https://files.pythonhosted.org/packages/bc/f7/7118f965541aeac6844fcb18d6988e111ac0d349c9b80cda53583e758908/orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c", size = 133273 }, + { url = "https://files.pythonhosted.org/packages/fb/d9/839637cc06eaf528dd8127b36004247bf56e064501f68df9ee6fd56a88ee/orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103", size = 136779 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/f226ecfef31a1f0e7d6bf9a31a0bbaf384c7cbe3fce49cc9c2acc51f902a/orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595", size = 132811 }, + { url = "https://files.pythonhosted.org/packages/73/2d/371513d04143c85b681cf8f3bce743656eb5b640cb1f461dad750ac4b4d4/orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc", size = 137018 }, + { url = "https://files.pythonhosted.org/packages/69/cb/a4d37a30507b7a59bdc484e4a3253c8141bf756d4e13fcc1da760a0b00cb/orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc", size = 138368 }, + { url = "https://files.pythonhosted.org/packages/1e/ae/cd10883c48d912d216d541eb3db8b2433415fde67f620afe6f311f5cd2ca/orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049", size = 142840 }, + { url = "https://files.pythonhosted.org/packages/6d/4c/2bda09855c6b5f2c055034c9eda1529967b042ff8d81a05005115c4e6772/orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58", size = 133135 }, + { url = "https://files.pythonhosted.org/packages/13/4a/35971fd809a8896731930a80dfff0b8ff48eeb5d8b57bb4d0d525160017f/orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034", size = 134810 }, + { url = "https://files.pythonhosted.org/packages/99/70/0fa9e6310cda98365629182486ff37a1c6578e34c33992df271a476ea1cd/orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1", size = 413491 }, + { url = "https://files.pythonhosted.org/packages/32/cb/990a0e88498babddb74fb97855ae4fbd22a82960e9b06eab5775cac435da/orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012", size = 153277 }, + { url = "https://files.pythonhosted.org/packages/92/44/473248c3305bf782a384ed50dd8bc2d3cde1543d107138fd99b707480ca1/orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f", size = 137367 }, + { url = "https://files.pythonhosted.org/packages/ad/fd/7f1d3edd4ffcd944a6a40e9f88af2197b619c931ac4d3cfba4798d4d3815/orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea", size = 142687 }, + { url = "https://files.pythonhosted.org/packages/4b/03/c75c6ad46be41c16f4cfe0352a2d1450546f3c09ad2c9d341110cd87b025/orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52", size = 134794 }, + { url = "https://files.pythonhosted.org/packages/c2/28/f53038a5a72cc4fd0b56c1eafb4ef64aec9685460d5ac34de98ca78b6e29/orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3", size = 131186 }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 }, +] + +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "sys_platform != 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "pillow" +version = "11.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185 }, + { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306 }, + { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121 }, + { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707 }, + { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921 }, + { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523 }, + { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836 }, + { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390 }, + { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309 }, + { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768 }, + { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087 }, + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098 }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166 }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674 }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005 }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707 }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008 }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420 }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655 }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329 }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388 }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950 }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759 }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284 }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826 }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049 }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408 }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863 }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938 }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774 }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895 }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, +] + +[[package]] +name = "posthog" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backoff" }, + { name = "distro" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/5b/2e9890700b7b55a370edbfbe5948eae780d48af9b46ad06ea2e7970576f4/posthog-4.2.0.tar.gz", hash = "sha256:c4abc95de03294be005b3b7e8735e9d7abab88583da26262112bacce64b0c3b5", size = 80727 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/16/7b6c5844acee2d343d463ee0e3143cd8c7c48a6c0d079a2f7daf0c80b95c/posthog-4.2.0-py2.py3-none-any.whl", hash = "sha256:60c7066caac43e43e326e9196d8c1aadeafc8b0be9e5c108446e352711fa456b", size = 96692 }, +] + +[[package]] +name = "prometheus-client" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/5a/3fa1fa7e91a203759aaf316be394f70f2ef598d589b9785a8611b6094c00/prometheus_client-0.22.0.tar.gz", hash = "sha256:18da1d2241ac2d10c8d2110f13eedcd5c7c0c8af18c926e8731f04fc10cd575c", size = 74443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/c7/cee159ba3d7192e84a4c166ec1752f44a5fa859ac0eeda2d73a1da65ab47/prometheus_client-0.22.0-py3-none-any.whl", hash = "sha256:c8951bbe64e62b96cd8e8f5d917279d1b9b91ab766793f33d4dce6c228558713", size = 62658 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, +] + +[[package]] +name = "propcache" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430 }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637 }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123 }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031 }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100 }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170 }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000 }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262 }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772 }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133 }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741 }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047 }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467 }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022 }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647 }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784 }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865 }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452 }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800 }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804 }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235 }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249 }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964 }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501 }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917 }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089 }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102 }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122 }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818 }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112 }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034 }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613 }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763 }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175 }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265 }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412 }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290 }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926 }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808 }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916 }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661 }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384 }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420 }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880 }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407 }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573 }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757 }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 }, +] + +[[package]] +name = "protobuf" +version = "5.29.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/7d/b9dca7365f0e2c4fa7c193ff795427cfa6290147e5185ab11ece280a18e7/protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99", size = 424902 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/b2/043a1a1a20edd134563699b0e91862726a0dc9146c090743b6c44d798e75/protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7", size = 422709 }, + { url = "https://files.pythonhosted.org/packages/79/fc/2474b59570daa818de6124c0a15741ee3e5d6302e9d6ce0bdfd12e98119f/protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d", size = 434506 }, + { url = "https://files.pythonhosted.org/packages/46/de/7c126bbb06aa0f8a7b38aaf8bd746c514d70e6a2a3f6dd460b3b7aad7aae/protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0", size = 417826 }, + { url = "https://files.pythonhosted.org/packages/a2/b5/bade14ae31ba871a139aa45e7a8183d869efe87c34a4850c87b936963261/protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e", size = 319574 }, + { url = "https://files.pythonhosted.org/packages/46/88/b01ed2291aae68b708f7d334288ad5fb3e7aa769a9c309c91a0d55cb91b0/protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922", size = 319672 }, + { url = "https://files.pythonhosted.org/packages/12/fb/a586e0c973c95502e054ac5f81f88394f24ccc7982dac19c515acd9e2c93/protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", size = 172551 }, +] + +[[package]] +name = "psutil" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + +[[package]] +name = "pyarrow" +version = "20.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067 }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128 }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890 }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775 }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231 }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639 }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549 }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216 }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496 }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501 }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895 }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322 }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441 }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027 }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473 }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897 }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847 }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219 }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957 }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972 }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434 }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648 }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853 }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743 }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441 }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279 }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982 }, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.11.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/86/8ce9040065e8f924d642c58e4a344e33163a07f6b57f836d0d734e0ad3fb/pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a", size = 787102 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/69/831ed22b38ff9b4b64b66569f0e5b7b97cf3638346eb95a2147fdb49ad5f/pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7", size = 444229 }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, +] + +[[package]] +name = "pydantic-settings" +version = "2.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 }, +] + +[[package]] +name = "pydot" +version = "3.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/dd/e0e6a4fb84c22050f6a9701ad9fd6a67ef82faa7ba97b97eb6fdc6b49b34/pydot-3.0.4.tar.gz", hash = "sha256:3ce88b2558f3808b0376f22bfa6c263909e1c3981e2a7b629b65b451eee4a25d", size = 168167 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/5f/1ebfd430df05c4f9e438dd3313c4456eab937d976f6ab8ce81a98f9fb381/pydot-3.0.4-py3-none-any.whl", hash = "sha256:bfa9c3fc0c44ba1d132adce131802d7df00429d1a79cc0346b0a5cd374dbe9c6", size = 35776 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pymoo" +version = "0.6.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alive-progress" }, + { name = "autograd" }, + { name = "cma" }, + { name = "deprecated" }, + { name = "dill" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/ed/ec5a76bb1556b774a67806c08234dab0e603509846b6b94934da59e5f4bd/pymoo-0.6.1.5.tar.gz", hash = "sha256:9ce71eaceb2f5cccf8c5af53102cf6d96fa911452addaf48fb971a60621f8364", size = 258027 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/23/45dddc4897e384534d059688576b02016af72270d7ff18b14816a30a4c30/pymoo-0.6.1.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31d9f9522337c6ddfa6fc7670daa9ce4c777c104283824c3e6a2c482d8cde5b8", size = 1564924 }, + { url = "https://files.pythonhosted.org/packages/4f/4e/5ffa473b30b7ab44b3bb3c4bd4b77d81c8975fb8bb17381275e106137838/pymoo-0.6.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:57dd99fd7fff871d42289646ee7899f5f85535a74d4fefcca900a9dde1067c07", size = 944016 }, + { url = "https://files.pythonhosted.org/packages/cf/9b/27e7e1e858c1f01b78a3de7e137c68905c693f1b81cee9826ff8b6bf6b78/pymoo-0.6.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:247099da5cf52092529089cd2b69d6cb959db9081d88789d6d1155778f392041", size = 4382163 }, + { url = "https://files.pythonhosted.org/packages/eb/8e/2dd71f8b75cad7251843a9b04587417171ee64233e8d1ef86fa59d385c7d/pymoo-0.6.1.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db6e562fad10afcfb250de116f958d7606f9ccb95d9a6e84b1c26378384cd736", size = 5786773 }, + { url = "https://files.pythonhosted.org/packages/ae/6a/f6733edb12bf452ca21d90bda2b50e13ade23c76e3018e092234b361840c/pymoo-0.6.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:44a151f83b9e455cdf1a8d63383c378b871c44592b6314167a39be3694a2fb01", size = 2009815 }, + { url = "https://files.pythonhosted.org/packages/2e/5e/260d77d5d44ee276fca63c902a38dbfa5315b13db4a856f4b4ede5769754/pymoo-0.6.1.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9ddaeb66ce18d473cdfdfd70c7e63e1cd7cddf47879e79bca1f8eab379a74413", size = 1552512 }, + { url = "https://files.pythonhosted.org/packages/a5/3f/38538bb89e92eb10357bc2aa8dcefdfa25ec01b57a2b4cd419e704de3139/pymoo-0.6.1.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:875d06c0f0617ea73eaedb810cc25d55b40b7ddf77db23f59bca51a18eab5079", size = 937888 }, + { url = "https://files.pythonhosted.org/packages/4d/75/7a7e1ddea474ef3e0d1845c20e7792743a8b01850e2956a6f776dbf87f46/pymoo-0.6.1.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da0d2afe9fa6a94fbec3fe970fa9426309b668eefb1eb796f44bfa186cf2c5ad", size = 4331420 }, + { url = "https://files.pythonhosted.org/packages/85/6a/85e26ad9b046e89a4a77bee7f0ed3b3d77ecb2e743727d09187473346719/pymoo-0.6.1.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0926f8ba84fc1e104b30ccdcf0dd5ed886be209f7de6d729fe115cdd3fdec084", size = 5775567 }, + { url = "https://files.pythonhosted.org/packages/e2/1f/479758d597229563bf9d2003911bdb0829f031da4d1577bf76ff61e5b704/pymoo-0.6.1.5-cp313-cp313-win_amd64.whl", hash = "sha256:36543ab8690c9afb4a07c795f58018223394b86c5ba0ce6044f7f28c193dfacc", size = 2008812 }, +] + +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, +] + +[[package]] +name = "pypdf" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/c8/543f8ae1cd9e182e9f979d9ab1df18e3445350471abadbdabc0166ae5741/pypdf-5.5.0.tar.gz", hash = "sha256:8ce6a18389f7394fd09a1d4b7a34b097b11c19088a23cfd09e5008f85893e254", size = 5021690 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/4e/931b90b51e3ebc69699be926b3d5bfdabae2d9c84337fd0c9fb98adbf70c/pypdf-5.5.0-py3-none-any.whl", hash = "sha256:2f61f2d32dde00471cd70b8977f98960c64e84dd5ba0d070e953fcb4da0b2a73", size = 303371 }, +] + +[[package]] +name = "pypika" +version = "0.48.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/2c/94ed7b91db81d61d7096ac8f2d325ec562fc75e35f3baea8749c85b28784/PyPika-0.48.9.tar.gz", hash = "sha256:838836a61747e7c8380cd1b7ff638694b7a7335345d0f559b04b2cd832ad5378", size = 67259 } + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216 }, +] + +[[package]] +name = "pyreadline3" +version = "3.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, +] + +[[package]] +name = "python-json-logger" +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/de/d3144a0bceede957f961e975f3752760fbe390d57fbe194baf709d8f1f7b/python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84", size = 16642 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7", size = 15163 }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, +] + +[[package]] +name = "pytorch-triton-xpu" +version = "3.3.0" +source = { registry = "https://download.pytorch.org/whl/xpu" } +dependencies = [ + { name = "setuptools", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:40f6fb65b345dc9a61813abe7ac9a585f2c9808f414d140cc2a5f11f53ee063c" }, + { url = "https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:0dd07e6d5b872e42e48f5ee140e609d4554ca3cc509d5bf509ac232267cf358e" }, + { url = "https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b22b4c02ec71b4bfc862ae3cdfd2871dc0b05d2b1802f5db2196e0f897d581e9" }, + { url = "https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:a936a18182d8e065a9933afc9a3ebbffadd38604969f87c493831214539fc027" }, + { url = "https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9821fe059de58e827ffc6aa10d69369b16c2f8c2a988b86bef9c2c6e396ab3aa" }, + { url = "https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:07c18df9202c4dd30096ba22e36335cd5db827e83f110091b763fbd066498f3e" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, +] + +[[package]] +name = "pywinpty" +version = "2.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/7c/917f9c4681bb8d34bfbe0b79d36bbcd902651aeab48790df3d30ba0202fb/pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2", size = 29017 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/e5/9714def18c3a411809771a3fbcec70bffa764b9675afb00048a620fca604/pywinpty-2.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc", size = 1405243 }, + { url = "https://files.pythonhosted.org/packages/fb/16/2ab7b3b7f55f3c6929e5f629e1a68362981e4e5fed592a2ed1cb4b4914a5/pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408", size = 1405020 }, + { url = "https://files.pythonhosted.org/packages/7c/16/edef3515dd2030db2795dbfbe392232c7a0f3dc41b98e92b38b42ba497c7/pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901", size = 1404151 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "pyzmq" +version = "26.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/44/a778555ebfdf6c7fc00816aad12d185d10a74d975800341b1bc36bad1187/pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b", size = 1341586 }, + { url = "https://files.pythonhosted.org/packages/9c/4f/f3a58dc69ac757e5103be3bd41fb78721a5e17da7cc617ddb56d973a365c/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905", size = 665880 }, + { url = "https://files.pythonhosted.org/packages/fe/45/50230bcfb3ae5cb98bee683b6edeba1919f2565d7cc1851d3c38e2260795/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b", size = 902216 }, + { url = "https://files.pythonhosted.org/packages/41/59/56bbdc5689be5e13727491ad2ba5efd7cd564365750514f9bc8f212eef82/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63", size = 859814 }, + { url = "https://files.pythonhosted.org/packages/81/b1/57db58cfc8af592ce94f40649bd1804369c05b2190e4cbc0a2dad572baeb/pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5", size = 855889 }, + { url = "https://files.pythonhosted.org/packages/e8/92/47542e629cbac8f221c230a6d0f38dd3d9cff9f6f589ed45fdf572ffd726/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b", size = 1197153 }, + { url = "https://files.pythonhosted.org/packages/07/e5/b10a979d1d565d54410afc87499b16c96b4a181af46e7645ab4831b1088c/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84", size = 1507352 }, + { url = "https://files.pythonhosted.org/packages/ab/58/5a23db84507ab9c01c04b1232a7a763be66e992aa2e66498521bbbc72a71/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f", size = 1406834 }, + { url = "https://files.pythonhosted.org/packages/22/74/aaa837b331580c13b79ac39396601fb361454ee184ca85e8861914769b99/pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44", size = 577992 }, + { url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be", size = 640466 }, + { url = "https://files.pythonhosted.org/packages/e4/29/073779afc3ef6f830b8de95026ef20b2d1ec22d0324d767748d806e57379/pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0", size = 556342 }, + { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484 }, + { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106 }, + { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148 }, + { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983 }, + { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274 }, + { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120 }, + { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738 }, + { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826 }, + { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406 }, + { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216 }, + { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769 }, + { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826 }, + { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650 }, + { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776 }, + { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516 }, + { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183 }, + { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501 }, + { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540 }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242 }, +] + +[[package]] +name = "rich" +version = "14.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, +] + +[[package]] +name = "rich-toolkit" +version = "0.14.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/7a/cb48b7024b247631ce39b1f14a0f1abedf311fb27b892b0e0387d809d4b5/rich_toolkit-0.14.7.tar.gz", hash = "sha256:6cca5a68850cc5778915f528eb785662c27ba3b4b2624612cce8340fa9701c5e", size = 104977 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/2e/95fde5b818dac9a37683ea064096323f593442d0f6358923c5f635974393/rich_toolkit-0.14.7-py3-none-any.whl", hash = "sha256:def05cc6e0f1176d6263b6a26648f16a62c4563b277ca2f8538683acdba1e0da", size = 24870 }, +] + +[[package]] +name = "rpds-py" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/a6/60184b7fc00dd3ca80ac635dd5b8577d444c57e8e8742cecabfacb829921/rpds_py-0.25.1.tar.gz", hash = "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3", size = 27304 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/81/28ab0408391b1dc57393653b6a0cf2014cc282cc2909e4615e63e58262be/rpds_py-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c", size = 364647 }, + { url = "https://files.pythonhosted.org/packages/2c/9a/7797f04cad0d5e56310e1238434f71fc6939d0bc517192a18bb99a72a95f/rpds_py-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b", size = 350454 }, + { url = "https://files.pythonhosted.org/packages/69/3c/93d2ef941b04898011e5d6eaa56a1acf46a3b4c9f4b3ad1bbcbafa0bee1f/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa", size = 389665 }, + { url = "https://files.pythonhosted.org/packages/c1/57/ad0e31e928751dde8903a11102559628d24173428a0f85e25e187defb2c1/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda", size = 403873 }, + { url = "https://files.pythonhosted.org/packages/16/ad/c0c652fa9bba778b4f54980a02962748479dc09632e1fd34e5282cf2556c/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309", size = 525866 }, + { url = "https://files.pythonhosted.org/packages/2a/39/3e1839bc527e6fcf48d5fec4770070f872cdee6c6fbc9b259932f4e88a38/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b", size = 416886 }, + { url = "https://files.pythonhosted.org/packages/7a/95/dd6b91cd4560da41df9d7030a038298a67d24f8ca38e150562644c829c48/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea", size = 390666 }, + { url = "https://files.pythonhosted.org/packages/64/48/1be88a820e7494ce0a15c2d390ccb7c52212370badabf128e6a7bb4cb802/rpds_py-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65", size = 425109 }, + { url = "https://files.pythonhosted.org/packages/cf/07/3e2a17927ef6d7720b9949ec1b37d1e963b829ad0387f7af18d923d5cfa5/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c", size = 567244 }, + { url = "https://files.pythonhosted.org/packages/d2/e5/76cf010998deccc4f95305d827847e2eae9c568099c06b405cf96384762b/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd", size = 596023 }, + { url = "https://files.pythonhosted.org/packages/52/9a/df55efd84403736ba37a5a6377b70aad0fd1cb469a9109ee8a1e21299a1c/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb", size = 561634 }, + { url = "https://files.pythonhosted.org/packages/ab/aa/dc3620dd8db84454aaf9374bd318f1aa02578bba5e567f5bf6b79492aca4/rpds_py-0.25.1-cp312-cp312-win32.whl", hash = "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe", size = 222713 }, + { url = "https://files.pythonhosted.org/packages/a3/7f/7cef485269a50ed5b4e9bae145f512d2a111ca638ae70cc101f661b4defd/rpds_py-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192", size = 235280 }, + { url = "https://files.pythonhosted.org/packages/99/f2/c2d64f6564f32af913bf5f3f7ae41c7c263c5ae4c4e8f1a17af8af66cd46/rpds_py-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728", size = 225399 }, + { url = "https://files.pythonhosted.org/packages/2b/da/323848a2b62abe6a0fec16ebe199dc6889c5d0a332458da8985b2980dffe/rpds_py-0.25.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559", size = 364498 }, + { url = "https://files.pythonhosted.org/packages/1f/b4/4d3820f731c80fd0cd823b3e95b9963fec681ae45ba35b5281a42382c67d/rpds_py-0.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1", size = 350083 }, + { url = "https://files.pythonhosted.org/packages/d5/b1/3a8ee1c9d480e8493619a437dec685d005f706b69253286f50f498cbdbcf/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c", size = 389023 }, + { url = "https://files.pythonhosted.org/packages/3b/31/17293edcfc934dc62c3bf74a0cb449ecd549531f956b72287203e6880b87/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb", size = 403283 }, + { url = "https://files.pythonhosted.org/packages/d1/ca/e0f0bc1a75a8925024f343258c8ecbd8828f8997ea2ac71e02f67b6f5299/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40", size = 524634 }, + { url = "https://files.pythonhosted.org/packages/3e/03/5d0be919037178fff33a6672ffc0afa04ea1cfcb61afd4119d1b5280ff0f/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79", size = 416233 }, + { url = "https://files.pythonhosted.org/packages/05/7c/8abb70f9017a231c6c961a8941403ed6557664c0913e1bf413cbdc039e75/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325", size = 390375 }, + { url = "https://files.pythonhosted.org/packages/7a/ac/a87f339f0e066b9535074a9f403b9313fd3892d4a164d5d5f5875ac9f29f/rpds_py-0.25.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295", size = 424537 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/8d5c1567eaf8c8afe98a838dd24de5013ce6e8f53a01bd47fe8bb06b5533/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b", size = 566425 }, + { url = "https://files.pythonhosted.org/packages/95/33/03016a6be5663b389c8ab0bbbcca68d9e96af14faeff0a04affcb587e776/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98", size = 595197 }, + { url = "https://files.pythonhosted.org/packages/33/8d/da9f4d3e208c82fda311bff0cf0a19579afceb77cf456e46c559a1c075ba/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd", size = 561244 }, + { url = "https://files.pythonhosted.org/packages/e2/b3/39d5dcf7c5f742ecd6dbc88f6f84ae54184b92f5f387a4053be2107b17f1/rpds_py-0.25.1-cp313-cp313-win32.whl", hash = "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31", size = 222254 }, + { url = "https://files.pythonhosted.org/packages/5f/19/2d6772c8eeb8302c5f834e6d0dfd83935a884e7c5ce16340c7eaf89ce925/rpds_py-0.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500", size = 234741 }, + { url = "https://files.pythonhosted.org/packages/5b/5a/145ada26cfaf86018d0eb304fe55eafdd4f0b6b84530246bb4a7c4fb5c4b/rpds_py-0.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5", size = 224830 }, + { url = "https://files.pythonhosted.org/packages/4b/ca/d435844829c384fd2c22754ff65889c5c556a675d2ed9eb0e148435c6690/rpds_py-0.25.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129", size = 359668 }, + { url = "https://files.pythonhosted.org/packages/1f/01/b056f21db3a09f89410d493d2f6614d87bb162499f98b649d1dbd2a81988/rpds_py-0.25.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d", size = 345649 }, + { url = "https://files.pythonhosted.org/packages/e0/0f/e0d00dc991e3d40e03ca36383b44995126c36b3eafa0ccbbd19664709c88/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72", size = 384776 }, + { url = "https://files.pythonhosted.org/packages/9f/a2/59374837f105f2ca79bde3c3cd1065b2f8c01678900924949f6392eab66d/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34", size = 395131 }, + { url = "https://files.pythonhosted.org/packages/9c/dc/48e8d84887627a0fe0bac53f0b4631e90976fd5d35fff8be66b8e4f3916b/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9", size = 520942 }, + { url = "https://files.pythonhosted.org/packages/7c/f5/ee056966aeae401913d37befeeab57a4a43a4f00099e0a20297f17b8f00c/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5", size = 411330 }, + { url = "https://files.pythonhosted.org/packages/ab/74/b2cffb46a097cefe5d17f94ede7a174184b9d158a0aeb195f39f2c0361e8/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194", size = 387339 }, + { url = "https://files.pythonhosted.org/packages/7f/9a/0ff0b375dcb5161c2b7054e7d0b7575f1680127505945f5cabaac890bc07/rpds_py-0.25.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6", size = 418077 }, + { url = "https://files.pythonhosted.org/packages/0d/a1/fda629bf20d6b698ae84c7c840cfb0e9e4200f664fc96e1f456f00e4ad6e/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78", size = 562441 }, + { url = "https://files.pythonhosted.org/packages/20/15/ce4b5257f654132f326f4acd87268e1006cc071e2c59794c5bdf4bebbb51/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72", size = 590750 }, + { url = "https://files.pythonhosted.org/packages/fb/ab/e04bf58a8d375aeedb5268edcc835c6a660ebf79d4384d8e0889439448b0/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66", size = 558891 }, + { url = "https://files.pythonhosted.org/packages/90/82/cb8c6028a6ef6cd2b7991e2e4ced01c854b6236ecf51e81b64b569c43d73/rpds_py-0.25.1-cp313-cp313t-win32.whl", hash = "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523", size = 218718 }, + { url = "https://files.pythonhosted.org/packages/b6/97/5a4b59697111c89477d20ba8a44df9ca16b41e737fa569d5ae8bff99e650/rpds_py-0.25.1-cp313-cp313t-win_amd64.whl", hash = "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763", size = 232218 }, +] + +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696 }, +] + +[[package]] +name = "safetensors" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/7e/2d5d6ee7b40c0682315367ec7475693d110f512922d582fef1bd4a63adc3/safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965", size = 67210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/ae/88f6c49dbd0cc4da0e08610019a3c78a7d390879a919411a410a1876d03a/safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073", size = 436917 }, + { url = "https://files.pythonhosted.org/packages/b8/3b/11f1b4a2f5d2ab7da34ecc062b0bc301f2be024d110a6466726bec8c055c/safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7", size = 418419 }, + { url = "https://files.pythonhosted.org/packages/5d/9a/add3e6fef267658075c5a41573c26d42d80c935cdc992384dfae435feaef/safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467", size = 459493 }, + { url = "https://files.pythonhosted.org/packages/df/5c/bf2cae92222513cc23b3ff85c4a1bb2811a2c3583ac0f8e8d502751de934/safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e", size = 472400 }, + { url = "https://files.pythonhosted.org/packages/58/11/7456afb740bd45782d0f4c8e8e1bb9e572f1bf82899fb6ace58af47b4282/safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d", size = 522891 }, + { url = "https://files.pythonhosted.org/packages/57/3d/fe73a9d2ace487e7285f6e157afee2383bd1ddb911b7cb44a55cf812eae3/safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9", size = 537694 }, + { url = "https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a", size = 471642 }, + { url = "https://files.pythonhosted.org/packages/ce/20/1fbe16f9b815f6c5a672f5b760951e20e17e43f67f231428f871909a37f6/safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d", size = 502241 }, + { url = "https://files.pythonhosted.org/packages/5f/18/8e108846b506487aa4629fe4116b27db65c3dde922de2c8e0cc1133f3f29/safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b", size = 638001 }, + { url = "https://files.pythonhosted.org/packages/82/5a/c116111d8291af6c8c8a8b40628fe833b9db97d8141c2a82359d14d9e078/safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff", size = 734013 }, + { url = "https://files.pythonhosted.org/packages/7d/ff/41fcc4d3b7de837963622e8610d998710705bbde9a8a17221d85e5d0baad/safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135", size = 670687 }, + { url = "https://files.pythonhosted.org/packages/40/ad/2b113098e69c985a3d8fbda4b902778eae4a35b7d5188859b4a63d30c161/safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04", size = 643147 }, + { url = "https://files.pythonhosted.org/packages/0a/0c/95aeb51d4246bd9a3242d3d8349c1112b4ee7611a4b40f0c5c93b05f001d/safetensors-0.5.3-cp38-abi3-win32.whl", hash = "sha256:cfc0ec0846dcf6763b0ed3d1846ff36008c6e7290683b61616c4b040f6a54ace", size = 296677 }, + { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878 }, +] + +[[package]] +name = "scikit-learn" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/a5/4ae3b3a0755f7b35a280ac90b28817d1f380318973cff14075ab41ef50d9/scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e", size = 7068312 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/18/c797c9b8c10380d05616db3bfb48e2a3358c767affd0857d56c2eb501caa/scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b", size = 12104516 }, + { url = "https://files.pythonhosted.org/packages/c4/b7/2e35f8e289ab70108f8cbb2e7a2208f0575dc704749721286519dcf35f6f/scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2", size = 11167837 }, + { url = "https://files.pythonhosted.org/packages/a4/f6/ff7beaeb644bcad72bcfd5a03ff36d32ee4e53a8b29a639f11bcb65d06cd/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f", size = 12253728 }, + { url = "https://files.pythonhosted.org/packages/29/7a/8bce8968883e9465de20be15542f4c7e221952441727c4dad24d534c6d99/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86", size = 13147700 }, + { url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52", size = 11110613 }, + { url = "https://files.pythonhosted.org/packages/2e/59/8eb1872ca87009bdcdb7f3cdc679ad557b992c12f4b61f9250659e592c63/scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322", size = 12010001 }, + { url = "https://files.pythonhosted.org/packages/9d/05/f2fc4effc5b32e525408524c982c468c29d22f828834f0625c5ef3d601be/scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1", size = 11096360 }, + { url = "https://files.pythonhosted.org/packages/c8/e4/4195d52cf4f113573fb8ebc44ed5a81bd511a92c0228889125fac2f4c3d1/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348", size = 12209004 }, + { url = "https://files.pythonhosted.org/packages/94/be/47e16cdd1e7fcf97d95b3cb08bde1abb13e627861af427a3651fcb80b517/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97", size = 13171776 }, + { url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb", size = 11071865 }, + { url = "https://files.pythonhosted.org/packages/12/ae/993b0fb24a356e71e9a894e42b8a9eec528d4c70217353a1cd7a48bc25d4/scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236", size = 11955804 }, + { url = "https://files.pythonhosted.org/packages/d6/54/32fa2ee591af44507eac86406fa6bba968d1eb22831494470d0a2e4a1eb1/scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35", size = 11100530 }, + { url = "https://files.pythonhosted.org/packages/3f/58/55856da1adec655bdce77b502e94a267bf40a8c0b89f8622837f89503b5a/scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691", size = 12433852 }, + { url = "https://files.pythonhosted.org/packages/ff/4f/c83853af13901a574f8f13b645467285a48940f185b690936bb700a50863/scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f", size = 11337256 }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735 }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284 }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958 }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454 }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199 }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455 }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140 }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549 }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184 }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256 }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540 }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115 }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884 }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018 }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716 }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342 }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869 }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851 }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011 }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407 }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030 }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709 }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062 }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132 }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503 }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097 }, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072 }, +] + +[[package]] +name = "sentence-transformers" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "pillow" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0+xpu", source = { registry = "https://download.pytorch.org/whl/xpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "tqdm" }, + { name = "transformers" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/84/b30d1b29ff58cfdff423e36a50efd622c8e31d7039b1a0d5e72066620da1/sentence_transformers-4.1.0.tar.gz", hash = "sha256:f125ffd1c727533e0eca5d4567de72f84728de8f7482834de442fd90c2c3d50b", size = 272420 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/2d/1151b371f28caae565ad384fdc38198f1165571870217aedda230b9d7497/sentence_transformers-4.1.0-py3-none-any.whl", hash = "sha256:382a7f6be1244a100ce40495fb7523dbe8d71b3c10b299f81e6b735092b3b8ca", size = 345695 }, +] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "soupsieve" +version = "2.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.41" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645 }, + { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399 }, + { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269 }, + { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364 }, + { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072 }, + { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074 }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514 }, + { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557 }, + { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491 }, + { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827 }, + { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224 }, + { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045 }, + { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357 }, + { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511 }, + { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420 }, + { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329 }, + { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224 }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + +[[package]] +name = "starlette" +version = "0.45.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507 }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353 }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, +] + +[[package]] +name = "tcmlib" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/6e/e9544e6ddb3640e92d9937689e9e33018503ddbc069eeb2e6a7581870591/tcmlib-1.2.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:dee9a0665ffa0a74f0ec72844ef7d82e9178ebf6980a76ac65906303d5ed4d03", size = 4160997 }, + { url = "https://files.pythonhosted.org/packages/5b/c8/c2a7bb169e21521a5bc82d955b30a064e266ab72485ac2dc33cd6ad153ea/tcmlib-1.2.0-py2.py3-none-win_amd64.whl", hash = "sha256:f751e005fd815ed0efeb87d4523f6a0938c5671e59ac935614f42d8ebb6489c9", size = 338379 }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 }, +] + +[[package]] +name = "text-summarizer-browser-plugin" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "fastapi", extra = ["standard"] }, + { name = "jupyter" }, + { name = "langchain" }, + { name = "langchain-chroma" }, + { name = "langchain-community" }, + { name = "langchain-huggingface" }, + { name = "optimum", extra = ["nncf", "openvino"] }, + { name = "pypdf" }, + { name = "pytorch-triton-xpu", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "sentence-transformers" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0+xpu", source = { registry = "https://download.pytorch.org/whl/xpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "torchvision", version = "0.22.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torchvision", version = "0.22.0+xpu", source = { registry = "https://download.pytorch.org/whl/xpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] + +[package.metadata] +requires-dist = [ + { name = "fastapi", extras = ["standard"], specifier = ">=0.115.9" }, + { name = "jupyter", specifier = ">=1.1.1" }, + { name = "langchain", specifier = ">=0.3.25" }, + { name = "langchain-chroma", specifier = ">=0.2.4" }, + { name = "langchain-community", specifier = ">=0.3.24" }, + { name = "langchain-huggingface", specifier = ">=0.2.0" }, + { name = "optimum", extras = ["nncf", "openvino"], specifier = ">=1.25.3" }, + { name = "pypdf", specifier = ">=5.5.0" }, + { name = "pytorch-triton-xpu", marker = "sys_platform == 'linux' or sys_platform == 'win32'", specifier = ">=3.3.0", index = "https://download.pytorch.org/whl/xpu" }, + { name = "sentence-transformers", specifier = ">=4.1.0" }, + { name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32'", specifier = ">=2.7.0" }, + { name = "torch", marker = "sys_platform == 'linux' or sys_platform == 'win32'", specifier = ">=2.7.0", index = "https://download.pytorch.org/whl/xpu" }, + { name = "torchvision", marker = "sys_platform != 'linux' and sys_platform != 'win32'", specifier = ">=0.22.0" }, + { name = "torchvision", marker = "sys_platform == 'linux' or sys_platform == 'win32'", specifier = ">=0.22.0", index = "https://download.pytorch.org/whl/xpu" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638 }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, +] + +[[package]] +name = "tokenizers" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/76/5ac0c97f1117b91b7eb7323dcd61af80d72f790b4df71249a7850c195f30/tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab", size = 343256 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/1f/328aee25f9115bf04262e8b4e5a2050b7b7cf44b59c74e982db7270c7f30/tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41", size = 2780767 }, + { url = "https://files.pythonhosted.org/packages/ae/1a/4526797f3719b0287853f12c5ad563a9be09d446c44ac784cdd7c50f76ab/tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3", size = 2650555 }, + { url = "https://files.pythonhosted.org/packages/4d/7a/a209b29f971a9fdc1da86f917fe4524564924db50d13f0724feed37b2a4d/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28da6b72d4fb14ee200a1bd386ff74ade8992d7f725f2bde2c495a9a98cf4d9f", size = 2937541 }, + { url = "https://files.pythonhosted.org/packages/3c/1e/b788b50ffc6191e0b1fc2b0d49df8cff16fe415302e5ceb89f619d12c5bc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34d8cfde551c9916cb92014e040806122295a6800914bab5865deb85623931cf", size = 2819058 }, + { url = "https://files.pythonhosted.org/packages/36/aa/3626dfa09a0ecc5b57a8c58eeaeb7dd7ca9a37ad9dd681edab5acd55764c/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaa852d23e125b73d283c98f007e06d4595732104b65402f46e8ef24b588d9f8", size = 3133278 }, + { url = "https://files.pythonhosted.org/packages/a4/4d/8fbc203838b3d26269f944a89459d94c858f5b3f9a9b6ee9728cdcf69161/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a21a15d5c8e603331b8a59548bbe113564136dc0f5ad8306dd5033459a226da0", size = 3144253 }, + { url = "https://files.pythonhosted.org/packages/d8/1b/2bd062adeb7c7511b847b32e356024980c0ffcf35f28947792c2d8ad2288/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fdbd4c067c60a0ac7eca14b6bd18a5bebace54eb757c706b47ea93204f7a37c", size = 3398225 }, + { url = "https://files.pythonhosted.org/packages/8a/63/38be071b0c8e06840bc6046991636bcb30c27f6bb1e670f4f4bc87cf49cc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd9a0061e403546f7377df940e866c3e678d7d4e9643d0461ea442b4f89e61a", size = 3038874 }, + { url = "https://files.pythonhosted.org/packages/ec/83/afa94193c09246417c23a3c75a8a0a96bf44ab5630a3015538d0c316dd4b/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db9484aeb2e200c43b915a1a0150ea885e35f357a5a8fabf7373af333dcc8dbf", size = 9014448 }, + { url = "https://files.pythonhosted.org/packages/ae/b3/0e1a37d4f84c0f014d43701c11eb8072704f6efe8d8fc2dcdb79c47d76de/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed248ab5279e601a30a4d67bdb897ecbe955a50f1e7bb62bd99f07dd11c2f5b6", size = 8937877 }, + { url = "https://files.pythonhosted.org/packages/ac/33/ff08f50e6d615eb180a4a328c65907feb6ded0b8f990ec923969759dc379/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:9ac78b12e541d4ce67b4dfd970e44c060a2147b9b2a21f509566d556a509c67d", size = 9186645 }, + { url = "https://files.pythonhosted.org/packages/5f/aa/8ae85f69a9f6012c6f8011c6f4aa1c96154c816e9eea2e1b758601157833/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5a69c1a4496b81a5ee5d2c1f3f7fbdf95e90a0196101b0ee89ed9956b8a168f", size = 9384380 }, + { url = "https://files.pythonhosted.org/packages/e8/5b/a5d98c89f747455e8b7a9504910c865d5e51da55e825a7ae641fb5ff0a58/tokenizers-0.21.1-cp39-abi3-win32.whl", hash = "sha256:1039a3a5734944e09de1d48761ade94e00d0fa760c0e0551151d4dd851ba63e3", size = 2239506 }, + { url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382", size = 2435481 }, +] + +[[package]] +name = "torch" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.12.4' and sys_platform != 'linux' and sys_platform != 'win32'", +] +dependencies = [ + { name = "filelock", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "fsspec", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "jinja2", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "networkx", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "setuptools", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "sympy", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "typing-extensions", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/8d/b2939e5254be932db1a34b2bd099070c509e8887e0c5a90c498a917e4032/torch-2.7.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:30b7688a87239a7de83f269333651d8e582afffce6f591fff08c046f7787296e", size = 68574294 }, + { url = "https://files.pythonhosted.org/packages/28/fd/74ba6fde80e2b9eef4237fe668ffae302c76f0e4221759949a632ca13afa/torch-2.7.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:edad98dddd82220465b106506bb91ee5ce32bd075cddbcf2b443dfaa2cbd83bf", size = 68856166 }, + { url = "https://files.pythonhosted.org/packages/90/48/7e6477cf40d48cc0a61fa0d41ee9582b9a316b12772fcac17bc1a40178e7/torch-2.7.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:27f5007bdf45f7bb7af7f11d1828d5c2487e030690afb3d89a651fd7036a390e", size = 68575074 }, +] + +[[package]] +name = "torch" +version = "2.7.0+xpu" +source = { registry = "https://download.pytorch.org/whl/xpu" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version < '3.12.4' and sys_platform == 'linux'", + "python_full_version < '3.12.4' and sys_platform == 'win32'", +] +dependencies = [ + { name = "filelock", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "fsspec", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "intel-cmplr-lib-rt", version = "2025.0.4", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" }, + { name = "intel-cmplr-lib-rt", version = "2025.0.5", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, + { name = "intel-cmplr-lib-ur", version = "2025.0.4", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" }, + { name = "intel-cmplr-lib-ur", version = "2025.0.5", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, + { name = "intel-cmplr-lic-rt", version = "2025.0.4", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" }, + { name = "intel-cmplr-lic-rt", version = "2025.0.5", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, + { name = "intel-pti", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "intel-sycl-rt", version = "2025.0.4", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" }, + { name = "intel-sycl-rt", version = "2025.0.5", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, + { name = "jinja2", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "networkx", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "pytorch-triton-xpu", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "setuptools", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "sympy", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "tcmlib", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "umf", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp312-cp312-linux_x86_64.whl", hash = "sha256:c806d44aa2ca5d225629f6fbc6c994d5deaac2d2cde449195bc8e3522ddd219a" }, + { url = "https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp312-cp312-win_amd64.whl", hash = "sha256:94739e665d9b4d5cd7af5f517cb6103f6f9fb421c095184609653a24524040f5" }, + { url = "https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp313-cp313-linux_x86_64.whl", hash = "sha256:25d8277b7f01d42e2e014ccbab57a2692b6ec4eff8dcf894eda1b297407cf97a" }, + { url = "https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp313-cp313-win_amd64.whl", hash = "sha256:31df3cb674918e89bc8c532baa331dc84f4430e1f9c0ec379232db44cba78355" }, + { url = "https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp313-cp313t-linux_x86_64.whl", hash = "sha256:f853aa4e926102a11a8522f415e53da39b7e431b7922835f62e8a71e33f7e7dd" }, + { url = "https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp313-cp313t-win_amd64.whl", hash = "sha256:cc286e5042fb0f628b2fdf79f570861e9340e6cc19f3e6a2ca27ce44e6fffbaf" }, +] + +[[package]] +name = "torchvision" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.12.4' and sys_platform != 'linux' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "pillow", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/ea/887d1d61cf4431a46280972de665f350af1898ce5006cd046326e5d0a2f2/torchvision-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31c3165418fe21c3d81fe3459e51077c2f948801b8933ed18169f54652796a0f", size = 1947826 }, + { url = "https://files.pythonhosted.org/packages/e1/2a/9b34685599dcb341d12fc2730055155623db7a619d2415a8d31f17050952/torchvision-0.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ece17995857dd328485c9c027c0b20ffc52db232e30c84ff6c95ab77201112c5", size = 1947823 }, + { url = "https://files.pythonhosted.org/packages/6f/a7/f43e9c8d13118b4ffbaebea664c9338ab20fa115a908125afd2238ff16e7/torchvision-0.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdc96daa4658b47ce9384154c86ed1e70cba9d972a19f5de6e33f8f94a626790", size = 2137621 }, +] + +[[package]] +name = "torchvision" +version = "0.22.0+xpu" +source = { registry = "https://download.pytorch.org/whl/xpu" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version < '3.12.4' and sys_platform == 'linux'", + "python_full_version < '3.12.4' and sys_platform == 'win32'", +] +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "pillow", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "torch", version = "2.7.0+xpu", source = { registry = "https://download.pytorch.org/whl/xpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp312-cp312-linux_x86_64.whl", hash = "sha256:b7686d566dd17f5304f52e4a8371c2d8cb7b80edc75e64ea55da82eb33cdef26" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c070dc5f1bb664c2d4a25175d21968ad01cabed26d82d1880a4642795ee958f0" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp312-cp312-win_amd64.whl", hash = "sha256:544264f62530b8d7564399ec2b72841045bfd872638646e764303b4e62a93516" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp313-cp313-linux_x86_64.whl", hash = "sha256:2b14385884e80c9d92bcdb3d91429157044548b38f1b4784f60065c3d93d0582" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:73121c18fbd45a1dee9e05a2cec98c067602862433846472ff69b379bccd0ed5" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp313-cp313-win_amd64.whl", hash = "sha256:ea3a5854452ab41961cf2e223ccc955b8f7018b6e92ef85ced9f923963c315b8" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp313-cp313t-linux_x86_64.whl", hash = "sha256:5df2f7bfc497cc0138e8b6996bff99e8fcd60f9571e7022be30f16ca54bae33b" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6d5aa0a6d19a860ab31d72874640ab5696d4792e82aa60b0bb19a43addf4fcdc" }, + { url = "https://download.pytorch.org/whl/xpu/torchvision-0.22.0%2Bxpu-cp313-cp313t-win_amd64.whl", hash = "sha256:31c075b44af2a1cb100b09c683a82521d9a057dc8874023800d8fcedc603dee1" }, +] + +[[package]] +name = "tornado" +version = "6.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948 }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112 }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672 }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019 }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252 }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930 }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351 }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328 }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396 }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840 }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596 }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + +[[package]] +name = "transformers" +version = "4.51.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/11/7414d5bc07690002ce4d7553602107bf969af85144bbd02830f9fb471236/transformers-4.51.3.tar.gz", hash = "sha256:e292fcab3990c6defe6328f0f7d2004283ca81a7a07b2de9a46d67fd81ea1409", size = 8941266 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/b6/5257d04ae327b44db31f15cce39e6020cc986333c715660b1315a9724d82/transformers-4.51.3-py3-none-any.whl", hash = "sha256:fd3279633ceb2b777013234bbf0b4f5c2d23c4626b05497691f00cfda55e8a83", size = 10383940 }, +] + +[[package]] +name = "typer" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317 }, +] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20250516" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/88/d65ed807393285204ab6e2801e5d11fbbea811adcaa979a2ed3b67a5ef41/types_python_dateutil-2.9.0.20250516.tar.gz", hash = "sha256:13e80d6c9c47df23ad773d54b2826bd52dbbb41be87c3f339381c1700ad21ee5", size = 13943 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/3f/b0e8db149896005adc938a1e7f371d6d7e9eca4053a29b108978ed15e0c2/types_python_dateutil-2.9.0.20250516-py3-none-any.whl", hash = "sha256:2b2b3f57f9c6a61fba26a9c0ffb9ea5681c9b83e69cd897c6b5f668d9c0cab93", size = 14356 }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, +] + +[[package]] +name = "umf" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tcmlib", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/19/cef361ce4c5c1079f90d35ed853996f94cef5e68bc29b8e7d11a28b0c53b/umf-0.9.1-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:2f7b8eb45e182b24823be420063799ea89b4f1cad6b9510b1fc6e04b809c7ec2", size = 161551 }, + { url = "https://files.pythonhosted.org/packages/56/2a/3ccea66d7390f3b6407b396ec289d5acad7f8f92a1bd8b66b58d376fc019/umf-0.9.1-py2.py3-none-win_amd64.whl", hash = "sha256:9d1336d63c7a6b36af1f76dab942a760168da519a1bfe6941fc6418198b10820", size = 72212 }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140 }, +] + +[[package]] +name = "urllib3" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, +] + +[[package]] +name = "uvicorn" +version = "0.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483 }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, +] + +[[package]] +name = "watchfiles" +version = "1.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511 }, + { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715 }, + { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138 }, + { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592 }, + { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865 }, + { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887 }, + { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498 }, + { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663 }, + { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410 }, + { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965 }, + { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693 }, + { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287 }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531 }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417 }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423 }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185 }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696 }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327 }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741 }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995 }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693 }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677 }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804 }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087 }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934 }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/53/2e0253c5efd69c9656b1843892052a31c36d37ad42812b5da45c62191f7e/widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af", size = 1097428 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503 }, +] + +[[package]] +name = "wrapt" +version = "1.17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/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", size = 89222 }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/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", size = 89174 }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/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", size = 109339 }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +] + +[[package]] +name = "xxhash" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969 }, + { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787 }, + { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959 }, + { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006 }, + { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326 }, + { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380 }, + { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934 }, + { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301 }, + { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351 }, + { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294 }, + { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674 }, + { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022 }, + { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170 }, + { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040 }, + { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796 }, + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795 }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792 }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950 }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980 }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324 }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370 }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911 }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352 }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410 }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322 }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725 }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070 }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172 }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041 }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801 }, +] + +[[package]] +name = "yarl" +version = "1.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089 }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706 }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719 }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972 }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639 }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745 }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178 }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219 }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266 }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873 }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524 }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370 }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297 }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771 }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355 }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904 }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030 }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894 }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457 }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070 }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739 }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338 }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636 }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061 }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150 }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207 }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277 }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990 }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684 }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599 }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573 }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051 }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742 }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575 }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121 }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815 }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231 }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221 }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400 }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714 }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279 }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044 }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236 }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034 }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058 }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792 }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242 }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816 }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093 }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124 }, +] + +[[package]] +name = "zipp" +version = "3.22.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/b6/7b3d16792fdf94f146bed92be90b4eb4563569eca91513c8609aebf0c167/zipp-3.22.0.tar.gz", hash = "sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5", size = 25257 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/da/f64669af4cae46f17b90798a827519ce3737d31dbafad65d391e49643dc4/zipp-3.22.0-py3-none-any.whl", hash = "sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343", size = 9796 }, +] + +[[package]] +name = "zstandard" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713 }, + { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459 }, + { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707 }, + { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545 }, + { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533 }, + { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510 }, + { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973 }, + { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968 }, + { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179 }, + { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577 }, + { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899 }, + { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964 }, + { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398 }, + { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313 }, + { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877 }, + { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595 }, + { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975 }, + { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448 }, + { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269 }, + { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228 }, + { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891 }, + { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310 }, + { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912 }, + { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946 }, + { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994 }, + { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681 }, + { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239 }, + { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149 }, + { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392 }, + { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299 }, + { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 }, + { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 }, +] From 1a1025d72e21b7dfc27429c20f6b5b00feff5df7 Mon Sep 17 00:00:00 2001 From: ankur-singh-intel Date: Thu, 5 Jun 2025 13:52:42 -0700 Subject: [PATCH 2/4] multiple small cosmetic changes - automatic device detection - index root for let the user the backend is health - cleaned up readme and notebook --- Text-Summarizer-Browser-Plugin/.gitignore | 4 -- Text-Summarizer-Browser-Plugin/README.md | 24 ++++--- .../TextSummarizerPlugin.ipynb | 62 ++++--------------- .../backend/llm_engine.py | 15 ++++- .../backend/server.py | 4 ++ .../requirements.txt | 9 --- 6 files changed, 46 insertions(+), 72 deletions(-) delete mode 100644 Text-Summarizer-Browser-Plugin/requirements.txt diff --git a/Text-Summarizer-Browser-Plugin/.gitignore b/Text-Summarizer-Browser-Plugin/.gitignore index 6e22444..f1fc8c5 100644 --- a/Text-Summarizer-Browser-Plugin/.gitignore +++ b/Text-Summarizer-Browser-Plugin/.gitignore @@ -61,10 +61,6 @@ local_settings.py db.sqlite3 db.sqlite3-journal -# Flask stuff: -instance/ -.webassets-cache - # Scrapy stuff: .scrapy diff --git a/Text-Summarizer-Browser-Plugin/README.md b/Text-Summarizer-Browser-Plugin/README.md index 819fb8b..8326406 100644 --- a/Text-Summarizer-Browser-Plugin/README.md +++ b/Text-Summarizer-Browser-Plugin/README.md @@ -87,6 +87,7 @@ Text-Summarizer-Browser-Plugin/ ``` 2. **Install dependencies:** ```sh + cd AI-PC_Notebooks/Text-Summarizer-Browser-Plugin/ uv sync # If you encounter issues: uv clean @@ -99,25 +100,31 @@ Text-Summarizer-Browser-Plugin/ uv huggingface-cli login ``` 2. **Export models to OpenVINO IR format:** + + > ⚠️ **Warning:** Exporting models can take a significant amount of time, potentially exceeding 10 minutes depending on your hardware and network conditions. + + > **Note:** Llama models require [access approval](https://www.llama.com/llama-downloads). + ```sh mkdir models cd models uv run optimum-cli export openvino --model meta-llama/Llama-2-7b-chat-hf --weight-format int4 ov_llama_2 uv run optimum-cli export openvino --model Qwen/Qwen2-7B-Instruct --weight-format int4 ov_qwen7b ``` - > **Note:** Llama models require [access approval](https://www.llama.com/llama-downloads). ### Running the Backend - **Via Jupyter Notebook:** - 1. Launch Jupyter Lab: - ```sh - uv run jupyter lab - ``` - 2. Open `TextSummarizerPlugin.ipynb` and run all cells. + + Launch Jupyter Lab + ```sh + uv run jupyter lab + ``` + Next, open `TextSummarizerPlugin.ipynb` and run all cells. - **Via Terminal:** - 1. Start the FastAPI server: + + Start the FastAPI server: ```sh cd backend uv run fastapi dev server.py --port 5000 @@ -128,9 +135,10 @@ Text-Summarizer-Browser-Plugin/ 1. Open Chrome and navigate to `chrome://extensions`. 2. Enable **Developer Mode**. 3. Click **Load unpacked** and select the `extension` directory. -![Loading the Chrome Extension](assets/load_extension.png) 4. Pin the extension for quick access. +![Loading the Chrome Extension](assets/load_extension.png) + --- ## Usage diff --git a/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb b/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb index 69b587a..6c30b09 100644 --- a/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb +++ b/Text-Summarizer-Browser-Plugin/TextSummarizerPlugin.ipynb @@ -15,7 +15,7 @@ "source": [ "## Introduction\n", "\n", - "Chrome extension seamlessly integrates with Flask and leverages an OpenVINO backend for fast and efficient summarization of webpages (via URL) and PDFs (via upload). Powered by LangChain tools, it handles advanced tasks like text splitting and vectorstore management to deliver accurate and meaningful summaries." + "Chrome extension seamlessly integrates with FastAPI and leverages an OpenVINO backend for fast and efficient summarization of webpages (via URL) and PDFs (via upload). Powered by LangChain tools, it handles advanced tasks like text splitting and vectorstore management to deliver accurate and meaningful summaries." ] }, { @@ -39,73 +39,35 @@ "\n", "- **Login to Hugging Face (HF):** Ensure you are logged in to your Hugging Face account to access required models.\n", "- **Convert Model to OpenVINO:** Follow the steps to convert your selected model to OpenVINO IR format as described in the documentation.\n", - "- **Install the Browser Plugin:** Install the browser extension to enable summarization features directly from your browser." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "4b2ed7c2-e406-4423-b7a6-0a377bb2a4b5", - "metadata": {}, - "source": [ - "### Load the extension\n", - "\n", - "To load an unpacked extension in developer mode:\n", - "- Go to the Extensions page by entering **chrome://extensions** in a new tab. (By design chrome:// URLs are not linkable.)\n", - " - Alternatively, **click the Extensions menu puzzle button and select Manage Extensions** at the bottom of the menu.\n", - " - Or, click the Chrome menu, hover over More Tools, then select Extensions.\n", - "- Enable **Developer Mode** by clicking the toggle switch next to Developer mode.\n", - "- Click the **Load unpacked** button and select the extension directory.\n", - "- Refer to [Chrome’s development documentation](https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world#load-unpacked) for further details.\n", - "\n", - "\n", "\n", - "\n", - "\n", - "\n", - "\n" + "> **Note:** Do not proceed to the next steps until you have completed all the prerequisites above." ] }, { "cell_type": "markdown", - "id": "5e4c9750-8fcc-474b-87c5-ba28448b632d", + "id": "0d060a9e-0355-41e5-a33c-c8baf35d7481", "metadata": {}, "source": [ - "### Pin the extension\n", - "Pin your extension to the toolbar to quickly access your extension.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "1191f358-ebcb-4ca9-b0a5-c80f96ac93fd", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, - "source": [ - "### Code Sample Structure\n", - "Browser plugin code has two parts, one is backend folder & the other is extension folder.\n", - "- **Backend** - In the backend folder, we have two python files `code.py` and `server.py`\n", - " - `code.py` manages data pre-processing tasks\n", - " - `server.py` manages flask server-side operations\n", - "- **Extension** - In the extension we have the front end code required for the browser plugin (popup.html, popup.js, style.css, manifest.json)\n" + "## Backend code for Text Summarization " ] }, { "cell_type": "markdown", - "id": "0d060a9e-0355-41e5-a33c-c8baf35d7481", + "id": "de840a1b-5913-455c-bb2e-fe90f4ebb545", "metadata": {}, "source": [ - "## Backend code for Text Summarization " + "### Importing the necessary libraries" ] }, { - "cell_type": "markdown", - "id": "de840a1b-5913-455c-bb2e-fe90f4ebb545", + "cell_type": "code", + "execution_count": null, + "id": "d037ace9", "metadata": {}, + "outputs": [], "source": [ - "### Importing the necessary libraries" + "import os\n", + "os.environ['USER_AGENT'] = \"SummarizeBot\"" ] }, { diff --git a/Text-Summarizer-Browser-Plugin/backend/llm_engine.py b/Text-Summarizer-Browser-Plugin/backend/llm_engine.py index ffbe97f..ea061a3 100644 --- a/Text-Summarizer-Browser-Plugin/backend/llm_engine.py +++ b/Text-Summarizer-Browser-Plugin/backend/llm_engine.py @@ -1,3 +1,7 @@ +import os +os.environ['USER_AGENT'] = "SummarizeBot" + +import openvino as ov from transformers import AutoTokenizer, pipeline from optimum.intel import OVModelForCausalLM from langchain_chroma import Chroma @@ -7,6 +11,14 @@ from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter +def get_device(): + core = ov.Core() + available_devices = core.available_devices + for device in available_devices: + if device.startswith("GPU"): + return device + return "CPU" # Fallback to CPU if no GPU is available + class TextSummarizerEngine: """ @@ -56,7 +68,8 @@ def load_model(self, model_id): raise ValueError(f"Unsupported model ID: {model_id}") # Load the model with OpenVINO optimization - model = OVModelForCausalLM.from_pretrained(self.model_path) + device = get_device() + model = OVModelForCausalLM.from_pretrained(self.model_path, device=device) self.tokenizer = AutoTokenizer.from_pretrained(self.model_path) # Create a text generation pipeline diff --git a/Text-Summarizer-Browser-Plugin/backend/server.py b/Text-Summarizer-Browser-Plugin/backend/server.py index c2b5f00..15cbdbe 100644 --- a/Text-Summarizer-Browser-Plugin/backend/server.py +++ b/Text-Summarizer-Browser-Plugin/backend/server.py @@ -44,6 +44,10 @@ async def get_engine(): raise HTTPException(status_code=500, detail="Engine not initialized") return engine_instance +@app.get("/") +async def root(): + return {"message": "The backend server is running. Please use the browser plugin to interact with it."} + @app.post("/select-model") async def select_model( diff --git a/Text-Summarizer-Browser-Plugin/requirements.txt b/Text-Summarizer-Browser-Plugin/requirements.txt deleted file mode 100644 index e9eb2da..0000000 --- a/Text-Summarizer-Browser-Plugin/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -flask==3.1.1 -flask_cors==6.0.0 -langchain==0.3.25 -langchain-community==0.3.24 -sentence-transformers==4.1.0 -langchain_chroma==0.2.4 -pypdf==5.6.0 -optimum[openvino,nncf] -ipykernel==6.29.5 From bfcf870c0957e2d9527c2b196a277c6e560f29d5 Mon Sep 17 00:00:00 2001 From: ankur-singh-intel Date: Mon, 9 Jun 2025 10:49:23 -0700 Subject: [PATCH 3/4] fix autopep8 errors --- .../backend/llm_engine.py | 76 +++++++++---------- .../backend/server.py | 34 +++++---- 2 files changed, 59 insertions(+), 51 deletions(-) diff --git a/Text-Summarizer-Browser-Plugin/backend/llm_engine.py b/Text-Summarizer-Browser-Plugin/backend/llm_engine.py index ea061a3..5c29e10 100644 --- a/Text-Summarizer-Browser-Plugin/backend/llm_engine.py +++ b/Text-Summarizer-Browser-Plugin/backend/llm_engine.py @@ -1,15 +1,15 @@ +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader +from langchain_huggingface import HuggingFaceEmbeddings, HuggingFacePipeline +from langchain.prompts import PromptTemplate +from langchain.chains import RetrievalQA +from langchain_chroma import Chroma +from optimum.intel import OVModelForCausalLM +from transformers import AutoTokenizer, pipeline +import openvino as ov import os os.environ['USER_AGENT'] = "SummarizeBot" -import openvino as ov -from transformers import AutoTokenizer, pipeline -from optimum.intel import OVModelForCausalLM -from langchain_chroma import Chroma -from langchain.chains import RetrievalQA -from langchain.prompts import PromptTemplate -from langchain_huggingface import HuggingFaceEmbeddings, HuggingFacePipeline -from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader -from langchain_text_splitters import RecursiveCharacterTextSplitter def get_device(): core = ov.Core() @@ -23,11 +23,11 @@ def get_device(): class TextSummarizerEngine: """ A class for managing text summarization and Q&A operations using LLMs and vector stores. - + This class encapsulates the functionality for loading LLMs, processing documents, and generating summaries and answers for both web content and PDFs. """ - + # Prompt Templates for Summarization & QA Bot SUMMARY_TEMPLATE = """Write a concise summary of the following: "{context}" CONCISE SUMMARY: """ QUERY_TEMPLATE = """Use the following pieces of context to answer the question at the end. @@ -37,41 +37,41 @@ class TextSummarizerEngine: {context} Question: {question} Helpful Answer:""" - + # Embedding model name EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" - + def __init__(self): """Initialize the TextSummarizerEngine with empty attributes.""" self.model_id = None self.model_path = None self.llm = None self.tokenizer = None - + # Vector store for document processing self.vectorstore = None - + # Initialize embeddings self.embeddings = HuggingFaceEmbeddings(model_name=self.EMBEDDING_MODEL) - + def load_model(self, model_id): """ Load and initialize the specified LLM model using OpenVINO optimization. """ self.model_id = model_id - + if model_id == "Meta LLama 2": self.model_path = "../models/ov_llama_2" elif model_id == "Qwen 7B Instruct": self.model_path = "../models/ov_qwen7b" else: raise ValueError(f"Unsupported model ID: {model_id}") - + # Load the model with OpenVINO optimization device = get_device() model = OVModelForCausalLM.from_pretrained(self.model_path, device=device) self.tokenizer = AutoTokenizer.from_pretrained(self.model_path) - + # Create a text generation pipeline pipe = pipeline( "text-generation", @@ -80,10 +80,10 @@ def load_model(self, model_id): max_new_tokens=4096, device=model.device, ) - + # Create a LangChain compatible model self.llm = HuggingFacePipeline(pipeline=pipe) - + def _process_document(self, loader): """ Process document content from a loader and create a vector store. @@ -94,36 +94,36 @@ def _process_document(self, loader): chunk_size=1000, chunk_overlap=20 ) all_splits = text_splitter.split_documents(page_data) - + # Create and return a vector store from the document chunks vectorstore = Chroma.from_documents( - documents=all_splits, + documents=all_splits, embedding=self.embeddings ) return vectorstore - + async def process_document(self, source, is_url=True): """ Process a document (URL or PDF) to generate a summary of its content. """ if not self.llm: raise ValueError("Model not loaded. Call load_model first.") - + # Create the appropriate loader based on the document type if is_url: loader = WebBaseLoader(source) else: loader = PyPDFLoader(source, extract_images=False) - + # Process the document content self.vectorstore = self._process_document(loader) - + # Create a prompt for summarization prompt = PromptTemplate( - template=self.SUMMARY_TEMPLATE, + template=self.SUMMARY_TEMPLATE, input_variables=["context"] ) - + # Create a retrieval QA chain qa_chain = RetrievalQA.from_chain_type( llm=self.llm, @@ -132,7 +132,7 @@ async def process_document(self, source, is_url=True): chain_type_kwargs={"prompt": prompt}, return_source_documents=False, ) - + # Generate a summary question = "Please summarize the entire content in one paragraph of 100 words" summary = qa_chain.invoke(question)["result"] @@ -142,20 +142,20 @@ async def process_document(self, source, is_url=True): else: summary = "No summary found." return summary - + async def answer_question(self, query): """ Answer a question about previously processed document content. """ if not self.llm or not self.vectorstore: raise ValueError("Document content not processed or model not loaded.") - + # Create a prompt for Q&A prompt = PromptTemplate( - template=self.QUERY_TEMPLATE, + template=self.QUERY_TEMPLATE, input_variables=["context", "question"] ) - + # Create a retrieval QA chain reduce_chain = RetrievalQA.from_chain_type( llm=self.llm, @@ -164,7 +164,7 @@ async def answer_question(self, query): chain_type_kwargs={"prompt": prompt}, return_source_documents=False, ) - + # Generate an answer response = reduce_chain.invoke({"query": query})['result'] start_idx = response.find("Helpful Answer:") @@ -173,7 +173,7 @@ async def answer_question(self, query): else: response = "No answer found." return response - + def cleanup(self): """Clean up resources when done.""" if self.vectorstore: @@ -182,12 +182,12 @@ def cleanup(self): except Exception: print("Failed to delete vector store collection") + if __name__ == "__main__": # Example usage engine = TextSummarizerEngine() engine.load_model("Qwen 7B Instruct") - + # Process a document (URL or PDF) engine.process_document("https://example.com/document", is_url=True) engine.cleanup() - \ No newline at end of file diff --git a/Text-Summarizer-Browser-Plugin/backend/server.py b/Text-Summarizer-Browser-Plugin/backend/server.py index 15cbdbe..7577f14 100644 --- a/Text-Summarizer-Browser-Plugin/backend/server.py +++ b/Text-Summarizer-Browser-Plugin/backend/server.py @@ -11,12 +11,15 @@ # Suppress warnings warnings.filterwarnings("ignore") + class ModelSelectionRequest(BaseModel): model_id: Literal["Meta LLama 2", "Qwen 7B Instruct"] + class UrlRequest(BaseModel): url: HttpUrl + # Create FastAPI app instance app = FastAPI() app.add_middleware( @@ -30,6 +33,8 @@ class UrlRequest(BaseModel): engine_instance = None # Startup event to initialize the engine + + @app.on_event("startup") async def startup_event(): """Initialize the TextSummarizerEngine when the application starts""" @@ -38,12 +43,15 @@ async def startup_event(): print("TextSummarizerEngine initialized on startup") # Dependency to get the engine + + async def get_engine(): """Dependency to provide the engine to routes that need it""" if engine_instance is None: raise HTTPException(status_code=500, detail="Engine not initialized") return engine_instance + @app.get("/") async def root(): return {"message": "The backend server is running. Please use the browser plugin to interact with it."} @@ -51,7 +59,7 @@ async def root(): @app.post("/select-model") async def select_model( - req: ModelSelectionRequest, + req: ModelSelectionRequest, engine: TextSummarizerEngine = Depends(get_engine) ): """ @@ -62,7 +70,6 @@ async def select_model( return {"message": f"Model {req.model_id} loaded successfully."} - # Add a cleanup event to free resources when the server shuts down @app.on_event("shutdown") async def shutdown_event(): @@ -84,11 +91,11 @@ async def process_url( url = str(url_req.url) if not url: return JSONResponse(content={"message": "No URL provided"}, status_code=400) - + # Make sure the model is loaded if engine.llm is None: return JSONResponse(content={"message": "Model not loaded. Please select a model first."}, status_code=400) - + # Process the URL and return summary summary = await engine.process_document(url, is_url=True) return JSONResponse(content={"message": summary}, status_code=200) @@ -99,7 +106,7 @@ async def process_url( @app.post("/upload-pdf") async def upload_pdf( - pdf_file: UploadFile = File(...), + pdf_file: UploadFile = File(...), engine: TextSummarizerEngine = Depends(get_engine) ): """ @@ -117,10 +124,10 @@ async def upload_pdf( # Make sure the model is loaded if engine.llm is None: return JSONResponse(content={"message": "Model not loaded. Please select a model first."}, status_code=400) - + # Process the PDF and return summary summary = await engine.process_document(temp_pdf_path, is_url=False) - return JSONResponse(content={"message": summary}, status_code=200) + return JSONResponse(content={"message": summary}, status_code=200) except Exception as e: return JSONResponse(content={"message": f"Error processing PDF: {str(e)}"}, status_code=500) @@ -128,6 +135,7 @@ async def upload_pdf( else: return JSONResponse(content={"message": "Invalid file type. Please upload a PDF."}, status_code=400) + @app.post("/query") async def query( query: str, @@ -136,14 +144,14 @@ async def query( try: if not query: return JSONResponse(content={"message": "No query provided"}, status_code=400) - + # Make sure the model and vectorstore are ready if engine.llm is None or engine.vectorstore is None: return JSONResponse( - content={"message": "No document processed yet or model not loaded"}, + content={"message": "No document processed yet or model not loaded"}, status_code=400 ) - + # Get answer to the query response_message = await engine.answer_question(query) return {"message": response_message} @@ -155,13 +163,13 @@ async def query( print(""" 🎉 FastAPI server is Ready! 🎉 Your application is now live and waiting for interaction! - + **🚀 Essential Step: Activate Your Browser Plugin!** - + - This application operates through its dedicated browser extension. - To begin, please open your web browser and locate the plugin's icon, which looks like `T`, in your toolbar (it's often in the top-right corner). - Click on the `T` icon to access the browser extension - + **Having trouble?** - Is the plugin loaded? If you haven't already, please load it by following the Readme.md file. - Is it enabled? Double-check your browser's extension settings to ensure the plugin isn't disabled. From 1e23c885879ebfa509b23213252fec8a607bd61d Mon Sep 17 00:00:00 2001 From: ankur-singh-intel Date: Tue, 10 Jun 2025 22:36:54 -0700 Subject: [PATCH 4/4] Update Text-Summarizer-Browser-Plugin/backend/server.py Co-authored-by: Laxmikant --- Text-Summarizer-Browser-Plugin/backend/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Text-Summarizer-Browser-Plugin/backend/server.py b/Text-Summarizer-Browser-Plugin/backend/server.py index 7577f14..bab2f29 100644 --- a/Text-Summarizer-Browser-Plugin/backend/server.py +++ b/Text-Summarizer-Browser-Plugin/backend/server.py @@ -175,4 +175,4 @@ async def query( - Is it enabled? Double-check your browser's extension settings to ensure the plugin isn't disabled. - Have you pinned the extension? Pin the extension. """) - uvicorn.run(app, host="0.0.0.0", port=5000) + uvicorn.run(app, host="127.0.0.1", port=5000)