diff --git a/.github/workflows/devin-review.yml b/.github/workflows/devin-review.yml new file mode 100644 index 0000000..ea1410b --- /dev/null +++ b/.github/workflows/devin-review.yml @@ -0,0 +1,29 @@ +name: Devin Review + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + devin-review: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Run Devin Review + # Use script to emulate a TTY as devin-review requires terminal features + # The -q flag suppresses script output, -e exits with command exit code, + # and -c runs the command. /dev/null discards script's own output. + env: + CI: true # Ensures the tool runs in non-interactive CI mode + run: | + script -q -e -c "npx devin-review ${{ github.event.pull_request.html_url }}" /dev/null diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a63397c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,94 @@ +name: Release + +on: + push: + tags: + - "v*" # Publish on any tag starting with v, e.g., v0.1.0 + workflow_dispatch: + +jobs: + build: + name: Build distributions + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 # Required for hatch-vcs + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + enable-cache: true + + # Build frontend + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: frontend/package-lock.json + + - name: Build frontend + run: | + cd frontend + npm ci + npm run build + rm -rf ../src/hyperview/server/static + mkdir -p ../src/hyperview/server/static + cp -r out/* ../src/hyperview/server/static/ + + # Build Python package (includes frontend assets) + - name: Build + run: uv build --no-sources + + # Smoke test: verify the built package can be imported + - name: Smoke test (wheel) + run: | + uv run --isolated --no-project --with dist/*.whl \ + python -c "import hyperview; print(f'hyperview {hyperview.__version__}')" + + - name: Smoke test (sdist) + run: | + uv run --isolated --no-project --with dist/*.tar.gz \ + python -c "import hyperview; print(f'hyperview {hyperview.__version__}')" + + - name: Upload dist artifacts + uses: actions/upload-artifact@v5 + with: + name: python-package-distributions + path: dist/ + if-no-files-found: error + + pypi: + name: Publish to PyPI + needs: build + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/hyperview + permissions: + id-token: write + contents: read + steps: + - name: Download dist artifacts + uses: actions/download-artifact@v6 + with: + name: python-package-distributions + path: dist/ + + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + enable-cache: true + + - name: Publish to PyPI + run: uv publish diff --git a/.gitignore b/.gitignore index d7ded76..195707d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ __pycache__/ env/ venv/ .venv/ +/uv.lock *.egg-info/ .pytest_cache/ .coverage @@ -21,11 +22,6 @@ htmlcov/ # VS Code .vscode/ -# Local Context (Agent files) -.claude/ -CLAUDE.md -context/ - # Generated assets assets/demo_animation_frames/ *.gif @@ -35,6 +31,9 @@ frontend/node_modules/ frontend/.next/ frontend/out/ +# Bundled frontend in Python package (built in CI during release) +src/hyperview/server/static/ + # Python package build dist/ build/ @@ -43,3 +42,45 @@ build/ # Data cache *.hf/ .cache/ + +# external repo (https://github.com/Hyper3Labs/hyper-scatter) +hyper-scatter/ + +# nohup +nohup.out +frontend/nohup.out + +# Local logs / tool artifacts +.hyperview-*.log +.hyperview-*.pid +.playwright-mcp/ +frontend/tsconfig.tsbuildinfo + +# Hyperbolic model zoo (kept as a separate repo) +hyper_model_zoo/ +hyper_models/ +scripts_ignored/ + +# AI Context (Agent files) +.claude/ +context/ +CLAUDE.md +TASKS.md +TESTS.md +AGENTS.md +**/AGENTS.md +.github/agents/ +.github/instructions/ +.github/hooks/ +.github/skills/ +.agents/ +.specstory/ + +# Generated version file (hatch-vcs) +src/hyperview/_version.py + +# Local workspace overlays (not part of upstream HyperView fork) +cosmos-curate/ +PLAN.md +TASK.md +submission/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c50efae --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,108 @@ +# Contributing to HyperView + +We welcome contributions! This guide will help you set up your development environment and submit high-quality pull requests. + +## Development Setup + +### Requirements +- **Python 3.10+** +- **uv** (Package manager) +- **Node.js** (For frontend development) + +### One-time Setup +Clone the repo and install dependencies: + +```bash +git clone https://github.com/Hyper3Labs/HyperView.git +cd HyperView + +# Create virtual environment and install dev dependencies +uv venv .venv +source .venv/bin/activate +uv pip install -e ".[dev]" + +# Install frontend dependencies +cd frontend +npm install +cd .. +``` + +### Optional: Co-develop `hyper-models` locally (uv workspace) + +By default, HyperView installs `hyper-models` from PyPI. + +If you want to develop HyperView and `hyper-models` side-by-side (without publishing `hyper-models`), you can tell **uv** to use a local checkout instead: + +1) Clone `hyper-models` next to the HyperView repo (as a sibling directory): + +```bash +cd .. +git clone https://github.com/Hyper3Labs/hyper-models +cd HyperView +``` + +2) Add the following to HyperView's `pyproject.toml` (keep this change local unless the maintainers decide otherwise): + +```toml +[tool.uv.workspace] +members = ["../hyper-models"] + +[tool.uv.sources] +hyper-models = { workspace = true } +``` + +3) Use uv's project commands (`uv run ...`, `uv sync`, etc.) so `tool.uv.sources` is respected. + +## Running Locally + +For the best development experience, run the backend and frontend in separate terminals. + +### 1. Start the Backend +Runs the Python API server at `http://127.0.0.1:6262`. + +```bash +uv run hyperview demo --samples 200 --no-browser +``` + +_Tip: Use `HF_DATASETS_OFFLINE=1` if you have cached datasets and want to work offline._ + +### 2. Start the Frontend +Runs the Next.js dev server at `http://127.0.0.1:3000` with hot reloading. + +```bash +cd frontend +npm run dev +``` + +The frontend automatically proxies API requests (`/api/*`) to the backend. + +## Common Tasks + +### Testing & Linting +Please ensure all checks pass before submitting a PR. + +```bash +# Python +uv run pytest # Run unit tests +uv run ruff format . # formatting +uv run ruff check . --fix # Linting + +# Frontend +cd frontend +npm run lint +``` + +### Exporting the Frontend +The Python package bundles the compiled frontend. If you modify the frontend, you must regenerate the static assets so they can be served by the Python backend in production/demos. + +```bash +bash scripts/export_frontend.sh +``` +_This compiles the frontend and places artifacts into `src/hyperview/server/static/`. Do not edit files in that directory manually._ + +## Pull Request Guidelines + +1. **Scope**: Keep changes focused. Open an issue first for major refactors or new features. +2. **Tests**: Add tests for new logic where practical. +3. **Visuals**: If changing the UI, please attach a screenshot or GIF to your PR. +4. **Format**: Ensure code is formatted with `ruff` (Python) and `prettier` (JS/TS implicit in `npm run lint`). diff --git a/README.md b/README.md index b9b6f17..aa253c3 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ # HyperView -> **Open-source dataset curation with hyperbolic embeddings visualization - a FiftyOne alternative.** +> **Open-source dataset curation + embedding visualization (Euclidean + Poincaré disk)** -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Hyper3Labs/HyperView) [![Open in HF Spaces](https://huggingface.co/datasets/huggingface/badges/resolve/main/open-in-hf-spaces-sm.svg)](https://huggingface.co/spaces/hyper3labs/HyperView) [![Discord](https://img.shields.io/badge/Discord-hyper%C2%B3labs-5865F2?logo=discord&logoColor=white)](https://discord.gg/Az7k4Ure)

- - HyperView Screenshot + + HyperView Screenshot
- Watch the Demo Video + Try the live demo on HuggingFace Spaces

--- @@ -17,23 +17,24 @@ ## Features - **Dual-Panel UI**: Image grid + scatter plot with bidirectional selection -- **Euclidean/Hyperbolic Toggle**: Switch between standard 2D UMAP and Poincaré disk visualization +- **Euclidean/Poincaré Toggle**: Switch between standard 2D UMAP and Poincaré disk visualization - **HuggingFace Integration**: Load datasets directly from HuggingFace Hub - **Fast Embeddings**: Uses EmbedAnything for CLIP-based image embeddings -- **FiftyOne-like API**: Familiar workflow for dataset exploration + +## Updates + +- **01-02-26** — [The Geometry of Image Embeddings, Hands-on Coding Workshop](https://www.meetup.com/berlin-computer-vision-group/events/312927919/) (Berlin Computer Vision Group) +- **17-01-26** — [The Geometry of Image Embeddings, Hands-on Coding Workshop, Part I](https://www.meetup.com/berlin-computer-vision-group/events/312636174/) (Berlin Computer Vision Group) +- **11-12-25** — [Hacker Room Demo Day #2](https://youtu.be/KnOiaNXN3Q0?t=2483) (Merantix AI Campus Berlin) — First version of HyperView presented ## Quick Start +**Docs:** [docs/datasets.md](docs/datasets.md) · [docs/colab.md](docs/colab.md) · [CONTRIBUTING.md](CONTRIBUTING.md) · [TESTS.md](TESTS.md) + ### Installation ```bash -git clone https://github.com/HackerRoomAI/HyperView.git -cd HyperView - -# Install with uv -uv venv .venv -source .venv/bin/activate -uv pip install -e . +uv pip install hyperview ``` ### Run the Demo @@ -45,8 +46,8 @@ hyperview demo --samples 500 This will: 1. Load 500 samples from CIFAR-100 2. Compute CLIP embeddings -3. Generate Euclidean and Hyperbolic visualizations -4. Start the server at **http://127.0.0.1:5151** +3. Generate Euclidean and Poincaré visualizations +4. Start the server at **http://127.0.0.1:6263** ### Python API @@ -67,107 +68,39 @@ dataset.add_from_huggingface( # dataset.add_images_dir("/path/to/images", label_from_folder=True) # Compute embeddings and visualization -dataset.compute_embeddings() +dataset.compute_embeddings(model="openai/clip-vit-base-patch32") dataset.compute_visualization() # Launch the UI -hv.launch(dataset) # Opens http://127.0.0.1:5151 +hv.launch(dataset, port=6263) # Opens http://127.0.0.1:6263 ``` -### Save and Load Datasets +### Google Colab -```python -# Save dataset with embeddings -dataset.save("my_dataset.json") - -# Load later -dataset = hv.Dataset.load("my_dataset.json") -hv.launch(dataset) -``` +See [docs/colab.md](docs/colab.md) for a fast Colab smoke test and notebook-friendly launch behavior. ## Why Hyperbolic? -Traditional Euclidean embeddings struggle with hierarchical data. In Euclidean space, volume grows polynomially ($r^d$), causing **Representation Collapse** where minority classes get crushed together. - -**Hyperbolic space** (Poincaré disk) has exponential volume growth ($e^r$), naturally preserving hierarchical structure and keeping rare classes distinct. - -

- Euclidean vs Hyperbolic -

- -## Architecture - -``` -hyperview/ -├── src/hyperview/ -│ ├── core/ # Dataset, Sample classes -│ ├── embeddings/ # EmbedAnything + UMAP + Poincaré projection -│ └── server/ # FastAPI + static frontend -├── frontend/ # React/Next.js (compiled to static) -└── scripts/ - └── demo.py # Demo script -``` +Traditional Euclidean embeddings struggle with hierarchical data. In Euclidean space, volume grows polynomially ($r^d$), causing **[Representation Collapse](https://hyper3labs.github.io/collapse)** where minority classes get crushed together. -**Tech Stack:** -- **Backend**: Python, FastAPI, EmbedAnything, UMAP -- **Frontend**: Next.js 16, React 18, regl-scatterplot, Zustand, Tailwind CSS -- **Package Manager**: uv +**[Hyperbolic space](https://hyper3labs.github.io/warp)** (Poincaré disk) has exponential volume growth ($e^r$), naturally preserving hierarchical structure and keeping rare classes distinct. -## Development +**[Try the live demo on HuggingFace Spaces→](https://huggingface.co/spaces/hyper3labs/HyperView)** -### Frontend Development (with Hot Reloading) +## Community -For the best development experience, run the backend and frontend separately: - -**Terminal 1 - Start the Python backend:** -```bash -# Activate your virtual environment first -source .venv/bin/activate - -# Run the demo script in no-browser mode -python scripts/demo.py --samples 200 --no-browser -``` -This runs the API on **http://127.0.0.1:5151** - -**Terminal 2 - Start the frontend dev server:** -```bash -cd frontend -npm install # First time only -npm run dev -``` -This runs the frontend on **http://localhost:3000** with hot reloading. - -Open **http://localhost:3000** in your browser. The frontend automatically proxies `/api/*` requests to the backend at port 5151 (configured in `next.config.ts`). - -Now you can: -- Edit React components and see changes instantly -- Edit Python backend and restart Terminal 1 -- No need to rebuild/export the frontend during development - -### Export Frontend for Production - -When you're ready to bundle the frontend into the Python package: - -```bash -./scripts/export_frontend.sh -``` +**Weekly Open Discussion** — Every Tuesday at 15:00 UTC on [Discord](https://discord.gg/Az7k4Ure?event=1469730571440885944) -This compiles the frontend and copies it to `src/hyperview/server/static/`. After this, `hv.launch()` serves the bundled frontend directly from the Python server. +Join us to see the latest features demoed live, walk through new code, and get help with local setup. Whether you're a core maintainer or looking for your first contribution, everyone is welcome. -## API Endpoints +## Contributing -| Endpoint | Description | -|----------|-------------| -| `GET /api/dataset` | Dataset metadata (name, labels, colors) | -| `GET /api/samples` | Paginated samples with thumbnails | -| `GET /api/embeddings` | 2D coordinates (Euclidean + Hyperbolic) | -| `POST /api/selection` | Sync selection state | +Development setup, frontend hot-reload, and backend API notes live in [CONTRIBUTING.md](CONTRIBUTING.md). -## References +## Related projects -- [Poincaré Embeddings for Learning Hierarchical Representations](https://arxiv.org/abs/1705.08039) (Nickel & Kiela, 2017) -- [Hyperbolic Neural Networks](https://arxiv.org/abs/1805.09112) (Ganea et al., 2018) -- [FiftyOne](https://github.com/voxel51/fiftyone) - Inspiration for the UI/API design +- **hyper-scatter**: High-performance WebGL scatterplot engine (Euclidean + Poincaré) used by the frontend: https://github.com/Hyper3Labs/hyper-scatter +- **hyper-models**: Non-Euclidean model zoo + ONNX exports : https://github.com/Hyper3Labs/hyper-models ## License diff --git a/assets/screenshot.png b/assets/screenshot.png index 6e9b00b..d3f3b43 100644 Binary files a/assets/screenshot.png and b/assets/screenshot.png differ diff --git a/docs/colab.md b/docs/colab.md new file mode 100644 index 0000000..eef4e27 --- /dev/null +++ b/docs/colab.md @@ -0,0 +1,37 @@ +# Running HyperView in Google Colab + +HyperView works natively in Google Colab. Because Colab runs on a remote VM, you cannot access `localhost` directly. HyperView handles this automatically. + +## Usage + +### 1. Install HyperView + +```bash +!pip install -q git+https://github.com/Hyper3Labs/HyperView.git +``` + +### 2. Launch the visualizer + +When you run `hv.launch()`, a button labeled **“Open HyperView in a new tab”** will appear in the output. Click it to open the visualization. + +```python +# Minimal example +import numpy as np +import hyperview as hv +from hyperview.core.sample import SampleFromArray + +dataset = hv.Dataset("colab_smoke", persist=False) + +rng = np.random.default_rng(0) +for i in range(200): + img = (rng.random((64, 64, 3)) * 255).astype(np.uint8) + sample = SampleFromArray.from_array(id=f"s{i}", image_array=img, label="demo") + sample.embedding_2d = [float(rng.normal()), float(rng.normal())] # Dummy 2D points + dataset.add_sample(sample) + +hv.launch(dataset) +``` + +## Technical Details + +To support Colab, HyperView uses `google.colab.kernel.proxyPort` to expose the backend server. The UI is opened via a specially constructed "launcher" page that embeds the proxied application in a full-page iframe. This workaround ensures compatibility with modern browser security policies (like third-party cookie blocking) that often break direct proxy URLs. diff --git a/docs/datasets.md b/docs/datasets.md new file mode 100644 index 0000000..c8382f2 --- /dev/null +++ b/docs/datasets.md @@ -0,0 +1,96 @@ +# Datasets + +## Creating a Dataset + +```python +import hyperview as hv + +# Persistent dataset (default) - survives restarts +dataset = hv.Dataset("my_dataset") + +# In-memory dataset - lost when process exits +dataset = hv.Dataset("my_dataset", persist=False) +``` + +**Storage location:** `~/.hyperview/datasets/` (configurable via `HYPERVIEW_DATABASE_DIR`) + +Internally, each dataset is stored as two Lance tables (directories) inside that folder: +- `hyperview_{dataset_name}.lance/` (samples) +- `hyperview_{dataset_name}_meta.lance/` (metadata like label colors) + +## Adding Samples + +### From HuggingFace +```python +dataset.add_from_huggingface( + "uoft-cs/cifar100", + split="train", + image_key="img", + label_key="fine_label", + max_samples=1000, +) +``` + +### From Directory +```python +dataset.add_images_dir("/path/to/images", label_from_folder=True) +``` + +## Persistence Model: Additive + +HyperView uses an **additive** persistence model: + +| Action | Behavior | +|--------|----------| +| Add samples | New samples inserted, existing skipped by ID | +| Request fewer than exist | Existing samples preserved (no deletion) | +| Request more than exist | Only new samples added | +| Embeddings | Cached per-sample, reused across sessions | +| Projections | Recomputed when new samples added (UMAP requires refit) | + +**Example:** +```python +dataset = hv.Dataset("my_dataset") + +dataset.add_from_huggingface(..., max_samples=200) # 200 samples +dataset.add_from_huggingface(..., max_samples=400) # +200 new → 400 total +dataset.add_from_huggingface(..., max_samples=300) # no change → 400 total +dataset.add_from_huggingface(..., max_samples=500) # +100 new → 500 total +``` + +Samples are **never implicitly deleted**. Use `hv.Dataset.delete("name")` for explicit removal. + +## Computing Embeddings + +```python +# High-dimensional embeddings (CLIP) +dataset.compute_embeddings(model="openai/clip-vit-base-patch32", show_progress=True) + +# 2D projections for visualization +dataset.compute_visualization() # UMAP to Euclidean + Hyperbolic +``` + +Embeddings are stored per-sample. If a sample already has embeddings, it's skipped. + +## Listing & Deleting Datasets + +```python +# List all persistent datasets +hv.Dataset.list_datasets() # ['cifar100_demo', 'my_dataset', ...] + +# Delete a dataset +hv.Dataset.delete("my_dataset") + +# Check existence +hv.Dataset.exists("my_dataset") # True/False +``` + +## Dataset Info + +```python +len(dataset) # Number of samples +dataset.name # Dataset name +dataset.labels # Unique labels +dataset.samples # Iterator over all samples +dataset[sample_id] # Get sample by ID +``` diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json deleted file mode 100644 index bffb357..0000000 --- a/frontend/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/frontend/components.json b/frontend/components.json new file mode 100644 index 0000000..f826c54 --- /dev/null +++ b/frontend/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs new file mode 100644 index 0000000..4c89b74 --- /dev/null +++ b/frontend/eslint.config.mjs @@ -0,0 +1,22 @@ +import path from "path"; +import { fileURLToPath } from "url"; + +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Bridge legacy shareable configs (like `next/core-web-vitals`) into ESLint v9 flat config. +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const config = [ + { + // Mirror Next.js defaults: never lint build artifacts. + ignores: ["**/.next/**", "**/out/**", "**/node_modules/**"], + }, + ...compat.extends("next/core-web-vitals"), +]; + +export default config; diff --git a/frontend/next.config.ts b/frontend/next.config.ts index a255d22..ae8d588 100644 --- a/frontend/next.config.ts +++ b/frontend/next.config.ts @@ -1,8 +1,12 @@ import type { NextConfig } from "next"; +import path from "path"; const nextConfig: NextConfig = { output: "export", trailingSlash: true, + // Needed for Turbopack to resolve local linked/file dependencies in a monorepo. + outputFileTracingRoot: path.join(__dirname, ".."), + transpilePackages: ["hyper-scatter"], images: { unoptimized: true, }, @@ -11,7 +15,7 @@ const nextConfig: NextConfig = { return [ { source: "/api/:path*", - destination: "http://127.0.0.1:5151/api/:path*", + destination: "http://127.0.0.1:6263/api/:path*", }, ]; }, diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e1a17b9..86da7b6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,23 +1,41 @@ { "name": "hyperview-frontend", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "hyperview-frontend", - "version": "0.1.0", - "dependencies": { + "version": "0.1.1", + "dependencies": { + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.8", "@tanstack/react-virtual": "^3.10.9", - "@types/d3-scale": "^4.0.9", - "d3-scale": "^4.0.2", - "next": "^16.0.7", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "dockview": "^4.13.1", + "hyper-scatter": "^0.1.0", + "justified-layout": "^4.1.0", + "lucide-react": "^0.562.0", + "next": "^16.1.6", "react": "18.3.1", "react-dom": "18.3.1", - "regl-scatterplot": "^1.9.2", + "react-icons": "^5.5.0", + "tailwind-merge": "^3.4.0", + "tailwindcss-animate": "^1.0.7", "zustand": "^5.0.1" }, "devDependencies": { + "@types/justified-layout": "^4.1.4", "@types/node": "^22.9.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", @@ -33,7 +51,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -43,9 +60,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, "license": "MIT", "optional": true, @@ -55,9 +72,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "license": "MIT", "optional": true, "dependencies": { @@ -76,9 +93,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -183,9 +200,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -219,10 +236,42 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@flekschas/utils": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@flekschas/utils/-/utils-0.32.2.tgz", - "integrity": "sha512-RPF5WBXxA3WFKdTTDQS7gl7hd1z6kOMfJKj0p+9TRLJm/vQHvRC2Zt62axSQlbve8a82NtVN96aaGhsx5+ekvQ==", + "node_modules/@floating-ui/core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", + "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.5" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, "node_modules/@humanfs/core": { @@ -747,7 +796,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -758,7 +806,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -768,14 +815,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -796,9 +841,9 @@ } }, "node_modules/@next/env": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.7.tgz", - "integrity": "sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", + "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -812,9 +857,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.7.tgz", - "integrity": "sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", + "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", "cpu": [ "arm64" ], @@ -828,9 +873,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.7.tgz", - "integrity": "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", + "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", "cpu": [ "x64" ], @@ -844,9 +889,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.7.tgz", - "integrity": "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", + "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", "cpu": [ "arm64" ], @@ -860,9 +905,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.7.tgz", - "integrity": "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", + "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", "cpu": [ "arm64" ], @@ -876,9 +921,25 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.7.tgz", - "integrity": "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", + "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", + "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", "cpu": [ "x64" ], @@ -891,102 +952,1021 @@ "node": ">= 10" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.7.tgz", - "integrity": "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==", - "cpu": [ - "x64" - ], + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", + "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", + "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.7.tgz", - "integrity": "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==", - "cpu": [ - "arm64" - ], + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.7.tgz", - "integrity": "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==", - "cpu": [ - "x64" - ], + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">= 8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@radix-ui/react-use-layout-effect": "1.1.1" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", "license": "MIT", - "engines": { - "node": ">=12.4.0" + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1011,12 +1991,12 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", - "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==", + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.18.tgz", + "integrity": "sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.13.12" + "@tanstack/virtual-core": "3.13.18" }, "funding": { "type": "github", @@ -1028,9 +2008,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", - "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.18.tgz", + "integrity": "sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==", "license": "MIT", "funding": { "type": "github", @@ -1048,21 +2028,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1084,10 +2049,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/justified-layout": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/justified-layout/-/justified-layout-4.1.4.tgz", + "integrity": "sha512-q2ybP0u0NVj87oMnGZOGxY2iUN8ddr48zPOBHBdbOLpsMTA/keGj+93ou+OMCnJk0xewzlNIaVEkxM6VBD3E2w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", + "version": "22.19.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.7.tgz", + "integrity": "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==", "dev": true, "license": "MIT", "dependencies": { @@ -1107,7 +2079,6 @@ "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -1117,28 +2088,27 @@ "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz", - "integrity": "sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/type-utils": "8.48.1", - "@typescript-eslint/utils": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1148,7 +2118,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.48.1", + "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1164,18 +2134,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.1.tgz", - "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1190,15 +2159,15 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.1.tgz", - "integrity": "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.48.1", - "@typescript-eslint/types": "^8.48.1", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1212,14 +2181,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.1.tgz", - "integrity": "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1" + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1230,9 +2199,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.1.tgz", - "integrity": "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", "dev": true, "license": "MIT", "engines": { @@ -1247,17 +2216,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.1.tgz", - "integrity": "sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1", - "@typescript-eslint/utils": "8.48.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1272,9 +2241,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.1.tgz", - "integrity": "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", "dev": true, "license": "MIT", "engines": { @@ -1286,21 +2255,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.1.tgz", - "integrity": "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.48.1", - "@typescript-eslint/tsconfig-utils": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1340,16 +2309,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.1.tgz", - "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1364,13 +2333,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.1.tgz", - "integrity": "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/types": "8.54.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1656,7 +2625,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1675,9 +2643,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1711,14 +2679,12 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -1732,7 +2698,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -1742,6 +2707,18 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -1930,9 +2907,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", "dev": true, "funding": [ { @@ -1950,10 +2927,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -1984,9 +2960,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", - "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", "dev": true, "license": "MPL-2.0", "engines": { @@ -2011,10 +2987,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.2.tgz", - "integrity": "sha512-PxSsosKQjI38iXkmb3d0Y32efqyA0uW4s41u4IVBsLlWLhCiYNpH/AfNOVWRqCQBlD8TFJTz6OUWNd4DFJCnmw==", - "dev": true, + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -2024,7 +2999,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2048,7 +3022,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -2077,7 +3050,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -2156,34 +3128,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, - "node_modules/camera-2d-simple": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camera-2d-simple/-/camera-2d-simple-3.0.0.tgz", - "integrity": "sha512-hBeuUeerQ2Repi/61PGyFkuJ9jt6IKAny7pjQo2w8/8uZh+RKvNLZQy4xbQeDH8FrlnFxAJDjyM4/yuLdOV5vQ==", - "license": "MIT", - "dependencies": { - "gl-matrix": "~3.3.0" - }, - "peerDependencies": { - "gl-matrix": "~3.3.0" - } - }, - "node_modules/camera-2d-simple/node_modules/gl-matrix": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", - "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==", - "license": "MIT" - }, "node_modules/caniuse-lite": { - "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", "funding": [ { "type": "opencollective", @@ -2221,7 +3174,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -2246,7 +3198,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -2255,12 +3206,49 @@ "node": ">= 6" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2285,7 +3273,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -2298,123 +3285,40 @@ "dev": true, "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-array": "2 - 3" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=12" + "node": ">=4" } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -2547,18 +3451,40 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, "license": "Apache-2.0" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, + "license": "MIT" + }, + "node_modules/dockview": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/dockview/-/dockview-4.13.1.tgz", + "integrity": "sha512-K8xnYt3Rvkx8MYKHaEsb8aFaPyQclKRRkXS9JcpQPZUgqxumTLnSidgdd6uIfzEps6yJsXoZGQGJ9PtcaKyDcQ==", + "license": "MIT", + "dependencies": { + "dockview-core": "^4.13.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/dockview-core": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/dockview-core/-/dockview-core-4.13.1.tgz", + "integrity": "sha512-+7vR0ZEoL8CNck6NqDVUMqBT22niwBu5CMMI137dZ3c8NDc7c5Si+3dGEqQgM4lNtHBLAtvypo1C4p21J2wkiQ==", "license": "MIT" }, "node_modules/doctrine": { @@ -2574,19 +3500,6 @@ "node": ">=0.10.0" } }, - "node_modules/dom-2d-camera": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/dom-2d-camera/-/dom-2d-camera-2.2.6.tgz", - "integrity": "sha512-HWfV26qjCfpOHa6X0PI1ZyZDhowk6skEs5f7aOwgewuJSP6IgPcK694ImYIOMGnDYK4vC4/Etsi26WpbJtS2vQ==", - "license": "MIT", - "dependencies": { - "camera-2d-simple": "^3.0.0", - "gl-matrix": "^3.3.0" - }, - "peerDependencies": { - "gl-matrix": "^3.3.0" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2602,16 +3515,10 @@ "node": ">= 0.4" } }, - "node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC" - }, "node_modules/electron-to-chromium": { - "version": "1.5.265", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.265.tgz", - "integrity": "sha512-B7IkLR1/AE+9jR2LtVF/1/6PFhY5TlnEHnlrKmGk7PvkJibg5jr+mLXLLzq3QYl6PA1T/vLDthQPqIPAlS/PPA==", + "version": "1.5.283", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", "dev": true, "license": "ISC" }, @@ -2623,9 +3530,9 @@ "license": "MIT" }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -2712,27 +3619,27 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", + "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" }, "engines": { @@ -2823,12 +3730,11 @@ } }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -2836,7 +3742,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3002,7 +3908,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -3204,9 +4109,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3301,10 +4206,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -3327,7 +4231,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -3408,7 +4311,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -3423,7 +4325,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3495,6 +4396,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -3528,9 +4438,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", "dev": true, "license": "MIT", "dependencies": { @@ -3540,17 +4450,10 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/gl-matrix": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", - "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", - "license": "MIT" - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -3602,13 +4505,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -3694,7 +4590,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3703,6 +4598,12 @@ "node": ">= 0.4" } }, + "node_modules/hyper-scatter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/hyper-scatter/-/hyper-scatter-0.1.0.tgz", + "integrity": "sha512-bsNklPi52mY/St0UdIwHkyW9tt2d2j57QXKi6orT1ji0FL6oYKT0wuoFaHgZ3ioMH+asE1Cl1SGS0x49sEPZkw==", + "license": "MIT" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3755,15 +4656,6 @@ "node": ">= 0.4" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -3822,7 +4714,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -3875,7 +4766,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -3926,7 +4816,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3972,7 +4861,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -4011,7 +4899,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -4215,9 +5102,7 @@ "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -4291,6 +5176,12 @@ "node": ">=4.0" } }, + "node_modules/justified-layout": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/justified-layout/-/justified-layout-4.1.0.tgz", + "integrity": "sha512-M5FimNMXgiOYerVRGsXZ2YK9YNCaTtwtYp7Hb2308U1Q9TXXHx5G0p08mcVR5O53qf8bWY4NJcPBxE6zuayXSg==", + "license": "ISC" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4339,7 +5230,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -4352,7 +5242,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, "node_modules/locate-path": { @@ -4390,6 +5279,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lucide-react": { + "version": "0.562.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", + "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4404,7 +5302,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -4414,7 +5311,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -4458,7 +5354,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -4508,13 +5403,14 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.7.tgz", - "integrity": "sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", + "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", "license": "MIT", "dependencies": { - "@next/env": "16.0.7", + "@next/env": "16.1.6", "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -4526,14 +5422,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.7", - "@next/swc-darwin-x64": "16.0.7", - "@next/swc-linux-arm64-gnu": "16.0.7", - "@next/swc-linux-arm64-musl": "16.0.7", - "@next/swc-linux-x64-gnu": "16.0.7", - "@next/swc-linux-x64-musl": "16.0.7", - "@next/swc-win32-arm64-msvc": "16.0.7", - "@next/swc-win32-x64-msvc": "16.0.7", + "@next/swc-darwin-arm64": "16.1.6", + "@next/swc-darwin-x64": "16.1.6", + "@next/swc-linux-arm64-gnu": "16.1.6", + "@next/swc-linux-arm64-musl": "16.1.6", + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", + "@next/swc-win32-arm64-msvc": "16.1.6", + "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { @@ -4598,17 +5494,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4618,7 +5503,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4628,7 +5512,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -4852,7 +5735,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -4865,7 +5747,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -4878,7 +5759,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4888,7 +5768,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -4908,7 +5787,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4924,7 +5802,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4938,7 +5815,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", @@ -4956,7 +5832,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4982,7 +5857,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5025,7 +5899,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5051,7 +5924,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -5065,7 +5937,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { @@ -5090,12 +5961,6 @@ "react-is": "^16.13.1" } }, - "node_modules/pub-sub-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pub-sub-es/-/pub-sub-es-3.0.0.tgz", - "integrity": "sha512-pf+6yCPsOfvDMru2LnsqdKSN8XQyF5HZzmEoKBvjMk4TILMUQiq1vxI6rC92T9ErY06sLXBmC1p7JGNFVB1pUQ==", - "license": "MIT" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5110,7 +5975,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -5132,7 +5996,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -5145,7 +6008,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -5154,6 +6016,15 @@ "react": "^18.3.1" } }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -5161,11 +6032,79 @@ "dev": true, "license": "MIT" }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "license": "MIT", "dependencies": { "pify": "^2.3.0" @@ -5175,7 +6114,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -5228,53 +6166,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.1.tgz", - "integrity": "sha512-+IOGrxl3FZ8ZM9ixCWQZzFRiRn7Rzn9bu3iFHwg/yz4tlOUQgbO4PHLgG+1ZT60zcIV8tief6Qrmyl8qcoJP0g==", - "license": "MIT" - }, - "node_modules/regl-line": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/regl-line/-/regl-line-1.1.1.tgz", - "integrity": "sha512-IKcyiZq+nQg7x3mEmxf9kImM9CzmEyZDhCCfas2xVpsoiDJFEyILsuocD1G4dSXA/nC39za9OBw4FzYEgWNiUg==", - "license": "MIT", - "dependencies": { - "gl-matrix": "^3.3.0", - "regl": "^2.1.0" - }, - "peerDependencies": { - "regl": "^2.1.0" - } - }, - "node_modules/regl-scatterplot": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/regl-scatterplot/-/regl-scatterplot-1.14.1.tgz", - "integrity": "sha512-2WMrP6+pgoeckPpWrkHEqPpSJKjR3/QgNGBqctRCbzofsxDx3nDQh7541KnTH3LheGiZEofSJAoctdySgZG+tg==", - "license": "MIT", - "dependencies": { - "@flekschas/utils": "^0.32.2", - "dom-2d-camera": "^2.2.6", - "earcut": "^3.0.1", - "gl-matrix": "~3.4.3", - "pub-sub-es": "~3.0.0", - "regl": "~2.1.1", - "regl-line": "~1.1.1" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=7.0.0" - }, - "peerDependencies": { - "pub-sub-es": "~3.0.0", - "regl": "~2.1.1" - } - }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.1", @@ -5315,7 +6210,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -5326,7 +6220,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -5809,7 +6702,6 @@ "version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", @@ -5845,7 +6737,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5854,11 +6745,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", - "dev": true, + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -5892,11 +6792,19 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/tailwindcss/node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -5913,7 +6821,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -5926,7 +6833,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -5936,7 +6842,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -5949,7 +6854,6 @@ "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -5966,7 +6870,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -5984,9 +6887,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -5998,7 +6899,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -6008,9 +6908,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -6024,7 +6924,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, "license": "Apache-2.0" }, "node_modules/tsconfig-paths": { @@ -6143,7 +7042,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6214,9 +7112,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -6254,11 +7152,53 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, "node_modules/which": { @@ -6345,9 +7285,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -6390,9 +7330,9 @@ } }, "node_modules/zustand": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", - "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.10.tgz", + "integrity": "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg==", "license": "MIT", "engines": { "node": ">=12.20.0" diff --git a/frontend/package.json b/frontend/package.json index 1c63b14..a3c667a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,25 +1,43 @@ { "name": "hyperview-frontend", - "version": "0.1.0", + "version": "0.1.1", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint", + "lint": "eslint .", "export": "next build && cp -r out/* ../src/hyperview/server/static/" }, "dependencies": { + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.8", "@tanstack/react-virtual": "^3.10.9", - "@types/d3-scale": "^4.0.9", - "d3-scale": "^4.0.2", - "next": "^16.0.7", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "dockview": "^4.13.1", + "hyper-scatter": "^0.1.0", + "justified-layout": "^4.1.0", + "lucide-react": "^0.562.0", + "next": "^16.1.6", "react": "18.3.1", "react-dom": "18.3.1", - "regl-scatterplot": "^1.9.2", + "react-icons": "^5.5.0", + "tailwind-merge": "^3.4.0", + "tailwindcss-animate": "^1.0.7", "zustand": "^5.0.1" }, "devDependencies": { + "@types/justified-layout": "^4.1.4", "@types/node": "^22.9.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index b2ce4a8..417f195 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -1,51 +1,106 @@ +@import "dockview/dist/styles/dockview.css"; + @tailwind base; @tailwind components; @tailwind utilities; -:root { - --background: #0a0a0b; - --surface: #18181b; - --surface-light: #27272a; - --border: #3f3f46; - --primary: #4F46E5; - --primary-light: #818CF8; - --text: #fafafa; - --text-muted: #a1a1aa; -} +@layer base { + html, + body { + height: 100%; + margin: 0; + padding: 0; + overflow: hidden; + } -* { - box-sizing: border-box; + :root { + /* Rerun-inspired dark theme as default (dark-first) */ + --background: 215 28% 7%; /* #0d1117 */ + --foreground: 213 27% 92%; /* #e6edf3 */ + + --card: 215 21% 11%; /* #161b22 */ + --card-foreground: 213 27% 92%; + + --popover: 215 21% 11%; + --popover-foreground: 213 27% 92%; + + --primary: 212 100% 67%; /* #58a6ff */ + --primary-foreground: 215 28% 7%; + + --secondary: 215 14% 17%; /* #21262d */ + --secondary-foreground: 213 27% 92%; + + --muted: 215 14% 17%; + --muted-foreground: 213 12% 58%; /* #8b949e */ + + --accent: 215 14% 17%; + --accent-foreground: 213 27% 92%; + + --destructive: 0 62% 50%; + --destructive-foreground: 0 0% 98%; + + --border: 215 14% 22%; /* #30363d */ + --input: 215 14% 22%; + --ring: 212 100% 67%; + + --radius: 0.375rem; + + /* Custom Rerun-specific tokens */ + --surface: 215 21% 11%; /* #161b22 */ + --surface-light: 215 14% 17%; /* #21262d */ + --surface-elevated: 215 14% 22%; /* #30363d */ + --border-subtle: 215 14% 17%; + --text: 213 27% 92%; /* #e6edf3 */ + --text-muted: 213 12% 58%; /* #8b949e */ + --text-subtle: 215 10% 46%; /* #6e7681 */ + --accent-cyan: 176 60% 53%; /* #39d3cc */ + --accent-orange: 27 86% 59%; /* #f0883e */ + } } -body { - background-color: var(--background); - color: var(--text); - margin: 0; - padding: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + font-size: 12px; + line-height: 16px; + letter-spacing: -0.15px; + font-weight: 500; + font-feature-settings: "liga" 1, "calt" 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } } -/* Custom scrollbar */ +/* Custom scrollbar - Rerun style: 6px bar, 2px inner margin, 2px outer margin */ ::-webkit-scrollbar { - width: 8px; - height: 8px; + width: 10px; /* 6px bar + 2px inner margin on each side */ + height: 10px; } ::-webkit-scrollbar-track { - background: var(--surface); + background: transparent; } ::-webkit-scrollbar-thumb { - background: var(--border); - border-radius: 4px; + background: hsl(var(--muted-foreground) / 0.2); + border-radius: 3px; + border: 2px solid transparent; + background-clip: padding-box; } ::-webkit-scrollbar-thumb:hover { - background: #4d4d4d; + background: hsl(var(--muted-foreground) / 0.35); + border: 2px solid transparent; + background-clip: padding-box; +} + +/* Firefox scrollbar */ +* { + scrollbar-width: thin; + scrollbar-color: hsl(var(--muted-foreground) / 0.25) transparent; } /* Hide scrollbar for some elements */ @@ -57,3 +112,120 @@ body { -ms-overflow-style: none; scrollbar-width: none; } + +/* Scroll containers inside panels should keep scrollbars inset */ +.panel-scroll { + scrollbar-gutter: stable; +} + +/* Dockview theme overrides (match HyperView tokens) */ +.hyperview-dockview { + --dv-background-color: hsl(var(--background)); + --dv-group-view-background-color: hsl(var(--card)); + --dv-tabs-and-actions-container-background-color: hsl(var(--secondary)); + --dv-activegroup-visiblepanel-tab-background-color: hsl(var(--card)); + --dv-activegroup-hiddenpanel-tab-background-color: hsl(var(--secondary)); + --dv-inactivegroup-visiblepanel-tab-background-color: hsl(var(--secondary)); + --dv-inactivegroup-hiddenpanel-tab-background-color: hsl(var(--secondary)); + --dv-activegroup-visiblepanel-tab-color: hsl(var(--foreground)); + --dv-activegroup-hiddenpanel-tab-color: hsl(var(--muted-foreground)); + --dv-inactivegroup-visiblepanel-tab-color: hsl(var(--muted-foreground)); + --dv-inactivegroup-hiddenpanel-tab-color: hsl(var(--muted-foreground)); + --dv-tabs-and-actions-container-font-size: 12px; + --dv-tabs-and-actions-container-height: 24px; + --dv-tab-font-size: 12px; + --dv-tabs-container-scrollbar-color: hsl(var(--muted-foreground) / 0.25); + --dv-scrollbar-background-color: hsl(var(--muted-foreground) / 0.25); + --dv-tab-divider-color: hsl(var(--border)); + --dv-separator-border: transparent; + --dv-paneview-header-border-color: hsl(var(--border)); + --dv-sash-color: hsl(var(--border)); + --dv-icon-hover-background-color: hsl(var(--accent)); + --dv-active-sash-color: hsl(var(--primary)); + --dv-drag-over-background-color: hsl(var(--primary) / 0.15); + --dv-drag-over-border-color: hsl(var(--primary) / 0.6); + /* Remove tab margins for flush appearance */ + --dv-tab-margin: 0; +} + +/* Remove any gaps between panels - Rerun-style flush layout */ +.hyperview-dockview .dv-groupview { + border: none; +} + +.hyperview-dockview .dv-tabs-and-actions-container { + border-bottom: 1px solid hsl(var(--border)); +} + +.hyperview-dockview .dv-tab { + padding: 0 8px; + height: 100%; + display: flex; + align-items: center; + line-height: 16px; +} + +.hyperview-dockview .dv-tab .dv-react-part { + height: 100%; + min-width: 0; + display: flex; + align-items: center; +} + +.hyperview-dockview .dv-scrollable .dv-scrollbar-horizontal { + height: 6px; + border-radius: 3px; +} + +/* Hide Dockview tab scrollbars (avoid extra bar under tabs) */ +.hyperview-dockview .dv-tabs-container { + scrollbar-width: none; +} + +.hyperview-dockview .dv-tabs-container::-webkit-scrollbar { + height: 0; +} + +.hyperview-dockview .dv-scrollable .dv-scrollbar-horizontal { + display: none; +} + +/* Sash styling: transparent hit area with centered 1px visible line via pseudo-element */ +.hyperview-dockview .dv-split-view-container > .dv-sash-container > .dv-sash { + /* Keep the sash itself transparent - we'll draw the line with ::after */ + background-color: transparent !important; +} + +/* Horizontal sash (vertical divider line) */ +.hyperview-dockview .dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 1px; + background-color: hsl(var(--border)); + pointer-events: none; +} + +.hyperview-dockview .dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash.dv-enabled:hover::after { + background-color: hsl(var(--primary)); +} + +/* Vertical sash (horizontal divider line) */ +.hyperview-dockview .dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash::after { + content: ""; + position: absolute; + left: 0; + right: 0; + top: 50%; + transform: translateY(-50%); + height: 1px; + background-color: hsl(var(--border)); + pointer-events: none; +} + +.hyperview-dockview .dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash.dv-enabled:hover::after { + background-color: hsl(var(--primary)); +} diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index cbfbe73..6af29df 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -1,6 +1,13 @@ import type { Metadata } from "next"; +import { Inter } from "next/font/google"; import "./globals.css"; +const inter = Inter({ + subsets: ["latin"], + display: "swap", + weight: ["400", "500"], +}); + export const metadata: Metadata = { title: "HyperView", description: "Dataset visualization with hyperbolic embeddings", @@ -12,8 +19,8 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - {children} + + {children} ); } diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 43f11b9..8632790 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -1,9 +1,18 @@ "use client"; -import { useEffect, useCallback, useState, useRef } from "react"; -import { Header, ImageGrid, ScatterPanel } from "@/components"; +import { useEffect, useCallback, useMemo, useRef, useState } from "react"; +import { Header } from "@/components"; +import { GlobalSeekBar } from "@/components/GlobalSeekBar"; +import { DockviewWorkspace, DockviewProvider } from "@/components/DockviewWorkspace"; import { useStore } from "@/store/useStore"; -import { fetchDataset, fetchSamples, fetchEmbeddings, fetchSamplesBatch } from "@/lib/api"; +import type { Sample } from "@/types"; +import { + fetchDataset, + postCurationFilter, + fetchSamples, + fetchSamplesBatch, + fetchLassoSelection, +} from "@/lib/api"; const SAMPLES_PER_PAGE = 100; @@ -11,40 +20,47 @@ export default function Home() { const { samples, totalSamples, + samplesLoaded, setSamples, appendSamples, addSamplesIfMissing, setDatasetInfo, - setEmbeddings, setIsLoading, isLoading, error, setError, selectedIds, + isLassoSelection, + selectionSource, + lassoQuery, + lassoSamples, + lassoTotal, + lassoIsLoading, + setLassoResults, + labelFilter, + curationQuery, } = useStore(); const [loadingMore, setLoadingMore] = useState(false); - const [leftPanelWidth, setLeftPanelWidth] = useState(50); // percentage - const containerRef = useRef(null); - const isDraggingRef = useRef(false); + const labelFilterRef = useRef(labelFilter ?? null); + const curationQueryRef = useRef(curationQuery); - // Initial data load + // Initial data load - runs once on mount + // Store setters are stable and don't need to be in deps useEffect(() => { const loadData = async () => { setIsLoading(true); setError(null); try { - // Fetch dataset info, samples, and embeddings in parallel - const [datasetInfo, samplesRes, embeddingsData] = await Promise.all([ + // Fetch dataset info and samples in parallel + const [datasetInfo, samplesRes] = await Promise.all([ fetchDataset(), fetchSamples(0, SAMPLES_PER_PAGE), - fetchEmbeddings(), ]); setDatasetInfo(datasetInfo); setSamples(samplesRes.samples, samplesRes.total); - setEmbeddings(embeddingsData); } catch (err) { console.error("Failed to load data:", err); setError(err instanceof Error ? err.message : "Failed to load data"); @@ -54,12 +70,15 @@ export default function Home() { }; loadData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Fetch selected samples that aren't already loaded useEffect(() => { const fetchSelectedSamples = async () => { + if (isLassoSelection) return; if (selectedIds.size === 0) return; + if (selectionSource === "label") return; // Find IDs that are selected but not in our samples array const loadedIds = new Set(samples.map((s) => s.id)); @@ -76,57 +95,215 @@ export default function Home() { }; fetchSelectedSamples(); - }, [selectedIds, samples, addSamplesIfMissing]); + }, [selectedIds, samples, addSamplesIfMissing, isLassoSelection, selectionSource]); + + // Refetch samples when label filter changes (non-lasso mode) + useEffect(() => { + if (labelFilterRef.current === labelFilter) return; + if (isLassoSelection) return; + if (curationQuery) return; + + labelFilterRef.current = labelFilter ?? null; + + let cancelled = false; + const run = async () => { + try { + const res = await fetchSamples(0, SAMPLES_PER_PAGE, labelFilter ?? undefined); + if (cancelled) return; + setSamples(res.samples, res.total); + } catch (err) { + if (cancelled) return; + console.error("Failed to load filtered samples:", err); + } + }; + + run(); + return () => { + cancelled = true; + }; + }, [curationQuery, isLassoSelection, labelFilter, setSamples]); + + // Refetch samples when curation filters are applied (non-lasso mode) + useEffect(() => { + if (!curationQuery) return; + if (isLassoSelection) return; + + let cancelled = false; + const run = async () => { + try { + const res = await postCurationFilter({ + ...curationQuery, + offset: 0, + limit: SAMPLES_PER_PAGE, + }); + if (cancelled) return; + setSamples(res.samples, res.total); + } catch (err) { + if (cancelled) return; + console.error("Failed to load curation-filtered samples:", err); + } + }; + + run(); + return () => { + cancelled = true; + }; + }, [curationQuery, isLassoSelection, setSamples]); + + // When curation filters are cleared, restore standard paginated samples. + useEffect(() => { + const previous = curationQueryRef.current; + curationQueryRef.current = curationQuery; + + if (!previous || curationQuery !== null) return; + if (isLassoSelection) return; + + let cancelled = false; + const run = async () => { + try { + const res = await fetchSamples(0, SAMPLES_PER_PAGE, labelFilter ?? undefined); + if (cancelled) return; + setSamples(res.samples, res.total); + } catch (err) { + if (cancelled) return; + console.error("Failed to restore samples after clearing curation filters:", err); + } + }; + + run(); + return () => { + cancelled = true; + }; + }, [curationQuery, isLassoSelection, labelFilter, setSamples]); + + // Fetch initial lasso selection page when a new lasso query begins. + useEffect(() => { + if (!isLassoSelection) return; + if (!lassoQuery) return; + if (!lassoIsLoading) return; + + const abort = new AbortController(); + + const run = async () => { + try { + const res = await fetchLassoSelection({ + layoutKey: lassoQuery.layoutKey, + polygon: lassoQuery.polygon, + offset: 0, + limit: SAMPLES_PER_PAGE, + signal: abort.signal, + }); + if (abort.signal.aborted) return; + setLassoResults(res.samples, res.total, false); + } catch (err) { + if (err instanceof DOMException && err.name === "AbortError") return; + console.error("Failed to fetch lasso selection:", err); + setLassoResults([], 0, false); + } + }; + + run(); + + return () => abort.abort(); + }, [isLassoSelection, lassoIsLoading, lassoQuery, setLassoResults]); // Load more samples const loadMore = useCallback(async () => { - if (loadingMore || samples.length >= totalSamples) return; + if (loadingMore) return; + + if (isLassoSelection) { + if (!lassoQuery) return; + if (lassoIsLoading) return; + if (!lassoIsLoading && lassoSamples.length >= lassoTotal) return; + + setLoadingMore(true); + try { + const res = await fetchLassoSelection({ + layoutKey: lassoQuery.layoutKey, + polygon: lassoQuery.polygon, + offset: lassoSamples.length, + limit: SAMPLES_PER_PAGE, + }); + setLassoResults(res.samples, res.total, true); + } catch (err) { + console.error("Failed to load more lasso samples:", err); + } finally { + setLoadingMore(false); + } + return; + } + + if (curationQuery) { + if (samplesLoaded >= totalSamples) return; + + setLoadingMore(true); + try { + const res = await postCurationFilter({ + ...curationQuery, + offset: samplesLoaded, + limit: SAMPLES_PER_PAGE, + }); + appendSamples(res.samples); + } catch (err) { + console.error("Failed to load more curation-filtered samples:", err); + } finally { + setLoadingMore(false); + } + return; + } + + if (samplesLoaded >= totalSamples) return; setLoadingMore(true); try { - const res = await fetchSamples(samples.length, SAMPLES_PER_PAGE); + const res = await fetchSamples(samplesLoaded, SAMPLES_PER_PAGE, labelFilter ?? undefined); appendSamples(res.samples); } catch (err) { console.error("Failed to load more samples:", err); } finally { setLoadingMore(false); } - }, [samples.length, totalSamples, loadingMore, appendSamples]); - - // Handle resizing - useEffect(() => { - const handleMouseMove = (e: MouseEvent) => { - if (!isDraggingRef.current || !containerRef.current) return; + }, [ + loadingMore, + appendSamples, + isLassoSelection, + lassoIsLoading, + lassoQuery, + lassoSamples.length, + lassoTotal, + samplesLoaded, + totalSamples, + setLassoResults, + labelFilter, + curationQuery, + ]); - const container = containerRef.current; - const containerRect = container.getBoundingClientRect(); - const newWidth = ((e.clientX - containerRect.left) / containerRect.width) * 100; + const displayedSamples = useMemo(() => { + if (isLassoSelection) return lassoSamples; - // Constrain between 20% and 80% - const clampedWidth = Math.min(Math.max(newWidth, 20), 80); - setLeftPanelWidth(clampedWidth); - }; + // When a selection comes from the scatter plot, bring selected samples to the top + // so the user immediately sees what they clicked. + if (selectionSource === "scatter" && selectedIds.size > 0) { + const byId = new Map(); + for (const s of samples) byId.set(s.id, s); - const handleMouseUp = () => { - isDraggingRef.current = false; - document.body.style.cursor = ""; - document.body.style.userSelect = ""; - }; + const pinned: Sample[] = []; + for (const id of selectedIds) { + const s = byId.get(id); + if (s) pinned.push(s); + } - document.addEventListener("mousemove", handleMouseMove); - document.addEventListener("mouseup", handleMouseUp); + if (pinned.length > 0) { + const rest = samples.filter((s) => !selectedIds.has(s.id)); + return [...pinned, ...rest]; + } + } - return () => { - document.removeEventListener("mousemove", handleMouseMove); - document.removeEventListener("mouseup", handleMouseUp); - }; - }, []); + return samples; + }, [isLassoSelection, lassoSamples, samples, selectedIds, selectionSource]); - const handleMouseDown = () => { - isDraggingRef.current = true; - document.body.style.cursor = "col-resize"; - document.body.style.userSelect = "none"; - }; + const displayedTotal = isLassoSelection ? lassoTotal : totalSamples; + const displayedHasMore = isLassoSelection ? displayedSamples.length < displayedTotal : samplesLoaded < totalSamples; if (error) { return ( @@ -134,10 +311,10 @@ export default function Home() {
-
Error
-
{error}
-

- Make sure the HyperView backend is running on port 5151. +

Error
+
{error}
+

+ Make sure the HyperView backend is running on port 6263.

@@ -152,7 +329,7 @@ export default function Home() {
-
Loading dataset...
+
Loading dataset...
@@ -160,37 +337,20 @@ export default function Home() { } return ( -
-
- - {/* Main content - two panels */} -
- {/* Left panel - Image Grid */} -
- -
+ +
+
+ - {/* Resizable divider */} -
- - {/* Right panel - Scatter Plot */} -
- + {/* Main content - dockable panels */} +
+
-
+ ); } diff --git a/frontend/src/components/CurationPanel.tsx b/frontend/src/components/CurationPanel.tsx new file mode 100644 index 0000000..8c7467d --- /dev/null +++ b/frontend/src/components/CurationPanel.tsx @@ -0,0 +1,243 @@ +"use client"; + +import { useEffect, useMemo, useState } from "react"; +import { BarChart3, Filter } from "lucide-react"; +import { fetchCurationStats } from "@/lib/api"; +import type { CurationFilterRequest, CurationStats, HistogramBin } from "@/types"; +import { useStore } from "@/store/useStore"; +import { Panel } from "./Panel"; +import { PanelHeader } from "./PanelHeader"; + +interface CurationPanelProps { + className?: string; +} + +function Histogram({ bins }: { bins: HistogramBin[] }) { + const maxCount = useMemo(() => { + let value = 0; + for (const bin of bins) value = Math.max(value, bin.count); + return value; + }, [bins]); + + if (bins.length === 0 || maxCount <= 0) { + return
No score data available.
; + } + + return ( +
+ {bins.map((bin) => ( +
+ ))} +
+ ); +} + +function scoreLabel(value: number): string { + return value.toFixed(1); +} + +export function CurationPanel({ className = "" }: CurationPanelProps) { + const { + datasetInfo, + curationFilters, + setCurationFilters, + setCurationQuery, + resetCurationFilters, + } = useStore(); + + const [stats, setStats] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + setIsLoading(true); + setError(null); + + fetchCurationStats() + .then((data) => { + if (cancelled) return; + setStats(data); + }) + .catch((err) => { + if (cancelled) return; + setStats(null); + setError(err instanceof Error ? err.message : "Failed to load curation stats"); + }) + .finally(() => { + if (cancelled) return; + setIsLoading(false); + }); + + return () => { + cancelled = true; + }; + }, [datasetInfo?.name]); + + const applyFilters = () => { + const request: CurationFilterRequest = { + min_aesthetic_score: + curationFilters.minAestheticScore > 0 ? curationFilters.minAestheticScore : undefined, + min_motion_score: + curationFilters.minMotionScore > 0 ? curationFilters.minMotionScore : undefined, + max_cosine_similarity: + curationFilters.maxCosineSimilarity < 1 + ? curationFilters.maxCosineSimilarity + : undefined, + caption_query: curationFilters.captionQuery.trim() || undefined, + dedup_status: + curationFilters.dedupStatus === "all" ? undefined : curationFilters.dedupStatus, + }; + setCurationQuery(request); + }; + + const clearFilters = () => { + resetCurationFilters(); + setCurationQuery(null); + }; + + return ( + + } /> + +
+
+
Dataset
+ {isLoading ? ( +
Loading curation stats…
+ ) : error ? ( +
{error}
+ ) : ( +
+
samples: {stats?.total_samples ?? 0}
+
with video: {stats?.with_video ?? 0}
+
with caption: {stats?.with_caption ?? 0}
+
+ dedup kept: {stats?.dedup_counts?.kept ?? 0} +
+
+ )} +
+ +
+
Aesthetic score
+ +
+ min score + + setCurationFilters({ minAestheticScore: Number(event.target.value) }) + } + className="flex-1 accent-primary" + /> + + {scoreLabel(curationFilters.minAestheticScore)} + +
+
+ +
+
Motion score
+ +
+ min score + + setCurationFilters({ minMotionScore: Number(event.target.value) }) + } + className="flex-1 accent-primary" + /> + + {scoreLabel(curationFilters.minMotionScore)} + +
+
+ +
+
Dedup + Caption
+ +
+ max sim + + setCurationFilters({ maxCosineSimilarity: Number(event.target.value) }) + } + className="flex-1 accent-primary" + /> + + {curationFilters.maxCosineSimilarity.toFixed(2)} + +
+ +
+ dedup + +
+ +
+ caption + + setCurationFilters({ captionQuery: event.target.value }) + } + placeholder="e.g. pedestrian" + className="flex-1 h-7 rounded bg-background border border-border px-2 text-foreground placeholder:text-muted-foreground" + /> +
+
+
+ +
+ + +
+
+ ); +} diff --git a/frontend/src/components/DockviewWorkspace.tsx b/frontend/src/components/DockviewWorkspace.tsx new file mode 100644 index 0000000..fe48bca --- /dev/null +++ b/frontend/src/components/DockviewWorkspace.tsx @@ -0,0 +1,848 @@ +"use client"; + +import React, { + useCallback, + useEffect, + useMemo, + useState, + createContext, + useContext, + type ReactNode, +} from "react"; +import { + DockviewReact, + type DockviewApi, + type DockviewReadyEvent, + type IDockviewPanelProps, + type IDockviewPanelHeaderProps, + type IWatermarkPanelProps, + themeAbyss, +} from "dockview"; +import { Circle, Disc, Film, Grid3X3, SlidersHorizontal } from "lucide-react"; + +import type { Geometry, Sample } from "@/types"; +import { useStore } from "@/store/useStore"; +import { findLayoutByGeometry } from "@/lib/layouts"; +import { VideoGrid } from "./VideoGrid"; +import { ScatterPanel } from "./ScatterPanel"; +import { ExplorerPanel } from "./ExplorerPanel"; +import { PlaceholderPanel } from "./PlaceholderPanel"; +import { VideoPanel } from "./VideoPanel"; +import { CurationPanel } from "./CurationPanel"; +import { HyperViewLogo } from "./icons"; +import { PanelTitle } from "./PanelTitle"; + +const LAYOUT_STORAGE_KEY = "hyperview:dockview-layout:v4"; + +// Panel IDs +const PANEL = { + EXPLORER: "explorer", + GRID: "grid", + VIDEO: "video", + CURATION: "curation", + SCATTER_EUCLIDEAN: "scatter-euclidean", + SCATTER_POINCARE: "scatter-poincare", + SCATTER_DEFAULT: "scatter-default", + RIGHT_PLACEHOLDER: "right-placeholder", + BOTTOM_PLACEHOLDER: "bottom-placeholder", +} as const; + +const CENTER_PANEL_IDS = [ + PANEL.GRID, + PANEL.VIDEO, + PANEL.CURATION, + PANEL.SCATTER_EUCLIDEAN, + PANEL.SCATTER_POINCARE, + PANEL.SCATTER_DEFAULT, +] as const; + +export const CENTER_PANEL_DEFS = [ + { id: PANEL.GRID, label: "Clip Previews", icon: Grid3X3 }, + { id: PANEL.VIDEO, label: "Video", icon: Film }, + { id: PANEL.CURATION, label: "Curation", icon: SlidersHorizontal }, + { id: PANEL.SCATTER_EUCLIDEAN, label: "Euclidean", icon: Circle }, + { id: PANEL.SCATTER_POINCARE, label: "Hyperbolic", icon: Disc }, +] as const; + +const NON_ANCHOR_PANEL_IDS = new Set([ + PANEL.EXPLORER, + PANEL.RIGHT_PLACEHOLDER, + PANEL.BOTTOM_PLACEHOLDER, +]); + +const DRAG_LOCKED_PANEL_IDS = new Set([PANEL.EXPLORER]); + +const DEFAULT_CONTAINER_WIDTH = 1200; +const DEFAULT_CONTAINER_HEIGHT = 800; +const MIN_SIDE_PANEL_WIDTH = 120; +const MIN_BOTTOM_PANEL_HEIGHT = 150; + +const getContainerWidth = (api?: DockviewApi | null) => + api?.width ?? + (typeof window === "undefined" ? DEFAULT_CONTAINER_WIDTH : window.innerWidth); +const getContainerHeight = (api?: DockviewApi | null) => + api?.height ?? + (typeof window === "undefined" ? DEFAULT_CONTAINER_HEIGHT : window.innerHeight); + +const getDefaultLeftPanelWidth = (screenWidth: number) => + Math.round(Math.min(0.35 * screenWidth, 200)); +const getDefaultRightPanelWidth = (screenWidth: number) => + Math.round(Math.min(0.45 * screenWidth, 300)); +const getDefaultBottomPanelHeight = (containerHeight: number) => + Math.round( + Math.min(Math.max(0.25 * containerHeight, MIN_BOTTOM_PANEL_HEIGHT), 250) + ); +const getBottomPanelMaxHeight = (containerHeight: number) => + Math.round( + Math.max(containerHeight - MIN_BOTTOM_PANEL_HEIGHT, MIN_BOTTOM_PANEL_HEIGHT) + ); + +function getCenterAnchorPanel(api: DockviewApi) { + for (const id of CENTER_PANEL_IDS) { + const panel = api.getPanel(id); + if (panel) return panel; + } + + const fallback = api.panels.find((panel) => !NON_ANCHOR_PANEL_IDS.has(panel.id)); + return fallback ?? api.activePanel; +} + +function getZonePosition(zone: "left" | "right" | "bottom") { + return { direction: zone === "bottom" ? "below" : zone }; +} + +function getCenterTabPosition(api: DockviewApi) { + const anchor = getCenterAnchorPanel(api); + if (!anchor) return undefined; + return { referencePanel: anchor, direction: "within" as const }; +} + +// ----------------------------------------------------------------------------- +// Context for sharing dockview API across components +// ----------------------------------------------------------------------------- +interface DockviewContextValue { + api: DockviewApi | null; + setApi: (api: DockviewApi) => void; + samples: Sample[]; + onLoadMore: () => void; + hasMore: boolean; +} + +const DockviewContext = createContext(null); + +function useDockviewContext() { + const ctx = useContext(DockviewContext); + if (!ctx) throw new Error("useDockviewContext must be used within DockviewProvider"); + return ctx; +} + +// Public hook for components like Header +export function useDockviewApi() { + const ctx = useContext(DockviewContext); + const datasetInfo = useStore((state) => state.datasetInfo); + const { + leftPanelOpen, + rightPanelOpen, + bottomPanelOpen, + setLeftPanelOpen, + setRightPanelOpen, + setBottomPanelOpen, + } = useStore(); + + const addPanel = useCallback( + (panelId: string) => { + if (!ctx?.api) return; + + const api = ctx.api; + const position = getCenterTabPosition(api); + const baseOptions = position ? { position } : {}; + + const layouts = datasetInfo?.layouts ?? []; + const euclideanLayout = findLayoutByGeometry(layouts, "euclidean"); + const poincareLayout = findLayoutByGeometry(layouts, "poincare"); + + // Don't add if already exists - just focus it + if (api.getPanel(panelId)) { + api.getPanel(panelId)?.focus(); + return; + } + + switch (panelId) { + case PANEL.GRID: + api.addPanel({ + id: PANEL.GRID, + component: "grid", + title: "Clip Previews", + tabComponent: "samplesTab", + renderer: "always", + ...baseOptions, + }); + break; + + case PANEL.VIDEO: + api.addPanel({ + id: PANEL.VIDEO, + component: "video", + title: "Video", + tabComponent: "videoTab", + renderer: "always", + ...baseOptions, + }); + break; + + case PANEL.CURATION: + api.addPanel({ + id: PANEL.CURATION, + component: "curation", + title: "Curation", + tabComponent: "curationTab", + renderer: "always", + ...baseOptions, + }); + break; + + case PANEL.SCATTER_EUCLIDEAN: + api.addPanel({ + id: PANEL.SCATTER_EUCLIDEAN, + component: "scatter", + title: "Euclidean", + tabComponent: "euclideanTab", + params: { + layoutKey: euclideanLayout?.layout_key, + geometry: "euclidean" as Geometry, + }, + renderer: "always", + ...baseOptions, + }); + break; + + case PANEL.SCATTER_POINCARE: + api.addPanel({ + id: PANEL.SCATTER_POINCARE, + component: "scatter", + title: "Hyperbolic", + tabComponent: "hyperbolicTab", + params: { + layoutKey: poincareLayout?.layout_key, + geometry: "poincare" as Geometry, + }, + renderer: "always", + ...baseOptions, + }); + break; + } + }, + [ctx?.api, datasetInfo] + ); + + const resetLayout = useCallback(() => { + localStorage.removeItem(LAYOUT_STORAGE_KEY); + window.location.reload(); + }, []); + + // Toggle zone visibility + const toggleZone = useCallback( + (zone: "left" | "right" | "bottom") => { + if (!ctx?.api) return; + + const api = ctx.api; + const panelId = + zone === "left" + ? PANEL.EXPLORER + : zone === "right" + ? PANEL.RIGHT_PLACEHOLDER + : PANEL.BOTTOM_PLACEHOLDER; + const setOpen = + zone === "left" + ? setLeftPanelOpen + : zone === "right" + ? setRightPanelOpen + : setBottomPanelOpen; + const isOpen = + zone === "left" + ? leftPanelOpen + : zone === "right" + ? rightPanelOpen + : bottomPanelOpen; + + const existingPanel = api.getPanel(panelId); + + if (isOpen && existingPanel) { + existingPanel.api.close(); + setOpen(false); + return; + } + + if (isOpen) return; + + const containerWidth = getContainerWidth(api); + const containerHeight = getContainerHeight(api); + const position = getZonePosition(zone); + + let newPanel; + if (zone === "left") { + const targetWidth = getDefaultLeftPanelWidth(containerWidth); + newPanel = api.addPanel({ + id: panelId, + component: "explorer", + title: "Labels", + position, + initialWidth: targetWidth, + minimumWidth: MIN_SIDE_PANEL_WIDTH, + maximumWidth: targetWidth, + }); + + if (newPanel) { + newPanel.group.locked = true; + newPanel.group.header.hidden = true; + // Explicitly set the width to ensure it's applied + newPanel.api.setSize({ width: targetWidth }); + } + } else if (zone === "right") { + newPanel = api.addPanel({ + id: panelId, + component: "placeholder", + title: "Blank", + position, + initialWidth: getDefaultRightPanelWidth(containerWidth), + minimumWidth: MIN_SIDE_PANEL_WIDTH, + maximumWidth: Math.round(containerWidth * 0.65), + }); + } else { + newPanel = api.addPanel({ + id: panelId, + component: "placeholder", + title: "Blank", + position, + initialHeight: getDefaultBottomPanelHeight(containerHeight), + minimumHeight: MIN_BOTTOM_PANEL_HEIGHT, + maximumHeight: getBottomPanelMaxHeight(containerHeight), + }); + } + + if (newPanel) { + setOpen(true); + // Activate the panel so its content renders immediately + newPanel.api.setActive(); + } + }, + [ + ctx?.api, + leftPanelOpen, + rightPanelOpen, + bottomPanelOpen, + setLeftPanelOpen, + setRightPanelOpen, + setBottomPanelOpen, + ] + ); + + if (!ctx) return null; + + return { + api: ctx.api, + addPanel, + resetLayout, + toggleZone, + }; +} + +// ----------------------------------------------------------------------------- +// Panel Components - stable references defined outside component +// ----------------------------------------------------------------------------- +type ScatterPanelParams = { + layoutKey?: string; + geometry?: Geometry; +}; + +const ScatterDockPanel = React.memo(function ScatterDockPanel( + props: IDockviewPanelProps +) { + const params = props.params ?? {}; + return ( + + ); +}); + +// Custom tab component with icon (like Rerun's "Image and segmentation mask" tab) +type TabWithIconProps = IDockviewPanelHeaderProps & { + icon: React.ReactNode; +}; + +const TabWithIcon = React.memo(function TabWithIcon({ api, icon }: TabWithIconProps) { + return ( + + ); +}); + +// Tab components for different panel types +const EuclideanTab = React.memo(function EuclideanTab(props: IDockviewPanelHeaderProps) { + return } />; +}); + +const HyperbolicTab = React.memo(function HyperbolicTab(props: IDockviewPanelHeaderProps) { + return } />; +}); + +const SamplesTab = React.memo(function SamplesTab(props: IDockviewPanelHeaderProps) { + return } />; +}); + +const VideoTab = React.memo(function VideoTab(props: IDockviewPanelHeaderProps) { + return } />; +}); + +const CurationTab = React.memo(function CurationTab(props: IDockviewPanelHeaderProps) { + return } />; +}); + +// Grid panel uses context to get samples +const GridDockPanel = React.memo(function GridDockPanel() { + const ctx = useDockviewContext(); + return ( + + ); +}); + +// Explorer panel for left zone +const ExplorerDockPanel = React.memo(function ExplorerDockPanel() { + return ; +}); + +// Placeholder panel for right/bottom zones +const PlaceholderDockPanel = React.memo(function PlaceholderDockPanel( + props: IDockviewPanelProps +) { + const handleClose = React.useCallback(() => { + props.api.close(); + }, [props.api]); + + return ; +}); + +const VideoDockPanel = React.memo(function VideoDockPanel( + props: IDockviewPanelProps<{ sampleId?: string }> +) { + return ; +}); + +const CurationDockPanel = React.memo(function CurationDockPanel() { + return ; +}); + +// Watermark shown when dock is empty - just the logo, no text +const Watermark = React.memo(function Watermark(_props: IWatermarkPanelProps) { + return ( +
+
+ +
+
+ ); +}); + +// Stable components object - never changes +const COMPONENTS = { + grid: GridDockPanel, + video: VideoDockPanel, + curation: CurationDockPanel, + scatter: ScatterDockPanel, + explorer: ExplorerDockPanel, + placeholder: PlaceholderDockPanel, +}; + +// Tab components with icons +const TAB_COMPONENTS = { + euclideanTab: EuclideanTab, + hyperbolicTab: HyperbolicTab, + samplesTab: SamplesTab, + videoTab: VideoTab, + curationTab: CurationTab, +}; + +// ----------------------------------------------------------------------------- +// Provider Component +// ----------------------------------------------------------------------------- +interface DockviewProviderProps { + children: ReactNode; + samples: Sample[]; + onLoadMore: () => void; + hasMore: boolean; +} + +export function DockviewProvider({ + children, + samples, + onLoadMore, + hasMore, +}: DockviewProviderProps) { + const [api, setApi] = useState(null); + + const contextValue = useMemo( + () => ({ + api, + setApi, + samples, + onLoadMore, + hasMore, + }), + [api, samples, onLoadMore, hasMore] + ); + + return ( + + {children} + + ); +} + +function applyZonePolicies(api: DockviewApi) { + const explorer = api.getPanel(PANEL.EXPLORER); + if (explorer) { + explorer.group.locked = true; + explorer.group.header.hidden = true; + explorer.api.setActive(); + } + + // Hide tab headers for placeholder panels + const rightPlaceholder = api.getPanel(PANEL.RIGHT_PLACEHOLDER); + if (rightPlaceholder) { + rightPlaceholder.group.header.hidden = true; + } + + const bottomPlaceholder = api.getPanel(PANEL.BOTTOM_PLACEHOLDER); + if (bottomPlaceholder) { + bottomPlaceholder.group.header.hidden = true; + } +} + +// ----------------------------------------------------------------------------- +// Workspace Component - the actual dockview renderer +// ----------------------------------------------------------------------------- +export function DockviewWorkspace() { + const ctx = useDockviewContext(); + const datasetInfo = useStore((state) => state.datasetInfo); + const { setLeftPanelOpen, setRightPanelOpen, setBottomPanelOpen } = useStore(); + + const buildDefaultLayout = useCallback( + (api: DockviewApi) => { + const layouts = datasetInfo?.layouts ?? []; + const euclideanLayout = findLayoutByGeometry(layouts, "euclidean"); + const poincareLayout = findLayoutByGeometry(layouts, "poincare"); + const fallbackLayout = !euclideanLayout && !poincareLayout ? layouts[0] : null; + const hasLayouts = layouts.length > 0; + + // Create the grid panel first (center zone) + const gridPanel = + api.getPanel(PANEL.GRID) ?? + api.addPanel({ + id: PANEL.GRID, + component: "grid", + title: "Clip Previews", + tabComponent: "samplesTab", + renderer: "always", + }); + + api.getPanel(PANEL.VIDEO) ?? + api.addPanel({ + id: PANEL.VIDEO, + component: "video", + title: "Video", + tabComponent: "videoTab", + position: { + referencePanel: gridPanel.id, + direction: "within", + }, + renderer: "always", + }); + + api.getPanel(PANEL.CURATION) ?? + api.addPanel({ + id: PANEL.CURATION, + component: "curation", + title: "Curation", + tabComponent: "curationTab", + position: { + referencePanel: gridPanel.id, + direction: "within", + }, + renderer: "always", + }); + + let scatterPanel: typeof gridPanel | null = null; + + if (hasLayouts && euclideanLayout) { + scatterPanel = + api.getPanel(PANEL.SCATTER_EUCLIDEAN) ?? + api.addPanel({ + id: PANEL.SCATTER_EUCLIDEAN, + component: "scatter", + title: "Euclidean", + tabComponent: "euclideanTab", + params: { + layoutKey: euclideanLayout.layout_key, + geometry: "euclidean" as Geometry, + }, + position: { + referencePanel: gridPanel.id, + direction: "right", + }, + renderer: "always", + }); + } + + if (hasLayouts && poincareLayout) { + const position = scatterPanel + ? { referencePanel: scatterPanel.id, direction: "within" as const } + : { referencePanel: gridPanel.id, direction: "right" as const }; + + const poincarePanel = + api.getPanel(PANEL.SCATTER_POINCARE) ?? + api.addPanel({ + id: PANEL.SCATTER_POINCARE, + component: "scatter", + title: "Hyperbolic", + tabComponent: "hyperbolicTab", + params: { + layoutKey: poincareLayout.layout_key, + geometry: "poincare" as Geometry, + }, + position, + renderer: "always", + }); + + if (!scatterPanel) { + scatterPanel = poincarePanel; + } + } + + if (!hasLayouts) { + const euclideanPanel = + api.getPanel(PANEL.SCATTER_EUCLIDEAN) ?? + api.addPanel({ + id: PANEL.SCATTER_EUCLIDEAN, + component: "scatter", + title: "Euclidean", + tabComponent: "euclideanTab", + params: { + geometry: "euclidean" as Geometry, + }, + position: { + referencePanel: gridPanel.id, + direction: "right", + }, + renderer: "always", + }); + + api.getPanel(PANEL.SCATTER_POINCARE) ?? + api.addPanel({ + id: PANEL.SCATTER_POINCARE, + component: "scatter", + title: "Hyperbolic", + tabComponent: "hyperbolicTab", + params: { + geometry: "poincare" as Geometry, + }, + position: { + referencePanel: euclideanPanel.id, + direction: "within" as const, + }, + renderer: "always", + }); + + scatterPanel = euclideanPanel; + } + + if (fallbackLayout && !scatterPanel) { + api.getPanel(PANEL.SCATTER_DEFAULT) ?? + api.addPanel({ + id: PANEL.SCATTER_DEFAULT, + component: "scatter", + title: "Embeddings", + params: { + layoutKey: fallbackLayout.layout_key, + }, + position: { + referencePanel: gridPanel.id, + direction: "right", + }, + renderer: "always", + }); + } + + const containerWidth = getContainerWidth(api); + const explorerPanel = + api.getPanel(PANEL.EXPLORER) ?? + api.addPanel({ + id: PANEL.EXPLORER, + component: "explorer", + title: "Labels", + position: getZonePosition("left"), + initialWidth: getDefaultLeftPanelWidth(containerWidth), + minimumWidth: MIN_SIDE_PANEL_WIDTH, + maximumWidth: getDefaultLeftPanelWidth(containerWidth), + }); + + if (explorerPanel) { + explorerPanel.group.locked = true; + explorerPanel.group.header.hidden = true; + explorerPanel.api.setActive(); + } + + setLeftPanelOpen(!!explorerPanel); + setRightPanelOpen(false); + setBottomPanelOpen(false); + }, + [datasetInfo, setLeftPanelOpen, setRightPanelOpen, setBottomPanelOpen] + ); + + const onReady = useCallback( + (event: DockviewReadyEvent) => { + ctx.setApi(event.api); + + const stored = localStorage.getItem(LAYOUT_STORAGE_KEY); + if (stored) { + try { + event.api.fromJSON(JSON.parse(stored)); + if (event.api.totalPanels === 0) { + localStorage.removeItem(LAYOUT_STORAGE_KEY); + buildDefaultLayout(event.api); + } + + // Re-apply side-zone policies after restore (header hidden, no-drop targets, etc) + applyZonePolicies(event.api); + + // Sync store state with restored layout + setLeftPanelOpen(!!event.api.getPanel(PANEL.EXPLORER)); + setRightPanelOpen(!!event.api.getPanel(PANEL.RIGHT_PLACEHOLDER)); + setBottomPanelOpen(!!event.api.getPanel(PANEL.BOTTOM_PLACEHOLDER)); + return; + } catch (err) { + console.warn("Failed to restore dock layout, resetting.", err); + localStorage.removeItem(LAYOUT_STORAGE_KEY); + } + } + + if (event.api.totalPanels === 0) { + buildDefaultLayout(event.api); + } + }, + [buildDefaultLayout, ctx, setLeftPanelOpen, setRightPanelOpen, setBottomPanelOpen] + ); + + // Save layout on changes + useEffect(() => { + const api = ctx.api; + if (!api) return; + + const disposable = api.onDidLayoutChange(() => { + if (api.totalPanels === 0) return; + const layout = api.toJSON(); + localStorage.setItem(LAYOUT_STORAGE_KEY, JSON.stringify(layout)); + }); + + return () => disposable.dispose(); + }, [ctx.api]); + + // Sync panel state when panels are closed + useEffect(() => { + const api = ctx.api; + if (!api) return; + + const disposable = api.onDidRemovePanel((e) => { + if (e.id === PANEL.EXPLORER) setLeftPanelOpen(false); + if (e.id === PANEL.RIGHT_PLACEHOLDER) setRightPanelOpen(false); + if (e.id === PANEL.BOTTOM_PLACEHOLDER) setBottomPanelOpen(false); + }); + + return () => disposable.dispose(); + }, [ctx.api, setLeftPanelOpen, setRightPanelOpen, setBottomPanelOpen]); + + // When a real panel is dropped into a placeholder group, close the placeholder + useEffect(() => { + const api = ctx.api; + if (!api) return; + + const disposable = api.onDidAddPanel((e) => { + // Skip if the added panel is a placeholder itself + if (e.id === PANEL.RIGHT_PLACEHOLDER || e.id === PANEL.BOTTOM_PLACEHOLDER) { + return; + } + + // Check if this panel was added to the same group as a placeholder + const group = e.group; + if (!group) return; + + // Find and close any placeholder panels in the same group + const rightPlaceholder = api.getPanel(PANEL.RIGHT_PLACEHOLDER); + const bottomPlaceholder = api.getPanel(PANEL.BOTTOM_PLACEHOLDER); + + if (rightPlaceholder && rightPlaceholder.group?.id === group.id) { + rightPlaceholder.api.close(); + } + if (bottomPlaceholder && bottomPlaceholder.group?.id === group.id) { + bottomPlaceholder.api.close(); + } + }); + + return () => disposable.dispose(); + }, [ctx.api]); + + // Prevent dragging locked panels (explorer only) + useEffect(() => { + const api = ctx.api; + if (!api) return; + + const disposable = api.onWillDragPanel((event) => { + if (DRAG_LOCKED_PANEL_IDS.has(event.panel.id)) { + event.nativeEvent.preventDefault(); + } + }); + + return () => disposable.dispose(); + }, [ctx.api]); + + // Rebuild layout when dataset info changes + useEffect(() => { + if (!ctx.api) return; + if (!datasetInfo) return; + + const hasScatter = + ctx.api.getPanel(PANEL.SCATTER_EUCLIDEAN) || + ctx.api.getPanel(PANEL.SCATTER_POINCARE) || + ctx.api.getPanel(PANEL.SCATTER_DEFAULT); + + if (!hasScatter) { + buildDefaultLayout(ctx.api); + } + }, [buildDefaultLayout, datasetInfo, ctx.api]); + + return ( +
+ +
+ ); +} diff --git a/frontend/src/components/ExplorerPanel.tsx b/frontend/src/components/ExplorerPanel.tsx new file mode 100644 index 0000000..b18c36a --- /dev/null +++ b/frontend/src/components/ExplorerPanel.tsx @@ -0,0 +1,136 @@ +"use client"; + +import React from "react"; +import { useStore } from "@/store/useStore"; +import { Panel } from "./Panel"; +import { PanelHeader } from "./PanelHeader"; +import { Search, Tag } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { FALLBACK_LABEL_COLOR, MISSING_LABEL_COLOR, normalizeLabel } from "@/lib/labelColors"; +import { useLabelLegend } from "./useLabelLegend"; + +interface ExplorerPanelProps { + className?: string; +} + +export function ExplorerPanel({ className }: ExplorerPanelProps) { + const { + datasetInfo, + embeddingsByLayoutKey, + activeLayoutKey, + labelFilter, + setLabelFilter, + } = useStore(); + const [labelSearch, setLabelSearch] = React.useState(""); + const [isSearchOpen, setIsSearchOpen] = React.useState(false); + const searchInputRef = React.useRef(null); + + const resolvedLayoutKey = + activeLayoutKey ?? datasetInfo?.layouts?.[0]?.layout_key ?? null; + const embeddings = resolvedLayoutKey + ? embeddingsByLayoutKey[resolvedLayoutKey] ?? null + : null; + + const { + labelCounts, + labelColorMap, + legendLabels, + } = useLabelLegend({ datasetInfo, embeddings, labelSearch, labelFilter }); + + const hasCounts = labelCounts.size > 0; + + const activeLabel = labelFilter ? normalizeLabel(labelFilter) : null; + + // Focus search input when opened + React.useEffect(() => { + if (isSearchOpen && searchInputRef.current) { + searchInputRef.current.focus(); + } + }, [isSearchOpen]); + + const handleSearchToggle = () => { + setIsSearchOpen(!isSearchOpen); + if (isSearchOpen) { + setLabelSearch(""); + } + }; + + return ( + + }> + {/* Search toggle button in header toolbar */} + + + + {/* Search input - shown when search is toggled */} + {isSearchOpen && ( +
+ setLabelSearch(e.target.value)} + placeholder="Filter labels..." + className="w-full h-6 px-2 rounded bg-background border border-border text-[12px] leading-[16px] text-foreground placeholder:text-muted-foreground/50 outline-none focus:ring-1 focus:ring-ring focus:border-ring" + /> +
+ )} + + {/* Scrollable labels list */} +
+ {legendLabels.length === 0 ? ( +
+ No labels available +
+ ) : ( +
+ {legendLabels.map((label) => { + const color = + label === "undefined" + ? MISSING_LABEL_COLOR + : labelColorMap[label] ?? FALLBACK_LABEL_COLOR; + const normalized = normalizeLabel(label); + const isActive = activeLabel === normalized; + const isDimmed = activeLabel && !isActive; + + return ( + + ); + })} +
+ )} +
+
+ ); +} diff --git a/frontend/src/components/GlobalSeekBar.tsx b/frontend/src/components/GlobalSeekBar.tsx new file mode 100644 index 0000000..8e296e3 --- /dev/null +++ b/frontend/src/components/GlobalSeekBar.tsx @@ -0,0 +1,92 @@ +"use client"; + +import { Pause, Play, SkipBack, SkipForward } from "lucide-react"; +import { useMemo } from "react"; +import { useStore } from "@/store/useStore"; + +function formatTime(seconds: number): string { + if (!Number.isFinite(seconds) || seconds < 0) return "00:00"; + const total = Math.floor(seconds); + const mins = Math.floor(total / 60); + const secs = total % 60; + return `${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")}`; +} + +export function GlobalSeekBar() { + const { + activeVideoId, + globalSeekTime, + setGlobalSeekTime, + isTimelinePlaying, + setTimelinePlaying, + videoDurations, + } = useStore(); + + const duration = useMemo(() => { + if (!activeVideoId) return 0; + return videoDurations[activeVideoId] ?? 0; + }, [activeVideoId, videoDurations]); + + const canSeek = Boolean(activeVideoId) && duration > 0; + + const jump = (delta: number) => { + if (!canSeek) return; + const next = Math.max(0, Math.min(duration, globalSeekTime + delta)); + setGlobalSeekTime(next); + }; + + return ( +
+ + + + + + + + {formatTime(globalSeekTime)} + + + setGlobalSeekTime(Number(event.target.value))} + disabled={!canSeek} + className="flex-1 accent-primary disabled:opacity-50" + /> + + {formatTime(duration)} + +
+ {activeVideoId ? `active: ${activeVideoId}` : "Select a video sample to enable global timeline"} +
+
+ ); +} diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 4918db0..ebc3521 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -1,61 +1,297 @@ "use client"; import { useStore } from "@/store/useStore"; +import { Button } from "@/components/ui/button"; +import { HyperViewLogo } from "./icons"; +import { FaDiscord } from "react-icons/fa"; +import { CENTER_PANEL_DEFS, useDockviewApi } from "./DockviewWorkspace"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from "@/components/ui/command"; +import { + ChevronDown, + RotateCcw, + Check, + PanelLeft, + PanelBottom, + PanelRight, + Settings, + Search, + Github, +} from "lucide-react"; +import { useState } from "react"; +import { cn } from "@/lib/utils"; +import { isLabelColorMapId } from "@/lib/labelColors"; +import { + LABEL_COLOR_MAP_OPTIONS, + useColorSettings, +} from "@/store/useColorSettings"; + +const GITHUB_URL = "https://github.com/Hyper3Labs/HyperView"; +const DISCORD_URL = process.env.NEXT_PUBLIC_DISCORD_URL ?? "https://discord.gg/Qf2pXtY4Vf"; +const PANEL_CONFIG = CENTER_PANEL_DEFS; export function Header() { - const { datasetInfo, selectedIds, clearSelection } = useStore(); + const { datasetInfo, leftPanelOpen, rightPanelOpen, bottomPanelOpen } = useStore(); + const dockview = useDockviewApi(); + const [datasetPickerOpen, setDatasetPickerOpen] = useState(false); + const labelColorMapId = useColorSettings((state) => state.labelColorMapId); + const setLabelColorMapId = useColorSettings((state) => state.setLabelColorMapId); + + const handleLabelColorMapChange = (nextValue: string) => { + if (!isLabelColorMapId(nextValue)) return; + setLabelColorMapId(nextValue); + }; + + const handlePanelToggle = (panelId: string) => { + if (!dockview?.api) return; + const panel = dockview.api.getPanel(panelId); + if (panel) { + panel.api.close(); + return; + } + dockview.addPanel(panelId); + }; + + // Check which panels are currently open + const openPanels = new Set( + PANEL_CONFIG.map((p) => p.id).filter((id) => dockview?.api?.getPanel(id)) + ); return ( -
- {/* Logo and title */} -
-
- - - -
-
-

HyperView

- {datasetInfo && ( -

{datasetInfo.name}

+
+ {/* Left side: Logo + View menu */} +
+ {/* Logo */} +
+ +
+ + {/* View dropdown */} + {dockview && ( + + + + + + {/* Panel toggles - no section header, similar to Rerun */} + {PANEL_CONFIG.map((panel) => { + const Icon = panel.icon; + const isOpen = openPanels.has(panel.id); + return ( + handlePanelToggle(panel.id)} + className="justify-between" + > + + + {panel.label} + + {isOpen && } + + ); + })} + + {/* Spacer */} +
+ + {/* Reset layout */} + dockview.resetLayout()} + className="gap-1.5" + > + + Reset Layout + + + )}
-
- - {/* Dataset info and actions */} -
- {datasetInfo && ( -
-
- Samples: - {datasetInfo.num_samples.toLocaleString()} -
-
- Labels: - {datasetInfo.labels.length} -
-
- )} - {selectedIds.size > 0 && ( - + + + + + + + No datasets found. + + + {/* Currently only show the loaded dataset */} + {datasetInfo && ( + setDatasetPickerOpen(false)} + className="text-[12px] leading-[16px]" + > + {datasetInfo.name} + + {datasetInfo.num_samples.toLocaleString()} clips + + + + )} + + + + + +
+ + {/* Right side: GitHub + Discord + Panel toggles + Settings */} +
+ {/* GitHub link */} + + + + + {/* Discord link */} + - Clear selection ({selectedIds.size}) - - )} -
+ + + + {/* Separator */} +
+ + {/* Left panel toggle */} + + + {/* Bottom panel toggle */} + + + {/* Right panel toggle */} + + + {/* Separator */} +
+ + {/* Settings menu */} + + + + + + Color Settings + + Label Palette + + {LABEL_COLOR_MAP_OPTIONS.map((option) => ( + + {option.label} + + ))} + + + setLabelColorMapId("auto")}>Reset to Auto + + +
); } diff --git a/frontend/src/components/ImageGrid.tsx b/frontend/src/components/ImageGrid.tsx index f5bc25e..d1fd07f 100644 --- a/frontend/src/components/ImageGrid.tsx +++ b/frontend/src/components/ImageGrid.tsx @@ -1,8 +1,11 @@ "use client"; -import { useCallback, useEffect, useRef, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useVirtualizer } from "@tanstack/react-virtual"; +import justifiedLayout from "justified-layout"; import { useStore } from "@/store/useStore"; +import { Panel } from "./Panel"; +import { CheckIcon } from "./icons"; import type { Sample } from "@/types"; interface ImageGridProps { @@ -11,71 +14,161 @@ interface ImageGridProps { hasMore?: boolean; } -const GAP = 8; -const ITEM_HEIGHT = 200; -const MIN_ITEM_WIDTH = 200; // Minimum width for each image +// Justified layout config +const BOX_SPACING = 2; // Tight spacing between images +const TARGET_ROW_HEIGHT = 180; // Target height for rows +const DEFAULT_ASPECT_RATIO = 1; // Fallback for samples without dimensions + +/** + * Get aspect ratio from sample, with fallback + */ +function getAspectRatio(sample: Sample): number { + if (sample.width && sample.height && sample.height > 0) { + return sample.width / sample.height; + } + return DEFAULT_ASPECT_RATIO; +} + +/** + * Compute justified layout geometry for samples + */ +function computeLayout( + samples: Sample[], + containerWidth: number +): { boxes: Array<{ width: number; height: number; top: number; left: number }>; containerHeight: number } { + if (samples.length === 0 || containerWidth <= 0) { + return { boxes: [], containerHeight: 0 }; + } + + const aspectRatios = samples.map(getAspectRatio); + + const geometry = justifiedLayout(aspectRatios, { + containerWidth, + containerPadding: 0, + boxSpacing: BOX_SPACING, + targetRowHeight: TARGET_ROW_HEIGHT, + targetRowHeightTolerance: 0.25, + showWidows: true, // Always show last row even if incomplete + }); + + return { + boxes: geometry.boxes, + containerHeight: geometry.containerHeight, + }; +} + +/** + * Group boxes into rows for virtualization + */ +interface RowData { + startIndex: number; + endIndex: number; // exclusive + top: number; + height: number; +} + +function groupIntoRows( + boxes: Array<{ width: number; height: number; top: number; left: number }> +): RowData[] { + if (boxes.length === 0) return []; + + const rows: RowData[] = []; + let currentRowTop = boxes[0].top; + let currentRowStart = 0; + let currentRowHeight = boxes[0].height; + + for (let i = 1; i < boxes.length; i++) { + const box = boxes[i]; + // New row if top position changes significantly + if (Math.abs(box.top - currentRowTop) > 1) { + rows.push({ + startIndex: currentRowStart, + endIndex: i, + top: currentRowTop, + height: currentRowHeight, + }); + currentRowStart = i; + currentRowTop = box.top; + currentRowHeight = box.height; + } else { + // Same row - take max height in case of slight variations + currentRowHeight = Math.max(currentRowHeight, box.height); + } + } + + // Push final row + rows.push({ + startIndex: currentRowStart, + endIndex: boxes.length, + top: currentRowTop, + height: currentRowHeight, + }); + + return rows; +} export function ImageGrid({ samples, onLoadMore, hasMore }: ImageGridProps) { const containerRef = useRef(null); - const { selectedIds, isLassoSelection, toggleSelection, addToSelection, setHoveredId, hoveredId } = useStore(); - const [columnCount, setColumnCount] = useState(4); + const [containerWidth, setContainerWidth] = useState(0); - // Calculate column count based on container width + const { + selectedIds, + isLassoSelection, + selectionSource, + toggleSelection, + addToSelection, + setHoveredId, + hoveredId, + labelFilter, + } = useStore(); + + // Track container width for layout computation useEffect(() => { - const updateColumnCount = () => { - if (!containerRef.current) return; - const containerWidth = containerRef.current.clientWidth; - const padding = 16; // Total horizontal padding (8px each side) - const availableWidth = containerWidth - padding; - - // Calculate how many columns can fit - const columns = Math.max(1, Math.floor((availableWidth + GAP) / (MIN_ITEM_WIDTH + GAP))); - setColumnCount(columns); + const container = containerRef.current; + if (!container) return; + + const updateWidth = () => { + const width = container.clientWidth; + if (width > 0 && width !== containerWidth) { + setContainerWidth(width); + } }; - updateColumnCount(); + updateWidth(); - const resizeObserver = new ResizeObserver(updateColumnCount); - if (containerRef.current) { - resizeObserver.observe(containerRef.current); - } + const resizeObserver = new ResizeObserver(() => { + requestAnimationFrame(updateWidth); + }); + resizeObserver.observe(container); return () => resizeObserver.disconnect(); - }, []); + }, [containerWidth]); - // Filter samples based on selection - const filteredSamples = useMemo(() => { - // Only filter (hide non-selected) when it's a lasso selection - if (isLassoSelection && selectedIds.size > 0) { - return samples.filter((sample) => selectedIds.has(sample.id)); - } - - // Otherwise, show all samples - return samples; - }, [samples, selectedIds, isLassoSelection]); - - // Calculate rows from filtered samples - const rowCount = Math.ceil(filteredSamples.length / columnCount); - - // Create stable row keys based on the sample IDs in each row - const getRowKey = useCallback( - (index: number) => { - const startIndex = index * columnCount; - const rowSamples = filteredSamples.slice(startIndex, startIndex + columnCount); - return rowSamples.map((s) => s.id).join("-") || `row-${index}`; - }, - [filteredSamples, columnCount] + // Compute justified layout + const { boxes, containerHeight } = useMemo( + () => computeLayout(samples, containerWidth), + [samples, containerWidth] ); + // Group into rows for virtualization + const rows = useMemo(() => groupIntoRows(boxes), [boxes]); + + // Virtualizer for rows const virtualizer = useVirtualizer({ - count: rowCount, + count: rows.length, getScrollElement: () => containerRef.current, - estimateSize: () => ITEM_HEIGHT + GAP, - overscan: 5, - getItemKey: getRowKey, + estimateSize: (index) => rows[index]?.height ?? TARGET_ROW_HEIGHT, + overscan: 3, + getItemKey: (index) => { + const row = rows[index]; + if (!row) return `row-${index}`; + // Create stable key from sample IDs in this row + const rowSamples = samples.slice(row.startIndex, row.endIndex); + return rowSamples.map((s) => s.id).join("-") || `row-${index}`; + }, }); - // Load more when scrolling near the bottom + // Load more when scrolling near bottom useEffect(() => { const container = containerRef.current; if (!container || !onLoadMore || !hasMore) return; @@ -91,18 +184,30 @@ export function ImageGrid({ samples, onLoadMore, hasMore }: ImageGridProps) { return () => container.removeEventListener("scroll", handleScroll); }, [onLoadMore, hasMore]); - // Reset virtualizer measurements when selection or filter mode changes + // Reset scroll on filter change + useEffect(() => { + containerRef.current?.scrollTo({ top: 0 }); + }, [labelFilter]); + + // Scroll to top when scatter selection made useEffect(() => { - virtualizer.measure(); - }, [selectedIds, isLassoSelection, virtualizer]); + if (isLassoSelection) return; + if (selectionSource !== "scatter") return; + if (selectedIds.size === 0) return; + try { + virtualizer.scrollToIndex(0, { align: "start" }); + } catch { + containerRef.current?.scrollTo({ top: 0 }); + } + }, [isLassoSelection, selectedIds, selectionSource, virtualizer]); + + // Handle click with selection logic const handleClick = useCallback( (sample: Sample, event: React.MouseEvent) => { if (event.metaKey || event.ctrlKey) { - // Multi-select with Cmd/Ctrl toggleSelection(sample.id); } else if (event.shiftKey && selectedIds.size > 0) { - // Range select with Shift - use original samples array, not filtered const selectedArray = Array.from(selectedIds); const lastSelected = selectedArray[selectedArray.length - 1]; const lastIndex = samples.findIndex((s) => s.id === lastSelected); @@ -115,147 +220,119 @@ export function ImageGrid({ samples, onLoadMore, hasMore }: ImageGridProps) { addToSelection(rangeIds); } } else { - // Single select const newSet = new Set(); newSet.add(sample.id); - useStore.getState().setSelectedIds(newSet); + useStore.getState().setSelectedIds(newSet, "grid"); } }, [samples, selectedIds, toggleSelection, addToSelection] ); - const items = virtualizer.getVirtualItems(); + const virtualRows = virtualizer.getVirtualItems(); return ( -
- {/* Header */} -
-
- Samples - - {selectedIds.size > 0 ? `${selectedIds.size} selected` : `${filteredSamples.length} items`} - -
- {selectedIds.size > 0 && ( - - )} -
+ {virtualRows.map((virtualRow) => { + const row = rows[virtualRow.index]; + if (!row) return null; - {/* Grid Container */} -
-
- {items.map((virtualRow) => { - const rowIndex = virtualRow.index; - const startIndex = rowIndex * columnCount; - const rowSamples = filteredSamples.slice(startIndex, startIndex + columnCount); - - return ( -
- {rowSamples.map((sample) => { - const isSelected = selectedIds.has(sample.id); - const isHovered = hoveredId === sample.id; - - return ( -
handleClick(sample, e)} - onMouseEnter={() => setHoveredId(sample.id)} - onMouseLeave={() => setHoveredId(null)} - > - {/* Image */} - {sample.thumbnail ? ( - {sample.filename} - ) : ( -
- No image -
- )} - - {/* Label badge */} - {sample.label && ( -
- - {sample.label} - -
- )} - - {/* Selection indicator */} - {isSelected && ( -
- - - -
- )} -
- ); - })} - {/* Fill empty cells */} - {Array.from({ length: columnCount - rowSamples.length }).map((_, i) => ( -
- ))} -
- ); - })} -
-
+ const rowSamples = samples.slice(row.startIndex, row.endIndex); + const rowBoxes = boxes.slice(row.startIndex, row.endIndex); - {/* Instructions footer */} -
- - Click to select • Cmd/Ctrl+click to multi-select • Shift+click for range - + return ( +
+ {rowSamples.map((sample, i) => { + const box = rowBoxes[i]; + if (!box) return null; + + const isSelected = isLassoSelection ? true : selectedIds.has(sample.id); + const isHovered = hoveredId === sample.id; + + return ( +
handleClick(sample, e)} + onMouseEnter={() => setHoveredId(sample.id)} + onMouseLeave={() => setHoveredId(null)} + > + {/* Image container - justified layout sizes tile to preserve aspect ratio */} + {/* Future: overlays (segmentations, bboxes) will be absolutely positioned here */} + {sample.thumbnail ? ( + // eslint-disable-next-line @next/next/no-img-element + {sample.filename} + ) : ( +
+ No preview +
+ )} + + {/* Label badge */} + {sample.label && ( +
+ + {sample.label} + +
+ )} + + {/* Selection indicator */} + {isSelected && ( +
+ +
+ )} +
+ ); + })} +
+ ); + })} +
+
-
+ ); } diff --git a/frontend/src/components/Panel.tsx b/frontend/src/components/Panel.tsx new file mode 100644 index 0000000..5058fa5 --- /dev/null +++ b/frontend/src/components/Panel.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { ReactNode } from "react"; +import { cn } from "@/lib/utils"; + +interface PanelProps { + children: ReactNode; + className?: string; +} + +/** + * Base panel container with consistent Rerun-style appearance. + * No borders or rounded corners - panels should be flush against each other. + */ +export function Panel({ children, className }: PanelProps) { + return ( +
+ {children} +
+ ); +} + +interface PanelFooterProps { + children: ReactNode; + className?: string; +} + +/** + * Panel footer for keyboard shortcuts/hints. + */ +export function PanelFooter({ children, className }: PanelFooterProps) { + return ( +
+ {children} +
+ ); +} diff --git a/frontend/src/components/PanelContextBar.tsx b/frontend/src/components/PanelContextBar.tsx new file mode 100644 index 0000000..5eb6c14 --- /dev/null +++ b/frontend/src/components/PanelContextBar.tsx @@ -0,0 +1,179 @@ +"use client"; + +import { Check, ChevronDown } from "lucide-react"; +import { type ReactNode } from "react"; + +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export interface PanelContextOption { + value: string; + label: string; + group?: string; + disabled?: boolean; +} + +interface PanelContextBaseItem { + id: string; + label: string; + showLabel?: boolean; + value: string; + placeholder?: string; + valueTitle?: string; + valueClassName?: string; +} + +export interface PanelContextStaticItem extends PanelContextBaseItem { + kind?: "static"; +} + +export interface PanelContextSelectItem extends PanelContextBaseItem { + kind: "select"; + options: PanelContextOption[]; + onValueChange: (value: string) => void; + disabled?: boolean; +} + +export type PanelContextItem = PanelContextStaticItem | PanelContextSelectItem; + +interface PanelContextBarProps { + items: PanelContextItem[]; + rightContent?: ReactNode; + className?: string; +} + +export function PanelContextBar({ items, rightContent, className }: PanelContextBarProps) { + const visibleItems = items.filter((item) => item.value.trim().length > 0 || item.kind === "select"); + + if (visibleItems.length === 0 && !rightContent) { + return null; + } + + return ( +
+
+ {visibleItems.map((item, index) => { + const valueTitle = item.valueTitle ?? item.value; + const showLabel = item.showLabel ?? item.label.trim().length > 0; + const selectedLabel = + item.kind === "select" + ? item.options.find((option) => option.value === item.value)?.label + : undefined; + const displayValue = selectedLabel ?? item.value ?? item.placeholder ?? "Select"; + + return ( +
+ {index > 0 &&
+ ); + })} +
+ + {rightContent &&
{rightContent}
} +
+ ); +} diff --git a/frontend/src/components/PanelHeader.tsx b/frontend/src/components/PanelHeader.tsx new file mode 100644 index 0000000..399fc25 --- /dev/null +++ b/frontend/src/components/PanelHeader.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { ReactNode } from "react"; +import { cn } from "@/lib/utils"; +import { PanelTitle } from "./PanelTitle"; + +interface PanelHeaderProps { + icon?: ReactNode; + title: string; + subtitle?: string; + children?: ReactNode; // Toolbar actions slot + className?: string; +} + +/** + * Rerun-style panel header with icon, title, and optional toolbar. + * + * Design tokens (from Rerun): + * - Title bar height: 24px + * - Icon size: 14px (3.5 tailwind units) + * - Icon-to-text gap: 4px (gap-1) + * - Font size: 12px with -0.15px tracking + * - Section header font: 11px uppercase + */ +export function PanelHeader({ icon, title, subtitle, children, className }: PanelHeaderProps) { + return ( +
+
+ + {subtitle && ( + {subtitle} + )} +
+ {children && ( +
{children}
+ )} +
+ ); +} diff --git a/frontend/src/components/PanelTitle.tsx b/frontend/src/components/PanelTitle.tsx new file mode 100644 index 0000000..095fb39 --- /dev/null +++ b/frontend/src/components/PanelTitle.tsx @@ -0,0 +1,40 @@ +"use client"; + +import { ReactNode } from "react"; + +import { cn } from "@/lib/utils"; + +interface PanelTitleProps { + title?: string; + icon?: ReactNode; + className?: string; + titleClassName?: string; + iconClassName?: string; + fullHeight?: boolean; +} + +export function PanelTitle({ + title, + icon, + className, + titleClassName, + iconClassName, + fullHeight = false, +}: PanelTitleProps) { + return ( +
+ {icon && ( + + {icon} + + )} + {title ?? ""} +
+ ); +} diff --git a/frontend/src/components/PlaceholderPanel.tsx b/frontend/src/components/PlaceholderPanel.tsx new file mode 100644 index 0000000..bf760fa --- /dev/null +++ b/frontend/src/components/PlaceholderPanel.tsx @@ -0,0 +1,39 @@ +"use client"; + +import React from "react"; +import { HyperViewLogo } from "./icons"; +import { Panel } from "./Panel"; +import { cn } from "@/lib/utils"; +import { X } from "lucide-react"; + +interface PlaceholderPanelProps { + className?: string; + onClose?: () => void; +} + +/** + * Empty placeholder panel with centered HyperView logo and a close button. + * Used for right and bottom zones that are reserved for future features. + * The close button is always visible in the top-right corner of the panel content. + */ +export function PlaceholderPanel({ className, onClose }: PlaceholderPanelProps) { + return ( + + {/* Close button always visible in top right */} + {onClose && ( + + )} +
+
+ +
+
+
+ ); +} diff --git a/frontend/src/components/ScatterPanel.tsx b/frontend/src/components/ScatterPanel.tsx index 177fea2..1091e23 100644 --- a/frontend/src/components/ScatterPanel.tsx +++ b/frontend/src/components/ScatterPanel.tsx @@ -1,402 +1,367 @@ "use client"; -import { useEffect, useRef, useCallback, useState } from "react"; -import { scaleLinear } from "d3-scale"; +import { useCallback, useEffect, useMemo, useState } from "react"; +import { Settings2 } from "lucide-react"; import { useStore } from "@/store/useStore"; -import type { ViewMode } from "@/types"; - -// Color utility -function hexToRgb(hex: string): [number, number, number] { - const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - if (result) { - return [ - parseInt(result[1], 16) / 255, - parseInt(result[2], 16) / 255, - parseInt(result[3], 16) / 255, - ]; - } - return [0.5, 0.5, 0.5]; -} - -// Default colors for points without labels -const DEFAULT_COLORS = [ - "#e6194b", "#3cb44b", "#ffe119", "#4363d8", "#f58231", - "#911eb4", "#46f0f0", "#f032e6", "#bcf60c", "#fabebe", - "#008080", "#e6beff", "#9a6324", "#fffac8", "#800000", -]; +import { Panel } from "./Panel"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { + PanelContextBar, + type PanelContextItem, + type PanelContextOption, +} from "./PanelContextBar"; +import { useHyperScatter } from "./useHyperScatter"; +import { useLabelLegend } from "./useLabelLegend"; +import type { Geometry } from "@/types"; +import { findLayoutByGeometry, listAvailableGeometries } from "@/lib/layouts"; +import { fetchEmbeddings } from "@/lib/api"; interface ScatterPanelProps { className?: string; + layoutKey?: string; + geometry?: Geometry; } -export function ScatterPanel({ className = "" }: ScatterPanelProps) { - const canvasRef = useRef(null); - const containerRef = useRef(null); - const svgGroupRef = useRef(null); - const scatterplotRef = useRef(null); - const [isInitialized, setIsInitialized] = useState(false); - +export function ScatterPanel({ + className = "", + layoutKey, + geometry, +}: ScatterPanelProps) { const { - embeddings, - viewMode, - setViewMode, + datasetInfo, + embeddingsByLayoutKey, + setEmbeddingsForLayout, selectedIds, setSelectedIds, + beginLassoSelection, hoveredId, setHoveredId, + setActiveLayoutKey, + labelFilter, } = useStore(); - // Sync SVG transform - const syncSvg = useCallback((event: any) => { - const { xScale, yScale } = event; + const [localGeometry, setLocalGeometry] = useState("euclidean"); + const [localLayoutKey, setLocalLayoutKey] = useState(null); + + // Check which geometries are available + const availableGeometries = useMemo(() => { + return listAvailableGeometries(datasetInfo?.layouts ?? []); + }, [datasetInfo?.layouts]); + + useEffect(() => { + if (geometry) return; + if (availableGeometries.length === 0) return; + if (!availableGeometries.includes(localGeometry)) { + setLocalGeometry(availableGeometries[0]); + } + }, [availableGeometries, geometry, localGeometry]); - if (svgGroupRef.current && xScale && yScale) { - // Calculate transform based on the actual scales used by the scatterplot - // The SVG is defined in [-1, 1] coordinate space (r=1 circle at 0,0) - // We want to map [-1, 1] to screen coordinates. + const resolvedGeometry = geometry ?? localGeometry; - // xScale(0) is the screen x-coordinate of the origin - // xScale(1) is the screen x-coordinate of x=1 - // So the scaling factor for x is xScale(1) - xScale(0) + const resolvedLayoutKey = useMemo(() => { + if (!datasetInfo) return localLayoutKey ?? layoutKey ?? null; - const scaleX = xScale(1) - xScale(0); - const scaleY = yScale(1) - yScale(0); - const translateX = xScale(0); - const translateY = yScale(0); + if (localLayoutKey) { + const exists = datasetInfo.layouts.some((layout) => layout.layout_key === localLayoutKey); + if (exists) return localLayoutKey; + } - svgGroupRef.current.setAttribute( - "transform", - `matrix(${scaleX}, 0, 0, ${scaleY}, ${translateX}, ${translateY})` - ); + if (layoutKey) { + const exists = datasetInfo.layouts.some((layout) => layout.layout_key === layoutKey); + if (exists) return layoutKey; } - }, []); - // Initialize scatterplot + const layout = findLayoutByGeometry(datasetInfo.layouts, resolvedGeometry); + return layout?.layout_key ?? datasetInfo.layouts[0]?.layout_key ?? null; + }, [datasetInfo, layoutKey, localLayoutKey, resolvedGeometry]); + useEffect(() => { - if (!canvasRef.current || !containerRef.current || isInitialized) return; - - let mounted = true; - - const initScatterplot = async () => { - try { - const createScatterplot = (await import("regl-scatterplot")).default; - - if (!mounted || !canvasRef.current || !containerRef.current) return; - - const { width, height } = containerRef.current.getBoundingClientRect(); - - // Initialize D3 scales for synchronization - // Our data is normalized to [-1, 1] - const xScale = scaleLinear().domain([-1, 1]); - const yScale = scaleLinear().domain([-1, 1]); - - const scatterplot = createScatterplot({ - canvas: canvasRef.current, - width, - height, - xScale, - yScale, - pointSize: 4, - pointSizeSelected: 8, - opacity: 0.8, - opacityInactiveMax: 0.2, - lassoColor: [0.31, 0.27, 0.90, 1], // Indigo primary #4F46E5 - lassoMinDelay: 10, - lassoMinDist: 2, - showReticle: true, - reticleColor: [1, 1, 1, 0.5], - colorBy: 'category', - pointColor: DEFAULT_COLORS, - }); - - // Handle view changes to sync SVG - scatterplot.subscribe("view", syncSvg); - - // Initial sync - const currentXScale = scatterplot.get("xScale"); - const currentYScale = scatterplot.get("yScale"); - if (currentXScale && currentYScale) { - syncSvg({ xScale: currentXScale, yScale: currentYScale }); - } - - // Handle lasso selection - scatterplot.subscribe("select", ({ points }: { points: number[] }) => { - if (points.length > 0) { - const currentEmbeddings = useStore.getState().embeddings; - if (currentEmbeddings) { - const selectedSampleIds = new Set( - points.map((idx) => currentEmbeddings.ids[idx]) - ); - // Mark this as a lasso selection - useStore.getState().setSelectedIds(selectedSampleIds, true); - } - } - }); - - // Handle deselection - scatterplot.subscribe("deselect", () => { - useStore.getState().setSelectedIds(new Set(), false); - }); - - // Handle point hover - scatterplot.subscribe( - "pointOver", - (pointIndex: number) => { - const currentEmbeddings = useStore.getState().embeddings; - if (currentEmbeddings && pointIndex >= 0) { - setHoveredId(currentEmbeddings.ids[pointIndex]); - } - } - ); + if (!datasetInfo || !localLayoutKey) return; + const exists = datasetInfo.layouts.some((layout) => layout.layout_key === localLayoutKey); + if (!exists) { + setLocalLayoutKey(null); + } + }, [datasetInfo, localLayoutKey]); - scatterplot.subscribe("pointOut", () => { - setHoveredId(null); - }); + const resolvedLayout = useMemo(() => { + if (!datasetInfo || !resolvedLayoutKey) return null; + return datasetInfo.layouts.find((layout) => layout.layout_key === resolvedLayoutKey) ?? null; + }, [datasetInfo, resolvedLayoutKey]); - scatterplotRef.current = scatterplot; - setIsInitialized(true); - } catch (error) { - console.error("Failed to initialize scatterplot:", error); - } - }; + const resolvedSpace = useMemo(() => { + if (!datasetInfo || !resolvedLayout) return null; + return datasetInfo.spaces.find((space) => space.space_key === resolvedLayout.space_key) ?? null; + }, [datasetInfo, resolvedLayout]); - initScatterplot(); + const geometryLayouts = useMemo(() => { + if (!datasetInfo) return []; + return datasetInfo.layouts.filter((layout) => layout.geometry === resolvedGeometry); + }, [datasetInfo, resolvedGeometry]); - return () => { - if (scatterplotRef.current) { - scatterplotRef.current.destroy(); - scatterplotRef.current = null; - setIsInitialized(false); - } - }; - }, [syncSvg]); + const modelOptions = useMemo(() => { + if (!datasetInfo || geometryLayouts.length === 0) return []; - // Update data when embeddings or viewMode changes - useEffect(() => { - if (!scatterplotRef.current || !embeddings) return; - - const coords = viewMode === "euclidean" ? embeddings.euclidean : embeddings.hyperbolic; - - // If switching to hyperbolic, try to sync SVG immediately - if (viewMode === "hyperbolic") { - // Small timeout to ensure SVG is rendered - setTimeout(() => { - if (scatterplotRef.current) { - const xScale = scatterplotRef.current.get("xScale"); - const yScale = scatterplotRef.current.get("yScale"); - if (xScale && yScale) { - syncSvg({ xScale, yScale }); - } - } - }, 0); - } + const seenSpaceKeys = new Set(); - // Build unique categories for color mapping - // Handle nulls by converting to "undefined" - const uniqueLabels = [...new Set(embeddings.labels.map((l) => l || "undefined"))]; - - const labelToCategory: Record = {}; - uniqueLabels.forEach((label, idx) => { - labelToCategory[label] = idx; - }); + return geometryLayouts.flatMap((layout) => { + if (seenSpaceKeys.has(layout.space_key)) return []; + seenSpaceKeys.add(layout.space_key); - // Build category array (integer indices for each point) - const categories = embeddings.labels.map((label) => { - const key = label || "undefined"; - return labelToCategory[key]; - }); + const space = datasetInfo.spaces.find((candidate) => candidate.space_key === layout.space_key); - // Build color palette from label colors - const colorPalette = uniqueLabels.map((label) => { - if (label === "undefined") return "#008080"; // Dark teal for undefined - return embeddings.label_colors[label] || "#808080"; + return [ + { + value: layout.space_key, + label: space?.model_id ?? layout.space_key, + group: space?.provider, + }, + ]; }); + }, [datasetInfo, geometryLayouts]); - // Set the color palette first - if (colorPalette.length > 0) { - scatterplotRef.current.set({ pointColor: colorPalette }); - } + const selectedSpaceKey = resolvedLayout?.space_key ?? modelOptions[0]?.value ?? ""; - scatterplotRef.current.draw({ - x: coords.map((c) => c[0]), - y: coords.map((c) => c[1]), - category: categories, - }); - - // Reset view to fit new points - scatterplotRef.current.reset(); - - // Try to sync again after draw - if (viewMode === "hyperbolic") { - setTimeout(() => { - if (scatterplotRef.current) { - const xScale = scatterplotRef.current.get("xScale"); - const yScale = scatterplotRef.current.get("yScale"); - if (xScale && yScale) { - syncSvg({ xScale, yScale }); - } - } - }, 100); - } - }, [embeddings, viewMode, isInitialized, syncSvg]); + const selectedProjectionMethod = resolvedLayout?.method ?? ""; - // Sync selection from store to scatterplot - useEffect(() => { - if (!scatterplotRef.current || !embeddings) return; + const selectedModelLabel = + modelOptions.find((option) => option.value === selectedSpaceKey)?.label ?? + resolvedSpace?.model_id ?? + ""; - const selectedIndices = Array.from(selectedIds) - .map((id) => embeddings.ids.indexOf(id)) - .filter((idx) => idx !== -1); + const projectionMethodOptions = useMemo(() => { + const methodsForSelectedModel = geometryLayouts + .filter((layout) => layout.space_key === selectedSpaceKey) + .map((layout) => layout.method); - scatterplotRef.current.select(selectedIndices, { preventEvent: true }); - }, [selectedIds, embeddings, isInitialized]); + const sourceMethods = + methodsForSelectedModel.length > 0 + ? methodsForSelectedModel + : geometryLayouts.map((layout) => layout.method); - // Handle resize - useEffect(() => { - if (!containerRef.current || !scatterplotRef.current) return; - - const resizeObserver = new ResizeObserver((entries) => { - for (const entry of entries) { - const { width, height } = entry.contentRect; - if (width > 0 && height > 0 && scatterplotRef.current) { - scatterplotRef.current.set({ width, height }); - } + return Array.from(new Set(sourceMethods)).sort(); + }, [geometryLayouts, selectedSpaceKey]); + + const handleModelChange = useCallback( + (nextSpaceKey: string) => { + if (!nextSpaceKey || geometryLayouts.length === 0) return; + + const targetLayout = + geometryLayouts.find( + (layout) => + layout.space_key === nextSpaceKey && layout.method === selectedProjectionMethod + ) ?? geometryLayouts.find((layout) => layout.space_key === nextSpaceKey); + + if (targetLayout) { + setLocalLayoutKey(targetLayout.layout_key); } - }); + }, + [geometryLayouts, selectedProjectionMethod] + ); - resizeObserver.observe(containerRef.current); - return () => resizeObserver.disconnect(); - }, [isInitialized]); + const handleProjectionMethodChange = useCallback( + (nextMethod: string) => { + if (!nextMethod || geometryLayouts.length === 0) return; - // Get unique labels for legend - const uniqueLabels = embeddings - ? [...new Set(embeddings.labels.map((l) => l || "undefined"))] - : []; + const targetLayout = + geometryLayouts.find( + (layout) => + layout.method === nextMethod && + layout.space_key === selectedSpaceKey + ) ?? geometryLayouts.find((layout) => layout.method === nextMethod); - return ( -
- {/* Header */} -
-
- Embeddings - - {/* View mode toggle */} -
- - + + + + Projection method + + + {projectionMethodOptions.length > 0 ? ( + - Hyperbolic - -
-
+ {projectionMethodOptions.map((method) => ( + + {method} + + ))} + + ) : ( +
+ No projection methods available +
+ )} + + + ), + [ + handleProjectionMethodChange, + projectionMethodOptions, + selectedProjectionMethod, + ] + ); - - {embeddings ? `${embeddings.ids.length} points` : "Loading..."} - -
+ const embeddings = resolvedLayoutKey ? embeddingsByLayoutKey[resolvedLayoutKey] ?? null : null; + + useEffect(() => { + if (!resolvedLayoutKey) return; + setActiveLayoutKey(resolvedLayoutKey); + }, [resolvedLayoutKey, setActiveLayoutKey]); + + useEffect(() => { + if (!resolvedLayoutKey) return; + if (embeddingsByLayoutKey[resolvedLayoutKey]) return; + + let cancelled = false; + + fetchEmbeddings(resolvedLayoutKey) + .then((data) => { + if (cancelled) return; + setEmbeddingsForLayout(resolvedLayoutKey, data); + }) + .catch((err) => { + if (cancelled) return; + console.error("Failed to load embeddings:", err); + }) + + return () => { + cancelled = true; + }; + }, [embeddingsByLayoutKey, resolvedLayoutKey, setEmbeddingsForLayout]); + + const { labelsInfo } = useLabelLegend({ datasetInfo, embeddings, labelFilter }); - {/* Main content area */} -
+ const { + canvasRef, + overlayCanvasRef, + containerRef, + handlePointerDown, + handlePointerMove, + handlePointerUp, + handlePointerLeave, + handleDoubleClick, + rendererError, + } = useHyperScatter({ + embeddings, + labelsInfo, + selectedIds, + hoveredId, + setSelectedIds, + beginLassoSelection, + setHoveredId, + hoverEnabled: !labelFilter, + }); + + const focusLayout = useCallback(() => { + if (!resolvedLayoutKey) return; + setActiveLayoutKey(resolvedLayoutKey); + }, [resolvedLayoutKey, setActiveLayoutKey]); + + const loadingLabel = resolvedLayoutKey + ? "Loading embeddings..." + : "No embeddings layout available"; + + return ( + + + + {/* Main content area - min-h-0 prevents flex overflow */} +
{/* Canvas container */} -
+
{ + focusLayout(); + handlePointerDown(e); + }} + onPointerMove={handlePointerMove} + onPointerUp={handlePointerUp} + onPointerCancel={handlePointerUp} + onPointerLeave={handlePointerLeave} + onDoubleClick={handleDoubleClick} + onPointerEnter={focusLayout} /> - {/* Poincaré disk boundary for hyperbolic mode */} - {viewMode === "hyperbolic" && ( - - - {/* Main Boundary Circle - scaled to match data (max r ≈ 0.9) */} - - - {/* Grid Circles - adjusted for 0.65 hyperbolic scaling factor */} - {/* After scaling: d=1 => r≈0.316, d=2 => r≈0.569, d=3 => r≈0.748 */} - - - - - {/* Radial Lines - scaled to boundary */} - - - {/* Diagonals */} - - - - - )} + {/* Lasso overlay (screen-space) */} + {/* Loading overlay */} - {!embeddings && ( -
-
Loading embeddings...
+ {rendererError ? ( +
+
+
Browser not supported
+
{rendererError}
+
+ ) : ( + !embeddings && ( +
+
{loadingLabel}
+
+ ) )}
- {/* Legend */} - {uniqueLabels.length > 0 && ( -
-
Labels
-
- {uniqueLabels.slice(0, 20).map((label) => ( -
-
- - {label} - -
- ))} - {uniqueLabels.length > 20 && ( -
- +{uniqueLabels.length - 20} more -
- )} -
-
- )} -
- - {/* Instructions */} -
- - Shift+drag to lasso select • Scroll to zoom • Drag to pan -
-
+ ); } diff --git a/frontend/src/components/VideoGrid.tsx b/frontend/src/components/VideoGrid.tsx new file mode 100644 index 0000000..261e1b8 --- /dev/null +++ b/frontend/src/components/VideoGrid.tsx @@ -0,0 +1,383 @@ +"use client"; + +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useVirtualizer } from "@tanstack/react-virtual"; +import justifiedLayout from "justified-layout"; +import { Play } from "lucide-react"; +import { useStore } from "@/store/useStore"; +import { getVideoUrl } from "@/lib/api"; +import { Panel } from "./Panel"; +import { CheckIcon } from "./icons"; +import type { Sample } from "@/types"; + +interface VideoGridProps { + samples: Sample[]; + onLoadMore?: () => void; + hasMore?: boolean; +} + +const BOX_SPACING = 2; +const TARGET_ROW_HEIGHT = 180; +const DEFAULT_ASPECT_RATIO = 1; + +function getAspectRatio(sample: Sample): number { + if (sample.width && sample.height && sample.height > 0) { + return sample.width / sample.height; + } + return DEFAULT_ASPECT_RATIO; +} + +function computeLayout( + samples: Sample[], + containerWidth: number +): { + boxes: Array<{ width: number; height: number; top: number; left: number }>; + containerHeight: number; +} { + if (samples.length === 0 || containerWidth <= 0) { + return { boxes: [], containerHeight: 0 }; + } + + const aspectRatios = samples.map(getAspectRatio); + + const geometry = justifiedLayout(aspectRatios, { + containerWidth, + containerPadding: 0, + boxSpacing: BOX_SPACING, + targetRowHeight: TARGET_ROW_HEIGHT, + targetRowHeightTolerance: 0.25, + showWidows: true, + }); + + return { + boxes: geometry.boxes, + containerHeight: geometry.containerHeight, + }; +} + +interface RowData { + startIndex: number; + endIndex: number; + top: number; + height: number; +} + +function groupIntoRows( + boxes: Array<{ width: number; height: number; top: number; left: number }> +): RowData[] { + if (boxes.length === 0) return []; + + const rows: RowData[] = []; + let currentRowTop = boxes[0].top; + let currentRowStart = 0; + let currentRowHeight = boxes[0].height; + + for (let i = 1; i < boxes.length; i++) { + const box = boxes[i]; + if (Math.abs(box.top - currentRowTop) > 1) { + rows.push({ + startIndex: currentRowStart, + endIndex: i, + top: currentRowTop, + height: currentRowHeight, + }); + currentRowStart = i; + currentRowTop = box.top; + currentRowHeight = box.height; + } else { + currentRowHeight = Math.max(currentRowHeight, box.height); + } + } + + rows.push({ + startIndex: currentRowStart, + endIndex: boxes.length, + top: currentRowTop, + height: currentRowHeight, + }); + + return rows; +} + +function hasVideo(sample: Sample): boolean { + const metadata = sample.metadata as Record; + const videoPath = metadata.video_path; + const clipLocation = metadata.clip_location; + + if (typeof videoPath === "string" && videoPath.trim()) return true; + if (typeof clipLocation === "string" && clipLocation.trim()) return true; + return sample.filepath.toLowerCase().endsWith(".mp4"); +} + +function metadataScore(sample: Sample, key: string): string { + const metadata = sample.metadata as Record; + const value = metadata[key]; + if (typeof value !== "number" || Number.isNaN(value)) return "—"; + return value.toFixed(1); +} + +function captionSnippet(sample: Sample): string | null { + const metadata = sample.metadata as Record; + for (const key of ["caption_answer", "first_caption", "caption_raw"]) { + const value = metadata[key]; + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + } + return null; +} + +export function VideoGrid({ samples, onLoadMore, hasMore }: VideoGridProps) { + const containerRef = useRef(null); + const [containerWidth, setContainerWidth] = useState(0); + + const { + selectedIds, + isLassoSelection, + selectionSource, + toggleSelection, + addToSelection, + setHoveredId, + hoveredId, + labelFilter, + activeVideoId, + setActiveVideoId, + setVideoDuration, + previewVideoId, + setPreviewVideoId, + } = useStore(); + + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + const updateWidth = () => { + const width = container.clientWidth; + if (width > 0 && width !== containerWidth) { + setContainerWidth(width); + } + }; + + updateWidth(); + + const resizeObserver = new ResizeObserver(() => { + requestAnimationFrame(updateWidth); + }); + resizeObserver.observe(container); + + return () => resizeObserver.disconnect(); + }, [containerWidth]); + + const { boxes, containerHeight } = useMemo( + () => computeLayout(samples, containerWidth), + [samples, containerWidth] + ); + + const rows = useMemo(() => groupIntoRows(boxes), [boxes]); + + const virtualizer = useVirtualizer({ + count: rows.length, + getScrollElement: () => containerRef.current, + estimateSize: (index) => rows[index]?.height ?? TARGET_ROW_HEIGHT, + overscan: 3, + getItemKey: (index) => { + const row = rows[index]; + if (!row) return `row-${index}`; + const rowSamples = samples.slice(row.startIndex, row.endIndex); + return rowSamples.map((s) => s.id).join("-") || `row-${index}`; + }, + }); + + useEffect(() => { + const container = containerRef.current; + if (!container || !onLoadMore || !hasMore) return; + + const handleScroll = () => { + const { scrollTop, scrollHeight, clientHeight } = container; + if (scrollHeight - scrollTop - clientHeight < 500) { + onLoadMore(); + } + }; + + container.addEventListener("scroll", handleScroll); + return () => container.removeEventListener("scroll", handleScroll); + }, [onLoadMore, hasMore]); + + useEffect(() => { + containerRef.current?.scrollTo({ top: 0 }); + }, [labelFilter]); + + useEffect(() => { + if (isLassoSelection) return; + if (selectionSource !== "scatter") return; + if (selectedIds.size === 0) return; + + try { + virtualizer.scrollToIndex(0, { align: "start" }); + } catch { + containerRef.current?.scrollTo({ top: 0 }); + } + }, [isLassoSelection, selectedIds, selectionSource, virtualizer]); + + const handleClick = useCallback( + (sample: Sample, event: React.MouseEvent) => { + setActiveVideoId(sample.id); + + if (event.metaKey || event.ctrlKey) { + toggleSelection(sample.id); + } else if (event.shiftKey && selectedIds.size > 0) { + const selectedArray = Array.from(selectedIds); + const lastSelected = selectedArray[selectedArray.length - 1]; + const lastIndex = samples.findIndex((s) => s.id === lastSelected); + const currentIndex = samples.findIndex((s) => s.id === sample.id); + + if (lastIndex !== -1 && currentIndex !== -1) { + const start = Math.min(lastIndex, currentIndex); + const end = Math.max(lastIndex, currentIndex); + const rangeIds = samples.slice(start, end + 1).map((s) => s.id); + addToSelection(rangeIds); + } + } else { + const newSet = new Set(); + newSet.add(sample.id); + useStore.getState().setSelectedIds(newSet, "grid"); + } + }, + [samples, selectedIds, toggleSelection, addToSelection, setActiveVideoId] + ); + + const virtualRows = virtualizer.getVirtualItems(); + + return ( + +
+
+
+ {virtualRows.map((virtualRow) => { + const row = rows[virtualRow.index]; + if (!row) return null; + + const rowSamples = samples.slice(row.startIndex, row.endIndex); + const rowBoxes = boxes.slice(row.startIndex, row.endIndex); + + return ( +
+ {rowSamples.map((sample, i) => { + const box = rowBoxes[i]; + if (!box) return null; + + const isSelected = isLassoSelection ? true : selectedIds.has(sample.id); + const isHovered = hoveredId === sample.id; + const isVideo = hasVideo(sample); + const showPreview = isVideo && previewVideoId === sample.id; + const isActiveVideo = activeVideoId === sample.id; + const caption = captionSnippet(sample); + + return ( +
handleClick(sample, e)} + onMouseEnter={() => { + setHoveredId(sample.id); + setPreviewVideoId(isVideo ? sample.id : null); + }} + onMouseLeave={() => { + setHoveredId(null); + if (previewVideoId === sample.id) { + setPreviewVideoId(null); + } + }} + > + {showPreview ? ( +
+ ); + })} +
+ ); + })} +
+
+
+
+ ); +} diff --git a/frontend/src/components/VideoPanel.tsx b/frontend/src/components/VideoPanel.tsx new file mode 100644 index 0000000..bae5717 --- /dev/null +++ b/frontend/src/components/VideoPanel.tsx @@ -0,0 +1,194 @@ +"use client"; + +import { useEffect, useMemo, useRef, useState } from "react"; +import { Panel } from "./Panel"; +import { fetchAnnotations, getVideoUrl } from "@/lib/api"; +import { useStore } from "@/store/useStore"; +import type { VideoAnnotation } from "@/types"; + +interface VideoPanelProps { + className?: string; + sampleId?: string; +} + +function formatScore(value: number | null): string { + if (typeof value !== "number" || Number.isNaN(value)) return "—"; + return value.toFixed(2); +} + +export function VideoPanel({ className = "", sampleId }: VideoPanelProps) { + const { + selectedIds, + activeVideoId, + setActiveVideoId, + globalSeekTime, + setGlobalSeekTime, + isTimelinePlaying, + setTimelinePlaying, + setVideoDuration, + annotationCache, + cacheAnnotation, + } = useStore(); + + const videoRef = useRef(null); + + const activeSampleId = useMemo(() => { + if (sampleId) return sampleId; + if (activeVideoId) return activeVideoId; + if (selectedIds.size === 0) return null; + return Array.from(selectedIds)[0] ?? null; + }, [activeVideoId, sampleId, selectedIds]); + + const [annotation, setAnnotation] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [videoFailed, setVideoFailed] = useState(false); + + useEffect(() => { + setVideoFailed(false); + }, [activeSampleId]); + + useEffect(() => { + if (!activeSampleId) return; + if (activeVideoId === activeSampleId) return; + setActiveVideoId(activeSampleId); + }, [activeSampleId, activeVideoId, setActiveVideoId]); + + useEffect(() => { + if (!activeSampleId) { + setAnnotation(null); + setError(null); + setTimelinePlaying(false); + return; + } + + const cached = annotationCache[activeSampleId]; + if (cached) { + setAnnotation(cached); + setError(null); + setIsLoading(false); + return; + } + + let cancelled = false; + setIsLoading(true); + setError(null); + + fetchAnnotations(activeSampleId) + .then((data) => { + if (cancelled) return; + setAnnotation(data); + cacheAnnotation(activeSampleId, data); + }) + .catch((err) => { + if (cancelled) return; + setAnnotation(null); + setError(err instanceof Error ? err.message : "Failed to load annotations"); + }) + .finally(() => { + if (cancelled) return; + setIsLoading(false); + }); + + return () => { + cancelled = true; + }; + }, [activeSampleId, annotationCache, cacheAnnotation, setTimelinePlaying]); + + useEffect(() => { + const video = videoRef.current; + if (!video) return; + + const delta = Math.abs(video.currentTime - globalSeekTime); + if (!isTimelinePlaying && delta > 0.08) { + video.currentTime = globalSeekTime; + } + + if (isTimelinePlaying) { + void video.play(); + } else { + video.pause(); + } + }, [activeSampleId, globalSeekTime, isTimelinePlaying]); + + if (!activeSampleId) { + return ( + +
+ Select a clip preview in the grid or scatter plot to open its video. +
+
+ ); + } + + return ( + +
+ {!videoFailed ? ( +
+ +
+
+ aesthetic: {formatScore(annotation?.aesthetic_score ?? null)} + motion: {formatScore(annotation?.motion_score ?? null)} + + dedup: {annotation?.dedup_status ?? "unknown"} + + + sim: {formatScore(annotation?.cosine_sim_score ?? null)} + +
+ + {isLoading ? ( +
Loading annotations…
+ ) : error ? ( +
{error}
+ ) : ( + <> +
+ {annotation?.caption ?? annotation?.raw_caption ?? "No caption available."} +
+ {annotation?.reasoning ? ( +
+ Reasoning +
{annotation.reasoning}
+
+ ) : null} + + )} +
+
+ ); +} diff --git a/frontend/src/components/icons.tsx b/frontend/src/components/icons.tsx new file mode 100644 index 0000000..46494f7 --- /dev/null +++ b/frontend/src/components/icons.tsx @@ -0,0 +1,68 @@ +"use client"; + +/** + * Shared icons for HyperView UI. + * Using inline SVGs for simplicity (no extra icon library dependency). + */ + +export const GridIcon = () => ( + + + + + + +); + +export const ScatterIcon = () => ( + + + + + + + +); + +export const HyperViewLogo = ({ className = "w-5 h-5" }: { className?: string }) => ( + + + + + +); + +export const CheckIcon = () => ( + + + +); + +/** Euclidean geometry icon - flat grid */ +export const EuclideanIcon = () => ( + + + + + +); + +/** Poincaré disk icon - hyperbolic geometry */ +export const PoincareIcon = () => ( + + + + + +); + +/** Spherical geometry icon - for future use */ +export const SphericalIcon = () => ( + + + + + +); + + diff --git a/frontend/src/components/index.ts b/frontend/src/components/index.ts index 1955b11..370b265 100644 --- a/frontend/src/components/index.ts +++ b/frontend/src/components/index.ts @@ -1,3 +1,15 @@ export { ImageGrid } from "./ImageGrid"; +export { VideoGrid } from "./VideoGrid"; export { ScatterPanel } from "./ScatterPanel"; +export { DockviewWorkspace } from "./DockviewWorkspace"; export { Header } from "./Header"; +export { GlobalSeekBar } from "./GlobalSeekBar"; +export { Panel, PanelFooter } from "./Panel"; +export { PanelHeader } from "./PanelHeader"; +export { PanelTitle } from "./PanelTitle"; +export { PanelContextBar } from "./PanelContextBar"; +export { ExplorerPanel } from "./ExplorerPanel"; +export { PlaceholderPanel } from "./PlaceholderPanel"; +export { VideoPanel } from "./VideoPanel"; +export { CurationPanel } from "./CurationPanel"; +export * from "./icons"; diff --git a/frontend/src/components/ui/button.tsx b/frontend/src/components/ui/button.tsx new file mode 100644 index 0000000..65d4fcd --- /dev/null +++ b/frontend/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/frontend/src/components/ui/collapsible.tsx b/frontend/src/components/ui/collapsible.tsx new file mode 100644 index 0000000..9fa4894 --- /dev/null +++ b/frontend/src/components/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/frontend/src/components/ui/command.tsx b/frontend/src/components/ui/command.tsx new file mode 100644 index 0000000..2cecd91 --- /dev/null +++ b/frontend/src/components/ui/command.tsx @@ -0,0 +1,153 @@ +"use client" + +import * as React from "react" +import { type DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +const CommandDialog = ({ children, ...props }: DialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx new file mode 100644 index 0000000..1647513 --- /dev/null +++ b/frontend/src/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogTrigger, + DialogClose, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/frontend/src/components/ui/dropdown-menu.tsx b/frontend/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..cd9a158 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,201 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 3, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + svg]:size-3.5 [&>svg]:shrink-0", + inset && "pl-8", + className + )} + {...props} + /> +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/frontend/src/components/ui/popover.tsx b/frontend/src/components/ui/popover.tsx new file mode 100644 index 0000000..70a28f6 --- /dev/null +++ b/frontend/src/components/ui/popover.tsx @@ -0,0 +1,33 @@ +"use client" + +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverAnchor = PopoverPrimitive.Anchor + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor } diff --git a/frontend/src/components/ui/scroll-area.tsx b/frontend/src/components/ui/scroll-area.tsx new file mode 100644 index 0000000..b1e223f --- /dev/null +++ b/frontend/src/components/ui/scroll-area.tsx @@ -0,0 +1,49 @@ +"use client" + +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/frontend/src/components/ui/separator.tsx b/frontend/src/components/ui/separator.tsx new file mode 100644 index 0000000..12d81c4 --- /dev/null +++ b/frontend/src/components/ui/separator.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/frontend/src/components/ui/toggle-group.tsx b/frontend/src/components/ui/toggle-group.tsx new file mode 100644 index 0000000..1c876bb --- /dev/null +++ b/frontend/src/components/ui/toggle-group.tsx @@ -0,0 +1,61 @@ +"use client" + +import * as React from "react" +import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group" +import { type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" +import { toggleVariants } from "@/components/ui/toggle" + +const ToggleGroupContext = React.createContext< + VariantProps +>({ + size: "default", + variant: "default", +}) + +const ToggleGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, variant, size, children, ...props }, ref) => ( + + + {children} + + +)) + +ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName + +const ToggleGroupItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, children, variant, size, ...props }, ref) => { + const context = React.useContext(ToggleGroupContext) + + return ( + + {children} + + ) +}) + +ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName + +export { ToggleGroup, ToggleGroupItem } diff --git a/frontend/src/components/ui/toggle.tsx b/frontend/src/components/ui/toggle.tsx new file mode 100644 index 0000000..e516f21 --- /dev/null +++ b/frontend/src/components/ui/toggle.tsx @@ -0,0 +1,45 @@ +"use client" + +import * as React from "react" +import * as TogglePrimitive from "@radix-ui/react-toggle" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const toggleVariants = cva( + "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-primary data-[state=on]:text-primary-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-transparent", + outline: + "border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground data-[state=on]:border-primary", + }, + size: { + default: "h-9 px-2 min-w-9", + sm: "h-8 px-1.5 min-w-8", + lg: "h-10 px-2.5 min-w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +const Toggle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, variant, size, ...props }, ref) => ( + +)) + +Toggle.displayName = TogglePrimitive.Root.displayName + +export { Toggle, toggleVariants } diff --git a/frontend/src/components/ui/tooltip.tsx b/frontend/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..28e1918 --- /dev/null +++ b/frontend/src/components/ui/tooltip.tsx @@ -0,0 +1,32 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/frontend/src/components/useHyperScatter.ts b/frontend/src/components/useHyperScatter.ts new file mode 100644 index 0000000..3801a70 --- /dev/null +++ b/frontend/src/components/useHyperScatter.ts @@ -0,0 +1,614 @@ +import type React from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; + +import type { EmbeddingsData } from "@/types"; +import type { ScatterLabelsInfo } from "@/lib/labelLegend"; +import type { Dataset, GeometryMode, Modifiers, Renderer } from "hyper-scatter"; + +type HyperScatterModule = typeof import("hyper-scatter"); + +const MAX_LASSO_VERTS = 512; + +function supportsWebGL2(): boolean { + try { + if (typeof document === "undefined") return false; + const canvas = document.createElement("canvas"); + return !!canvas.getContext("webgl2"); + } catch { + return false; + } +} + +function capInterleavedXY(points: ArrayLike, maxVerts: number): number[] { + const n = Math.floor(points.length / 2); + if (n <= maxVerts) return Array.from(points as ArrayLike); + + const out = new Array(maxVerts * 2); + for (let i = 0; i < maxVerts; i++) { + const src = Math.floor((i * n) / maxVerts); + out[i * 2] = points[src * 2]; + out[i * 2 + 1] = points[src * 2 + 1]; + } + return out; +} + + +interface UseHyperScatterArgs { + embeddings: EmbeddingsData | null; + labelsInfo: ScatterLabelsInfo | null; + selectedIds: Set; + hoveredId: string | null; + setSelectedIds: (ids: Set, source?: "scatter" | "grid") => void; + beginLassoSelection: (query: { layoutKey: string; polygon: number[] }) => void; + setHoveredId: (id: string | null) => void; + hoverEnabled?: boolean; +} + +function toModifiers(e: { shiftKey: boolean; ctrlKey: boolean; altKey: boolean; metaKey: boolean }): Modifiers { + return { + shift: e.shiftKey, + ctrl: e.ctrlKey, + alt: e.altKey, + meta: e.metaKey, + }; +} + +function clearOverlay(canvas: HTMLCanvasElement | null): void { + if (!canvas) return; + const ctx = canvas.getContext("2d"); + if (!ctx) return; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); +} + +function drawLassoOverlay(canvas: HTMLCanvasElement | null, points: number[]): void { + if (!canvas) return; + const ctx = canvas.getContext("2d"); + if (!ctx) return; + + clearOverlay(canvas); + if (points.length < 6) return; + + ctx.save(); + ctx.lineWidth = 2; + ctx.strokeStyle = "rgba(79,70,229,0.9)"; // indigo-ish + ctx.fillStyle = "rgba(79,70,229,0.15)"; + + ctx.beginPath(); + ctx.moveTo(points[0], points[1]); + for (let i = 2; i < points.length; i += 2) { + ctx.lineTo(points[i], points[i + 1]); + } + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + ctx.restore(); +} + +export function useHyperScatter({ + embeddings, + labelsInfo, + selectedIds, + hoveredId, + setSelectedIds, + beginLassoSelection, + setHoveredId, + hoverEnabled = true, +}: UseHyperScatterArgs) { + const canvasRef = useRef(null); + const overlayCanvasRef = useRef(null); + const containerRef = useRef(null); + + const rendererRef = useRef(null); + + const [rendererError, setRendererError] = useState(null); + + const rafPendingRef = useRef(false); + + // Interaction state (refs to avoid rerender churn) + const isPanningRef = useRef(false); + const isLassoingRef = useRef(false); + const pointerDownXRef = useRef(0); + const pointerDownYRef = useRef(0); + const lastPointerXRef = useRef(0); + const lastPointerYRef = useRef(0); + const lassoPointsRef = useRef([]); + const persistentLassoRef = useRef(null); + + const hoveredIndexRef = useRef(-1); + + const idToIndex = useMemo(() => { + if (!embeddings) return null; + const m = new Map(); + for (let i = 0; i < embeddings.ids.length; i++) { + m.set(embeddings.ids[i], i); + } + return m; + }, [embeddings]); + + const requestRender = useCallback(() => { + if (rafPendingRef.current) return; + rafPendingRef.current = true; + + requestAnimationFrame(() => { + rafPendingRef.current = false; + const renderer = rendererRef.current; + if (!renderer) return; + + try { + renderer.render(); + } catch (err) { + // Avoid an exception storm that would permanently prevent the UI from updating. + console.error("hyper-scatter renderer.render() failed:", err); + try { + renderer.destroy(); + } catch { + // ignore + } + rendererRef.current = null; + setRendererError( + "This browser can't render the scatter plot (WebGL2 is required). Please use Chrome/Edge/Firefox." + ); + clearOverlay(overlayCanvasRef.current); + return; + } + + if (isLassoingRef.current) { + drawLassoOverlay(overlayCanvasRef.current, lassoPointsRef.current); + } + }); + }, []); + + const getCanvasPos = useCallback((e: { clientX: number; clientY: number }) => { + const canvas = canvasRef.current; + if (!canvas) return { x: 0, y: 0 }; + const rect = canvas.getBoundingClientRect(); + return { + x: e.clientX - rect.left, + y: e.clientY - rect.top, + }; + }, []); + + const redrawOverlay = useCallback(() => { + if (!overlayCanvasRef.current) return; + clearOverlay(overlayCanvasRef.current); + const persistent = persistentLassoRef.current; + if (persistent && persistent.length >= 6) { + drawLassoOverlay(overlayCanvasRef.current, persistent); + } + }, []); + + const clearPersistentLasso = useCallback(() => { + persistentLassoRef.current = null; + clearOverlay(overlayCanvasRef.current); + }, []); + + const stopInteraction = useCallback(() => { + isPanningRef.current = false; + isLassoingRef.current = false; + lassoPointsRef.current = []; + if (persistentLassoRef.current) { + redrawOverlay(); + return; + } + clearOverlay(overlayCanvasRef.current); + }, [redrawOverlay]); + + // Initialize renderer when embeddings change. + useEffect(() => { + if (!embeddings || !labelsInfo) return; + if (!canvasRef.current || !containerRef.current) return; + + let cancelled = false; + + const init = async () => { + // Clear any previous renderer errors when we attempt to re-init. + setRendererError(null); + + if (!supportsWebGL2()) { + setRendererError( + "This browser doesn't support WebGL2, so the scatter plot can't be displayed. Please use Chrome/Edge/Firefox." + ); + return; + } + + try { + const viz = (await import("hyper-scatter")) as HyperScatterModule; + if (cancelled) return; + + const container = containerRef.current; + const canvas = canvasRef.current; + if (!container || !canvas) return; + + // Destroy existing renderer (if any) + if (rendererRef.current) { + rendererRef.current.destroy(); + rendererRef.current = null; + } + + const rect = container.getBoundingClientRect(); + const width = Math.floor(rect.width); + const height = Math.floor(rect.height); + if (overlayCanvasRef.current) { + overlayCanvasRef.current.width = Math.max(1, width); + overlayCanvasRef.current.height = Math.max(1, height); + overlayCanvasRef.current.style.width = `${width}px`; + overlayCanvasRef.current.style.height = `${height}px`; + redrawOverlay(); + } + + // Use coords from embeddings response directly + const coords = embeddings.coords; + const positions = new Float32Array(coords.length * 2); + for (let i = 0; i < coords.length; i++) { + positions[i * 2] = coords[i][0]; + positions[i * 2 + 1] = coords[i][1]; + } + + const geometry = embeddings.geometry as GeometryMode; + const dataset: Dataset = viz.createDataset(geometry, positions, labelsInfo.categories); + + const opts = { + width, + height, + devicePixelRatio: window.devicePixelRatio, + pointRadius: 4, + colors: labelsInfo.palette, + backgroundColor: "#161b22", // Match HyperView theme: --card is #161b22 + }; + + const renderer: Renderer = + geometry === "euclidean" ? new viz.EuclideanWebGLCandidate() : new viz.HyperbolicWebGLCandidate(); + + renderer.init(canvas, opts); + + renderer.setDataset(dataset); + rendererRef.current = renderer; + + // Force a first render to surface WebGL2 context creation failures early. + try { + renderer.render(); + } catch (err) { + console.error("hyper-scatter initial render failed:", err); + rendererRef.current = null; + try { + renderer.destroy(); + } catch { + // ignore + } + setRendererError( + "This browser can't render the scatter plot (WebGL2 is required). Please use Chrome/Edge/Firefox." + ); + return; + } + + hoveredIndexRef.current = -1; + renderer.setHovered(-1); + + requestRender(); + } catch (err) { + console.error("Failed to initialize hyper-scatter renderer:", err); + setRendererError( + "Failed to initialize the scatter renderer in this browser. Please use Chrome/Edge/Firefox." + ); + } + }; + + init(); + + return () => { + cancelled = true; + stopInteraction(); + if (rendererRef.current) { + rendererRef.current.destroy(); + rendererRef.current = null; + } + }; + }, [embeddings, labelsInfo, redrawOverlay, requestRender, stopInteraction]); + + // Store -> renderer sync + useEffect(() => { + const renderer = rendererRef.current; + if (!renderer || !embeddings || !idToIndex) return; + + const indices = new Set(); + for (const id of selectedIds) { + const idx = idToIndex.get(id); + if (typeof idx === "number") indices.add(idx); + } + + renderer.setSelection(indices); + + if (!hoverEnabled) { + renderer.setHovered(-1); + hoveredIndexRef.current = -1; + requestRender(); + return; + } + + const hoveredIdx = hoveredId ? (idToIndex.get(hoveredId) ?? -1) : -1; + renderer.setHovered(hoveredIdx); + hoveredIndexRef.current = hoveredIdx; + + requestRender(); + }, [embeddings, hoveredId, hoverEnabled, idToIndex, requestRender, selectedIds]); + + // Resize handling + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + const resize = () => { + const rect = container.getBoundingClientRect(); + const width = Math.floor(rect.width); + const height = Math.floor(rect.height); + if (!(width > 0) || !(height > 0)) return; + + if (overlayCanvasRef.current) { + overlayCanvasRef.current.width = Math.max(1, width); + overlayCanvasRef.current.height = Math.max(1, height); + overlayCanvasRef.current.style.width = `${width}px`; + overlayCanvasRef.current.style.height = `${height}px`; + redrawOverlay(); + } + + const renderer = rendererRef.current; + if (renderer) { + renderer.resize(width, height); + requestRender(); + } + }; + + resize(); + + const ro = new ResizeObserver(resize); + ro.observe(container); + return () => ro.disconnect(); + }, [redrawOverlay, requestRender]); + + // Wheel zoom (native listener so we can set passive:false) + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const onWheel = (e: WheelEvent) => { + const renderer = rendererRef.current; + if (!renderer) return; + e.preventDefault(); + + const pos = getCanvasPos(e); + const delta = -e.deltaY / 100; + renderer.zoom(pos.x, pos.y, delta, toModifiers(e)); + requestRender(); + }; + + canvas.addEventListener("wheel", onWheel, { passive: false }); + return () => canvas.removeEventListener("wheel", onWheel); + }, [getCanvasPos, requestRender]); + + // Pointer interactions + const handlePointerDown = useCallback( + (e: React.PointerEvent) => { + const renderer = rendererRef.current; + if (!renderer) return; + + // Left button only + if (typeof e.button === "number" && e.button !== 0) return; + + const pos = getCanvasPos(e); + pointerDownXRef.current = pos.x; + pointerDownYRef.current = pos.y; + lastPointerXRef.current = pos.x; + lastPointerYRef.current = pos.y; + + if (persistentLassoRef.current) { + clearPersistentLasso(); + } + + // Shift-drag = lasso, otherwise pan. + if (e.shiftKey) { + isLassoingRef.current = true; + isPanningRef.current = false; + lassoPointsRef.current = [pos.x, pos.y]; + drawLassoOverlay(overlayCanvasRef.current, lassoPointsRef.current); + } else { + isPanningRef.current = true; + isLassoingRef.current = false; + } + + try { + e.currentTarget.setPointerCapture(e.pointerId); + } catch { + // ignore + } + + e.preventDefault(); + }, + [clearPersistentLasso, getCanvasPos] + ); + + const handlePointerMove = useCallback( + (e: React.PointerEvent) => { + const renderer = rendererRef.current; + if (!renderer) return; + + const pos = getCanvasPos(e); + + if (isPanningRef.current) { + const dx = pos.x - lastPointerXRef.current; + const dy = pos.y - lastPointerYRef.current; + lastPointerXRef.current = pos.x; + lastPointerYRef.current = pos.y; + + renderer.pan(dx, dy, toModifiers(e)); + requestRender(); + return; + } + + if (isLassoingRef.current) { + const pts = lassoPointsRef.current; + const lastX = pts[pts.length - 2] ?? pos.x; + const lastY = pts[pts.length - 1] ?? pos.y; + const ddx = pos.x - lastX; + const ddy = pos.y - lastY; + const distSq = ddx * ddx + ddy * ddy; + + // Sample at ~2px spacing + if (distSq >= 4) { + pts.push(pos.x, pos.y); + drawLassoOverlay(overlayCanvasRef.current, pts); + } + return; + } + + if (!hoverEnabled) { + if (hoveredIndexRef.current !== -1) { + hoveredIndexRef.current = -1; + renderer.setHovered(-1); + requestRender(); + } + return; + } + + // Hover + const hit = renderer.hitTest(pos.x, pos.y); + const nextIndex = hit ? hit.index : -1; + if (nextIndex === hoveredIndexRef.current) return; + hoveredIndexRef.current = nextIndex; + renderer.setHovered(nextIndex); + + if (!embeddings) return; + if (nextIndex >= 0 && nextIndex < embeddings.ids.length) { + setHoveredId(embeddings.ids[nextIndex]); + } else { + setHoveredId(null); + } + + requestRender(); + }, + [embeddings, getCanvasPos, hoverEnabled, requestRender, setHoveredId] + ); + + const handlePointerUp = useCallback( + async (e: React.PointerEvent) => { + const renderer = rendererRef.current; + if (!renderer || !embeddings) { + stopInteraction(); + return; + } + + if (isLassoingRef.current) { + const pts = lassoPointsRef.current.slice(); + persistentLassoRef.current = pts.length >= 6 ? pts : null; + stopInteraction(); + redrawOverlay(); + + if (pts.length >= 6) { + try { + const polyline = new Float32Array(pts); + const result = renderer.lassoSelect(polyline); + + // Enter server-driven lasso mode by sending a data-space polygon. + // Backend selection runs in the same coordinate system returned by /api/embeddings. + const dataCoords = result.geometry?.coords; + if (!dataCoords || dataCoords.length < 6) return; + + // Clear any existing manual selection highlights immediately. + renderer.setSelection(new Set()); + + // Cap vertex count to keep request payload + backend runtime bounded. + const polygon = capInterleavedXY(dataCoords, MAX_LASSO_VERTS); + if (polygon.length < 6) return; + + beginLassoSelection({ layoutKey: embeddings.layout_key, polygon }); + } catch (err) { + console.error("Lasso selection failed:", err); + } + } + + requestRender(); + return; + } + + // Click-to-select (scatter -> image grid) + // Only treat as a click if the pointer didn't move much (otherwise it's a pan). + const pos = getCanvasPos(e); + const dx = pos.x - pointerDownXRef.current; + const dy = pos.y - pointerDownYRef.current; + const CLICK_MAX_DIST_SQ = 36; // ~6px + const isClick = dx * dx + dy * dy <= CLICK_MAX_DIST_SQ; + + if (isClick) { + const hit = renderer.hitTest(pos.x, pos.y); + const idx = hit ? hit.index : -1; + + if (idx >= 0 && idx < embeddings.ids.length) { + const id = embeddings.ids[idx]; + + if (e.metaKey || e.ctrlKey) { + const next = new Set(selectedIds); + if (next.has(id)) next.delete(id); + else next.add(id); + setSelectedIds(next, "scatter"); + } else { + setSelectedIds(new Set([id]), "scatter"); + } + } + } + + stopInteraction(); + requestRender(); + }, + [ + beginLassoSelection, + embeddings, + getCanvasPos, + redrawOverlay, + requestRender, + selectedIds, + setSelectedIds, + stopInteraction, + ] + ); + + const handlePointerLeave = useCallback( + (_e: React.PointerEvent) => { + const renderer = rendererRef.current; + if (renderer) { + hoveredIndexRef.current = -1; + setHoveredId(null); + renderer.setHovered(-1); + requestRender(); + } + stopInteraction(); + }, + [requestRender, setHoveredId, stopInteraction] + ); + + const handleDoubleClick = useCallback( + (_e: React.MouseEvent) => { + const renderer = rendererRef.current; + if (!renderer) return; + clearPersistentLasso(); + stopInteraction(); + + renderer.setSelection(new Set()); + setSelectedIds(new Set(), "scatter"); + + requestRender(); + }, + [clearPersistentLasso, requestRender, setSelectedIds, stopInteraction] + ); + + return { + canvasRef, + overlayCanvasRef, + containerRef, + handlePointerDown, + handlePointerMove, + handlePointerUp, + handlePointerLeave, + handleDoubleClick, + rendererError, + }; +} diff --git a/frontend/src/components/useLabelLegend.ts b/frontend/src/components/useLabelLegend.ts new file mode 100644 index 0000000..f14ee8c --- /dev/null +++ b/frontend/src/components/useLabelLegend.ts @@ -0,0 +1,74 @@ +import { useMemo } from "react"; + +import type { DatasetInfo, EmbeddingsData } from "@/types"; +import { + buildLabelColorMap, + buildLabelCounts, + buildLabelUniverse, + buildLabelsInfo, + buildLegendLabels, +} from "@/lib/labelLegend"; +import { useColorSettings } from "@/store/useColorSettings"; + +interface UseLabelLegendArgs { + datasetInfo: DatasetInfo | null; + embeddings: EmbeddingsData | null; + labelSearch?: string; + labelFilter?: string | null; +} + +export function useLabelLegend({ + datasetInfo, + embeddings, + labelSearch = "", + labelFilter = null, +}: UseLabelLegendArgs) { + const labelColorMapId = useColorSettings((state) => state.labelColorMapId); + + const labelCounts = useMemo(() => buildLabelCounts(embeddings), [embeddings]); + + const labelUniverse = useMemo( + () => buildLabelUniverse(datasetInfo?.labels ?? [], embeddings?.labels ?? null), + [datasetInfo?.labels, embeddings?.labels] + ); + + const labelsInfo = useMemo( + () => + buildLabelsInfo({ + datasetLabels: datasetInfo?.labels ?? [], + embeddings, + labelColorMapId, + labelFilter, + }), + [datasetInfo?.labels, embeddings, labelColorMapId, labelFilter] + ); + + const labelColorMap = useMemo( + () => + buildLabelColorMap({ + labelsInfo, + labelUniverse, + labelColorMapId, + labelFilter, + }), + [labelsInfo, labelUniverse, labelColorMapId, labelFilter] + ); + + const legendLabels = useMemo( + () => + buildLegendLabels({ + labelUniverse, + labelCounts, + query: labelSearch, + }), + [labelUniverse, labelCounts, labelSearch] + ); + + return { + labelCounts, + labelUniverse, + labelsInfo, + labelColorMap, + legendLabels, + }; +} diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index c923cd3..1d420dc 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -1,6 +1,15 @@ -import type { DatasetInfo, EmbeddingsData, Sample, SamplesResponse } from "@/types"; +import type { + CurationFilterRequest, + CurationFilterResponse, + CurationStats, + DatasetInfo, + EmbeddingsData, + Sample, + SamplesResponse, + VideoAnnotation, +} from "@/types"; -const API_BASE = process.env.NODE_ENV === "development" ? "http://127.0.0.1:5151" : ""; +const API_BASE = process.env.NODE_ENV === "development" ? "http://127.0.0.1:6263" : ""; export async function fetchDataset(): Promise { const res = await fetch(`${API_BASE}/api/dataset`); @@ -30,8 +39,13 @@ export async function fetchSamples( return res.json(); } -export async function fetchEmbeddings(): Promise { - const res = await fetch(`${API_BASE}/api/embeddings`); +export async function fetchEmbeddings(layoutKey?: string): Promise { + const params = new URLSearchParams(); + if (layoutKey) { + params.set("layout_key", layoutKey); + } + const query = params.toString(); + const res = await fetch(`${API_BASE}/api/embeddings${query ? `?${query}` : ""}`); if (!res.ok) { throw new Error(`Failed to fetch embeddings: ${res.statusText}`); } @@ -60,3 +74,76 @@ export async function fetchSamplesBatch(sampleIds: string[]): Promise const data = await res.json(); return data.samples; } + +export interface LassoSelectionResponse { + total: number; + offset: number; + limit: number; + sample_ids: string[]; + samples: Sample[]; +} + +export async function fetchLassoSelection(args: { + layoutKey: string; + polygon: ArrayLike; + offset?: number; + limit?: number; + includeThumbnails?: boolean; + signal?: AbortSignal; +}): Promise { + const res = await fetch(`${API_BASE}/api/selection/lasso`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + layout_key: args.layoutKey, + polygon: Array.from(args.polygon), + offset: args.offset ?? 0, + limit: args.limit ?? 100, + include_thumbnails: args.includeThumbnails ?? true, + }), + signal: args.signal, + }); + if (!res.ok) { + throw new Error(`Failed to fetch lasso selection: ${res.statusText}`); + } + return res.json(); +} + +export function getVideoUrl(sampleId: string): string { + return `${API_BASE}/api/video/${sampleId}`; +} + +export async function fetchAnnotations(sampleId: string): Promise { + const res = await fetch(`${API_BASE}/api/annotations/${sampleId}`); + if (!res.ok) { + throw new Error(`Failed to fetch annotations: ${res.statusText}`); + } + return res.json(); +} + +export async function fetchCurationStats(): Promise { + const res = await fetch(`${API_BASE}/api/curation/stats`); + if (!res.ok) { + throw new Error(`Failed to fetch curation stats: ${res.statusText}`); + } + return res.json(); +} + +export async function postCurationFilter( + request: CurationFilterRequest +): Promise { + const res = await fetch(`${API_BASE}/api/curation/filter`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(request), + }); + + if (!res.ok) { + throw new Error(`Failed to filter curation samples: ${res.statusText}`); + } + return res.json(); +} diff --git a/frontend/src/lib/colorTransfer.ts b/frontend/src/lib/colorTransfer.ts new file mode 100644 index 0000000..fab7532 --- /dev/null +++ b/frontend/src/lib/colorTransfer.ts @@ -0,0 +1,26 @@ +import { + FALLBACK_LABEL_COLOR, + createLabelColorMap, + normalizeLabel, + type LabelColorMapId, +} from "@/lib/labelColors"; + +export interface CategoricalLabelTransferFunction { + kind: "categorical"; + paletteId: LabelColorMapId; + colorFor: (label: string | null | undefined) => string; +} + +export function createCategoricalLabelTransferFunction(params: { + labels: string[]; + paletteId: LabelColorMapId; +}): CategoricalLabelTransferFunction { + const { labels, paletteId } = params; + const colorMap = createLabelColorMap(labels, { paletteId }); + + return { + kind: "categorical", + paletteId, + colorFor: (label) => colorMap[normalizeLabel(label)] ?? FALLBACK_LABEL_COLOR, + }; +} diff --git a/frontend/src/lib/labelColors.ts b/frontend/src/lib/labelColors.ts new file mode 100644 index 0000000..d38e64b --- /dev/null +++ b/frontend/src/lib/labelColors.ts @@ -0,0 +1,241 @@ +const MISSING_LABEL_SENTINEL = "undefined"; + +export const MISSING_LABEL_COLOR = "#39d3cc"; // matches --accent-cyan +export const FALLBACK_LABEL_COLOR = "#8b949e"; // matches --muted-foreground + +export const LABEL_COLOR_MAP_IDS = ["auto", "classic20", "tab10", "tab20", "wong"] as const; +export type LabelColorMapId = (typeof LABEL_COLOR_MAP_IDS)[number]; + +const AUTO_DEFAULT_PALETTE_ID: LabelColorMapId = "tab20"; +const OVERFLOW_HUE_STEP_DEGREES = 137.508; + +export function isLabelColorMapId(value: string): value is LabelColorMapId { + return LABEL_COLOR_MAP_IDS.includes(value as LabelColorMapId); +} + +const CLASSIC_20_LABEL_PALETTE = [ + "#e6194b", + "#3cb44b", + "#ffe119", + "#4363d8", + "#f58231", + "#911eb4", + "#46f0f0", + "#f032e6", + "#bcf60c", + "#fabebe", + "#008080", + "#e6beff", + "#9a6324", + "#fffac8", + "#800000", + "#aaffc3", + "#808000", + "#ffd8b1", + "#000075", + "#808080", +]; + +const TAB_10_LABEL_PALETTE = [ + "#4e79a7", + "#f28e2b", + "#e15759", + "#76b7b2", + "#59a14f", + "#edc948", + "#b07aa1", + "#ff9da7", + "#9c755f", + "#bab0ab", +]; + +const TAB_20_LABEL_PALETTE = [ + "#1f77b4", + "#aec7e8", + "#ff7f0e", + "#ffbb78", + "#2ca02c", + "#98df8a", + "#d62728", + "#ff9896", + "#9467bd", + "#c5b0d5", + "#8c564b", + "#c49c94", + "#e377c2", + "#f7b6d2", + "#7f7f7f", + "#c7c7c7", + "#bcbd22", + "#dbdb8d", + "#17becf", + "#9edae5", +]; + +const WONG_LABEL_PALETTE = [ + "#e69f00", + "#56b4e9", + "#009e73", + "#f0e442", + "#0072b2", + "#d55e00", + "#cc79a7", +]; + +function clamp01(v: number): number { + if (v < 0) return 0; + if (v > 1) return 1; + return v; +} + +function hslToHex(hDegrees: number, saturation: number, lightness: number): string { + const h = ((((hDegrees % 360) + 360) % 360) / 360) % 1; + const s = clamp01(saturation); + const l = clamp01(lightness); + + let r = l; + let g = l; + let b = l; + + if (s > 0) { + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + + const hueToChannel = (tIn: number): number => { + let t = tIn; + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + + r = hueToChannel(h + 1 / 3); + g = hueToChannel(h); + b = hueToChannel(h - 1 / 3); + } + + const toHex = (x: number) => { + const n = Math.round(clamp01(x) * 255); + return n.toString(16).padStart(2, "0"); + }; + + return `#${toHex(r)}${toHex(g)}${toHex(b)}`; +} + +function createOverflowColor(index: number, seedPrefix: LabelColorMapId): string { + const paletteSeedShift = + seedPrefix === "tab10" + ? 17 + : seedPrefix === "tab20" + ? 43 + : seedPrefix === "wong" + ? 71 + : seedPrefix === "classic20" + ? 101 + : 131; + + const hue = (paletteSeedShift + index * OVERFLOW_HUE_STEP_DEGREES) % 360; + const saturationBands = [0.72, 0.64, 0.78]; + const lightnessBands = [0.46, 0.54, 0.38, 0.62]; + + const saturation = saturationBands[index % saturationBands.length]; + const lightness = + lightnessBands[Math.floor(index / saturationBands.length) % lightnessBands.length]; + + return hslToHex(hue, saturation, lightness); +} + +function stableLabelSort(a: string, b: string): number { + if (a === MISSING_LABEL_SENTINEL && b !== MISSING_LABEL_SENTINEL) return 1; + if (b === MISSING_LABEL_SENTINEL && a !== MISSING_LABEL_SENTINEL) return -1; + return a.localeCompare(b); +} + +function createAutoLabelColorMap(unique: string[]): Record { + return createPaletteLabelColorMap(unique, TAB_20_LABEL_PALETTE, AUTO_DEFAULT_PALETTE_ID); +} + +function createPaletteLabelColorMap( + unique: string[], + palette: string[], + seedPrefix: LabelColorMapId +): Record { + const colors: Record = {}; + const used = new Set(); + let nonMissingIndex = 0; + let overflowIndex = 0; + + for (const label of unique) { + if (label === MISSING_LABEL_SENTINEL) { + colors[label] = MISSING_LABEL_COLOR; + used.add(MISSING_LABEL_COLOR.toLowerCase()); + continue; + } + + let candidate = + nonMissingIndex < palette.length + ? (palette[nonMissingIndex] ?? FALLBACK_LABEL_COLOR) + : createOverflowColor(overflowIndex, seedPrefix); + + let safety = 0; + while (used.has(candidate.toLowerCase()) && safety < 2048) { + overflowIndex += 1; + candidate = createOverflowColor(overflowIndex, seedPrefix); + safety += 1; + } + + if (nonMissingIndex >= palette.length) { + overflowIndex += 1; + } + + if (used.has(candidate.toLowerCase())) { + candidate = FALLBACK_LABEL_COLOR; + } + + colors[label] = candidate; + used.add(candidate.toLowerCase()); + nonMissingIndex += 1; + } + + return colors; +} + +/** + * Builds a deterministic label → color mapping for the given label universe. + * + * Notes: + * - `auto` mode uses `tab20` as the default categorical palette. + * - `classic20`, `tab10`, `tab20`, and `wong` use fixed categorical palettes + * first, then deterministic overflow colors for additional labels. + */ +export function createLabelColorMap( + labels: string[], + options?: { paletteId?: LabelColorMapId } +): Record { + const unique = Array.from(new Set(labels.map((l) => normalizeLabel(l)))).sort(stableLabelSort); + const paletteId = options?.paletteId ?? "auto"; + + if (paletteId === "classic20") { + return createPaletteLabelColorMap(unique, CLASSIC_20_LABEL_PALETTE, "classic20"); + } + + if (paletteId === "tab10") { + return createPaletteLabelColorMap(unique, TAB_10_LABEL_PALETTE, "tab10"); + } + + if (paletteId === "tab20") { + return createPaletteLabelColorMap(unique, TAB_20_LABEL_PALETTE, "tab20"); + } + + if (paletteId === "wong") { + return createPaletteLabelColorMap(unique, WONG_LABEL_PALETTE, "wong"); + } + + return createAutoLabelColorMap(unique); +} + +export function normalizeLabel(label: string | null | undefined): string { + return label && label.length > 0 ? label : MISSING_LABEL_SENTINEL; +} diff --git a/frontend/src/lib/labelLegend.ts b/frontend/src/lib/labelLegend.ts new file mode 100644 index 0000000..22546e3 --- /dev/null +++ b/frontend/src/lib/labelLegend.ts @@ -0,0 +1,234 @@ +import type { EmbeddingsData } from "@/types"; +import { + FALLBACK_LABEL_COLOR, + MISSING_LABEL_COLOR, + normalizeLabel, + type LabelColorMapId, +} from "@/lib/labelColors"; +import { createCategoricalLabelTransferFunction } from "@/lib/colorTransfer"; + +export const UNSELECTED_LABEL_ALPHA = 0.12; + +export interface ScatterLabelsInfo { + uniqueLabels: string[]; + categories: Uint16Array; + palette: string[]; +} + +function clamp01(v: number): number { + if (v < 0) return 0; + if (v > 1) return 1; + return v; +} + +function applyAlphaToHex(color: string, alpha: number): string { + if (!color.startsWith("#")) return color; + const hex = Math.round(clamp01(alpha) * 255) + .toString(16) + .padStart(2, "0"); + + if (color.length === 7) { + return `${color}${hex}`; + } + + if (color.length === 9) { + return `${color.slice(0, 7)}${hex}`; + } + + return color; +} + +function applyLabelFilterToPalette(params: { + palette: string[]; + labels: string[]; + labelFilter: string | null; + unselectedAlpha: number; +}): string[] { + const { palette, labels, labelFilter, unselectedAlpha } = params; + if (!labelFilter) return palette; + if (!labels.includes(labelFilter)) return palette; + + return palette.map((color, idx) => + labels[idx] === labelFilter ? color : applyAlphaToHex(color, unselectedAlpha) + ); +} + +export function buildLabelCounts(embeddings: EmbeddingsData | null): Map { + const counts = new Map(); + if (!embeddings) return counts; + for (const raw of embeddings.labels) { + const l = normalizeLabel(raw); + counts.set(l, (counts.get(l) ?? 0) + 1); + } + return counts; +} + +export function buildLabelUniverse( + datasetLabels: string[], + embeddingsLabels: (string | null)[] | null +): string[] { + const universe: string[] = []; + const seen = new Set(); + let hasMissing = false; + + const baseLabels = datasetLabels.map((l) => normalizeLabel(l)); + for (const l of baseLabels) { + if (l === "undefined") { + hasMissing = true; + continue; + } + if (seen.has(l)) continue; + seen.add(l); + universe.push(l); + } + + if (embeddingsLabels) { + const extras = new Set(); + for (const raw of embeddingsLabels) { + const l = normalizeLabel(raw); + if (l === "undefined") { + hasMissing = true; + continue; + } + if (!seen.has(l)) extras.add(l); + } + + if (extras.size > 0) { + const extraSorted = Array.from(extras).sort((a, b) => a.localeCompare(b)); + for (const l of extraSorted) { + seen.add(l); + universe.push(l); + } + } + } + + if (hasMissing) universe.push("undefined"); + return universe; +} + +export function buildLabelsInfo(params: { + datasetLabels: string[]; + embeddings: EmbeddingsData | null; + labelColorMapId: LabelColorMapId; + labelFilter?: string | null; + unselectedAlpha?: number; +}): ScatterLabelsInfo | null { + const { + datasetLabels, + embeddings, + labelColorMapId, + labelFilter = null, + unselectedAlpha = UNSELECTED_LABEL_ALPHA, + } = params; + if (!embeddings) return null; + + const universe = buildLabelUniverse(datasetLabels, embeddings.labels); + + // Guard: hyper-scatter categories are Uint16. + if (universe.length > 65535) { + console.warn( + `Too many labels (${universe.length}) for uint16 categories; collapsing to a single color.` + ); + return { + uniqueLabels: ["undefined"], + categories: new Uint16Array(embeddings.labels.length), + palette: [FALLBACK_LABEL_COLOR], + }; + } + + const labelToCategory: Record = {}; + for (let i = 0; i < universe.length; i++) { + labelToCategory[universe[i]] = i; + } + + const undefinedIndex = labelToCategory["undefined"] ?? 0; + const categories = new Uint16Array(embeddings.labels.length); + for (let i = 0; i < embeddings.labels.length; i++) { + const key = normalizeLabel(embeddings.labels[i]); + categories[i] = labelToCategory[key] ?? undefinedIndex; + } + + const transfer = createCategoricalLabelTransferFunction({ + labels: universe, + paletteId: labelColorMapId, + }); + let palette = universe.map((l) => transfer.colorFor(l)); + + const filteredPalette = applyLabelFilterToPalette({ + palette, + labels: universe, + labelFilter, + unselectedAlpha, + }); + + return { uniqueLabels: universe, categories, palette: filteredPalette }; +} + +export function buildLabelColorMap(params: { + labelsInfo: ScatterLabelsInfo | null; + labelUniverse: string[]; + labelColorMapId: LabelColorMapId; + labelFilter?: string | null; + unselectedAlpha?: number; +}): Record { + const { + labelsInfo, + labelUniverse, + labelColorMapId, + labelFilter = null, + unselectedAlpha = UNSELECTED_LABEL_ALPHA, + } = params; + const map: Record = {}; + + if (labelsInfo) { + for (let i = 0; i < labelsInfo.uniqueLabels.length; i++) { + map[labelsInfo.uniqueLabels[i]] = labelsInfo.palette[i] ?? FALLBACK_LABEL_COLOR; + } + return map; + } + + if (labelUniverse.length === 0) return map; + + const transfer = createCategoricalLabelTransferFunction({ + labels: labelUniverse, + paletteId: labelColorMapId, + }); + for (const label of labelUniverse) { + map[label] = transfer.colorFor(label); + } + + if (!labelFilter || !labelUniverse.includes(labelFilter)) return map; + + for (const label of labelUniverse) { + if (label !== labelFilter) { + map[label] = applyAlphaToHex(map[label], unselectedAlpha); + } + } + + return map; +} + +export function buildLegendLabels(params: { + labelUniverse: string[]; + labelCounts: Map; + query: string; +}): string[] { + const { labelUniverse, labelCounts, query } = params; + const all = labelUniverse.length > 0 ? [...labelUniverse] : Array.from(labelCounts.keys()); + const q = query.trim().toLowerCase(); + const filtered = q ? all.filter((l) => l.toLowerCase().includes(q)) : all; + const hasCounts = labelCounts.size > 0; + + return filtered.sort((a, b) => { + if (a === "undefined" && b !== "undefined") return 1; + if (b === "undefined" && a !== "undefined") return -1; + + if (hasCounts) { + const ca = labelCounts.get(a) ?? 0; + const cb = labelCounts.get(b) ?? 0; + if (cb !== ca) return cb - ca; + } + + return a.localeCompare(b); + }); +} diff --git a/frontend/src/lib/layouts.ts b/frontend/src/lib/layouts.ts new file mode 100644 index 0000000..2f02e92 --- /dev/null +++ b/frontend/src/lib/layouts.ts @@ -0,0 +1,17 @@ +import type { Geometry, LayoutInfo } from "@/types"; + +export function listAvailableGeometries(layouts: LayoutInfo[]): Geometry[] { + const geometries = new Set(); + for (const layout of layouts) { + geometries.add(layout.geometry); + } + return Array.from(geometries); +} + +export function findLayoutByGeometry(layouts: LayoutInfo[], geometry: Geometry): LayoutInfo | undefined { + return layouts.find((l) => l.geometry === geometry); +} + +export function findLayoutByKey(layouts: LayoutInfo[], layoutKey: string): LayoutInfo | undefined { + return layouts.find((l) => l.layout_key === layoutKey); +} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts new file mode 100644 index 0000000..bd0c391 --- /dev/null +++ b/frontend/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/frontend/src/store/useColorSettings.ts b/frontend/src/store/useColorSettings.ts new file mode 100644 index 0000000..56d0971 --- /dev/null +++ b/frontend/src/store/useColorSettings.ts @@ -0,0 +1,36 @@ +import { create } from "zustand"; +import { createJSONStorage, persist } from "zustand/middleware"; + +import type { LabelColorMapId } from "@/lib/labelColors"; + +export interface LabelColorMapOption { + value: LabelColorMapId; + label: string; +} + +export const LABEL_COLOR_MAP_OPTIONS: LabelColorMapOption[] = [ + { value: "auto", label: "Auto" }, + { value: "tab20", label: "Tab 20" }, + { value: "tab10", label: "Tab 10" }, + { value: "wong", label: "Wong" }, + { value: "classic20", label: "Classic 20" }, +]; + +interface ColorSettingsState { + labelColorMapId: LabelColorMapId; + setLabelColorMapId: (value: LabelColorMapId) => void; +} + +export const useColorSettings = create()( + persist( + (set) => ({ + labelColorMapId: "auto", + setLabelColorMapId: (value) => set({ labelColorMapId: value }), + }), + { + name: "hyperview-color-settings", + version: 1, + storage: createJSONStorage(() => localStorage), + } + ) +); diff --git a/frontend/src/store/useStore.ts b/frontend/src/store/useStore.ts index 59abb54..6285652 100644 --- a/frontend/src/store/useStore.ts +++ b/frontend/src/store/useStore.ts @@ -1,68 +1,138 @@ import { create } from "zustand"; -import type { DatasetInfo, EmbeddingsData, Sample, ViewMode } from "@/types"; +import type { + CurationFilterRequest, + DatasetInfo, + EmbeddingsData, + Sample, + VideoAnnotation, +} from "@/types"; +import { normalizeLabel } from "@/lib/labelColors"; + +type SelectionSource = "scatter" | "grid" | "lasso" | "label" | "curation" | null; + +export interface CurationFilterState { + minAestheticScore: number; + minMotionScore: number; + maxCosineSimilarity: number; + captionQuery: string; + dedupStatus: "all" | "kept" | "removed" | "unknown"; +} + +const DEFAULT_CURATION_FILTERS: CurationFilterState = { + minAestheticScore: 0, + minMotionScore: 0, + maxCosineSimilarity: 1, + captionQuery: "", + dedupStatus: "all", +}; + +function computeLabelSelection(embeddings: EmbeddingsData, label: string): Set { + const target = normalizeLabel(label); + const ids = new Set(); + for (let i = 0; i < embeddings.labels.length; i++) { + if (normalizeLabel(embeddings.labels[i]) === target) { + ids.add(embeddings.ids[i]); + } + } + return ids; +} interface AppState { - // Dataset info + leftPanelOpen: boolean; + rightPanelOpen: boolean; + bottomPanelOpen: boolean; + setLeftPanelOpen: (open: boolean) => void; + setRightPanelOpen: (open: boolean) => void; + setBottomPanelOpen: (open: boolean) => void; + datasetInfo: DatasetInfo | null; setDatasetInfo: (info: DatasetInfo) => void; - // Samples samples: Sample[]; totalSamples: number; + samplesLoaded: number; setSamples: (samples: Sample[], total: number) => void; appendSamples: (samples: Sample[]) => void; addSamplesIfMissing: (samples: Sample[]) => void; - // Embeddings - embeddings: EmbeddingsData | null; - setEmbeddings: (data: EmbeddingsData) => void; + embeddingsByLayoutKey: Record; + setEmbeddingsForLayout: (layoutKey: string, data: EmbeddingsData) => void; - // View mode (euclidean or hyperbolic) - viewMode: ViewMode; - setViewMode: (mode: ViewMode) => void; + activeLayoutKey: string | null; + setActiveLayoutKey: (layoutKey: string | null) => void; + + labelFilter: string | null; + setLabelFilter: (label: string | null) => void; - // Selection selectedIds: Set; isLassoSelection: boolean; - setSelectedIds: (ids: Set, isLasso?: boolean) => void; + selectionSource: SelectionSource; + setSelectedIds: (ids: Set, source?: "scatter" | "grid" | "label" | "curation") => void; toggleSelection: (id: string) => void; addToSelection: (ids: string[]) => void; clearSelection: () => void; - // Hover state + lassoQuery: { layoutKey: string; polygon: number[] } | null; + lassoSamples: Sample[]; + lassoTotal: number; + lassoIsLoading: boolean; + beginLassoSelection: (query: { layoutKey: string; polygon: number[] }) => void; + setLassoResults: (samples: Sample[], total: number, append?: boolean) => void; + clearLassoSelection: () => void; + + activeVideoId: string | null; + setActiveVideoId: (id: string | null) => void; + globalSeekTime: number; + setGlobalSeekTime: (seconds: number) => void; + isTimelinePlaying: boolean; + setTimelinePlaying: (playing: boolean) => void; + videoDurations: Record; + setVideoDuration: (sampleId: string, duration: number) => void; + previewVideoId: string | null; + setPreviewVideoId: (sampleId: string | null) => void; + + curationFilters: CurationFilterState; + setCurationFilters: (patch: Partial) => void; + resetCurationFilters: () => void; + curationQuery: CurationFilterRequest | null; + setCurationQuery: (query: CurationFilterRequest | null) => void; + + annotationCache: Record; + cacheAnnotation: (sampleId: string, annotation: VideoAnnotation) => void; + hoveredId: string | null; setHoveredId: (id: string | null) => void; - // Loading states isLoading: boolean; setIsLoading: (loading: boolean) => void; - // Error state error: string | null; setError: (error: string | null) => void; - - // Label filter - filterLabel: string | null; - setFilterLabel: (label: string | null) => void; - - // UI state - showLabels: boolean; - setShowLabels: (show: boolean) => void; } -export const useStore = create((set, get) => ({ - // Dataset info +export const useStore = create((set) => ({ + leftPanelOpen: false, + rightPanelOpen: false, + bottomPanelOpen: false, + setLeftPanelOpen: (open) => set({ leftPanelOpen: open }), + setRightPanelOpen: (open) => set({ rightPanelOpen: open }), + setBottomPanelOpen: (open) => set({ bottomPanelOpen: open }), + datasetInfo: null, setDatasetInfo: (info) => set({ datasetInfo: info }), - // Samples samples: [], totalSamples: 0, - setSamples: (samples, total) => set({ samples, totalSamples: total }), + samplesLoaded: 0, + setSamples: (samples, total) => set({ samples, totalSamples: total, samplesLoaded: samples.length }), appendSamples: (newSamples) => - set((state) => ({ - samples: [...state.samples, ...newSamples], - })), + set((state) => { + const existingIds = new Set(state.samples.map((s) => s.id)); + const toAdd = newSamples.filter((s) => !existingIds.has(s.id)); + const samplesLoaded = state.samplesLoaded + newSamples.length; + if (toAdd.length === 0) return { samplesLoaded }; + return { samples: [...state.samples, ...toAdd], samplesLoaded }; + }), addSamplesIfMissing: (newSamples) => set((state) => { const existingIds = new Set(state.samples.map((s) => s.id)); @@ -71,18 +141,94 @@ export const useStore = create((set, get) => ({ return { samples: [...state.samples, ...toAdd] }; }), - // Embeddings - embeddings: null, - setEmbeddings: (data) => set({ embeddings: data }), + embeddingsByLayoutKey: {}, + setEmbeddingsForLayout: (layoutKey, data) => + set((state) => { + const selectionUpdate = + state.labelFilter && + state.selectionSource === "label" && + state.activeLayoutKey === layoutKey + ? { + selectedIds: computeLabelSelection(data, state.labelFilter), + selectionSource: "label" as const, + } + : {}; + + return { + embeddingsByLayoutKey: { ...state.embeddingsByLayoutKey, [layoutKey]: data }, + ...selectionUpdate, + }; + }), - // View mode - viewMode: "hyperbolic", - setViewMode: (mode) => set({ viewMode: mode }), + activeLayoutKey: null, + setActiveLayoutKey: (layoutKey) => + set((state) => { + if (!layoutKey) return { activeLayoutKey: null }; + if (!state.labelFilter || state.selectionSource !== "label") { + return { activeLayoutKey: layoutKey }; + } + + const embeddings = state.embeddingsByLayoutKey[layoutKey]; + if (!embeddings) { + return { + activeLayoutKey: layoutKey, + selectedIds: new Set(), + selectionSource: "label", + }; + } + + return { + activeLayoutKey: layoutKey, + selectedIds: computeLabelSelection(embeddings, state.labelFilter), + selectionSource: "label", + }; + }), + + labelFilter: null, + setLabelFilter: (label) => + set((state) => { + const nextLabel = label ? normalizeLabel(label) : null; + const nextState: Partial = { labelFilter: nextLabel }; + + if (nextLabel) { + const layoutKey = state.activeLayoutKey; + const embeddings = layoutKey ? state.embeddingsByLayoutKey[layoutKey] : null; + nextState.selectedIds = embeddings ? computeLabelSelection(embeddings, nextLabel) : new Set(); + nextState.selectionSource = "label"; + nextState.isLassoSelection = false; + nextState.lassoQuery = null; + nextState.lassoSamples = []; + nextState.lassoTotal = 0; + nextState.lassoIsLoading = false; + } else if (state.selectionSource === "label") { + nextState.selectedIds = new Set(); + nextState.selectionSource = null; + } + + return nextState; + }), - // Selection selectedIds: new Set(), isLassoSelection: false, - setSelectedIds: (ids, isLasso = false) => set({ selectedIds: ids, isLassoSelection: isLasso }), + selectionSource: null, + setSelectedIds: (ids, source = "grid") => + set((state) => { + const nextActive = + ids.size > 0 && source !== "label" + ? (Array.from(ids)[0] ?? state.activeVideoId) + : state.activeVideoId; + + return { + selectedIds: ids, + selectionSource: ids.size > 0 ? source : null, + isLassoSelection: false, + lassoQuery: null, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: false, + activeVideoId: nextActive, + }; + }), toggleSelection: (id) => set((state) => { const newSet = new Set(state.selectedIds); @@ -91,35 +237,124 @@ export const useStore = create((set, get) => ({ } else { newSet.add(id); } - // Manual selection from image grid, not lasso - return { selectedIds: newSet, isLassoSelection: false }; + return { + selectedIds: newSet, + selectionSource: newSet.size > 0 ? "grid" : null, + isLassoSelection: false, + lassoQuery: null, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: false, + activeVideoId: + newSet.size > 0 + ? (newSet.has(id) ? id : (Array.from(newSet)[0] ?? state.activeVideoId)) + : state.activeVideoId, + }; }), addToSelection: (ids) => set((state) => { const newSet = new Set(state.selectedIds); ids.forEach((id) => newSet.add(id)); - // Manual selection from image grid, not lasso - return { selectedIds: newSet, isLassoSelection: false }; + return { + selectedIds: newSet, + selectionSource: newSet.size > 0 ? "grid" : null, + isLassoSelection: false, + lassoQuery: null, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: false, + activeVideoId: ids[ids.length - 1] ?? state.activeVideoId, + }; + }), + clearSelection: () => + set({ + selectedIds: new Set(), + selectionSource: null, + isLassoSelection: false, + lassoQuery: null, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: false, }), - clearSelection: () => set({ selectedIds: new Set(), isLassoSelection: false }), - // Hover + lassoQuery: null, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: false, + beginLassoSelection: (query) => + set({ + isLassoSelection: true, + selectedIds: new Set(), + selectionSource: "lasso", + lassoQuery: query, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: true, + }), + setLassoResults: (samples, total, append = false) => + set((state) => ({ + lassoSamples: append ? [...state.lassoSamples, ...samples] : samples, + lassoTotal: total, + lassoIsLoading: false, + })), + clearLassoSelection: () => + set({ + isLassoSelection: false, + selectionSource: null, + lassoQuery: null, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: false, + }), + + activeVideoId: null, + setActiveVideoId: (id) => set({ activeVideoId: id }), + globalSeekTime: 0, + setGlobalSeekTime: (seconds) => set({ globalSeekTime: Math.max(0, seconds) }), + isTimelinePlaying: false, + setTimelinePlaying: (playing) => set({ isTimelinePlaying: playing }), + videoDurations: {}, + setVideoDuration: (sampleId, duration) => + set((state) => ({ + videoDurations: { + ...state.videoDurations, + [sampleId]: Math.max(0, duration), + }, + })), + previewVideoId: null, + setPreviewVideoId: (sampleId) => set({ previewVideoId: sampleId }), + + curationFilters: DEFAULT_CURATION_FILTERS, + setCurationFilters: (patch) => + set((state) => ({ curationFilters: { ...state.curationFilters, ...patch } })), + resetCurationFilters: () => set({ curationFilters: { ...DEFAULT_CURATION_FILTERS }, curationQuery: null }), + curationQuery: null, + setCurationQuery: (query) => + set({ + curationQuery: query, + isLassoSelection: false, + lassoQuery: null, + lassoSamples: [], + lassoTotal: 0, + lassoIsLoading: false, + selectionSource: query ? "curation" : null, + }), + + annotationCache: {}, + cacheAnnotation: (sampleId, annotation) => + set((state) => ({ + annotationCache: { + ...state.annotationCache, + [sampleId]: annotation, + }, + })), + hoveredId: null, setHoveredId: (id) => set({ hoveredId: id }), - // Loading isLoading: false, setIsLoading: (loading) => set({ isLoading: loading }), - // Error error: null, setError: (error) => set({ error }), - - // Label filter - filterLabel: null, - setFilterLabel: (label) => set({ filterLabel: label }), - - // UI state - showLabels: true, - setShowLabels: (show) => set({ showLabels: show }), })); diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index bfb2616..8aeb275 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -5,23 +5,45 @@ export interface Sample { label: string | null; thumbnail: string | null; metadata: Record; - embedding_2d?: [number, number]; - embedding_2d_hyperbolic?: [number, number]; + width: number | null; + height: number | null; +} + +export type Geometry = "euclidean" | "poincare"; + +export interface SpaceInfo { + space_key: string; + model_id: string; + dim: number; + count: number; + provider: string; + geometry: Geometry | string; + config: Record | null; +} + +export interface LayoutInfo { + layout_key: string; + space_key: string; + method: string; + geometry: Geometry; + count: number; + params: Record | null; } export interface DatasetInfo { name: string; num_samples: number; labels: string[]; - label_colors: Record; + spaces: SpaceInfo[]; + layouts: LayoutInfo[]; } export interface EmbeddingsData { + layout_key: string; + geometry: Geometry; ids: string[]; labels: (string | null)[]; - euclidean: [number, number][]; - hyperbolic: [number, number][]; - label_colors: Record; + coords: [number, number][]; } export interface SamplesResponse { @@ -31,4 +53,64 @@ export interface SamplesResponse { samples: Sample[]; } -export type ViewMode = "euclidean" | "hyperbolic"; +export interface VideoAnnotation { + id: string; + caption: string | null; + reasoning: string | null; + raw_caption: string | null; + aesthetic_score: number | null; + motion_score: number | null; + dedup_status: string | null; + dedup_keep: boolean | null; + cosine_sim_score: number | null; + source_video: string | null; + video_path: string | null; + span: [number, number] | number[] | null; +} + +export interface HistogramBin { + start: number; + end: number; + count: number; +} + +export interface ScoreSummary { + count: number; + min: number | null; + max: number | null; + avg: number | null; +} + +export interface CurationStats { + total_samples: number; + with_video: number; + with_caption: number; + dedup_counts: Record; + score_summary: { + aesthetic: ScoreSummary; + motion: ScoreSummary; + }; + aesthetic_histogram: HistogramBin[]; + motion_histogram: HistogramBin[]; +} + +export type DedupStatus = "kept" | "removed" | "unknown"; + +export interface CurationFilterRequest { + min_aesthetic_score?: number; + min_motion_score?: number; + max_cosine_similarity?: number; + caption_query?: string; + dedup_status?: DedupStatus; + offset?: number; + limit?: number; + include_thumbnails?: boolean; +} + +export interface CurationFilterResponse { + total: number; + offset: number; + limit: number; + sample_ids: string[]; + samples: Sample[]; +} diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts index 7aa3713..9ebc9b5 100644 --- a/frontend/tailwind.config.ts +++ b/frontend/tailwind.config.ts @@ -1,6 +1,7 @@ import type { Config } from "tailwindcss"; export default { + darkMode: ["class"], content: [ "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", "./src/components/**/*.{js,ts,jsx,tsx,mdx}", @@ -9,17 +10,58 @@ export default { theme: { extend: { colors: { - // Dark theme colors (shadcn-style with Indigo primary) - background: "#0a0a0b", - surface: "#18181b", - "surface-light": "#27272a", - border: "#3f3f46", - primary: "#4F46E5", - "primary-light": "#818CF8", - text: "#fafafa", - "text-muted": "#a1a1aa", + // shadcn semantic colors (HSL-based) + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + + // Rerun-specific aliases + surface: "hsl(var(--surface))", + "surface-light": "hsl(var(--surface-light))", + "surface-elevated": "hsl(var(--surface-elevated))", + "border-subtle": "hsl(var(--border-subtle))", + text: "hsl(var(--text))", + "text-muted": "hsl(var(--text-muted))", + "text-subtle": "hsl(var(--text-subtle))", + "accent-cyan": "hsl(var(--accent-cyan))", + "accent-orange": "hsl(var(--accent-orange))", + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", }, }, }, - plugins: [], + plugins: [require("tailwindcss-animate")], } satisfies Config; diff --git a/notebooks/INSTALLATION.md b/notebooks/INSTALLATION.md new file mode 100644 index 0000000..2e332d8 --- /dev/null +++ b/notebooks/INSTALLATION.md @@ -0,0 +1,80 @@ +# Installation Instructions + +This guide shows how to set up and run the demo notebook in VSCode. + +## Prerequisites + +- [uv](https://docs.astral.sh/uv/) package manager installed +- VSCode with Python extension + +## Setup Steps + +### 1. Initialize the Project + +```bash +uv init +``` + +This creates a new project named `hyperview-demo-notebook`. + +### 2. Create Virtual Environment + +```bash +uv venv .venv +``` + +This creates a virtual environment using Python 3.13.2 in the `.venv` directory. + +### 3. Activate Virtual Environment + +```bash +source .venv/bin/activate +``` + +Your terminal prompt should now show `(.venv)` at the beginning. + +### 4. Install Required Packages + +Install the packages in the following order: + +```bash +uv pip install ipykernel +``` + +```bash +uv pip install jupyter +``` + +```bash +uv pip install hyperview +``` + +**Note:** Do not use commas between package names when installing multiple packages at once. Use spaces instead or install packages separately. + +## Verify Installation + +After installation, you should have: + +- Jupyter notebook support (68+ packages) +- IPython kernel for running notebooks (30+ packages) +- Hyperview and dependencies (59+ packages) + +## Running the Notebook + +1. Open the notebook file in VSCode +2. Select the Python interpreter from `.venv` when prompted +3. Run the notebook cells + +## Troubleshooting + +### Virtual Environment Not Activating + +If you see "no such file or directory" when activating, check the path: + +```bash +source .venv/bin/activate +``` + +### Package Installation Errors + +If you get parsing errors during installation, avoid using commas in the package list. Install packages separately or use spaces to separate package names. diff --git a/notebooks/colab_smoke_test.ipynb b/notebooks/colab_smoke_test.ipynb new file mode 100644 index 0000000..0cea259 --- /dev/null +++ b/notebooks/colab_smoke_test.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "47ee06e6", + "metadata": {}, + "source": [ + "# HyperView — Colab Smoke Test\n", + "\n", + "This notebook verifies that HyperView can launch inside Google Colab and open the UI in a new browser tab.\n", + "\n", + "The smoke test downloads a small set of public-domain NASA images and computes real embeddings using a lightweight model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "945a1017", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install hyperview" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "856febf3", + "metadata": {}, + "outputs": [], + "source": [ + "import hyperview as hv" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58b82256", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import random\n", + "import urllib.parse\n", + "import urllib.request\n", + "from pathlib import Path\n", + "\n", + "# Download a small set of NASA space images (public domain)\n", + "NUM_IMAGES = 24\n", + "CACHE_DIR = Path(\"/tmp/_nasa_smoke_images\")\n", + "NASA_QUERIES = [\"black hole\", \"nebula\", \"galaxy\", \"jwst\", \"hubble\"]\n", + "\n", + "CACHE_DIR.mkdir(parents=True, exist_ok=True)\n", + "image_files = [\n", + " p for p in CACHE_DIR.iterdir()\n", + " if p.is_file() and p.suffix.lower() in {\".jpg\", \".jpeg\", \".png\", \".webp\"}\n", + "]\n", + "if len(image_files) < NUM_IMAGES:\n", + " rng = random.Random(42)\n", + " query = rng.choice(NASA_QUERIES)\n", + " params = {\"q\": query, \"media_type\": \"image\", \"page\": \"1\"}\n", + " api_url = f\"https://images-api.nasa.gov/search?{urllib.parse.urlencode(params)}\"\n", + " items = json.load(urllib.request.urlopen(api_url))[\"collection\"][\"items\"]\n", + " rng.shuffle(items)\n", + "\n", + " for i, item in enumerate(items[:NUM_IMAGES]):\n", + " href = item[\"links\"][0][\"href\"]\n", + " ext = Path(urllib.parse.urlparse(href).path).suffix or \".jpg\"\n", + " urllib.request.urlretrieve(href, CACHE_DIR / f\"nasa_{i:03d}{ext}\")\n", + "\n", + "# Create dataset and add images\n", + "dataset = hv.Dataset(\"colab_smoke\", persist=False)\n", + "added, skipped = dataset.add_images_dir(str(CACHE_DIR), label_from_folder=False)\n", + "print(f\"✓ Loaded {added} NASA images\" + (f\" ({skipped} already present)\" if skipped else \"\"))\n", + "\n", + "# Compute embeddings with a lightweight model\n", + "MODEL = \"google/siglip-base-patch16-224\"\n", + "dataset.compute_embeddings(model=MODEL, show_progress=True)\n", + "dataset.compute_visualization()\n", + "\n", + "# Launch HyperView\n", + "hv.launch(dataset, port=6262)" + ] + }, + { + "cell_type": "markdown", + "id": "b1cb3148", + "metadata": {}, + "source": [ + "Click the link printed above to open HyperView in a new tab. In Colab, you may need to copy/paste the URL." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/hyperview_clip_umap.py b/notebooks/hyperview_clip_umap.py new file mode 100644 index 0000000..e6b5c8d --- /dev/null +++ b/notebooks/hyperview_clip_umap.py @@ -0,0 +1,75 @@ +# %% [markdown] +# # HyperView Demo: Image Embeddings + UMAP Visualization +# +# Demonstrates computing image embeddings and visualizing them in 2D using UMAP +# with the HyperView Dataset API. Supports CLIP and SigLip models. + +# %% +import json +import random +import urllib.parse +import urllib.request +from pathlib import Path + +import hyperview as hv + +# %% [markdown] +# ## Download Random Space Images (NASA, Public Domain) +# +# This demo downloads a random set of space images from NASA's Images and Video Library +# (https://images.nasa.gov). NASA imagery is generally public domain (US Government work). + +# %% +NUM_IMAGES = 48 +CACHE_DIR = Path(__file__).parent / "_nasa_space_images" +RANDOM_SEED = None # Set to an int (e.g. 0) for reproducible sampling +NASA_QUERIES = ["black hole", "nebula", "galaxy", "jwst", "hubble"] + + +CACHE_DIR.mkdir(parents=True, exist_ok=True) +image_files = [ + p + for p in CACHE_DIR.iterdir() + if p.is_file() and p.suffix.lower() in {".jpg", ".jpeg", ".png", ".webp", ".tif", ".tiff"} +] +if len(image_files) < NUM_IMAGES: + rng = random.Random(RANDOM_SEED) + query = rng.choice(NASA_QUERIES) + params = {"q": query, "media_type": "image", "page": "1"} + api_url = f"https://images-api.nasa.gov/search?{urllib.parse.urlencode(params)}" + items = json.load(urllib.request.urlopen(api_url))["collection"]["items"] + rng.shuffle(items) + + for i, item in enumerate(items[:NUM_IMAGES]): + href = item["links"][0]["href"] + ext = Path(urllib.parse.urlparse(href).path).suffix or ".jpg" + urllib.request.urlretrieve(href, CACHE_DIR / f"nasa_{i:03d}{ext}") + +dataset = hv.Dataset("nasa_space_demo", persist=False) +added, skipped = dataset.add_images_dir(str(CACHE_DIR), label_from_folder=False) +print(f"✓ Loaded {added} NASA space images" + (f" ({skipped} already present)" if skipped else "")) + +# %% [markdown] +# ## Compute Embeddings & UMAP Projection +# +# EmbedAnything supports many HuggingFace vision models, but not all. +# For example, `microsoft/resnet-18` is currently rejected by EmbedAnything +# ("Model not supported"). Common choices that work: +# - CLIP: openai/clip-vit-base-patch32, openai/clip-vit-base-patch16, etc. +# - SigLip: google/siglip-base-patch16-224, google/siglip-large-patch16-384 +# - Jina CLIP: jinaai/jina-clip-v2 + +# %% +# Use any HuggingFace model supported by EmbedAnything +MODEL = "google/siglip-base-patch16-224" + +dataset.compute_embeddings(model=MODEL, show_progress=True) +dataset.compute_visualization() + +# %% [markdown] +# ## Launch HyperView + +# %% +hv.launch(dataset, port=6262, open_browser=True) + + diff --git a/notebooks/umap_tutorial.ipynb b/notebooks/umap_tutorial.ipynb new file mode 100644 index 0000000..39b0f75 --- /dev/null +++ b/notebooks/umap_tutorial.ipynb @@ -0,0 +1,779 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "47ee06e6", + "metadata": { + "id": "47ee06e6" + }, + "source": [ + "# HyperView: CLIP vs HyCoCLIP with 2D UMAP Projection on CIFAR-100\n", + "\n", + "This notebook compares two embedding spaces on the same image set.\n", + "\n", + "- [**CLIP**](https://github.com/openai/CLIP) maps images and text into one shared vector space.\n", + " \n", + "- [**HyCoCLIP**](https://github.com/PalAvik/hycoclip) maps images into a space designed for hierarchy and tree like structure.\n", + " \n", + "- We then compute a **2D projection** of each embedding space with [UMAP](https://umap-learn.readthedocs.io/en/latest/) so we can inspect clusters and label structure.\n", + " \n", + "\n", + "HyperView allows us to compare the embedding spaces of these different geometries.\n", + "\n", + "In this demo, we use the [CIFAR-100](https://huggingface.co/datasets/uoft-cs/cifar100) dataset of tiny images, available through HuggingFace." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Install\n", + "\n", + "HyperView is a library for dataset curation and model analysis. It provides tools for interactive visualization of the embedding space." + ], + "metadata": { + "id": "hyaagNXkyUBN" + }, + "id": "hyaagNXkyUBN" + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "945a1017", + "metadata": { + "id": "945a1017" + }, + "outputs": [], + "source": [ + "%%capture\n", + "# If you run this in Google Colab, install HyperView with this command.\n", + "!uv pip install hyperview" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Import HyperView" + ], + "metadata": { + "id": "hYtO76VBy7C9" + }, + "id": "hYtO76VBy7C9" + }, + { + "cell_type": "markdown", + "source": [ + "\n", + "We import HyperView and use it as the main interface for:\n", + "\n", + "- reading data\n", + " \n", + "- computing embeddings with pretrained models\n", + " \n", + "- computing a 2D projection for visualization\n", + " \n", + "- launching the interactive viewer\n", + " " + ], + "metadata": { + "id": "v-TvwC2Qyw42" + }, + "id": "v-TvwC2Qyw42" + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "58b82256", + "metadata": { + "id": "58b82256" + }, + "outputs": [], + "source": [ + "import hyperview as hv" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Configuration" + ], + "metadata": { + "id": "nH4CjViEy-U4" + }, + "id": "nH4CjViEy-U4" + }, + { + "cell_type": "markdown", + "source": [ + "We specify the dataset and model settings in a single dictionary.\n", + "\n", + "### Data source\n", + "\n", + "- We load **CIFAR-100** from Hugging Face.\n", + " \n", + "- We use the **test** split.\n", + " \n", + "- `img` is the image field.\n", + " \n", + "- We use `coarse_label` for labels." + ], + "metadata": { + "id": "36tl8PxjzBT6" + }, + "id": "36tl8PxjzBT6" + }, + { + "cell_type": "markdown", + "source": [ + "Why coarse labels:\n", + "\n", + "- HyperView disables distinct label coloring when there are more than 20 labels.\n", + " \n", + "- CIFAR-100 has 100 fine labels, but 20 coarse labels.\n", + " \n", + "- Using coarse labels keeps label coloring useful in the viewer.\n", + " " + ], + "metadata": { + "id": "SIR8CsvfzW3I" + }, + "id": "SIR8CsvfzW3I" + }, + { + "cell_type": "markdown", + "source": [ + "### Sampling\n", + "\n", + "- `NUM_SAMPLES = 200` keeps embedding and layout computation fast enough for a demo.\n", + " \n", + "- Increase this if you want denser clusters, but expect more compute time.\n", + " " + ], + "metadata": { + "id": "tXpwwCXozezd" + }, + "id": "tXpwwCXozezd" + }, + { + "cell_type": "markdown", + "source": [ + "### Models\n", + "\n", + "- `openai/clip-vit-base-patch32` is a common CLIP baseline.\n", + " \n", + "- `hycoclip-vit-s` is a HyCoCLIP model that targets hierarchical structure." + ], + "metadata": { + "id": "NCtE2BN0zk3G" + }, + "id": "NCtE2BN0zk3G" + }, + { + "cell_type": "code", + "source": [ + "DATASET_NAME = \"cifar100_coarse_clip_hyper_models\"\n", + "HF_DATASET = \"uoft-cs/cifar100\"\n", + "HF_SPLIT = \"test\"\n", + "HF_IMAGE_KEY = \"img\"\n", + "# NOTE: HyperView disables distinct label coloring when there are >20 labels.\n", + "# CIFAR-100 has 100 fine labels, but only 20 coarse labels.\n", + "HF_LABEL_KEY = \"coarse_label\"\n", + "NUM_SAMPLES = 200\n", + "CLIP_MODEL_ID = \"openai/clip-vit-base-patch32\"\n", + "HYPER_MODELS_MODEL_ID = \"hycoclip-vit-s\"" + ], + "metadata": { + "id": "Wto-RfOFzCdJ" + }, + "id": "Wto-RfOFzCdJ", + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Load CIFAR-100 into a HyperView dataset\n", + "\n", + "We create a HyperView `Dataset` object and then import samples from Hugging Face.\n", + "\n", + "Key parameters:\n", + "\n", + "- `persist=False` keeps this dataset in memory for this run.\n", + " \n", + "- `max_samples=NUM_SAMPLES` subsamples the split.\n", + " \n", + "\n", + "At the end, `len(dataset)` is the number of loaded examples." + ], + "metadata": { + "id": "nEdV-nZTzs3G" + }, + "id": "nEdV-nZTzs3G" + }, + { + "cell_type": "code", + "source": [ + "print(\"Loading CIFAR-100 from Hugging Face...\")\n", + "dataset = hv.Dataset(DATASET_NAME, persist=False)\n", + "dataset.add_from_huggingface(\n", + " HF_DATASET,\n", + " split=HF_SPLIT,\n", + " image_key=HF_IMAGE_KEY,\n", + " label_key=HF_LABEL_KEY,\n", + " max_samples=NUM_SAMPLES,\n", + ")\n", + "print(f\"Loaded {len(dataset)} samples\")\n", + "\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Vb0PAH7gvsP7", + "outputId": "953a9176-fa36-4874-9263-838df3bf0180" + }, + "id": "Vb0PAH7gvsP7", + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Loading CIFAR-100 from Hugging Face...\n", + "Loading 200 samples from uoft-cs/cifar100...\n", + "Images saved to: /root/.hyperview/media/huggingface/uoft-cs_cifar100/test\n", + "Loaded 200 samples\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Compute CLIP embeddings\n", + "\n", + "### What CLIP embeddings represent\n", + "\n", + "CLIP trains an image encoder and a text encoder so that matching image text pairs have nearby vectors. When we compute image embeddings here, each image becomes a single vector in a shared space that also supports text vectors.\n", + "\n", + "### What we do in code\n", + "\n", + "- `compute_embeddings(CLIP_MODEL_ID)` runs the CLIP image encoder and stores one vector per image.\n", + " \n", + "- The returned `space_key` is a handle to that embedding space inside HyperView.\n", + " \n", + "\n", + "### Why we compute a 2D visualization\n", + "\n", + "High dimensional vectors are hard to inspect. We compute a 2D layout so we can see neighborhood structure.\n", + "\n", + "- `compute_visualization(..., geometry=\"euclidean\")` treats the embedding space as Euclidean.\n", + " \n", + "- This matches how CLIP vectors are often used with cosine similarity or dot product in a flat vector space.\n", + " \n", + "\n", + "Note on “UMAP” \n", + "This notebook focuses on a 2D projection step. HyperView computes a 2D layout for the viewer. The title calls this UMAP. In practice, you should treat this as a nonlinear projection that preserves local neighborhoods better than PCA." + ], + "metadata": { + "id": "xvAMFY_Dz71Z" + }, + "id": "xvAMFY_Dz71Z" + }, + { + "cell_type": "markdown", + "source": [ + "## Compute HyCoCLIP embeddings\n", + "\n", + "### Why a different geometry\n", + "\n", + "Some datasets have hierarchical label structure. A tree structure is hard to represent in Euclidean space without distortion.\n", + "\n", + "Hyperbolic spaces can represent tree growth patterns with less distortion than Euclidean spaces. A common model is the **Poincaré ball**, which is a way to work with hyperbolic geometry in a bounded region.\n", + "\n", + "### What we do in code\n", + "\n", + "- `compute_embeddings(model=HYPER_MODELS_MODEL_ID)` computes embeddings from the HyCoCLIP model.\n", + " \n", + "- `compute_visualization(..., geometry=\"poincare\")` tells HyperView to treat distances and neighborhoods using Poincaré geometry.\n", + " \n", + "\n", + "How to read the plot\n", + "\n", + "- In Poincaré style layouts, points near the center and points near the boundary can have different distance behavior than Euclidean layouts.\n", + " \n", + "- Focus on neighborhood membership and cluster separation rather than raw coordinate scale." + ], + "metadata": { + "id": "zEkSKKPN0GZz" + }, + "id": "zEkSKKPN0GZz" + }, + { + "cell_type": "code", + "source": [ + "clip_space = dataset.compute_embeddings(CLIP_MODEL_ID)\n", + "clip_space" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 53 + }, + "id": "rXl9yJKyx3hQ", + "outputId": "472d1e1e-bde6-4b4c-cfe5-5485c7ca18bd" + }, + "id": "rXl9yJKyx3hQ", + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "All 200 samples already have embeddings in space 'embed-anything__openai_clip-vit-base-patch32__4771034973d8'\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'embed-anything__openai_clip-vit-base-patch32__4771034973d8'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "source": [ + "hyperbolic_clip_space = dataset.compute_embeddings(model=HYPER_MODELS_MODEL_ID)\n", + "hyperbolic_clip_space" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 53 + }, + "id": "bxivI8P79IiK", + "outputId": "16c01abb-848e-4915-c88b-4972a532c7eb" + }, + "id": "bxivI8P79IiK", + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Computing embeddings for 200 samples...\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'hyper-models__hycoclip-vit-s__b63e9ee38a30'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## UMAP Parameters: `n_neighbors` and `min_dist`\n", + "\n", + "UMAP creates 2D visualizations through a two-phase process:\n", + "\n", + "1. **Local structure learning** (controlled by `n_neighbors`)\n", + "2. **Layout optimization** (controlled by `min_dist`)\n", + "\n", + "These parameters have different effects depending on whether you're working with Euclidean or hyperbolic embeddings.\n", + "\n", + "\n", + "## `n_neighbors`: Balancing Local vs Global Structure\n", + "\n", + "The `n_neighbors` parameter determines how many nearby points UMAP considers when learning the manifold structure.\n", + "\n", + "**Small values (5-15):**\n", + "- UMAP focuses on immediate neighbors\n", + "- Preserves fine-grained local structure\n", + "- Creates tight, distinct clusters\n", + "- May fragment large-scale patterns\n", + "- Better for finding small subgroups\n", + "\n", + "**Large values (30-100):**\n", + "- UMAP considers broader neighborhoods\n", + "- Captures global dataset organization\n", + "- Creates more connected layouts\n", + "- May blur boundaries between clusters\n", + "- Better for understanding overall structure\n", + "\n", + "**Technical detail:** UMAP constructs a k-nearest neighbor graph using this parameter. The graph encodes which points should remain close in the 2D projection.\n", + "\n", + "**Default: 15**, which is a middle ground that works for most datasets\n", + "\n", + "## `min_dist`: Controlling Point Spacing\n", + "\n", + "The `min_dist` parameter sets the minimum allowed distance between points in the final 2D layout. This is the distance that UMAP forces between **all points** in the 2D layout. When `min-dist` is large points that are in the samle cluster are pushed apart from each other. The visual effect is that we see more empty space everywhere in the plot.\n", + "\n", + "**Small values (0.0-0.1):**\n", + "- Points can be placed very close together\n", + "- Clusters appear dense and compact\n", + "- Easier to see cluster boundaries\n", + "- Can create overlapping point clouds, making them difficult to select with HyperView's lasso tool\n", + "- Good for large datasets where you want to see density\n", + "\n", + "**Large values (0.3-0.99):**\n", + "- Forces points to spread out\n", + "- Individual points are more visible and the layout appears less crowded\n", + "- May exaggerate distances between similar items\n", + "- Good for small datasets or when you need to see each point\n", + "\n", + "**Technical detail:** This parameter affects the \"attractive force\" in UMAP's layout.\n", + "\n", + "**Default: 0.1** (high density some clumping of embedding projections)" + ], + "metadata": { + "id": "PG3rQ6lNAoyV" + }, + "id": "PG3rQ6lNAoyV" + }, + { + "cell_type": "markdown", + "source": [ + "## Parameter Interaction in UMAP\n", + "\n", + "The two parameters work together to shape your visualization:\n", + "\n", + "**n_neighbors + min_dist together:**\n", + "\n", + "| n_neighbors | min_dist | Result |\n", + "|------------|----------|--------|\n", + "| Small (5) | Small (0.01) | Many tight, separated micro-clusters |\n", + "| Small (5) | Large (0.5) | Fragmented layout with forced spacing |\n", + "| Large (50) | Small (0.01) | Dense, continuous manifold structure |\n", + "| Large (50) | Large (0.5) | Smooth, evenly distributed layout |\n", + "\n", + "**Practical example:**\n", + "```python\n", + "# For finding fine subgroups in cell types\n", + "compute_visualization(n_neighbors=10, min_dist=0.05)\n", + "\n", + "# For understanding broad relationships in a corpus\n", + "compute_visualization(n_neighbors=50, min_dist=0.3)" + ], + "metadata": { + "id": "zV_EJELHBkKt" + }, + "id": "zV_EJELHBkKt" + }, + { + "cell_type": "markdown", + "source": [ + "## Parameter Interaction in UMAP\n", + "\n", + "The two parameters work together to shape your visualization:\n", + "\n", + "**n_neighbors + min_dist together:**\n", + "\n", + "| n_neighbors | min_dist | Result |\n", + "|------------|----------|--------|\n", + "| Small (5) | Small (0.01) | Many tight, separated and small clusters |\n", + "| Small (5) | Large (0.5) | Fragmented layout with forced spacing |\n", + "| Large (50) | Small (0.01) | Dense, continuous structure |\n", + "| Large (50) | Large (0.5) | Smooth, evenly distributed layout |\n", + "\n", + "**Snippets:**\n", + "```python\n", + "# For finding fine subgroups in cell types\n", + "compute_visualization(n_neighbors=10, min_dist=0.05)\n", + "\n", + "# For understanding broad relationships in a corpus\n", + "compute_visualization(n_neighbors=50, min_dist=0.3)\n", + "\n", + "\n", + "\n" + ], + "metadata": { + "id": "p4-fczUnDfds" + }, + "id": "p4-fczUnDfds" + }, + { + "cell_type": "markdown", + "source": [ + "### Euclidean UMAP (Standard Embeddings)\n", + "\n", + "```markdown\n", + "## UMAP on Euclidean Embeddings\n", + "\n", + "For standard models (CLIP, ResNet, etc.), embeddings live in flat Euclidean space.\n", + "\n", + "**What happens:**\n", + "1. UMAP measures distances using the specified metric (default: cosine)\n", + "2. Constructs a neighbor graph in the high-dimensional space\n", + "3. Optimizes a 2D layout in flat Euclidean space\n", + "4. Output coordinates are (x, y) pairs with no geometric constraints (can be as far away from each other as originally computed)\n", + "\n", + "**Metric choice matters:**\n", + "- `metric=\"cosine\"`: Best for normalized embeddings (CLIP, sentence transformers)\n", + "- `metric=\"euclidean\"`: Best for embeddings where magnitude matters\n", + "- `metric=\"manhattan\"`: Sometimes better for sparse or categorical data" + ], + "metadata": { + "id": "zXoChx71EfDP" + }, + "id": "zXoChx71EfDP" + }, + { + "cell_type": "code", + "source": [ + "dataset.compute_visualization(space_key=clip_space, # Which embedding space to project\n", + " method=\"umap\", # Projection method (only 'umap' supported)\n", + " geometry=\"euclidean\", # Output geometry: 'euclidean' or 'poincare'\n", + " n_neighbors=15, # UMAP: Number of neighbors (default: 15)\n", + " min_dist=0.1, # UMAP: Minimum distance (default: 0.1)\n", + " metric=\"cosine\", # UMAP: Distance metric (default: 'cosine')\n", + " force=True) # Force recomputation if layout exists\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 53 + }, + "id": "Fd50hTlc9K31", + "outputId": "7272fbef-0a2e-4d2c-8178-9b33764a20c2" + }, + "id": "Fd50hTlc9K31", + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Computing euclidean umap layout for 200 samples...\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'embed-anything__openai_clip-vit-base-patch32__4771034973d8__euclidean_umap_92b543de'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Cell 6: Hyperbolic UMAP (HyCoCLIP and Hyperboloid Embeddings)\n", + "\n", + "```markdown\n", + "## UMAP on Hyperbolic Embeddings\n", + "\n", + "For hyperbolic models (HyCoCLIP), embeddings live in curved hyperbolic space (hyperboloid model).\n", + "\n", + "**What happens:**\n", + "1. HyperView converts hyperboloid coordinates to the Poincaré ball (unit disk)\n", + "2. UMAP measures distances using Poincaré distance (hyperbolic geometry)\n", + "3. Optimizes a 2D layout using hyperbolic distance in the output space\n", + "4. Output coordinates are (x, y) pairs **constrained to the unit disk**\n", + "\n", + "**Key differences from Euclidean:**\n", + "- Distance metric is **automatically** \"poincare\" (you cannot override this)\n", + "- Points near the disk center have more \"room\" (hyperbolic space expands near edges)\n", + "- Same Euclidean distance means different hyperbolic distances at different radii\n", + "- Natural hierarchy: broader or more ambiguous concepts toward center, specific items toward edges. Mislabeled examples also appear near the center as they are hard to separate.\n", + "\n", + "**Parameter effects:**\n", + "- `n_neighbors`: Works the same as Euclidean (controls local vs global)\n", + "- `min_dist`: Interprets distances **in hyperbolic geometry**\n", + " - Same numeric value creates different visual spacing than in Euclidean\n", + " - Points near the boundary can appear closer in visual distance but farther in hyperbolic distance\n", + "\n", + "**Example:**\n", + "```python\n", + "# Hyperbolic CLIP embeddings\n", + "dataset.compute_embeddings(model=\"hycoclip-vit-s\") # Creates hyperboloid space\n", + "dataset.compute_visualization(\n", + " geometry=\"poincare\", # Output to Poincaré disk\n", + " # metric is automatically \"poincare\" (ignores what you pass)\n", + " n_neighbors=15,\n", + " min_dist=0.1\n", + ")" + ], + "metadata": { + "id": "etnAtM19EyUH" + }, + "id": "etnAtM19EyUH" + }, + { + "cell_type": "code", + "source": [ + "dataset.compute_visualization(space_key=hyperbolic_clip_space,\n", + " method=\"umap\",\n", + " geometry=\"poincare\", # Use Poincare ball method to project hyperbolic embedding to 2D plane\n", + " # metric is overriden to \"poincare\", see https://github.com/Hyper3Labs/HyperView/blob/main/src/hyperview/embeddings/projection.py#L102\n", + " n_neighbors=15,\n", + " min_dist=0.1,\n", + " )" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 53 + }, + "id": "tXWs_FXQ9OX2", + "outputId": "156e937b-8d5c-4321-872b-bce25de69648" + }, + "id": "tXWs_FXQ9OX2", + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Computing poincare umap layout for 200 samples...\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'hyper-models__hycoclip-vit-s__b63e9ee38a30__poincare_umap_92b543de'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 15 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Launch the interactive app in HyperView\n", + "\n", + "`hv.launch(dataset, open_browser=True)` starts a local server and opens the viewer.\n", + "\n", + "In the UI, you should be able to:\n", + "\n", + "- switch between embedding spaces (CLIP vs HyCoCLIP)\n", + " \n", + "- inspect image thumbnails for selected points\n", + " \n", + "- compare how coarse labels cluster under each geometry\n", + " \n" + ], + "metadata": { + "id": "rGEUqA0W0O4g" + }, + "id": "rGEUqA0W0O4g" + }, + { + "cell_type": "code", + "source": [ + "hv.launch(dataset, open_browser=True)" + ], + "metadata": { + "id": "o3TdCwD2wIf2" + }, + "id": "o3TdCwD2wIf2", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Euclidean vs Poincaré: Visual Differences\n", + "\n", + "**Euclidean geometry (`geometry=\"euclidean\"`):**\n", + "- Points spread across an unbounded 2D plane\n", + "- Distance is uniform everywhere (1 unit = 1 unit, regardless of location)\n", + "- Typical output: points in a square/rectangular region\n", + "- Best for: Datasets without strong hierarchical structure\n", + "\n", + "**Poincaré geometry (`geometry=\"poincare\"`):**\n", + "- Points constrained to a unit disk (circle with radius 1)\n", + "- Distance is **non-uniform**: more space near edges, compressed near center\n", + "- Typical output: hierarchical organization\n", + " - General/abstract concepts cluster near the center\n", + " - Specific/detailed items pushed toward the boundary\n", + "- Best for: Datasets with natural hierarchies (taxonomies, concept trees)\n", + "\n", + "**When to use Poincaré output:**\n", + "1. You have hyperbolic embeddings (HyCoCLIP)\n", + "2. Your data has hierarchical structure (animal taxonomy, document topics)\n", + "3. You want to visualize relationships at multiple scales simultaneously\n", + "\n", + "**When to use Euclidean output:**\n", + "1. You have standard embeddings (CLIP, ResNet)\n", + "2. Your data has flat or network structure\n", + "3. You want familiar, intuitive spatial relationships\n", + "\n" + ], + "metadata": { + "id": "FqwDwyE9Fdpw" + }, + "id": "FqwDwyE9Fdpw" + }, + { + "cell_type": "markdown", + "source": [ + "## Suggested checks\n", + "\n", + "- Are nearest neighbors under Euclidean CLIP similar to nearest neighbors under Poincaré HyCoCLIP?\n", + "\n", + "\n", + " " + ], + "metadata": { + "id": "FRjieuy10Yed" + }, + "id": "FRjieuy10Yed" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.8" + }, + "colab": { + "provenance": [], + "machine_shape": "hm", + "gpuType": "T4" + }, + "accelerator": "GPU" + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 8fb24bd..fc26f6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "hyperview" -version = "0.1.0" +dynamic = ["version"] description = "Open-source dataset curation with hyperbolic embeddings visualization" readme = "README.md" license = { text = "MIT" } requires-python = ">=3.10" authors = [ - { name = "HyperView Team" } + { name = "hyper3labs" } ] keywords = ["embeddings", "visualization", "hyperbolic", "dataset", "curation", "machine-learning"] classifiers = [ @@ -23,43 +23,60 @@ classifiers = [ ] dependencies = [ - "fastapi>=0.115.0", - "uvicorn[standard]>=0.32.0", - "embed-anything>=0.3.0", - "numpy>=1.26.0", - "umap-learn>=0.5.6", - "pillow>=10.0.0", - "pydantic>=2.0.0", - "aiofiles>=24.0.0", - "datasets>=3.0.0", + "fastapi>=0.128.0", + "uvicorn[standard]>=0.40.0", + "embed-anything>=0.7.0", + "hyper-models>=0.1.0", # PyPI package: https://pypi.org/project/hyper-models/ + "numpy>=1.26.4,<2.4", + "umap-learn>=0.5.11", + "pillow>=12.1.0", + "pydantic>=2.12.5", + "aiofiles>=25.1.0", + "datasets>=4.5.0", + "lancedb>=0.26.1", + "pyarrow>=22.0.0", ] [project.optional-dependencies] dev = [ - "pytest>=8.0.0", - "pytest-asyncio>=0.24.0", - "httpx>=0.27.0", - "ruff>=0.7.0", + "pytest>=9.0.2", + "pytest-asyncio>=1.3.0", + "httpx>=0.28.1", + "ruff>=0.14.13", ] -hyperbolic = [ - "torch>=2.0.0", - "geoopt>=0.5.1", +ml = [ + "torch>=2.9.1", + "torchvision>=0.24.1", + "timm>=1.0.0", ] [project.scripts] hyperview = "hyperview.cli:main" [project.urls] -Homepage = "https://github.com/merantix/HyperView" -Documentation = "https://github.com/merantix/HyperView#readme" -Repository = "https://github.com/merantix/HyperView" +Homepage = "https://github.com/Hyper3Labs/HyperView" +Documentation = "https://github.com/Hyper3Labs/HyperView#readme" +Repository = "https://github.com/Hyper3Labs/HyperView" +Issues = "https://github.com/Hyper3Labs/HyperView/issues" [build-system] -requires = ["hatchling"] +requires = ["hatchling", "hatch-vcs"] build-backend = "hatchling.build" +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.version] +source = "vcs" + +[tool.hatch.build.hooks.vcs] +version-file = "src/hyperview/_version.py" + [tool.hatch.build.targets.wheel] packages = ["src/hyperview"] +# Include frontend static assets (pre-built before packaging) +# artifacts is for untracked files that exist; force-include ensures they're packaged +artifacts = ["src/hyperview/server/static/**"] [tool.hatch.build.targets.sdist] include = [ @@ -67,6 +84,8 @@ include = [ "/README.md", "/LICENSE", ] +# Include built frontend for reproducible source builds +artifacts = ["src/hyperview/server/static/**"] [tool.ruff] line-length = 100 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index c747cac..0000000 --- a/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -torch>=2.9.1 -numpy>=2.3.5 -matplotlib>=3.10.7 -geoopt>=0.5.1 -geomstats>=2.8.0 -scikit-learn>=1.7.2 diff --git a/scripts/create_cookoff_fixture.py b/scripts/create_cookoff_fixture.py new file mode 100644 index 0000000..815f9d2 --- /dev/null +++ b/scripts/create_cookoff_fixture.py @@ -0,0 +1,171 @@ +"""Create a lightweight Cosmos-Curate-like fixture for local UI development. + +This script builds a synthetic split output using existing MP4 clips so the +frontend/backend can be developed without running full cosmos-curate pipelines. + +Output structure: + / + split_output/ + clips/*.mp4 + metas/v0/*.json + previews/*_0_20.webp + ce1_embd/*.pickle + summary.json + dedup_output/ + kmeans_centroids.npy + +Usage: + uv run python scripts/create_cookoff_fixture.py \ + --source-clips-path /path/to/mp4s \ + --output-root /tmp/cookoff_fixture \ + --num-clips 40 +""" + +from __future__ import annotations + +import argparse +import json +import pickle +import random +import shutil +import uuid +from pathlib import Path + +import numpy as np +from PIL import Image, ImageDraw + + +CAPTION_TEMPLATES = [ + ( + "The ego vehicle approaches an intersection with moderate traffic. " + "A lead vehicle slows down near a traffic signal while pedestrians remain on the sidewalk." + ), + ( + "The car continues through an urban road segment with lane markers clearly visible. " + "Oncoming traffic is sparse and no sudden hazards are observed." + ), + ( + "The vehicle moves past parked cars and approaches a crosswalk. " + "A cyclist appears on the right edge of the scene and the ego car reduces speed." + ), + ( + "The camera captures a highway merge with multiple vehicles changing lanes. " + "The ego vehicle keeps steady distance and follows lane guidance." + ), +] + + +def _normalize_dir(path_str: str, *, create: bool = False) -> Path: + path = Path(path_str).expanduser().resolve() + if create: + path.mkdir(parents=True, exist_ok=True) + elif not path.exists(): + raise FileNotFoundError(f"Path does not exist: {path}") + return path + + +def _make_preview(path: Path, *, index: int, clip_id: str) -> None: + width, height = 640, 360 + img = Image.new("RGB", (width, height), color=(20 + (index * 17) % 120, 40, 70 + (index * 11) % 120)) + draw = ImageDraw.Draw(img) + draw.rectangle((16, 16, width - 16, height - 16), outline=(255, 255, 255), width=2) + draw.text((28, 28), f"Cookoff Fixture Clip {index + 1}", fill=(255, 255, 255)) + draw.text((28, 60), clip_id[:18], fill=(220, 220, 220)) + path.parent.mkdir(parents=True, exist_ok=True) + img.save(path, "WEBP", quality=92) + + +def _make_caption(index: int) -> str: + base = CAPTION_TEMPLATES[index % len(CAPTION_TEMPLATES)] + return ( + f"{base} The model reasons over traffic flow, relative motion, and road context.\n" + f"{base}" + ) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Create synthetic Cosmos-Curate fixture") + parser.add_argument("--source-clips-path", required=True, help="Directory containing source MP4 clips") + parser.add_argument("--output-root", default="/tmp/cookoff_fixture", help="Fixture output root") + parser.add_argument("--num-clips", type=int, default=40, help="Number of clips to include") + parser.add_argument( + "--embedding-dim", + type=int, + default=256, + help="Embedding vector dimension (default matches cosmos-embed1-224p)", + ) + parser.add_argument("--seed", type=int, default=42, help="Random seed") + args = parser.parse_args() + + rng = np.random.default_rng(args.seed) + random.seed(args.seed) + + source_dir = _normalize_dir(args.source_clips_path) + output_root = _normalize_dir(args.output_root, create=True) + + split_output = _normalize_dir(str(output_root / "split_output"), create=True) + dedup_output = _normalize_dir(str(output_root / "dedup_output"), create=True) + + clips_dir = _normalize_dir(str(split_output / "clips"), create=True) + metas_dir = _normalize_dir(str(split_output / "metas" / "v0"), create=True) + previews_dir = _normalize_dir(str(split_output / "previews"), create=True) + embd_dir = _normalize_dir(str(split_output / "ce1_embd"), create=True) + + source_clips = sorted(source_dir.glob("*.mp4")) + if not source_clips: + raise RuntimeError(f"No .mp4 files found under {source_dir}") + + selected = source_clips[: max(1, min(args.num_clips, len(source_clips)))] + + for index, src_clip in enumerate(selected): + clip_id = str(uuid.uuid4()) + dst_clip = clips_dir / f"{clip_id}.mp4" + shutil.copy2(src_clip, dst_clip) + + preview_path = previews_dir / f"{clip_id}_0_20.webp" + _make_preview(preview_path, index=index, clip_id=clip_id) + + caption = _make_caption(index) + meta = { + "clip_uuid": clip_id, + "source_video": str(src_clip), + "clip_location": str(dst_clip), + "span": [0.0, 2.0], + "dimensions": [1600, 900], + "framerate": 10.0, + "num_frames": 20, + "aesthetic_score": round(random.uniform(4.8, 9.6), 2), + "motion_score": round(random.uniform(3.1, 9.8), 2), + "captions": {"cosmos_r2": caption}, + } + (metas_dir / f"{clip_id}.json").write_text(json.dumps(meta, indent=2), encoding="utf-8") + + vec = rng.normal(loc=0.0, scale=1.0, size=(args.embedding_dim,)).astype(np.float32) + with (embd_dir / f"{clip_id}.pickle").open("wb") as f: + pickle.dump(vec, f) + + summary = { + "total_videos_processed": len(selected), + "total_clips_generated": len(selected), + "pipeline_duration_seconds": round(2.5 + len(selected) * 0.05, 2), + "models_used": ["transnetv2", "cosmos_r2", "cosmos_embed1_224p"], + "embedding_algorithm": "cosmos-embed1-224p", + "total_num_clips_passed": len(selected), + "total_num_clips_with_caption": len(selected), + "total_num_clips_with_embeddings": len(selected), + "num_input_videos": len(selected), + "num_processed_videos": len(selected), + "pipeline_run_time": round(0.2 + len(selected) * 0.02, 2), + "total_video_duration": float(len(selected) * 2), + "total_clip_duration": float(len(selected) * 2), + } + (split_output / "summary.json").write_text(json.dumps(summary, indent=2), encoding="utf-8") + + np.save(dedup_output / "kmeans_centroids.npy", rng.normal(size=(4, args.embedding_dim)).astype(np.float32)) + + print(f"Created fixture at: {output_root}") + print(f"Clips: {len(selected)}") + + +if __name__ == "__main__": + main() diff --git a/scripts/curate_submission_metrics.py b/scripts/curate_submission_metrics.py new file mode 100644 index 0000000..c87a6a3 --- /dev/null +++ b/scripts/curate_submission_metrics.py @@ -0,0 +1,262 @@ +"""Compute submission KPIs from Cosmos-Curate outputs. + +This script aggregates split + dedup artifacts into metrics used in the hackathon +submission and demo narrative. +""" + +from __future__ import annotations + +import argparse +import csv +import json +from pathlib import Path +from typing import Any + +import pyarrow.parquet as pq + + +def _normalize_path(path_str: str) -> Path: + path = Path(path_str).expanduser().resolve() + if not path.exists(): + raise FileNotFoundError(f"Path does not exist: {path}") + return path + + +def _read_json(path: Path) -> dict[str, Any]: + with path.open("r", encoding="utf-8") as f: + return json.load(f) + + +def _dedup_summary_path(dedup_output_path: Path, dedup_eps: float) -> Path: + tag = f"{dedup_eps:.6g}".rstrip("0").rstrip(".") + return dedup_output_path / "extraction" / f"dedup_summary_{tag}.csv" + + +def _safe_div(numerator: float, denominator: float) -> float: + if denominator <= 0: + return 0.0 + return numerator / denominator + + +def _load_split_metrics(split_output_path: Path) -> dict[str, Any]: + summary_path = split_output_path / "summary.json" + if not summary_path.exists(): + raise FileNotFoundError(f"Missing split summary file: {summary_path}") + + summary = _read_json(summary_path) + clips_passed = int(summary.get("total_num_clips_passed", 0)) + clips_with_caption = int(summary.get("total_num_clips_with_caption", 0)) + clips_with_embeddings = int(summary.get("total_num_clips_with_embeddings", 0)) + clips_transcoded = int(summary.get("total_num_clips_transcoded", 0)) + + return { + "embedding_algorithm": summary.get("embedding_algorithm"), + "num_input_videos": int(summary.get("num_input_videos", 0)), + "num_processed_videos": int(summary.get("num_processed_videos", 0)), + "pipeline_run_time_min": float(summary.get("pipeline_run_time", 0.0)), + "total_video_duration_sec": float(summary.get("total_video_duration", 0.0)), + "total_clip_duration_sec": float(summary.get("total_clip_duration", 0.0)), + "clips_passed": clips_passed, + "clips_transcoded": clips_transcoded, + "clips_with_caption": clips_with_caption, + "clips_with_embeddings": clips_with_embeddings, + "caption_coverage_pct": _safe_div(clips_with_caption, clips_passed) * 100.0, + "embedding_coverage_pct": _safe_div(clips_with_embeddings, clips_passed) * 100.0, + } + + +def _load_dedup_metrics(dedup_output_path: Path, dedup_eps: float) -> dict[str, Any]: + summary_path = _dedup_summary_path(dedup_output_path, dedup_eps) + + if summary_path.exists(): + with summary_path.open("r", encoding="utf-8") as f: + reader = csv.DictReader(f) + rows = list(reader) + if rows: + row = rows[0] + kept = int(row.get("kept", 0)) + removed = int(row.get("removed", 0)) + total = int(row.get("total", 0)) + reduction_pct = _safe_div(removed, total) * 100.0 + return { + "eps": float(row.get("eps", dedup_eps)), + "kept": kept, + "removed": removed, + "total": total, + "reduction_pct": reduction_pct, + } + + threshold = 1.0 - dedup_eps + pruning_dir = dedup_output_path / "extraction" / "semdedup_pruning_tables" + if not pruning_dir.exists(): + return { + "eps": dedup_eps, + "kept": 0, + "removed": 0, + "total": 0, + "reduction_pct": 0.0, + } + + kept = 0 + total = 0 + for parquet_path in sorted(pruning_dir.glob("cluster_*.parquet")): + table = pq.read_table(parquet_path, columns=["cosine_sim_score"]) + scores = table.column("cosine_sim_score").to_pylist() + for score in scores: + if score is None: + continue + total += 1 + if float(score) <= threshold: + kept += 1 + + removed = max(total - kept, 0) + return { + "eps": dedup_eps, + "kept": kept, + "removed": removed, + "total": total, + "reduction_pct": _safe_div(removed, total) * 100.0, + } + + +def _top_duplicate_pairs( + dedup_output_path: Path, + *, + dedup_eps: float, + top_k: int, +) -> list[dict[str, Any]]: + pruning_dir = dedup_output_path / "extraction" / "semdedup_pruning_tables" + if not pruning_dir.exists() or top_k <= 0: + return [] + + threshold = 1.0 - dedup_eps + rows: list[dict[str, Any]] = [] + + for parquet_path in sorted(pruning_dir.glob("cluster_*.parquet")): + table = pq.read_table(parquet_path, columns=["id", "max_id", "cosine_sim_score"]) + ids = table.column("id").to_pylist() + max_ids = table.column("max_id").to_pylist() + scores = table.column("cosine_sim_score").to_pylist() + + for clip_id, max_id, score in zip(ids, max_ids, scores): + if clip_id is None or max_id is None or score is None: + continue + score_f = float(score) + if score_f <= threshold: + continue + rows.append( + { + "id": str(clip_id), + "max_id": str(max_id), + "cosine_sim_score": score_f, + "cluster_file": parquet_path.name, + } + ) + + rows.sort(key=lambda x: x["cosine_sim_score"], reverse=True) + return rows[:top_k] + + +def _to_markdown(metrics: dict[str, Any]) -> str: + split_metrics = metrics["split"] + dedup_metrics = metrics.get("dedup") + + lines = [ + "# Cosmos-Curate Submission Metrics", + "", + "## Split Pipeline", + "", + f"- Input videos: **{split_metrics['num_input_videos']}**", + f"- Processed videos: **{split_metrics['num_processed_videos']}**", + f"- Clips passed: **{split_metrics['clips_passed']}**", + f"- Caption coverage: **{split_metrics['caption_coverage_pct']:.2f}%**", + f"- Embedding coverage: **{split_metrics['embedding_coverage_pct']:.2f}%**", + f"- Embedding algorithm: **{split_metrics['embedding_algorithm']}**", + f"- Pipeline runtime: **{split_metrics['pipeline_run_time_min']:.2f} min**", + ] + + if dedup_metrics is not None: + lines += [ + "", + "## Semantic Dedup", + "", + f"- Epsilon: **{dedup_metrics['eps']}**", + f"- Total clips considered: **{dedup_metrics['total']}**", + f"- Kept clips: **{dedup_metrics['kept']}**", + f"- Removed duplicates: **{dedup_metrics['removed']}**", + f"- Reduction: **{dedup_metrics['reduction_pct']:.2f}%**", + ] + + top_pairs = metrics.get("top_duplicate_pairs", []) + if top_pairs: + lines += [ + "", + "## Top Duplicate Pairs", + "", + "| id | max_id | cosine_sim_score | cluster_file |", + "|---|---|---:|---|", + ] + for row in top_pairs: + lines.append( + f"| {row['id']} | {row['max_id']} | {row['cosine_sim_score']:.6f} | {row['cluster_file']} |" + ) + + return "\n".join(lines) + "\n" + + +def main() -> None: + parser = argparse.ArgumentParser(description="Compute hackathon KPIs from Cosmos-Curate outputs") + parser.add_argument("--split-output-path", required=True, help="Path to Cosmos-Curate split output") + parser.add_argument("--dedup-output-path", default=None, help="Path to Cosmos-Curate dedup output") + parser.add_argument("--dedup-eps", type=float, default=0.01, help="Epsilon used in dedup") + parser.add_argument("--top-duplicates", type=int, default=20, help="Top duplicate pairs to include") + parser.add_argument( + "--output-json", + default=None, + help="Output JSON path (default: /submission_metrics.json)", + ) + parser.add_argument( + "--output-markdown", + default=None, + help="Output markdown path (default: /submission_metrics.md)", + ) + args = parser.parse_args() + + split_output_path = _normalize_path(args.split_output_path) + dedup_output_path = _normalize_path(args.dedup_output_path) if args.dedup_output_path else None + + output_json = ( + Path(args.output_json).expanduser().resolve() + if args.output_json + else split_output_path / "submission_metrics.json" + ) + output_markdown = ( + Path(args.output_markdown).expanduser().resolve() + if args.output_markdown + else split_output_path / "submission_metrics.md" + ) + + metrics: dict[str, Any] = { + "split": _load_split_metrics(split_output_path), + } + + if dedup_output_path is not None: + metrics["dedup"] = _load_dedup_metrics(dedup_output_path, args.dedup_eps) + metrics["top_duplicate_pairs"] = _top_duplicate_pairs( + dedup_output_path, + dedup_eps=args.dedup_eps, + top_k=args.top_duplicates, + ) + + output_json.parent.mkdir(parents=True, exist_ok=True) + output_json.write_text(json.dumps(metrics, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + output_markdown.parent.mkdir(parents=True, exist_ok=True) + output_markdown.write_text(_to_markdown(metrics), encoding="utf-8") + + print(f"Wrote metrics JSON: {output_json}") + print(f"Wrote metrics markdown: {output_markdown}") + + +if __name__ == "__main__": + main() diff --git a/scripts/demo.py b/scripts/demo.py index 7cde441..dbb821c 100644 --- a/scripts/demo.py +++ b/scripts/demo.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 -"""Run HyperView demo with CIFAR-100 dataset.""" +"""Run HyperView demo with CIFAR-10 dataset.""" import argparse +import os import sys from pathlib import Path @@ -12,37 +13,69 @@ def main(): parser = argparse.ArgumentParser(description="Run HyperView demo") parser.add_argument( - "--samples", type=int, default=500, help="Number of samples to load (default: 500)" + "--dataset", + type=str, + default="cifar10_demo", + help="Dataset name to use for persistence (default: cifar10_demo)", ) parser.add_argument( - "--port", type=int, default=5151, help="Port to run server on (default: 5151)" + "--samples", type=int, default=50000, help="Number of samples to load (default: 50000)" + ) + parser.add_argument( + "--port", type=int, default=6263, help="Port to run server on (default: 6263)" ) parser.add_argument( "--no-browser", action="store_true", help="Don't open browser automatically" ) + parser.add_argument( + "--no-persist", action="store_true", help="Don't persist to database (use in-memory)" + ) + parser.add_argument( + "--model", + type=str, + default="openai/clip-vit-base-patch32", + help=( + "Embedding model_id to use (default: openai/clip-vit-base-patch32). " + "This is passed to Dataset.compute_embeddings(model=...)." + ), + ) + parser.add_argument( + "--datasets-dir", + "--database-dir", + type=str, + default=None, + help="Override persistence directory (sets HYPERVIEW_DATASETS_DIR)", + ) + parser.add_argument( + "--no-server", + action="store_true", + help="Don't start the web server (useful for CI / DB checks)", + ) args = parser.parse_args() + if args.datasets_dir: + os.environ["HYPERVIEW_DATASETS_DIR"] = args.datasets_dir + import hyperview as hv - print(f"Loading {args.samples} samples from CIFAR-100...") - dataset = hv.Dataset("cifar100_demo") - count = dataset.add_from_huggingface( - "uoft-cs/cifar100", + dataset = hv.Dataset(args.dataset, persist=not args.no_persist) + + dataset.add_from_huggingface( + "uoft-cs/cifar10", split="train", image_key="img", - label_key="fine_label", + label_key="label", max_samples=args.samples, ) - print(f"Loaded {count} samples") - - print("Computing embeddings...") - dataset.compute_embeddings(show_progress=True) - print("Computing visualization (UMAP + Poincare)...") - dataset.compute_visualization() + space_key = dataset.compute_embeddings(model=args.model, show_progress=True) + # Compute a single layout for the UI to display by default. + # Switch to geometry="euclidean" for standard 2D UMAP. + dataset.compute_visualization(space_key=space_key, geometry="poincare") - print(f"Starting server at http://127.0.0.1:{args.port}") + if args.no_server: + return hv.launch(dataset, port=args.port, open_browser=not args.no_browser) diff --git a/scripts/demo_hyperbolic_clip.py b/scripts/demo_hyperbolic_clip.py new file mode 100644 index 0000000..7e781eb --- /dev/null +++ b/scripts/demo_hyperbolic_clip.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +"""Demo: CLIP (Euclidean) + HyCoCLIP (Poincaré) on Imagenette.""" + +import hyperview as hv + +DATASET_NAME = "imagenette_val_clip_hycoclip_demo" +HF_DATASET = "Multimodal-Fatima/Imagenette_validation" +HF_SPLIT = "validation" +HF_IMAGE_KEY = "image" +HF_LABEL_KEY = "label" +NUM_SAMPLES = 300 +CLIP_MODEL_ID = "openai/clip-vit-base-patch32" +HYPER_MODELS_MODEL_ID = "hycoclip-vit-s" + + +def main() -> None: + print("Loading Imagenette validation from Hugging Face...") + dataset = hv.Dataset(DATASET_NAME, persist=False) + dataset.add_from_huggingface( + HF_DATASET, + split=HF_SPLIT, + image_key=HF_IMAGE_KEY, + label_key=HF_LABEL_KEY, + max_samples=NUM_SAMPLES, + shuffle=True, + ) + print(f"Loaded {len(dataset)} samples") + + clip_space = dataset.compute_embeddings(CLIP_MODEL_ID) + dataset.compute_visualization(space_key=clip_space, geometry="euclidean") + hyper_space = dataset.compute_embeddings(model=HYPER_MODELS_MODEL_ID) + dataset.compute_visualization(space_key=hyper_space, geometry="poincare") + + print("Launching at http://127.0.0.1:6263") + + hv.launch(dataset, open_browser=True, port=6263) + + +if __name__ == "__main__": + main() diff --git a/scripts/export_frontend.sh b/scripts/export_frontend.sh index 137545b..dd1cc37 100755 --- a/scripts/export_frontend.sh +++ b/scripts/export_frontend.sh @@ -6,14 +6,25 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" FRONTEND_DIR="$PROJECT_ROOT/frontend" +HYPER_SCATTER_DIR="$PROJECT_ROOT/hyper-scatter" STATIC_DIR="$PROJECT_ROOT/src/hyperview/server/static" -echo "🔄 Building frontend..." +# Build hyper-scatter library if it's a local checkout +if [ -d "$HYPER_SCATTER_DIR" ] && [ -f "$HYPER_SCATTER_DIR/package.json" ]; then + echo "Building hyper-scatter library..." + cd "$HYPER_SCATTER_DIR" + if [ ! -d "node_modules" ]; then + npm install + fi + npm run build:lib +fi + +echo "Building frontend..." cd "$FRONTEND_DIR" # Install dependencies if needed if [ ! -d "node_modules" ]; then - echo "📦 Installing dependencies..." + echo "Installing frontend dependencies..." npm install fi @@ -21,11 +32,12 @@ fi npm run build # Copy to Python package -echo "📁 Copying to Python package..." +echo "Copying build output into Python package..." rm -rf "$STATIC_DIR" mkdir -p "$STATIC_DIR" cp -r out/* "$STATIC_DIR/" +echo "" echo "✅ Frontend exported to $STATIC_DIR" echo "" echo "To test, run:" diff --git a/scripts/load_cosmos_curate.py b/scripts/load_cosmos_curate.py new file mode 100644 index 0000000..e69d7cd --- /dev/null +++ b/scripts/load_cosmos_curate.py @@ -0,0 +1,725 @@ +"""Load Cosmos-Curate outputs into HyperView for hackathon demos. + +This script builds a HyperView dataset directly from Cosmos-Curate artifacts: +- split output metadata (`metas/v0/*.json` or `metas_jsonl/v0/*.jsonl`) +- split output embeddings parquet (`*_embd_parquet/*.parquet`) +- optional dedup output (`extraction/semdedup_pruning_tables/*.parquet`) + +It then: +1) adds clip samples with preview thumbnails, +2) imports precomputed embeddings as a HyperView space, +3) computes Euclidean + Poincaré 2D layouts, +4) launches HyperView. +""" + +from __future__ import annotations + +import argparse +import base64 +import csv +import io +import json +import pickle +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import numpy as np +import pyarrow.parquet as pq +from PIL import Image + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "src")) + +import hyperview as hv +from hyperview.core.sample import Sample +from hyperview.storage.schema import make_layout_key + + +@dataclass(frozen=True) +class ClipRecord: + clip_id: str + filepath: str + label: str | None + metadata: dict[str, Any] + thumbnail_base64: str | None = None + + +def _normalize_embedding_algorithm(raw_name: str | None) -> str: + name = (raw_name or "").strip().lower().replace("_", "-") + aliases = { + "internvideo2-mm": "internvideo2", + "iv2": "internvideo2", + "cosmos-embed1": "cosmos-embed1-224p", + } + return aliases.get(name, name) + + +def _infer_embedding_algorithm(split_output_path: Path, split_summary: dict[str, Any]) -> str: + summary_value = _normalize_embedding_algorithm(split_summary.get("embedding_algorithm")) + if summary_value: + return summary_value + + for model_name in split_summary.get("models_used", []) or []: + model_norm = _normalize_embedding_algorithm(str(model_name)) + if "cosmos-embed1" in model_norm: + if model_norm == "cosmos-embed1": + return "cosmos-embed1-224p" + return model_norm + if "internvideo2" in model_norm: + return "internvideo2" + + if (split_output_path / "ce1_embd_parquet").exists() or (split_output_path / "ce1_embd").exists(): + return "cosmos-embed1-224p" + if (split_output_path / "iv2_embd_parquet").exists() or (split_output_path / "iv2_embd").exists(): + return "internvideo2" + + raise ValueError( + "Could not infer embedding algorithm from split summary or directory structure. " + "Expected summary.embedding_algorithm/models_used or one of ce1_embd[_parquet]/iv2_embd[_parquet]." + ) + + +def _normalize_path(path_str: str) -> Path: + path = Path(path_str).expanduser().resolve() + if not path.exists(): + raise FileNotFoundError(f"Path does not exist: {path}") + return path + + +def _read_json(path: Path) -> dict[str, Any]: + with path.open("r", encoding="utf-8") as f: + return json.load(f) + + +def _embedding_parquet_dir(split_output_path: Path, embedding_algorithm: str) -> Path: + algo = _normalize_embedding_algorithm(embedding_algorithm) + if algo == "internvideo2": + return split_output_path / "iv2_embd_parquet" + if algo.startswith("cosmos-embed1"): + return split_output_path / "ce1_embd_parquet" + return split_output_path / f"{algo}_embd_parquet" + + +def _embedding_pickle_dir(split_output_path: Path, embedding_algorithm: str) -> Path: + algo = _normalize_embedding_algorithm(embedding_algorithm) + if algo == "internvideo2": + return split_output_path / "iv2_embd" + if algo.startswith("cosmos-embed1"): + return split_output_path / "ce1_embd" + return split_output_path / f"{algo}_embd" + + +def _embedding_model_id(embedding_algorithm: str) -> str: + algo = _normalize_embedding_algorithm(embedding_algorithm) + mapping = { + "cosmos-embed1-224p": "nvidia/Cosmos-Embed1-224p", + "cosmos-embed1-336p": "nvidia/Cosmos-Embed1-336p", + "cosmos-embed1-448p": "nvidia/Cosmos-Embed1-448p", + "internvideo2": "OpenGVLab/InternVideo2-Stage2_1B-224p-f4", + } + return mapping.get(algo, embedding_algorithm) + + +def _expected_embedding_dim(embedding_algorithm: str) -> int | None: + algo = _normalize_embedding_algorithm(embedding_algorithm) + expected = { + "cosmos-embed1-224p": 256, + "cosmos-embed1-336p": 768, + "cosmos-embed1-448p": 768, + } + return expected.get(algo) + + +def _dedup_summary_path(dedup_output_path: Path, dedup_eps: float) -> Path: + tag = f"{dedup_eps:.6g}".rstrip("0").rstrip(".") + return dedup_output_path / "extraction" / f"dedup_summary_{tag}.csv" + + +def _load_dedup_maps(dedup_output_path: Path, dedup_eps: float) -> tuple[dict[str, bool], dict[str, float]]: + keep_map: dict[str, bool] = {} + score_map: dict[str, float] = {} + pruning_dir = dedup_output_path / "extraction" / "semdedup_pruning_tables" + if not pruning_dir.exists(): + return keep_map, score_map + + threshold = 1.0 - dedup_eps + for parquet_path in sorted(pruning_dir.glob("cluster_*.parquet")): + table = pq.read_table(parquet_path, columns=["id", "cosine_sim_score"]) + ids = table.column("id").to_pylist() + scores = table.column("cosine_sim_score").to_pylist() + for clip_id, score in zip(ids, scores): + if clip_id is None or score is None: + continue + clip_id_str = str(clip_id) + score_f = float(score) + keep_map[clip_id_str] = score_f <= threshold + score_map[clip_id_str] = score_f + return keep_map, score_map + + +def _select_caption(window: dict[str, Any], caption_field: str | None) -> str | None: + if caption_field and caption_field in window: + value = window.get(caption_field) + if isinstance(value, str) and value.strip(): + return value.strip() + + for key, value in window.items(): + if key.endswith("_caption") and isinstance(value, str) and value.strip(): + return value.strip() + return None + + +def _select_caption_from_row(row: dict[str, Any], caption_field: str | None) -> str | None: + windows = row.get("windows") or [] + first_window = windows[0] if isinstance(windows, list) and windows else {} + if isinstance(first_window, dict): + caption = _select_caption(first_window, caption_field) + if caption: + return caption + + captions_obj = row.get("captions") + if isinstance(captions_obj, dict): + preferred_keys = [caption_field] if caption_field else [] + preferred_keys += ["cosmos_r2", "cosmos_r2_caption", "caption", "default"] + + for key in preferred_keys: + if not key: + continue + value = captions_obj.get(key) + if isinstance(value, str) and value.strip(): + return value.strip() + + for value in captions_obj.values(): + if isinstance(value, str) and value.strip(): + return value.strip() + + for key in ("caption", "first_caption", "cosmos_r2_caption"): + value = row.get(key) + if isinstance(value, str) and value.strip(): + return value.strip() + + return None + + +def _extract_reasoning_and_answer(caption_text: str | None) -> tuple[str | None, str | None]: + if not caption_text: + return None, None + + reasoning: str | None = None + answer: str | None = None + + think_start = caption_text.find("") + think_end = caption_text.find("") + if think_start != -1 and think_end != -1 and think_end > think_start: + reasoning = caption_text[think_start + len("") : think_end].strip() or None + + answer_start = caption_text.find("") + answer_end = caption_text.find("") + if answer_start != -1 and answer_end != -1 and answer_end > answer_start: + answer = caption_text[answer_start + len("") : answer_end].strip() or None + + if answer is None: + answer = caption_text.strip() or None + + return reasoning, answer + + +def _default_label( + *, + label_mode: str, + source_video: str, + keep_flag: bool | None, +) -> str: + if label_mode == "dedup-status": + if keep_flag is True: + return "kept" + if keep_flag is False: + return "removed" + return "unknown" + return Path(source_video).stem or "unknown" + + +def _iter_clip_metadata_rows(split_output_path: Path) -> list[dict[str, Any]]: + metas_dir = split_output_path / "metas" / "v0" + metas_jsonl_dir = split_output_path / "metas_jsonl" / "v0" + + rows: list[dict[str, Any]] = [] + if metas_dir.exists(): + for json_path in sorted(metas_dir.glob("*.json")): + rows.append(_read_json(json_path)) + return rows + + if metas_jsonl_dir.exists(): + for jsonl_path in sorted(metas_jsonl_dir.glob("*.jsonl")): + with jsonl_path.open("r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if line: + rows.append(json.loads(line)) + return rows + + raise FileNotFoundError( + "No clip metadata found. Expected one of: " + f"{metas_dir} or {metas_jsonl_dir}." + ) + + +def _placeholder_image(split_output_path: Path) -> Path: + placeholder_path = split_output_path / "_hyperview_placeholder.jpg" + if not placeholder_path.exists(): + placeholder_path.parent.mkdir(parents=True, exist_ok=True) + Image.new("RGB", (96, 96), color=(35, 35, 35)).save(placeholder_path, "JPEG", quality=92) + return placeholder_path + + +def _thumbnail_base64_from_image(path: Path, fallback: Path) -> str | None: + for candidate in (path, fallback): + try: + with Image.open(candidate) as img: + if img.mode in ("RGBA", "P"): + img = img.convert("RGB") + buffer = io.BytesIO() + img.save(buffer, format="JPEG", quality=85) + return base64.b64encode(buffer.getvalue()).decode("utf-8") + except Exception: + continue + return None + + +def _build_clip_records( + *, + split_output_path: Path, + metadata_rows: list[dict[str, Any]], + dedup_keep_map: dict[str, bool], + dedup_score_map: dict[str, float], + caption_field: str | None, + label_mode: str, + max_samples: int, + allow_placeholder: bool, +) -> list[ClipRecord]: + records: list[ClipRecord] = [] + placeholder_path = _placeholder_image(split_output_path) + previews_dir = split_output_path / "previews" + + for row in metadata_rows: + clip_id = str(row.get("span_uuid") or row.get("clip_uuid") or row.get("id") or "").strip() + if not clip_id: + continue + + windows = row.get("windows") or [] + first_window = windows[0] if windows else {} + start_frame = first_window.get("start_frame") if isinstance(first_window, dict) else None + end_frame = first_window.get("end_frame") if isinstance(first_window, dict) else None + if start_frame is None or end_frame is None: + num_frames = row.get("num_frames") + if isinstance(num_frames, int) and num_frames > 0: + start_frame = 0 + end_frame = num_frames + + preview_path: Path | None = None + if start_frame is not None and end_frame is not None: + nested_candidate = previews_dir / clip_id / f"{start_frame}_{end_frame}.webp" + flat_candidate = previews_dir / f"{clip_id}_{start_frame}_{end_frame}.webp" + if nested_candidate.exists(): + preview_path = nested_candidate + elif flat_candidate.exists(): + preview_path = flat_candidate + + if preview_path is None: + flat_matches = sorted(previews_dir.glob(f"{clip_id}_*.webp")) + if flat_matches: + preview_path = flat_matches[0] + + if preview_path is None: + nested_matches = sorted((previews_dir / clip_id).glob("*.webp")) if (previews_dir / clip_id).exists() else [] + if nested_matches: + preview_path = nested_matches[0] + + if preview_path is None and allow_placeholder: + preview_path = placeholder_path + if preview_path is None: + continue + + source_video = str(row.get("source_video", "")) + clip_location = row.get("clip_location") + video_path = str(clip_location).strip() if clip_location else "" + if not video_path: + default_clip = split_output_path / "clips" / f"{clip_id}.mp4" + if default_clip.exists(): + video_path = str(default_clip) + + keep_flag = dedup_keep_map.get(clip_id) + cosine_sim_score = dedup_score_map.get(clip_id) + caption = _select_caption_from_row(row, caption_field) + caption_reasoning, caption_answer = _extract_reasoning_and_answer(caption) + + span = row.get("duration_span") + if span is None: + span = row.get("span") + + metadata = { + "clip_id": clip_id, + "source_video": source_video, + "clip_location": clip_location, + "video_path": video_path or None, + "duration_span": span, + "span": row.get("span"), + "window_count": len(windows), + "first_caption": caption, + "caption_raw": caption, + "caption_answer": caption_answer, + "caption_reasoning": caption_reasoning, + "has_caption": bool(row.get("has_caption", False) or caption), + "aesthetic_score": row.get("aesthetic_score"), + "motion_score": row.get("motion_score"), + "dimensions": row.get("dimensions"), + "framerate": row.get("framerate"), + "num_frames": row.get("num_frames"), + "dedup_keep": keep_flag, + "dedup_status": "kept" if keep_flag is True else ("removed" if keep_flag is False else "unknown"), + "cosine_sim_score": cosine_sim_score, + "dedup_cosine_similarity": cosine_sim_score, + "preview_path": str(preview_path), + "preview_is_placeholder": preview_path == placeholder_path, + } + + label = _default_label(label_mode=label_mode, source_video=source_video, keep_flag=keep_flag) + sample_filepath = video_path or str(preview_path) + + records.append( + ClipRecord( + clip_id=clip_id, + filepath=sample_filepath, + label=label, + metadata=metadata, + thumbnail_base64=_thumbnail_base64_from_image(preview_path, placeholder_path), + ) + ) + + if max_samples > 0 and len(records) >= max_samples: + break + + return records + + +def _extract_dimensions(metadata: dict[str, Any]) -> tuple[int | None, int | None]: + dims = metadata.get("dimensions") + if not isinstance(dims, (list, tuple)) or len(dims) < 2: + return None, None + + try: + width = int(dims[0]) + height = int(dims[1]) + except (TypeError, ValueError): + return None, None + + if width <= 0 or height <= 0: + return None, None + + return width, height + + +def _load_embeddings( + split_output_path: Path, + embedding_algorithm: str, + *, + clip_ids: set[str], +) -> tuple[list[str], np.ndarray]: + algo = _normalize_embedding_algorithm(embedding_algorithm) + parquet_dir = _embedding_parquet_dir(split_output_path, algo) + pickle_dir = _embedding_pickle_dir(split_output_path, algo) + + vectors_by_id: dict[str, np.ndarray] = {} + + def _store_vector(clip_id: str, payload: Any) -> None: + if clip_id in vectors_by_id: + return + if clip_id not in clip_ids: + return + + vec: np.ndarray | None = None + if isinstance(payload, np.ndarray): + vec = payload.astype(np.float32) + elif isinstance(payload, (list, tuple)): + vec = np.asarray(payload, dtype=np.float32) + elif isinstance(payload, dict): + for key in ("embedding", "vector", "emb", "embd"): + if key in payload: + vec = np.asarray(payload[key], dtype=np.float32) + break + + if vec is None or vec.ndim != 1 or vec.size == 0 or np.any(~np.isfinite(vec)): + return + vectors_by_id[clip_id] = vec + + if parquet_dir.exists(): + for parquet_path in sorted(parquet_dir.glob("*.parquet")): + table = pq.read_table(parquet_path) + cols = {name.lower(): name for name in table.column_names} + + id_col_name = next((cols[c] for c in ("id", "clip_uuid", "span_uuid", "uuid") if c in cols), None) + vec_col_name = next( + (cols[c] for c in ("embedding", "vector", "embeddings", "embd") if c in cols), + None, + ) + + if id_col_name is None or vec_col_name is None: + continue + + id_values = table.column(id_col_name).to_pylist() + emb_values = table.column(vec_col_name).to_pylist() + + for clip_id_raw, emb in zip(id_values, emb_values): + if clip_id_raw is None or emb is None: + continue + _store_vector(str(clip_id_raw), emb) + + if (not vectors_by_id) and pickle_dir.exists(): + for pickle_path in sorted(pickle_dir.glob("*.pickle")): + clip_id = pickle_path.stem + if clip_id not in clip_ids: + continue + try: + with pickle_path.open("rb") as f: + payload = pickle.load(f) + except Exception: + continue + _store_vector(clip_id, payload) + + if not vectors_by_id: + return [], np.empty((0, 0), dtype=np.float32) + + ids = list(vectors_by_id.keys()) + vectors = list(vectors_by_id.values()) + + if not vectors: + return [], np.empty((0, 0), dtype=np.float32) + + dim = vectors[0].shape[0] + filtered_ids: list[str] = [] + filtered_vectors: list[np.ndarray] = [] + for clip_id, vec in zip(ids, vectors): + if vec.shape[0] == dim: + filtered_ids.append(clip_id) + filtered_vectors.append(vec) + + if not filtered_vectors: + return [], np.empty((0, 0), dtype=np.float32) + + return filtered_ids, np.vstack(filtered_vectors).astype(np.float32) + + +def _dedup_summary_metrics(dedup_output_path: Path, dedup_eps: float) -> dict[str, Any] | None: + summary_path = _dedup_summary_path(dedup_output_path, dedup_eps) + if not summary_path.exists(): + return None + + with summary_path.open("r", encoding="utf-8") as f: + reader = csv.DictReader(f) + rows = list(reader) + if not rows: + return None + + row = rows[0] + total = int(row.get("total", 0)) + kept = int(row.get("kept", 0)) + removed = int(row.get("removed", 0)) + reduction_pct = (removed / total * 100.0) if total > 0 else 0.0 + + return { + "eps": float(row.get("eps", dedup_eps)), + "kept": kept, + "removed": removed, + "total": total, + "reduction_pct": reduction_pct, + } + + +def _manual_small_layout_coords(num_points: int, *, poincare: bool) -> np.ndarray: + if num_points <= 0: + return np.empty((0, 2), dtype=np.float32) + if num_points == 1: + coords = np.array([[0.0, 0.0]], dtype=np.float32) + elif num_points == 2: + coords = np.array([[-0.35, 0.0], [0.35, 0.0]], dtype=np.float32) + else: + angles = np.linspace(0, 2 * np.pi, num_points, endpoint=False, dtype=np.float32) + radius = 0.6 if poincare else 1.0 + coords = np.stack([radius * np.cos(angles), radius * np.sin(angles)], axis=1).astype(np.float32) + + if poincare: + norms = np.linalg.norm(coords, axis=1, keepdims=True) + mask = norms >= 0.98 + if np.any(mask): + scale = (0.98 / np.maximum(norms[mask], 1e-9)).reshape(-1, 1) + coords[mask[:, 0]] *= scale + return coords + + +def _create_small_layouts(dataset: hv.Dataset, *, space_key: str, ids: list[str]) -> None: + euclidean_key = make_layout_key(space_key, method="manual", geometry="euclidean") + poincare_key = make_layout_key(space_key, method="manual", geometry="poincare") + + dataset._storage.ensure_layout( + layout_key=euclidean_key, + space_key=space_key, + method="manual", + geometry="euclidean", + params={"reason": "too_few_samples_for_umap"}, + ) + dataset._storage.ensure_layout( + layout_key=poincare_key, + space_key=space_key, + method="manual", + geometry="poincare", + params={"reason": "too_few_samples_for_umap"}, + ) + + dataset._storage.add_layout_coords(euclidean_key, ids, _manual_small_layout_coords(len(ids), poincare=False)) + dataset._storage.add_layout_coords(poincare_key, ids, _manual_small_layout_coords(len(ids), poincare=True)) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Load Cosmos-Curate outputs into HyperView") + parser.add_argument("--split-output-path", required=True, help="Path to Cosmos-Curate split output directory") + parser.add_argument("--dedup-output-path", default=None, help="Path to Cosmos-Curate dedup output directory") + parser.add_argument("--dedup-eps", type=float, default=0.01, help="Epsilon used for semantic dedup") + parser.add_argument("--caption-field", default="cosmos_r2_caption", help="Preferred caption field in windows") + parser.add_argument( + "--label-mode", + choices=["source-video", "dedup-status"], + default="dedup-status", + help="How labels are assigned in HyperView", + ) + parser.add_argument("--dataset-name", default="cosmos_curate_submission", help="HyperView dataset name") + parser.add_argument( + "--persist", + action=argparse.BooleanOptionalAction, + default=True, + help="Persist dataset in LanceDB (--persist) or keep in-memory (--no-persist)", + ) + parser.add_argument("--max-samples", type=int, default=0, help="Max clips to load (0 = all)") + parser.add_argument( + "--allow-placeholder", + action=argparse.BooleanOptionalAction, + default=True, + help="Use a generated placeholder image when preview webp is missing", + ) + parser.add_argument("--port", type=int, default=6263, help="Port for HyperView") + parser.add_argument("--no-browser", action="store_true", help="Do not auto-open browser") + parser.add_argument("--reuse-server", action="store_true", help="Reuse compatible running HyperView server") + args = parser.parse_args() + + split_output_path = _normalize_path(args.split_output_path) + dedup_output_path = _normalize_path(args.dedup_output_path) if args.dedup_output_path else None + + summary_path = split_output_path / "summary.json" + if not summary_path.exists(): + raise FileNotFoundError(f"Missing split summary file: {summary_path}") + split_summary = _read_json(summary_path) + embedding_algorithm = _infer_embedding_algorithm(split_output_path, split_summary) + + print(f"Loading split output from: {split_output_path}") + print(f"Embedding algorithm: {embedding_algorithm}") + + dedup_keep_map: dict[str, bool] = {} + dedup_score_map: dict[str, float] = {} + dedup_metrics: dict[str, Any] | None = None + if dedup_output_path is not None: + dedup_keep_map, dedup_score_map = _load_dedup_maps(dedup_output_path, args.dedup_eps) + dedup_metrics = _dedup_summary_metrics(dedup_output_path, args.dedup_eps) + print(f"Loaded dedup flags for {len(dedup_keep_map)} clips") + + metadata_rows = _iter_clip_metadata_rows(split_output_path) + records = _build_clip_records( + split_output_path=split_output_path, + metadata_rows=metadata_rows, + dedup_keep_map=dedup_keep_map, + dedup_score_map=dedup_score_map, + caption_field=args.caption_field, + label_mode=args.label_mode, + max_samples=args.max_samples, + allow_placeholder=args.allow_placeholder, + ) + if not records: + raise RuntimeError("No clip samples loaded from split output") + + dataset = hv.Dataset(args.dataset_name, persist=args.persist) + samples: list[Sample] = [] + for record in records: + width, height = _extract_dimensions(record.metadata) + samples.append( + Sample( + id=record.clip_id, + filepath=record.filepath, + label=record.label, + metadata=record.metadata, + thumbnail_base64=record.thumbnail_base64, + width=width, + height=height, + ) + ) + dataset._storage.add_samples_batch(samples) + print(f"Added/updated {len(samples)} samples in dataset '{args.dataset_name}'") + + ids, vectors = _load_embeddings( + split_output_path, + embedding_algorithm, + clip_ids={record.clip_id for record in records}, + ) + if len(ids) == 0: + raise RuntimeError( + "No embeddings found for loaded clips. Checked both parquet and pickle embedding directories." + ) + + expected_dim = _expected_embedding_dim(embedding_algorithm) + if expected_dim is not None and int(vectors.shape[1]) != expected_dim: + print( + "WARNING: Loaded embedding dimension does not match expected model output: " + f"algorithm={embedding_algorithm} expected_dim={expected_dim} loaded_dim={vectors.shape[1]}" + ) + + model_id = _embedding_model_id(embedding_algorithm) + space_key = f"cosmos_curate__{embedding_algorithm.replace('/', '_')}" + dataset._storage.ensure_space( + model_id=model_id, + dim=int(vectors.shape[1]), + config={ + "provider": "cosmos-curate", + "geometry": "euclidean", + "algorithm": embedding_algorithm, + "source": "cosmos-curate", + }, + space_key=space_key, + ) + dataset._storage.add_embeddings(space_key=space_key, ids=ids, vectors=vectors) + print(f"Imported {len(ids)} embeddings (dim={vectors.shape[1]}) into space '{space_key}'") + + if len(ids) >= 3: + print("Computing Euclidean layout...") + dataset.compute_visualization(space_key=space_key, geometry="euclidean") + print("Computing Poincaré layout...") + dataset.compute_visualization(space_key=space_key, geometry="poincare") + else: + print("Too few samples for UMAP; creating manual Euclidean/Poincaré layouts...") + _create_small_layouts(dataset, space_key=space_key, ids=ids) + + if dedup_metrics is not None: + print( + "Dedup summary: " + f"kept={dedup_metrics['kept']} removed={dedup_metrics['removed']} " + f"total={dedup_metrics['total']} reduction={dedup_metrics['reduction_pct']:.2f}%" + ) + + print(f"Launching HyperView at http://127.0.0.1:{args.port}") + hv.launch( + dataset, + port=args.port, + open_browser=not args.no_browser, + reuse_server=args.reuse_server, + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/load_nuscenes.py b/scripts/load_nuscenes.py new file mode 100644 index 0000000..ea8e73a --- /dev/null +++ b/scripts/load_nuscenes.py @@ -0,0 +1,330 @@ +"""Load nuScenes mini dataset into HyperView for embedding visualization. + +This script: +1. Loads nuScenes mini (10 scenes, ~404 samples) +2. Extracts front-camera images and their object annotations (hierarchical labels) +3. Crops annotated objects from camera images +4. Loads them into HyperView as samples with hierarchical category labels +5. Computes CLIP embeddings + both Euclidean and Poincaré projections +6. Launches HyperView to visualize + +Usage: + uv run python scripts/load_nuscenes.py [--dataroot ~/nuscenes] [--max-crops 2000] +""" + +import argparse +import hashlib +import os +import sys +from pathlib import Path + +import numpy as np +from PIL import Image + +# Add src to path for local dev +sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "src")) + +import hyperview as hv +from hyperview.core.sample import Sample + + +def get_2d_box(nusc, ann, sample_data): + """Project a 3D annotation to 2D bounding box on the camera image. + + Returns (xmin, ymin, xmax, ymax) or None if not visible. + """ + from nuscenes.utils.data_classes import Box + from nuscenes.utils.geometry_utils import view_points + from pyquaternion import Quaternion + + # Get the annotation box in global frame + box = Box( + ann["translation"], + ann["size"], + Quaternion(ann["rotation"]), + ) + + # Move box to ego vehicle frame + ego_pose = nusc.get("ego_pose", sample_data["ego_pose_token"]) + box.translate(-np.array(ego_pose["translation"])) + box.rotate(Quaternion(ego_pose["rotation"]).inverse) + + # Move box to sensor frame + cal_sensor = nusc.get("calibrated_sensor", sample_data["calibrated_sensor_token"]) + box.translate(-np.array(cal_sensor["translation"])) + box.rotate(Quaternion(cal_sensor["rotation"]).inverse) + + # Check if box is in front of camera + if box.center[2] <= 0: + return None + + # Project corners to 2D + camera_intrinsic = np.array(cal_sensor["camera_intrinsic"]) + corners_3d = box.corners() # (3, 8) + corners_2d = view_points(corners_3d, camera_intrinsic, normalize=True)[:2] # (2, 8) + + # Get bounding rectangle + xmin = max(0, int(np.min(corners_2d[0]))) + ymin = max(0, int(np.min(corners_2d[1]))) + xmax = min(1600, int(np.max(corners_2d[0]))) + ymax = min(900, int(np.max(corners_2d[1]))) + + # Filter out tiny or off-screen boxes + w = xmax - xmin + h = ymax - ymin + if w < 20 or h < 20 or xmin >= 1600 or ymin >= 900: + return None + + return (xmin, ymin, xmax, ymax) + + +def load_nuscenes_crops(dataroot: str, max_crops: int = 2000, camera: str = "CAM_FRONT"): + """Extract object crops from nuScenes mini with hierarchical labels. + + Returns list of (image_path, category_name, metadata) tuples. + """ + from nuscenes.nuscenes import NuScenes + + print(f"Loading nuScenes mini from {dataroot}...") + nusc = NuScenes(version="v1.0-mini", dataroot=dataroot, verbose=True) + + # Create output directory for crops + crops_dir = Path(dataroot) / "crops" + crops_dir.mkdir(exist_ok=True) + + crops = [] + total_anns = 0 + + for sample in nusc.sample: + # Get camera data + cam_token = sample["data"].get(camera) + if cam_token is None: + continue + cam_data = nusc.get("sample_data", cam_token) + img_path = os.path.join(dataroot, cam_data["filename"]) + + if not os.path.exists(img_path): + continue + + img = Image.open(img_path) + + for ann_token in sample["anns"]: + ann = nusc.get("sample_annotation", ann_token) + category = ann["category_name"] # e.g. "vehicle.car", "human.pedestrian.adult" + + # Project to 2D + bbox = get_2d_box(nusc, ann, cam_data) + if bbox is None: + continue + + xmin, ymin, xmax, ymax = bbox + crop = img.crop((xmin, ymin, xmax, ymax)) + + # Skip very small crops + if crop.size[0] < 24 or crop.size[1] < 24: + continue + + # Save crop + crop_id = hashlib.md5(f"{ann_token}_{camera}".encode()).hexdigest()[:12] + crop_path = crops_dir / f"{crop_id}.jpg" + if not crop_path.exists(): + crop.convert("RGB").save(crop_path, "JPEG", quality=90) + + # Parse hierarchy + parts = category.split(".") + top_level = parts[0] if len(parts) >= 1 else category + mid_level = ".".join(parts[:2]) if len(parts) >= 2 else category + + visibility_token = ann.get("visibility_token", "") + vis = nusc.get("visibility", visibility_token)["description"] if visibility_token else "" + + metadata = { + "category": category, + "top_level": top_level, + "mid_level": mid_level, + "visibility": vis, + "num_lidar_pts": ann.get("num_lidar_pts", 0), + "scene_token": sample["scene_token"], + "sample_token": sample["token"], + "camera": camera, + "bbox": list(bbox), + } + + crops.append((str(crop_path), category, metadata, crop_id)) + total_anns += 1 + + if len(crops) >= max_crops: + break + + if len(crops) >= max_crops: + break + + print(f"Extracted {len(crops)} object crops from {total_anns} annotations") + + # Print category distribution + from collections import Counter + cat_counts = Counter(c[1] for c in crops) + print("\nCategory distribution:") + for cat, count in cat_counts.most_common(): + print(f" {cat}: {count}") + + return crops, nusc + + +def load_nuscenes_scenes(dataroot: str, camera: str = "CAM_FRONT"): + """Load full camera images (scene-level) with scene metadata. + + Good for a broader overview. Each sample is one camera keyframe. + """ + from nuscenes.nuscenes import NuScenes + + print(f"Loading nuScenes mini scenes from {dataroot}...") + nusc = NuScenes(version="v1.0-mini", dataroot=dataroot, verbose=True) + + images = [] + for sample in nusc.sample: + cam_token = sample["data"].get(camera) + if cam_token is None: + continue + cam_data = nusc.get("sample_data", cam_token) + img_path = os.path.join(dataroot, cam_data["filename"]) + + if not os.path.exists(img_path): + continue + + # Get scene info + scene = nusc.get("scene", sample["scene_token"]) + log = nusc.get("log", scene["log_token"]) + + # Count annotations by top-level category + ann_summary = {} + for ann_token in sample["anns"]: + ann = nusc.get("sample_annotation", ann_token) + top = ann["category_name"].split(".")[0] + ann_summary[top] = ann_summary.get(top, 0) + 1 + + sample_id = hashlib.md5(f"{sample['token']}_{camera}".encode()).hexdigest()[:12] + + metadata = { + "scene_name": scene["name"], + "scene_description": scene["description"], + "location": log["location"], + "num_annotations": len(sample["anns"]), + "annotation_summary": ann_summary, + "timestamp": sample["timestamp"], + } + + # Label by location + description for scene-level clustering + label = log["location"] + + images.append((img_path, label, metadata, sample_id)) + + print(f"Loaded {len(images)} scene images") + return images, nusc + + +def main(): + parser = argparse.ArgumentParser(description="Load nuScenes into HyperView") + parser.add_argument("--dataroot", default=os.path.expanduser("~/nuscenes"), + help="Path to nuScenes data") + parser.add_argument("--max-crops", type=int, default=2000, + help="Max number of object crops to extract") + parser.add_argument("--mode", choices=["crops", "scenes", "both"], default="crops", + help="What to load: 'crops' (object-level), 'scenes' (image-level), or 'both'") + parser.add_argument("--model", default="openai/clip-vit-base-patch32", + help="Embedding model to use") + parser.add_argument("--port", type=int, default=6263) + parser.add_argument("--no-browser", action="store_true") + parser.add_argument( + "--dataset-name", + default="nuscenes_mini", + help="HyperView dataset name. Use a unique name for isolated runs.", + ) + parser.add_argument( + "--persist", + action=argparse.BooleanOptionalAction, + default=True, + help=( + "Persist dataset in LanceDB (--persist, default) or keep in-memory only (--no-persist). " + "Use --no-persist for a guaranteed fresh small run." + ), + ) + parser.add_argument( + "--reuse-server", + action="store_true", + help="Attach to an existing HyperView server on --port if compatible.", + ) + args = parser.parse_args() + + # Check dataroot exists + if not os.path.isdir(os.path.join(args.dataroot, "v1.0-mini")): + print(f"ERROR: nuScenes mini not found at {args.dataroot}") + print("Download: wget https://www.nuscenes.org/data/v1.0-mini.tgz") + print(f"Extract: tar -xf v1.0-mini.tgz -C {args.dataroot}") + sys.exit(1) + + dataset = hv.Dataset(args.dataset_name, persist=args.persist) + + if args.persist and len(dataset) > 0: + print( + f"NOTE: dataset '{args.dataset_name}' already has {len(dataset)} samples. " + "Use --no-persist or a different --dataset-name for a fresh small run." + ) + + if args.mode in ("crops", "both"): + crops, nusc = load_nuscenes_crops(args.dataroot, max_crops=args.max_crops) + + print(f"\nAdding {len(crops)} crops to HyperView...") + samples = [] + for filepath, category, metadata, crop_id in crops: + sample = Sample( + id=f"crop_{crop_id}", + filepath=filepath, + label=category, # Full hierarchical label like "vehicle.car" + metadata=metadata, + ) + samples.append(sample) + + dataset._storage.add_samples_batch(samples) + print(f"Added {len(samples)} crop samples") + + if args.mode in ("scenes", "both"): + images, nusc = load_nuscenes_scenes(args.dataroot) + + print(f"\nAdding {len(images)} scene images to HyperView...") + samples = [] + for filepath, label, metadata, sample_id in images: + sample = Sample( + id=f"scene_{sample_id}", + filepath=filepath, + label=label, + metadata=metadata, + ) + samples.append(sample) + + dataset._storage.add_samples_batch(samples) + print(f"Added {len(samples)} scene samples") + + # Compute embeddings + print(f"\nComputing embeddings with {args.model}...") + space_key = dataset.compute_embeddings(model=args.model, show_progress=True) + print(f"Embeddings computed (space_key={space_key})") + + # Compute both visualizations + print("\nComputing Euclidean projection...") + dataset.compute_visualization(space_key=space_key, geometry="euclidean") + + print("Computing Poincaré projection...") + dataset.compute_visualization(space_key=space_key, geometry="poincare") + + print("\nDone! Launching HyperView...") + hv.launch( + dataset, + port=args.port, + open_browser=not args.no_browser, + reuse_server=args.reuse_server, + ) + + +if __name__ == "__main__": + main() diff --git a/src/hyperview/__init__.py b/src/hyperview/__init__.py index 7def79f..d055599 100644 --- a/src/hyperview/__init__.py +++ b/src/hyperview/__init__.py @@ -1,6 +1,14 @@ """HyperView - Open-source dataset curation with hyperbolic embeddings visualization.""" -from hyperview.api import Dataset, launch +from . import _version as _version +from . import api as _api -__version__ = "0.1.0" -__all__ = ["Dataset", "launch", "__version__"] +Dataset = _api.Dataset +launch = _api.launch +__version__ = _version.__version__ + +__all__ = [ + "Dataset", + "launch", + "__version__", +] diff --git a/src/hyperview/api.py b/src/hyperview/api.py index 928553b..c9a7e5b 100644 --- a/src/hyperview/api.py +++ b/src/hyperview/api.py @@ -1,46 +1,398 @@ """Public API for HyperView.""" -from __future__ import annotations - +import json +import os +import socket +import threading +import time import webbrowser +from dataclasses import dataclass +from urllib.error import URLError +from urllib.request import Request, urlopen +from uuid import uuid4 + import uvicorn from hyperview.core.dataset import Dataset from hyperview.server.app import create_app, set_dataset -__all__ = ["Dataset", "launch"] +__all__ = ["Dataset", "launch", "Session"] + + +@dataclass(frozen=True) +class _HealthResponse: + name: str | None + session_id: str | None + dataset: str | None + pid: int | None + + +def _can_connect(host: str, port: int, timeout_s: float) -> bool: + try: + with socket.create_connection((host, port), timeout=timeout_s): + return True + except OSError: + return False + + +def _try_read_health(url: str, timeout_s: float) -> _HealthResponse | None: + try: + return _read_health(url, timeout_s=timeout_s) + except (URLError, TimeoutError, OSError, ValueError, json.JSONDecodeError): + return None + + +def _read_health(url: str, timeout_s: float) -> _HealthResponse: + request = Request(url, headers={"Accept": "application/json"}) + with urlopen(request, timeout=timeout_s) as response: + data = json.loads(response.read().decode("utf-8")) + + return _HealthResponse( + name=data.get("name"), + session_id=data.get("session_id"), + dataset=data.get("dataset"), + pid=data.get("pid") if isinstance(data.get("pid"), int) else None, + ) + + +class Session: + """A session for the HyperView visualizer.""" + + def __init__(self, dataset: Dataset, host: str, port: int): + self.dataset = dataset + self.host = host + self.port = port + # Prefer a browser-connectable host for user-facing URLs. + # When binding to 0.0.0.0, users should connect via 127.0.0.1 locally. + self.url = f"http://{self._connect_host}:{port}" + self._server_thread: threading.Thread | None = None + self._server: uvicorn.Server | None = None + self._startup_error: BaseException | None = None + self.session_id = uuid4().hex + + @property + def _connect_host(self) -> str: + return "127.0.0.1" if self.host == "0.0.0.0" else self.host + + @property + def _health_url(self) -> str: + return f"http://{self._connect_host}:{self.port}/__hyperview__/health" + + def _run_server(self): + try: + set_dataset(self.dataset) + app = create_app(self.dataset, session_id=self.session_id) + config = uvicorn.Config(app, host=self.host, port=self.port, log_level="warning") + self._server = uvicorn.Server(config) + self._server.run() + except BaseException as exc: + self._startup_error = exc + + def start(self, background: bool = True): + """Start the visualizer server.""" + if not background: + self._run_server() + return + + # Fail fast if something is already listening on this port. + if _can_connect(self._connect_host, self.port, timeout_s=0.2): + health = _try_read_health(self._health_url, timeout_s=0.2) + if health is not None and health.name == "hyperview": + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"HyperView (port={self.port}, session_id={health.session_id}). " + "Choose a different port or stop the existing server." + ) + + raise RuntimeError( + "HyperView failed to start because the port is already in use " + f"by a non-HyperView service (port={self.port}). Choose a different " + "port or stop the process listening on that port." + ) + + self._startup_error = None + self._server_thread = threading.Thread(target=self._run_server, daemon=True) + self._server_thread.start() + + deadline = time.time() + 5.0 + last_health_error: Exception | None = None + + while time.time() < deadline: + if self._startup_error is not None: + raise RuntimeError( + f"HyperView server failed to start (port={self.port}): " + f"{type(self._startup_error).__name__}: {self._startup_error}" + ) + + if self._server_thread is not None and not self._server_thread.is_alive(): + raise RuntimeError( + "HyperView server thread exited during startup. " + f"The port may be in use (port={self.port})." + ) + + try: + health = _read_health(self._health_url, timeout_s=0.2) + except (URLError, TimeoutError, OSError, ValueError, json.JSONDecodeError) as exc: + last_health_error = exc + time.sleep(0.05) + continue + + if health.name == "hyperview" and health.session_id == self.session_id: + return + + if health.name == "hyperview": + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"a different HyperView session (port={self.port}, " + f"session_id={health.session_id})." + ) + + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"a non-HyperView app (port={self.port})." + ) + + raise TimeoutError( + "HyperView server did not become ready in time " + f"(port={self.port}). Last error: {last_health_error}" + ) + + def stop(self): + """Stop the visualizer server.""" + if self._server: + self._server.should_exit = True + + def show(self, height: int = 800): + """Display the visualizer in a notebook. + + In Google Colab, notebook kernels cannot be accessed via localhost. + Colab exposes kernel ports through a proxy URL (see + `google.colab.kernel.proxyPort`). This renders a link to the proxied URL + that opens in a new tab. + + In other notebook environments, it renders a clickable link to the local + URL and a best-effort JavaScript auto-open. + """ + if _is_colab(): + try: + from google.colab.output import eval_js # type: ignore[import-not-found] + from IPython.display import HTML, display + + proxy_url = eval_js(f"google.colab.kernel.proxyPort({self.port})") + app_url = str(proxy_url).rstrip("/") + "/" + + display( + HTML( + "

HyperView is running in Colab. " + f"" + "Open HyperView in a new tab.

" + ) + ) + display(HTML(f"

{app_url}

")) + return + except Exception: + # Fall through to the generic notebook behavior. + pass + + # Default: open in a new browser tab (works well for Jupyter). + try: + from IPython.display import HTML, Javascript, display + + display( + HTML( + "

HyperView is running. " + f"Open in a new tab." + "

" + ) + ) + + # Best-effort auto-open. Some browsers may block popups. + display(Javascript(f'window.open("{self.url}", "_blank");')) + except ImportError: + print(f"IPython not installed. Please visit {self.url} in your browser.") + + def open_browser(self): + """Open the visualizer in a browser window.""" + webbrowser.open(self.url) def launch( dataset: Dataset, - port: int = 5151, + port: int = 6262, host: str = "127.0.0.1", open_browser: bool = True, -) -> None: + notebook: bool | None = None, + height: int = 800, + reuse_server: bool = False, +) -> Session: """Launch the HyperView visualization server. + Note: + HyperView's UI needs at least one 2D layout. If layouts are missing but + embedding spaces exist, this function will compute a default layout + automatically (Euclidean if any Euclidean space exists, otherwise Poincaré). + Args: dataset: The dataset to visualize. port: Port to run the server on. host: Host to bind to. open_browser: Whether to open a browser window. + notebook: Whether to display in a notebook. If None, auto-detects. + height: Height of the iframe in the notebook. + reuse_server: If True, and the requested port is already serving HyperView, + attach to the existing server instead of starting a new one. For safety, + this will only attach when the existing server reports the same dataset + name (via `/__hyperview__/health`). + + Returns: + A Session object. Example: >>> import hyperview as hv >>> dataset = hv.Dataset("my_dataset") >>> dataset.add_images_dir("/path/to/images", label_from_folder=True) - >>> dataset.compute_embeddings() + >>> dataset.compute_embeddings(model="openai/clip-vit-base-patch32") >>> dataset.compute_visualization() >>> hv.launch(dataset) """ - set_dataset(dataset) - app = create_app(dataset) + if notebook is None: + # Colab is always a notebook environment, even if _is_notebook() fails to detect it + notebook = _is_notebook() or _is_colab() + + if _is_colab() and host == "127.0.0.1": + # Colab port forwarding/proxying is most reliable when the server binds + # to all interfaces. + host = "0.0.0.0" + + # Preflight: avoid doing expensive work if the port is already in use. + # If it's already serving HyperView and reuse_server=True, we can safely attach. + connect_host = "127.0.0.1" if host == "0.0.0.0" else host + health_url = f"http://{connect_host}:{port}/__hyperview__/health" + + if _can_connect(connect_host, port, timeout_s=0.2): + health = _try_read_health(health_url, timeout_s=0.2) + if health is not None and health.name == "hyperview": + if not reuse_server: + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"HyperView (port={port}, dataset={health.dataset}, " + f"session_id={health.session_id}, pid={health.pid}). " + "Choose a different port, stop the existing server, or pass " + "reuse_server=True to attach." + ) + + if health.dataset is not None and health.dataset != dataset.name: + raise RuntimeError( + "HyperView refused to attach to the existing server because it is " + f"serving a different dataset (port={port}, dataset={health.dataset}). " + f"Requested dataset={dataset.name}. Stop the existing server or " + "choose a different port." + ) + + session = Session(dataset, host, port) + if health.session_id is not None: + session.session_id = health.session_id + + if notebook: + if _is_colab(): + print( + f"\nHyperView is already running (Colab, port={session.port}). " + "Use the link below to open it." + ) + else: + print( + f"\nHyperView is already running at {session.url} (port={session.port}). " + "Opening a new tab..." + ) + session.show(height=height) + else: + print(f"\nHyperView is already running at {session.url} (port={session.port}).") + if open_browser: + session.open_browser() + + return session + + raise RuntimeError( + "HyperView failed to start because the port is already in use " + f"by a non-HyperView service (port={port}). Choose a different " + "port or stop the process listening on that port." + ) + + # The frontend requires 2D coords from /api/embeddings. + # Ensure at least one layout exists; do not auto-generate optional geometries. + layouts = dataset.list_layouts() + spaces = dataset.list_spaces() + + if not spaces: + raise ValueError( + "HyperView launch requires 2D projections for the UI. " + "No projections or embedding spaces were found. " + "Call `dataset.compute_embeddings()` and `dataset.compute_visualization()` " + "before `hv.launch()`." + ) + + if not layouts: + has_euclidean_space = any(s.geometry != "hyperboloid" for s in spaces) + default_geometry = "euclidean" if has_euclidean_space else "poincare" + + print(f"No layouts found. Computing {default_geometry} visualization...") + # Let compute_visualization pick the most appropriate default space. + dataset.compute_visualization(space_key=None, geometry=default_geometry) + + session = Session(dataset, host, port) + + if notebook: + session.start(background=True) + if _is_colab(): + print( + f"\nHyperView is running (Colab, port={session.port}). " + "Use the link below to open it." + ) + else: + print(f"\nHyperView is running at {session.url}. Opening a new tab...") + session.show(height=height) + else: + session.start(background=True) + print(" Press Ctrl+C to stop.\n") + print(f"\nHyperView is running at {session.url}") + + if open_browser: + session.open_browser() + + try: + while True: + # Keep the main thread alive so the daemon server thread can run. + time.sleep(0.25) + if session._server_thread is not None and not session._server_thread.is_alive(): + raise RuntimeError("HyperView server stopped unexpectedly.") + except KeyboardInterrupt: + pass + finally: + session.stop() + if session._server_thread is not None: + session._server_thread.join(timeout=2.0) + + return session + + +def _is_notebook() -> bool: + """Check if running in a notebook environment.""" + try: + from IPython import get_ipython + except ImportError: + return False + + shell = get_ipython() + return shell is not None and shell.__class__.__name__ == "ZMQInteractiveShell" - url = f"http://{host}:{port}" - print(f"\n🚀 HyperView is running at {url}") - print(" Press Ctrl+C to stop.\n") - if open_browser: - webbrowser.open(url) +def _is_colab() -> bool: + """Check if running inside a Google Colab notebook runtime.""" + if os.environ.get("COLAB_RELEASE_TAG"): + return True + try: + import google.colab # type: ignore[import-not-found] - uvicorn.run(app, host=host, port=port, log_level="warning") + return True + except ImportError: + return False diff --git a/src/hyperview/cli.py b/src/hyperview/cli.py index 9bcd459..f7cc77b 100644 --- a/src/hyperview/cli.py +++ b/src/hyperview/cli.py @@ -1,7 +1,5 @@ """Command-line interface for HyperView.""" -from __future__ import annotations - import argparse import sys @@ -27,8 +25,33 @@ def main(): demo_parser.add_argument( "--port", type=int, - default=5151, - help="Port to run the server on (default: 5151)", + default=6262, + help="Port to run the server on (default: 6262)", + ) + demo_parser.add_argument( + "--host", + type=str, + default="127.0.0.1", + help="Host to bind the server to (default: 127.0.0.1)", + ) + demo_parser.add_argument( + "--no-browser", + action="store_true", + help="Do not open a browser window automatically", + ) + demo_parser.add_argument( + "--reuse-server", + action="store_true", + help=( + "If the port is already serving HyperView, attach instead of failing. " + "For safety, this only attaches when the existing server reports the same dataset name." + ), + ) + demo_parser.add_argument( + "--model", + type=str, + default="openai/clip-vit-base-patch32", + help="Embedding model to use (default: openai/clip-vit-base-patch32)", ) # Serve command @@ -37,60 +60,107 @@ def main(): serve_parser.add_argument( "--port", type=int, - default=5151, - help="Port to run the server on (default: 5151)", + default=6262, + help="Port to run the server on (default: 6262)", + ) + serve_parser.add_argument( + "--host", + type=str, + default="127.0.0.1", + help="Host to bind the server to (default: 127.0.0.1)", + ) + serve_parser.add_argument( + "--no-browser", + action="store_true", + help="Do not open a browser window automatically", + ) + serve_parser.add_argument( + "--reuse-server", + action="store_true", + help=( + "If the port is already serving HyperView, attach instead of failing. " + "For safety, this only attaches when the existing server reports the same dataset name." + ), ) args = parser.parse_args() if args.command == "demo": - run_demo(args.samples, args.port) + run_demo( + args.samples, + args.port, + host=args.host, + open_browser=not args.no_browser, + reuse_server=args.reuse_server, + model=args.model, + ) elif args.command == "serve": - serve_dataset(args.dataset, args.port) + serve_dataset( + args.dataset, + args.port, + host=args.host, + open_browser=not args.no_browser, + reuse_server=args.reuse_server, + ) else: parser.print_help() sys.exit(1) -def run_demo(num_samples: int = 500, port: int = 5151): - """Run a demo with CIFAR-100 data.""" - print("🔄 Loading CIFAR-100 dataset...") - dataset = Dataset("cifar100_demo") - - try: - count = dataset.add_from_huggingface( - "uoft-cs/cifar100", - split="train", - image_key="img", - label_key="fine_label", - max_samples=num_samples, - ) - print(f"✓ Loaded {count} samples") - except Exception as e: - print(f"Failed to load HuggingFace dataset: {e}") - print("Please ensure 'datasets' is installed: pip install datasets") - sys.exit(1) +def run_demo( + num_samples: int = 500, + port: int = 6262, + *, + host: str = "127.0.0.1", + open_browser: bool = True, + reuse_server: bool = False, + model: str = "openai/clip-vit-base-patch32", +) -> None: + """Run a demo with CIFAR-10 data.""" + print("Loading CIFAR-10 dataset...") + dataset = Dataset("cifar10_demo") + + added, skipped = dataset.add_from_huggingface( + "uoft-cs/cifar10", + split="train", + image_key="img", + label_key="label", + max_samples=num_samples, + ) + if skipped > 0: + print(f"Loaded {added} samples ({skipped} already present)") + else: + print(f"Loaded {added} samples") - print("🔄 Computing embeddings...") - dataset.compute_embeddings(show_progress=True) - print("✓ Embeddings computed") + print(f"Computing embeddings with {model}...") + space_key = dataset.compute_embeddings(model=model, show_progress=True) + print("Embeddings computed") - print("🔄 Computing visualizations...") - dataset.compute_visualization() - print("✓ Visualizations ready") + print("Computing visualizations...") + # Compute both euclidean and poincare layouts + dataset.compute_visualization(space_key=space_key, geometry="euclidean") + dataset.compute_visualization(space_key=space_key, geometry="poincare") + print("Visualizations ready") - launch(dataset, port=port) + launch(dataset, port=port, host=host, open_browser=open_browser, reuse_server=reuse_server) -def serve_dataset(filepath: str, port: int = 5151): +def serve_dataset( + filepath: str, + port: int = 6262, + *, + host: str = "127.0.0.1", + open_browser: bool = True, + reuse_server: bool = False, +) -> None: """Serve a saved dataset.""" from hyperview import Dataset, launch - print(f"🔄 Loading dataset from {filepath}...") + print(f"Loading dataset from {filepath}...") dataset = Dataset.load(filepath) - print(f"✓ Loaded {len(dataset)} samples") + print(f"Loaded {len(dataset)} samples") - launch(dataset, port=port) + launch(dataset, port=port, host=host, open_browser=open_browser, reuse_server=reuse_server) if __name__ == "__main__": diff --git a/src/hyperview/core/dataset.py b/src/hyperview/core/dataset.py index 44cafaf..09cba36 100644 --- a/src/hyperview/core/dataset.py +++ b/src/hyperview/core/dataset.py @@ -7,44 +7,115 @@ import uuid from collections.abc import Callable, Iterator from pathlib import Path -from typing import Any +from typing import Any, cast import numpy as np -from datasets import load_dataset +from datasets import DownloadConfig, load_dataset from PIL import Image -from hyperview.core.sample import Sample, SampleFromArray +from hyperview.core.sample import Sample +from hyperview.storage.backend import StorageBackend +from hyperview.storage.schema import make_layout_key class Dataset: - """A collection of samples with support for embeddings and visualization.""" + """A collection of samples with support for embeddings and visualization. - def __init__(self, name: str | None = None): + Datasets are automatically persisted to LanceDB by default, providing: + - Automatic persistence (no need to call save()) + - Vector similarity search + - Efficient storage and retrieval + + Embeddings are stored separately from samples, keyed by model_id. + Layouts (2D projections) are stored per layout_key (space + method). + + Examples: + # Create a new dataset (auto-persisted) + dataset = hv.Dataset("my_dataset") + dataset.add_images_dir("/path/to/images") + + # Create an in-memory dataset (for testing) + dataset = hv.Dataset("temp", persist=False) + """ + + def __init__( + self, + name: str | None = None, + persist: bool = True, + storage: StorageBackend | None = None, + ): """Initialize a new dataset. Args: name: Optional name for the dataset. + persist: If True (default), use LanceDB for persistence. + If False, use in-memory storage. + storage: Optional custom storage backend. If provided, persist is ignored. """ self.name = name or f"dataset_{uuid.uuid4().hex[:8]}" - self._samples: dict[str, Sample] = {} - self._embedding_computer = None - self._projection_engine = None - self._label_colors: dict[str, str] = {} + + # Initialize storage backend + if storage is not None: + self._storage = storage + elif persist: + from hyperview.storage import LanceDBBackend, StorageConfig + + config = StorageConfig.default() + self._storage = LanceDBBackend(self.name, config) + else: + from hyperview.storage import MemoryBackend + self._storage = MemoryBackend(self.name) def __len__(self) -> int: - return len(self._samples) + return len(self._storage) def __iter__(self) -> Iterator[Sample]: - return iter(self._samples.values()) + return iter(self._storage) def __getitem__(self, sample_id: str) -> Sample: - return self._samples[sample_id] + sample = self._storage.get_sample(sample_id) + if sample is None: + raise KeyError(sample_id) + return sample def add_sample(self, sample: Sample) -> None: - """Add a sample to the dataset.""" - self._samples[sample.id] = sample - if sample.label and sample.label not in self._label_colors: - self._assign_label_color(sample.label) + """Add a sample to the dataset (idempotent).""" + self._storage.add_sample(sample) + + def _ingest_samples( + self, + samples: list[Sample], + *, + skip_existing: bool = True, + ) -> tuple[int, int]: + """Shared ingestion helper for batch sample insertion. + + Handles deduplication uniformly. + + Args: + samples: List of samples to ingest. + skip_existing: If True, skip samples that already exist in storage. + + Returns: + Tuple of (num_added, num_skipped). + """ + if not samples: + return 0, 0 + + skipped = 0 + if skip_existing: + all_ids = [s.id for s in samples] + existing_ids = self._storage.get_existing_ids(all_ids) + if existing_ids: + samples = [s for s in samples if s.id not in existing_ids] + skipped = len(all_ids) - len(samples) + + if not samples: + return 0, skipped + + self._storage.add_samples_batch(samples) + + return len(samples), skipped def add_image( self, @@ -82,7 +153,8 @@ def add_images_dir( extensions: tuple[str, ...] = (".jpg", ".jpeg", ".png", ".webp"), label_from_folder: bool = False, recursive: bool = True, - ) -> int: + skip_existing: bool = True, + ) -> tuple[int, int]: """Add all images from a directory. Args: @@ -90,24 +162,32 @@ def add_images_dir( extensions: Tuple of valid file extensions. label_from_folder: If True, use parent folder name as label. recursive: If True, search subdirectories. + skip_existing: If True (default), skip samples that already exist. Returns: - Number of images added. + Tuple of (num_added, num_skipped). """ - directory = Path(directory) - if not directory.exists(): - raise ValueError(f"Directory does not exist: {directory}") + directory_path = Path(directory) + if not directory_path.exists(): + raise ValueError(f"Directory does not exist: {directory_path}") - count = 0 + samples = [] pattern = "**/*" if recursive else "*" - for path in directory.glob(pattern): + for path in directory_path.glob(pattern): if path.is_file() and path.suffix.lower() in extensions: label = path.parent.name if label_from_folder else None - self.add_image(str(path), label=label) - count += 1 - - return count + sample_id = hashlib.md5(str(path).encode()).hexdigest()[:12] + sample = Sample( + id=sample_id, + filepath=str(path), + label=label, + metadata={}, + ) + samples.append(sample) + + # Use shared ingestion helper + return self._ingest_samples(samples, skip_existing=skip_existing) def add_from_huggingface( self, @@ -117,9 +197,18 @@ def add_from_huggingface( label_key: str | None = "fine_label", label_names_key: str | None = None, max_samples: int | None = None, - ) -> int: + shuffle: bool = False, + seed: int = 42, + show_progress: bool = True, + skip_existing: bool = True, + image_format: str = "auto", + ) -> tuple[int, int]: """Load samples from a HuggingFace dataset. + Images are downloaded to disk at ~/.hyperview/media/huggingface/{dataset}/{split}/ + This ensures images persist across sessions and embeddings can be computed + at any time, similar to FiftyOne's approach. + Args: dataset_name: Name of the HuggingFace dataset. split: Dataset split to use. @@ -127,33 +216,85 @@ def add_from_huggingface( label_key: Key for the label column (can be None). label_names_key: Key for label names in dataset info. max_samples: Maximum number of samples to load. + shuffle: If True, shuffle the dataset before sampling (ensures diverse classes). + seed: Random seed for shuffling (default: 42). + show_progress: Whether to print progress. + skip_existing: If True (default), skip samples that already exist in storage. + image_format: Image format to save: "auto" (detect from source, fallback PNG), + "png" (lossless), or "jpeg" (smaller files). Returns: - Number of samples added. + Tuple of (num_added, num_skipped). """ - ds = load_dataset(dataset_name, split=split) + from hyperview.storage import StorageConfig + + # HuggingFace `load_dataset()` can be surprisingly slow even when the dataset + # is already cached, due to Hub reachability checks in some environments. + # For a fast path, first try loading in "offline" mode (cache-only), and + # fall back to an online load if the dataset isn't cached yet. + try: + ds = cast( + Any, + load_dataset( + dataset_name, + split=split, + download_config=DownloadConfig(local_files_only=True), + ), + ) + except Exception: + ds = cast(Any, load_dataset(dataset_name, split=split)) + + source_fingerprint = ds._fingerprint if hasattr(ds, "_fingerprint") else None + + dataset_size = len(ds) + total = dataset_size if max_samples is None else min(dataset_size, max_samples) + + # Select source row indices explicitly so sampled subsets are clear and + # sample IDs remain stable for the same underlying row. + selected_indices: list[int] | None = None + if shuffle: + rng = np.random.default_rng(seed) + selected_indices = rng.permutation(dataset_size)[:total].tolist() + ds = ds.select(selected_indices) + elif max_samples is not None: + selected_indices = list(range(total)) + ds = ds.select(selected_indices) # Get label names if available label_names = None if label_key and label_names_key: if label_names_key in ds.features: - label_names = ds.features[label_names_key].names + label_names = ds.features[label_names_key].names elif label_key: if hasattr(ds.features[label_key], "names"): label_names = ds.features[label_key].names - count = 0 - total = len(ds) if max_samples is None else min(len(ds), max_samples) + # Extract dataset metadata for robust sample IDs + config_name = getattr(ds.info, "config_name", None) or "default" + fingerprint = source_fingerprint[:8] if source_fingerprint else "unknown" + version = str(ds.info.version) if ds.info.version else None + + # Get media directory for this dataset + config = StorageConfig.default() + media_dir = config.get_huggingface_media_dir(dataset_name, split) + + samples = [] + + if show_progress: + print(f"Loading {total} samples from {dataset_name}...") + + iterator = range(total) - for i in range(total): + for i in iterator: item = ds[i] + source_index = selected_indices[i] if selected_indices is not None else i image = item[image_key] # Handle PIL Image or numpy array if isinstance(image, Image.Image): - image_array = np.array(image) + pil_image = image else: - image_array = image + pil_image = Image.fromarray(np.asarray(image)) # Get label label = None @@ -164,179 +305,397 @@ def add_from_huggingface( else: label = str(label_idx) - sample = SampleFromArray.from_array( - id=f"{dataset_name.replace('/', '_')}_{split}_{i}", - image_array=image_array, + # Generate robust sample ID with config and fingerprint + safe_name = dataset_name.replace("/", "_") + sample_id = f"{safe_name}_{config_name}_{fingerprint}_{split}_{source_index}" + + # Determine image format and extension + if image_format == "auto": + # Try to preserve original format, fallback to PNG + original_format = getattr(pil_image, "format", None) + if original_format in ("JPEG", "JPG"): + save_format = "JPEG" + ext = ".jpg" + else: + save_format = "PNG" + ext = ".png" + elif image_format == "jpeg": + save_format = "JPEG" + ext = ".jpg" + else: + save_format = "PNG" + ext = ".png" + + # Enhanced metadata with dataset info + metadata = { + "source": dataset_name, + "config": config_name, + "split": split, + "index": source_index, + "fingerprint": source_fingerprint, + "version": version, + } + + image_path = media_dir / f"{sample_id}{ext}" + if not image_path.exists(): + if save_format == "JPEG" or pil_image.mode in ("RGBA", "P", "L"): + pil_image = pil_image.convert("RGB") + pil_image.save(image_path, format=save_format) + + sample = Sample( + id=sample_id, + filepath=str(image_path), label=label, - metadata={"source": dataset_name, "split": split, "index": i}, + metadata=metadata, ) - self.add_sample(sample) - count += 1 - return count + samples.append(sample) + + # Use shared ingestion helper + num_added, skipped = self._ingest_samples(samples, skip_existing=skip_existing) + + if show_progress: + print(f"Images saved to: {media_dir}") + if skipped > 0: + print(f"Skipped {skipped} existing samples") + + return num_added, skipped def compute_embeddings( self, - model: str = "clip", + model: str, + *, + provider: str | None = None, + checkpoint: str | None = None, batch_size: int = 32, show_progress: bool = True, - ) -> None: - """Compute embeddings for all samples. + **provider_kwargs: Any, + ) -> str: + """Compute embeddings for samples that don't have them yet. + + Embeddings are stored in a dedicated space keyed by the embedding spec. Args: - model: Embedding model to use. + model: Model identifier (required). Use a HuggingFace model_id + (e.g. 'openai/clip-vit-base-patch32') for embed-anything, or a + hyper-models name (e.g. 'hycoclip-vit-s') for hyperbolic embeddings. + provider: Explicit provider identifier. If not specified, auto-detected: + 'hyper-models' if model matches a hyper-models name, else 'embed-anything'. + Available providers: `hyperview.embeddings.list_embedding_providers()`. + checkpoint: Checkpoint path/URL (hf://... or local path) for weight-only models. batch_size: Batch size for processing. show_progress: Whether to show progress bar. - """ - from hyperview.embeddings.compute import EmbeddingComputer + **provider_kwargs: Additional kwargs passed to the embedding function. - if self._embedding_computer is None: - self._embedding_computer = EmbeddingComputer(model=model) + Returns: + space_key for the embedding space. + + Raises: + ValueError: If model is not provided. + """ + if not model: + raise ValueError( + "model is required. Examples: 'openai/clip-vit-base-patch32' (CLIP), " + "'hycoclip-vit-s' (hyperbolic). See hyperview.embeddings.list_embedding_providers()." + ) - samples = list(self._samples.values()) - embeddings = self._embedding_computer.compute_batch( - samples, batch_size=batch_size, show_progress=show_progress + from hyperview.embeddings.engine import EmbeddingSpec + from hyperview.embeddings.pipelines import compute_embeddings + + if provider is None: + provider = "embed-anything" + try: + import hyper_models + if model in hyper_models.list_models(): + provider = "hyper-models" + except ImportError: + pass + spec = EmbeddingSpec( + provider=provider, + model_id=model, + checkpoint=checkpoint, + provider_kwargs=provider_kwargs, ) - for sample, embedding in zip(samples, embeddings): - sample.embedding = embedding.tolist() + space_key, _num_computed, _num_skipped = compute_embeddings( + storage=self._storage, + spec=spec, + batch_size=batch_size, + show_progress=show_progress, + ) + return space_key def compute_visualization( self, + space_key: str | None = None, method: str = "umap", + geometry: str = "euclidean", n_neighbors: int = 15, min_dist: float = 0.1, metric: str = "cosine", - ) -> None: + force: bool = False, + ) -> str: """Compute 2D projections for visualization. Args: + space_key: Embedding space to project. If None, uses the first available. method: Projection method ('umap' supported). + geometry: Output geometry type ('euclidean' or 'poincare'). n_neighbors: Number of neighbors for UMAP. min_dist: Minimum distance for UMAP. metric: Distance metric for UMAP. - """ - from hyperview.embeddings.projection import ProjectionEngine - - if self._projection_engine is None: - self._projection_engine = ProjectionEngine() + force: Force recomputation even if layout exists. - samples = [s for s in self._samples.values() if s.embedding is not None] - if not samples: - raise ValueError("No embeddings computed. Call compute_embeddings() first.") - - embeddings = np.array([s.embedding for s in samples]) + Returns: + layout_key for the computed layout. + """ + from hyperview.embeddings.pipelines import compute_layout - # Compute Euclidean 2D projection - coords_euclidean = self._projection_engine.project_umap( - embeddings, + return compute_layout( + storage=self._storage, + space_key=space_key, + method=method, + geometry=geometry, n_neighbors=n_neighbors, min_dist=min_dist, metric=metric, + force=force, + show_progress=True, ) - # Compute Hyperbolic (Poincaré) 2D projection - coords_hyperbolic = self._projection_engine.project_to_poincare( - embeddings, - n_neighbors=n_neighbors, - min_dist=min_dist, + def list_spaces(self) -> list[Any]: + """List all embedding spaces in this dataset.""" + return self._storage.list_spaces() + + def list_layouts(self) -> list[Any]: + """List all layouts in this dataset (returns LayoutInfo objects).""" + return self._storage.list_layouts() + + def find_similar( + self, + sample_id: str, + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + """Find k most similar samples to a given sample. + + Args: + sample_id: ID of the query sample. + k: Number of neighbors to return. + space_key: Embedding space to search in. If None, uses first available. + + Returns: + List of (sample, distance) tuples, sorted by distance ascending. + """ + return self._storage.find_similar(sample_id, k, space_key) + + def find_similar_by_vector( + self, + vector: list[float], + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + """Find k most similar samples to a given vector. + + Args: + vector: Query vector. + k: Number of neighbors to return. + space_key: Embedding space to search in. If None, uses first available. + + Returns: + List of (sample, distance) tuples, sorted by distance ascending. + """ + return self._storage.find_similar_by_vector(vector, k, space_key) + + def set_coords( + self, + geometry: str, + ids: list[str], + coords: np.ndarray | list[list[float]], + ) -> str: + """Set precomputed 2D coordinates for visualization. + + Use this when you have precomputed 2D projections and want to skip + embedding computation. Useful for smoke tests or external projections. + + Args: + geometry: "euclidean" or "poincare". + ids: List of sample IDs. + coords: (N, 2) array of coordinates. + + Returns: + The layout_key for the stored coordinates. + + Example: + >>> dataset.set_coords("euclidean", ["s0", "s1"], [[0.1, 0.2], [0.3, 0.4]]) + >>> dataset.set_coords("poincare", ["s0", "s1"], [[0.1, 0.2], [0.3, 0.4]]) + >>> hv.launch(dataset) + """ + if geometry not in ("euclidean", "poincare"): + raise ValueError(f"geometry must be 'euclidean' or 'poincare', got '{geometry}'") + + coords_arr = np.asarray(coords, dtype=np.float32) + if coords_arr.ndim != 2 or coords_arr.shape[1] != 2: + raise ValueError(f"coords must be (N, 2), got shape {coords_arr.shape}") + + # Ensure a synthetic space exists (required by launch()) + space_key = "precomputed" + if not any(s.space_key == space_key for s in self._storage.list_spaces()): + precomputed_config = { + "provider": "precomputed", + "geometry": "unknown", # Precomputed coords don't have a source embedding geometry + } + self._storage.ensure_space(space_key, dim=2, config=precomputed_config) + + layout_key = make_layout_key(space_key, method="precomputed", geometry=geometry) + + # Ensure layout registry entry exists + self._storage.ensure_layout( + layout_key=layout_key, + space_key=space_key, + method="precomputed", + geometry=geometry, + params=None, ) - for sample, coord_e, coord_h in zip(samples, coords_euclidean, coords_hyperbolic): - sample.embedding_2d = coord_e.tolist() - sample.embedding_2d_hyperbolic = coord_h.tolist() - - def _assign_label_color(self, label: str) -> None: - """Assign a color to a label.""" - # Use a predefined color palette - colors = [ - "#e6194b", "#3cb44b", "#ffe119", "#4363d8", "#f58231", - "#911eb4", "#46f0f0", "#f032e6", "#bcf60c", "#fabebe", - "#008080", "#e6beff", "#9a6324", "#fffac8", "#800000", - "#aaffc3", "#808000", "#ffd8b1", "#000075", "#808080", - ] - idx = len(self._label_colors) % len(colors) - self._label_colors[label] = colors[idx] - - def get_label_colors(self) -> dict[str, str]: - """Get the color mapping for labels.""" - return self._label_colors.copy() + self._storage.add_layout_coords(layout_key, list(ids), coords_arr) + return layout_key @property def samples(self) -> list[Sample]: """Get all samples as a list.""" - return list(self._samples.values()) + return self._storage.get_all_samples() @property def labels(self) -> list[str]: """Get unique labels in the dataset.""" - return list(set(s.label for s in self._samples.values() if s.label)) + return self._storage.get_unique_labels() def filter(self, predicate: Callable[[Sample], bool]) -> list[Sample]: """Filter samples based on a predicate function.""" - return [s for s in self._samples.values() if predicate(s)] + return self._storage.filter(predicate) - def to_dict(self) -> dict[str, Any]: - """Convert dataset to dictionary for serialization.""" - return { - "name": self.name, - "num_samples": len(self), - "labels": self.labels, - "label_colors": self._label_colors, - } + def get_samples_paginated( + self, + offset: int = 0, + limit: int = 100, + label: str | None = None, + ) -> tuple[list[Sample], int]: + """Get paginated samples. + + This avoids loading all samples into memory and is used by the server + API for efficient pagination. + """ + return self._storage.get_samples_paginated(offset=offset, limit=limit, label=label) + + def get_samples_by_ids(self, sample_ids: list[str]) -> list[Sample]: + """Retrieve multiple samples by ID. + + The returned list is aligned to the input order and skips missing IDs. + """ + return self._storage.get_samples_by_ids(sample_ids) + + def get_visualization_data( + self, + layout_key: str, + ) -> tuple[list[str], list[str | None], np.ndarray]: + """Get visualization data (ids, labels, coords) for a layout.""" + layout_ids, layout_coords = self._storage.get_layout_coords(layout_key) + if not layout_ids: + return [], [], np.empty((0, 2), dtype=np.float32) + + labels_by_id = self._storage.get_labels_by_ids(layout_ids) + + ids: list[str] = [] + labels: list[str | None] = [] + coords: list[np.ndarray] = [] + + for i, sample_id in enumerate(layout_ids): + if sample_id in labels_by_id: + ids.append(sample_id) + labels.append(labels_by_id[sample_id]) + coords.append(layout_coords[i]) + + if not coords: + return [], [], np.empty((0, 2), dtype=np.float32) + + return ids, labels, np.asarray(coords, dtype=np.float32) + + + def get_lasso_candidates_aabb( + self, + *, + layout_key: str, + x_min: float, + x_max: float, + y_min: float, + y_max: float, + ) -> tuple[list[str], np.ndarray]: + """Return candidate (id, xy) rows within an AABB for a layout.""" + return self._storage.get_lasso_candidates_aabb( + layout_key=layout_key, + x_min=x_min, + x_max=x_max, + y_min=y_min, + y_max=y_max, + ) def save(self, filepath: str, include_thumbnails: bool = True) -> None: - """Save dataset to a JSON file. + """Export dataset to a JSON file. Args: filepath: Path to save the JSON file. include_thumbnails: Whether to include cached thumbnails. """ - # Cache thumbnails before saving if requested + samples = self._storage.get_all_samples() if include_thumbnails: - for s in self._samples.values(): + for s in samples: s.cache_thumbnail() data = { "name": self.name, - "label_colors": self._label_colors, "samples": [ { "id": s.id, "filepath": s.filepath, "label": s.label, "metadata": s.metadata, - "embedding": s.embedding, - "embedding_2d": s.embedding_2d, - "embedding_2d_hyperbolic": s.embedding_2d_hyperbolic, "thumbnail_base64": s.thumbnail_base64 if include_thumbnails else None, } - for s in self._samples.values() + for s in samples ], } with open(filepath, "w") as f: json.dump(data, f) @classmethod - def load(cls, filepath: str) -> Dataset: - """Load dataset from a JSON file.""" + def load(cls, filepath: str, persist: bool = False) -> "Dataset": + """Load dataset from a JSON file. + + Args: + filepath: Path to the JSON file. + persist: If True, persist the loaded data to LanceDB. + If False (default), keep in memory only. + + Returns: + Dataset instance. + """ with open(filepath) as f: data = json.load(f) - dataset = cls(name=data["name"]) - dataset._label_colors = data.get("label_colors", {}) + dataset = cls(name=data["name"], persist=persist) + # Add samples + samples = [] for s_data in data["samples"]: sample = Sample( id=s_data["id"], filepath=s_data["filepath"], label=s_data.get("label"), metadata=s_data.get("metadata", {}), - embedding=s_data.get("embedding"), - embedding_2d=s_data.get("embedding_2d"), - embedding_2d_hyperbolic=s_data.get("embedding_2d_hyperbolic"), thumbnail_base64=s_data.get("thumbnail_base64"), ) - dataset.add_sample(sample) + samples.append(sample) + dataset._storage.add_samples_batch(samples) return dataset diff --git a/src/hyperview/core/sample.py b/src/hyperview/core/sample.py index 97b0dd6..d0e3f38 100644 --- a/src/hyperview/core/sample.py +++ b/src/hyperview/core/sample.py @@ -1,30 +1,28 @@ """Sample class representing a single data point in a dataset.""" -from __future__ import annotations - import base64 import io from pathlib import Path from typing import Any -import numpy as np from PIL import Image from pydantic import BaseModel, Field class Sample(BaseModel): - """A single sample in a HyperView dataset.""" + """A single sample in a HyperView dataset. + + Samples are pure metadata containers. Embeddings and layouts are stored + separately in dedicated tables (per embedding space / per layout). + """ id: str = Field(..., description="Unique identifier for the sample") filepath: str = Field(..., description="Path to the image file") label: str | None = Field(default=None, description="Label for the sample") metadata: dict[str, Any] = Field(default_factory=dict, description="Additional metadata") - embedding: list[float] | None = Field(default=None, description="High-dimensional embedding") - embedding_2d: list[float] | None = Field(default=None, description="2D projected embedding") - embedding_2d_hyperbolic: list[float] | None = Field( - default=None, description="2D hyperbolic (Poincaré) embedding" - ) thumbnail_base64: str | None = Field(default=None, description="Cached thumbnail as base64") + width: int | None = Field(default=None, description="Image width in pixels") + height: int | None = Field(default=None, description="Image height in pixels") model_config = {"arbitrary_types_allowed": True} @@ -38,78 +36,60 @@ def load_image(self) -> Image.Image: return Image.open(self.filepath) def get_thumbnail(self, size: tuple[int, int] = (128, 128)) -> Image.Image: - """Get a thumbnail of the image.""" + """Get a thumbnail of the image. Also captures original dimensions.""" img = self.load_image() + # Capture original dimensions while we have the image loaded + if self.width is None or self.height is None: + self.width, self.height = img.size img.thumbnail(size, Image.Resampling.LANCZOS) return img - def get_thumbnail_base64(self, size: tuple[int, int] = (128, 128)) -> str: - """Get thumbnail as base64 encoded string.""" - # Return cached thumbnail if available - if self.thumbnail_base64: - return self.thumbnail_base64 - + def _encode_thumbnail(self, size: tuple[int, int] = (128, 128)) -> str: + """Encode thumbnail as base64 JPEG.""" thumb = self.get_thumbnail(size) - # Convert to RGB if necessary (for PNG with alpha) if thumb.mode in ("RGBA", "P"): thumb = thumb.convert("RGB") buffer = io.BytesIO() thumb.save(buffer, format="JPEG", quality=85) return base64.b64encode(buffer.getvalue()).decode("utf-8") + def get_thumbnail_base64(self, size: tuple[int, int] = (128, 128)) -> str: + """Get thumbnail as base64 encoded string.""" + return self.thumbnail_base64 or self._encode_thumbnail(size) + def cache_thumbnail(self, size: tuple[int, int] = (128, 128)) -> None: """Cache the thumbnail as base64 for persistence.""" if self.thumbnail_base64 is None: - thumb = self.get_thumbnail(size) - if thumb.mode in ("RGBA", "P"): - thumb = thumb.convert("RGB") - buffer = io.BytesIO() - thumb.save(buffer, format="JPEG", quality=85) - self.thumbnail_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8") + self.thumbnail_base64 = self._encode_thumbnail(size) def to_api_dict(self, include_thumbnail: bool = True) -> dict[str, Any]: """Convert to dictionary for API response.""" + # Ensure dimensions are populated (loads image if needed but not cached) + if self.width is None or self.height is None: + self.ensure_dimensions() + data = { "id": self.id, "filepath": self.filepath, "filename": self.filename, "label": self.label, "metadata": self.metadata, + "width": self.width, + "height": self.height, } if include_thumbnail: data["thumbnail"] = self.get_thumbnail_base64() - if self.embedding_2d: - data["embedding_2d"] = self.embedding_2d - if self.embedding_2d_hyperbolic: - data["embedding_2d_hyperbolic"] = self.embedding_2d_hyperbolic return data + def ensure_dimensions(self) -> None: + """Load image dimensions if not already set.""" + if self.width is None or self.height is None: + try: + img = self.load_image() + self.width, self.height = img.size + except Exception: + # If image can't be loaded, leave as None + pass + -class SampleFromArray(Sample): - """A sample created from a numpy array (e.g., from HuggingFace datasets).""" - - _image_array: np.ndarray | None = None - - @classmethod - def from_array( - cls, - id: str, - image_array: np.ndarray, - label: str | None = None, - metadata: dict[str, Any] | None = None, - ) -> SampleFromArray: - """Create a sample from a numpy array.""" - sample = cls( - id=id, - filepath=f"memory://{id}", - label=label, - metadata=metadata or {}, - ) - sample._image_array = image_array - return sample - def load_image(self) -> Image.Image: - """Load the image from the array.""" - if self._image_array is not None: - return Image.fromarray(self._image_array) - return super().load_image() diff --git a/src/hyperview/core/selection.py b/src/hyperview/core/selection.py new file mode 100644 index 0000000..1dee065 --- /dev/null +++ b/src/hyperview/core/selection.py @@ -0,0 +1,53 @@ +"""Selection / geometry helpers. + +This module contains small, backend-agnostic utilities used by selection endpoints +(e.g. lasso selection over 2D embeddings). +""" + +from __future__ import annotations + +import numpy as np + + +def points_in_polygon(points_xy: np.ndarray, polygon_xy: np.ndarray) -> np.ndarray: + """Vectorized point-in-polygon (even-odd rule / ray casting). + + Args: + points_xy: Array of shape (m, 2) with point coordinates. + polygon_xy: Array of shape (n, 2) with polygon vertices. + + Returns: + Boolean mask of length m, True where point lies inside polygon. + + Notes: + Boundary points may be classified as outside depending on floating point + ties (common for lasso selection tools). + """ + if polygon_xy.shape[0] < 3: + return np.zeros((points_xy.shape[0],), dtype=bool) + + x = points_xy[:, 0] + y = points_xy[:, 1] + poly_x = polygon_xy[:, 0] + poly_y = polygon_xy[:, 1] + + inside = np.zeros((points_xy.shape[0],), dtype=bool) + j = polygon_xy.shape[0] - 1 + + for i in range(polygon_xy.shape[0]): + xi = poly_x[i] + yi = poly_y[i] + xj = poly_x[j] + yj = poly_y[j] + + # Half-open y-interval to avoid double-counting vertices. + intersects = (yi > y) != (yj > y) + + denom = yj - yi + # denom == 0 => intersects is always False; add tiny epsilon to avoid warnings. + x_intersect = (xj - xi) * (y - yi) / (denom + 1e-30) + xi + + inside ^= intersects & (x < x_intersect) + j = i + + return inside diff --git a/src/hyperview/embeddings/__init__.py b/src/hyperview/embeddings/__init__.py index 2d83dcc..24ba7aa 100644 --- a/src/hyperview/embeddings/__init__.py +++ b/src/hyperview/embeddings/__init__.py @@ -1,6 +1,31 @@ -"""Embedding computation and projection modules.""" +"""Embedding computation and projection.""" from hyperview.embeddings.compute import EmbeddingComputer -from hyperview.embeddings.projection import ProjectionEngine +from hyperview.embeddings.engine import ( + EmbeddingSpec, + get_engine, + get_provider_info, + list_embedding_providers, +) -__all__ = ["EmbeddingComputer", "ProjectionEngine"] +# Register HyperView providers into LanceDB registry. +import hyperview.embeddings.providers.lancedb_providers as _lancedb_providers # noqa: F401 + + +def __getattr__(name: str): + """Lazy import for heavy dependencies (UMAP/numba).""" + if name == "ProjectionEngine": + from hyperview.embeddings.projection import ProjectionEngine + return ProjectionEngine + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +__all__ = [ + "EmbeddingComputer", + "EmbeddingSpec", + "ProjectionEngine", + # Provider utilities + "get_engine", + "get_provider_info", + "list_embedding_providers", +] diff --git a/src/hyperview/embeddings/compute.py b/src/hyperview/embeddings/compute.py index 27d68b7..d2026b5 100644 --- a/src/hyperview/embeddings/compute.py +++ b/src/hyperview/embeddings/compute.py @@ -1,103 +1,75 @@ -"""Embedding computation using EmbedAnything.""" - -from __future__ import annotations +"""Image embedding computation via EmbedAnything.""" import os import tempfile +from pathlib import Path -import embed_anything import numpy as np -from embed_anything import EmbeddingModel, WhichModel +from embed_anything import EmbeddingModel from PIL import Image -try: - from tqdm import tqdm -except ImportError: - tqdm = None - from hyperview.core.sample import Sample class EmbeddingComputer: - """Compute embeddings for images using EmbedAnything.""" + """Compute embeddings for image samples using EmbedAnything.""" - def __init__(self, model: str = "clip"): + def __init__(self, model: str): """Initialize the embedding computer. Args: - model: Model to use for embeddings. + model: HuggingFace model ID to load via EmbedAnything. """ - self.model_name = model - self._model = None - self._initialized = False - - def _init_model(self) -> None: - """Lazily initialize the model.""" - if self._initialized: - return - # Use CLIP model by default - self._model = EmbeddingModel.from_pretrained_hf( - WhichModel.Clip, - model_id="openai/clip-vit-base-patch32", - ) - self._embed_anything = embed_anything - self._initialized = True + if not model or not model.strip(): + raise ValueError("model must be a non-empty HuggingFace model_id") - def _load_rgb_image(self, sample: Sample) -> Image.Image: - """Load an image and ensure it is in RGB mode.""" - image = sample.load_image() - if image.mode != "RGB": - image = image.convert("RGB") - return image + self.model_id = model + self._model: EmbeddingModel | None = None - def _embed_with_model( - self, - sample: Sample, - image: Image.Image | None = None, - ) -> np.ndarray | None: - """Attempt to embed a sample via embed_anything, handling memory-backed files.""" - path = sample.filepath - temp_path: str | None = None + def _get_model(self) -> EmbeddingModel: + """Lazily initialize the EmbedAnything model.""" + if self._model is None: + self._model = EmbeddingModel.from_pretrained_hf(model_id=self.model_id) + return self._model + def _load_rgb_image(self, sample: Sample) -> Image.Image: + """Load an image and normalize it to RGB. + + For file-backed samples, returns an in-memory copy and closes the file + handle immediately to avoid leaking descriptors during batch processing. + """ + with sample.load_image() as img: + img.load() + if img.mode != "RGB": + return img.convert("RGB") + return img.copy() + + def _embed_file(self, file_path: str) -> np.ndarray: + model = self._get_model() + result = model.embed_file(file_path) + + if not result: + raise RuntimeError(f"EmbedAnything returned no embeddings for: {file_path}") + if len(result) != 1: + raise RuntimeError( + f"Expected 1 embedding for an image file, got {len(result)}: {file_path}" + ) + + return np.asarray(result[0].embedding, dtype=np.float32) + + def _embed_pil_image(self, image: Image.Image) -> np.ndarray: + temp_fd, temp_path = tempfile.mkstemp(suffix=".png") + os.close(temp_fd) try: - if path.startswith("memory://"): - if image is None: - image = self._load_rgb_image(sample) - temp_file = tempfile.NamedTemporaryFile(suffix=".png", delete=False) - image.save(temp_file, format="PNG") - temp_file.close() - temp_path = temp_file.name - path = temp_path - - result = self._embed_anything.embed_file(path, embedder=self._model) - if result: - return np.array(result[0].embedding, dtype=np.float32) + image.save(temp_path, format="PNG") + return self._embed_file(temp_path) finally: - if temp_path and os.path.exists(temp_path): - os.remove(temp_path) - - return None + Path(temp_path).unlink(missing_ok=True) def compute_single(self, sample: Sample) -> np.ndarray: - """Compute embedding for a single sample. - - Args: - sample: Sample to compute embedding for. - - Returns: - Embedding as numpy array. - """ - self._init_model() - - pil_image = None - if sample.filepath.startswith("memory://"): - pil_image = self._load_rgb_image(sample) - - embedding = self._embed_with_model(sample, image=pil_image) - if embedding is None: - raise RuntimeError(f"Failed to compute embedding for sample {sample.id}") - - return embedding + """Compute embedding for a single sample.""" + image = self._load_rgb_image(sample) + return self._embed_pil_image(image) def compute_batch( self, @@ -105,46 +77,13 @@ def compute_batch( batch_size: int = 32, show_progress: bool = True, ) -> list[np.ndarray]: - """Compute embeddings for a batch of samples. - - Args: - samples: List of samples to compute embeddings for. - batch_size: Number of samples to process at once. - show_progress: Whether to show a progress bar. - - Returns: - List of embeddings as numpy arrays. - """ - self._init_model() - - embeddings = [] - total = len(samples) - - if show_progress and tqdm is not None: - iterator = tqdm(range(0, total, batch_size), desc="Computing embeddings") - else: - if show_progress and tqdm is None: - print(f"Computing embeddings for {total} samples...") - iterator = range(0, total, batch_size) - - for i in iterator: - batch = samples[i : i + batch_size] - batch_embeddings = [] - - for sample in batch: - pil_image = None - if sample.filepath.startswith("memory://"): - pil_image = self._load_rgb_image(sample) - - embedding = self._embed_with_model(sample, image=pil_image) - if embedding is None: - raise RuntimeError( - f"Failed to compute embedding for sample {sample.id}" - ) - - batch_embeddings.append(embedding) + """Compute embeddings for a list of samples.""" + if batch_size <= 0: + raise ValueError("batch_size must be > 0") + self._get_model() - embeddings.extend(batch_embeddings) + if show_progress: + print(f"Computing embeddings for {len(samples)} samples...") - return embeddings + return [self.compute_single(sample) for sample in samples] diff --git a/src/hyperview/embeddings/engine.py b/src/hyperview/embeddings/engine.py new file mode 100644 index 0000000..a82e8ac --- /dev/null +++ b/src/hyperview/embeddings/engine.py @@ -0,0 +1,330 @@ +"""Embedding spec + engine built on LanceDB's embedding registry.""" + +from __future__ import annotations + +import hashlib +import json +from dataclasses import dataclass, field +from typing import Any, Literal + +import numpy as np + +# Register HyperView providers into LanceDB registry. +import hyperview.embeddings.providers.lancedb_providers as _lancedb_providers # noqa: F401 + +__all__ = [ + "EmbeddingSpec", + "EmbeddingEngine", + "get_engine", + "list_embedding_providers", + "get_provider_info", +] + +HYPERBOLIC_PROVIDERS = frozenset({"hyper-models"}) + + +@dataclass +class EmbeddingSpec: + """Specification for an embedding model. + + All providers live in the LanceDB registry. HyperView's custom providers + (embed-anything, hyper-models) are registered on import. + + Attributes: + provider: Provider identifier (e.g., 'embed-anything', 'hyper-models', 'open-clip') + model_id: Model identifier (HuggingFace model_id, checkpoint name, etc.) + checkpoint: Optional checkpoint path/URL for weight-only models + provider_kwargs: Additional kwargs passed to the embedding function + modality: What input type this embedder handles + """ + + provider: str + model_id: str | None = None + checkpoint: str | None = None + provider_kwargs: dict[str, Any] = field(default_factory=dict) + modality: Literal["image", "text", "multimodal"] = "image" + + @property + def geometry(self) -> Literal["euclidean", "hyperboloid"]: + """Get the output geometry for this spec.""" + + if self.provider == "hyper-models": + model_name = self.model_id or self.provider_kwargs.get("name") + if model_name is None: + return "hyperboloid" + import hyper_models + + geom = str(hyper_models.get_model_info(str(model_name)).geometry) + return "hyperboloid" if geom in ("hyperboloid", "poincare") else "euclidean" + + if self.provider in HYPERBOLIC_PROVIDERS: + return "hyperboloid" + return "euclidean" + + def to_dict(self) -> dict[str, Any]: + """Convert to JSON-serializable dict for persistence.""" + d: dict[str, Any] = { + "provider": self.provider, + "modality": self.modality, + "geometry": self.geometry, + } + if self.model_id: + d["model_id"] = self.model_id + if self.checkpoint: + d["checkpoint"] = self.checkpoint + if self.provider_kwargs: + d["provider_kwargs"] = self.provider_kwargs + return d + + @classmethod + def from_dict(cls, d: dict[str, Any]) -> EmbeddingSpec: + """Create from dict (e.g., loaded from JSON).""" + return cls( + provider=d["provider"], + model_id=d.get("model_id"), + checkpoint=d.get("checkpoint"), + provider_kwargs=d.get("provider_kwargs", {}), + modality=d.get("modality", "image"), + ) + + def content_hash(self) -> str: + """Generate a short hash of the spec for collision-resistant keys.""" + content = json.dumps(self.to_dict(), sort_keys=True) + return hashlib.sha256(content.encode()).hexdigest()[:12] + + def make_space_key(self) -> str: + """Generate a collision-resistant space_key from this spec. + + Format: {provider}__{slugified_model_id}__{content_hash} + """ + from hyperview.storage.schema import slugify_model_id + + model_part = self.model_id or self.checkpoint or "default" + slug = slugify_model_id(model_part) + content_hash = self.content_hash() + return f"{self.provider}__{slug}__{content_hash}" + + +class EmbeddingEngine: + """Embedding engine using LanceDB registry. + + All providers are accessed through the LanceDB embedding registry. + HyperView providers are registered automatically on import. + """ + + def __init__(self) -> None: + self._cache: dict[str, Any] = {} # spec_hash -> embedding function + + def get_function(self, spec: EmbeddingSpec) -> Any: + """Get an embedding function from LanceDB registry. + + Args: + spec: Embedding specification. + + Returns: + LanceDB EmbeddingFunction instance. + + Raises: + ValueError: If provider not found in registry. + """ + cache_key = spec.content_hash() + if cache_key in self._cache: + return self._cache[cache_key] + + from lancedb.embeddings import get_registry + + registry = get_registry() + + # Get provider factory from registry + try: + factory = registry.get(spec.provider) + except KeyError: + available = list_embedding_providers() + raise ValueError( + f"Unknown provider: '{spec.provider}'. " + f"Available: {', '.join(sorted(available))}" + ) from None + + create_kwargs: dict[str, Any] = {} + if spec.model_id: + create_kwargs["name"] = spec.model_id + + if spec.checkpoint: + create_kwargs["checkpoint"] = spec.checkpoint + + create_kwargs.update(spec.provider_kwargs) + + try: + func = factory.create(**create_kwargs) + except ImportError as e: + raise ImportError( + f"Provider '{spec.provider}' requires additional dependencies. " + "Install the provider's extra dependencies and try again." + ) from e + + self._cache[cache_key] = func + return func + + def embed_images( + self, + samples: list[Any], + spec: EmbeddingSpec, + batch_size: int = 32, + show_progress: bool = True, + ) -> np.ndarray: + """Compute embeddings for image samples. + + Args: + samples: List of Sample objects with image filepaths. + spec: Embedding specification. + batch_size: Batch size for processing. + show_progress: Whether to show progress. + + Returns: + Array of shape (N, D) where N is len(samples) and D is embedding dim. + """ + func = self.get_function(spec) + + if show_progress: + print(f"Computing embeddings for {len(samples)} samples...") + + all_embeddings: list[np.ndarray] = [] + for i in range(0, len(samples), batch_size): + batch_samples = samples[i:i + batch_size] + + batch_paths = [s.filepath for s in batch_samples] + batch_embeddings = func.compute_source_embeddings(batch_paths) + all_embeddings.extend(batch_embeddings) + + return np.array(all_embeddings, dtype=np.float32) + + def embed_texts( + self, + texts: list[str], + spec: EmbeddingSpec, + ) -> np.ndarray: + """Compute embeddings for text inputs. + + Args: + texts: List of text strings. + spec: Embedding specification. + + Returns: + Array of shape (N, D). + """ + func = self.get_function(spec) + + if hasattr(func, "generate_embeddings"): + out = func.generate_embeddings(texts) + return np.asarray(out, dtype=np.float32) + + embeddings: list[np.ndarray] = [] + for text in texts: + out = func.compute_query_embeddings(text) + if not out: + raise RuntimeError(f"Provider '{spec.provider}' returned no embedding for query") + embeddings.append(np.asarray(out[0], dtype=np.float32)) + return np.vstack(embeddings) + + def get_space_config(self, spec: EmbeddingSpec, dim: int) -> dict[str, Any]: + """Get space configuration for storage. + + Args: + spec: Embedding specification. + dim: Embedding dimension. + + Returns: + Config dict for SpaceInfo.config_json. + """ + func = self.get_function(spec) + + config = spec.to_dict() + config["dim"] = dim + + if hasattr(func, "geometry"): + config["geometry"] = func.geometry + if hasattr(func, "curvature") and func.curvature is not None: + config["curvature"] = func.curvature + + if config.get("geometry") == "hyperboloid": + config["spatial_dim"] = dim - 1 + + return config + + +_ENGINE: EmbeddingEngine | None = None + + +def get_engine() -> EmbeddingEngine: + """Get the global embedding engine singleton.""" + global _ENGINE + if _ENGINE is None: + _ENGINE = EmbeddingEngine() + return _ENGINE + + +def list_embedding_providers(available_only: bool = False) -> list[str]: + """List all registered embedding providers. + + Args: + available_only: If True, only return providers whose dependencies are installed. + + Returns: + List of provider identifiers. + """ + from lancedb.embeddings import get_registry + + registry = get_registry() + + all_providers = list(getattr(registry, "_functions", {}).keys()) + + if not available_only: + return sorted(all_providers) + + available: list[str] = [] + for provider in all_providers: + try: + factory = registry.get(provider) + factory.create() + available.append(provider) + except ImportError: + pass + except (TypeError, ValueError): + available.append(provider) + + return sorted(available) + + +def get_provider_info(provider: str) -> dict[str, Any]: + """Get information about an embedding provider. + + Args: + provider: Provider identifier. + + Returns: + Dict with provider info. + """ + from lancedb.embeddings import get_registry + + registry = get_registry() + + try: + factory = registry.get(provider) + except KeyError: + raise ValueError(f"Unknown provider: {provider}") from None + + info: dict[str, Any] = { + "provider": provider, + "source": "hyperview" if provider in ("embed-anything", "hyper-models") else "lancedb", + "geometry": "hyperboloid" if provider in HYPERBOLIC_PROVIDERS else "euclidean", + } + + try: + factory.create() + info["installed"] = True + except ImportError: + info["installed"] = False + except (TypeError, ValueError): + info["installed"] = True + + return info diff --git a/src/hyperview/embeddings/pipelines.py b/src/hyperview/embeddings/pipelines.py new file mode 100644 index 0000000..e3aa716 --- /dev/null +++ b/src/hyperview/embeddings/pipelines.py @@ -0,0 +1,203 @@ +"""Compute orchestration pipelines for HyperView. + +These functions coordinate embedding computation and 2D layout/projection +computation, persisting results into the configured storage backend. +""" + +from __future__ import annotations + +from typing import Any + +import numpy as np + +from hyperview.storage.backend import StorageBackend +from hyperview.storage.schema import make_layout_key + + +def compute_embeddings( + storage: StorageBackend, + spec: Any, + batch_size: int = 32, + show_progress: bool = True, +) -> tuple[str, int, int]: + """Compute embeddings for samples that don't have them yet. + + Args: + storage: Storage backend to read samples from and write embeddings to. + spec: Embedding specification (provider, model_id, etc.) + batch_size: Batch size for processing. + show_progress: Whether to show progress bar. + + Returns: + Tuple of (space_key, num_computed, num_skipped). + + Raises: + ValueError: If no samples in storage or provider not found. + """ + from hyperview.embeddings.engine import get_engine + + engine = get_engine() + + all_samples = storage.get_all_samples() + if not all_samples: + raise ValueError("No samples in storage") + + # Generate space key before computing (deterministic from spec) + space_key = spec.make_space_key() + + # Check which samples need embeddings + missing_ids = storage.get_missing_embedding_ids(space_key) + + # If space doesn't exist yet, all samples are missing + if not storage.get_space(space_key): + missing_ids = [s.id for s in all_samples] + + num_skipped = len(all_samples) - len(missing_ids) + + if not missing_ids: + if show_progress: + print(f"All {len(all_samples)} samples already have embeddings in space '{space_key}'") + return space_key, 0, num_skipped + + samples_to_embed = storage.get_samples_by_ids(missing_ids) + + if show_progress and num_skipped > 0: + print(f"Skipped {num_skipped} samples with existing embeddings") + + # Compute all embeddings via the engine + embeddings = engine.embed_images( + samples=samples_to_embed, + spec=spec, + batch_size=batch_size, + show_progress=show_progress, + ) + + dim = embeddings.shape[1] + + # Ensure space exists (create if needed) + config = engine.get_space_config(spec, dim) + storage.ensure_space( + model_id=spec.model_id or spec.provider, + dim=dim, + config=config, + space_key=space_key, + ) + + # Store embeddings + ids = [s.id for s in samples_to_embed] + storage.add_embeddings(space_key, ids, embeddings) + + return space_key, len(ids), num_skipped + + +def compute_layout( + storage: StorageBackend, + space_key: str | None = None, + method: str = "umap", + geometry: str = "euclidean", + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: str = "cosine", + force: bool = False, + show_progress: bool = True, +) -> str: + """Compute 2D layout/projection for visualization. + + Args: + storage: Storage backend with embeddings. + space_key: Embedding space to project. If None, uses the first available. + method: Projection method ('umap' supported). + geometry: Output geometry type ('euclidean' or 'poincare'). + n_neighbors: Number of neighbors for UMAP. + min_dist: Minimum distance for UMAP. + metric: Distance metric for UMAP. + force: Force recomputation even if layout exists. + show_progress: Whether to print progress messages. + + Returns: + layout_key for the computed layout. + + Raises: + ValueError: If no embedding spaces, space not found, or insufficient samples. + """ + from hyperview.embeddings.projection import ProjectionEngine + + if method != "umap": + raise ValueError(f"Invalid method: {method}. Only 'umap' is supported.") + + if geometry not in ("euclidean", "poincare"): + raise ValueError(f"Invalid geometry: {geometry}. Must be 'euclidean' or 'poincare'.") + + if space_key is None: + spaces = storage.list_spaces() + if not spaces: + raise ValueError("No embedding spaces. Call compute_embeddings() first.") + + # Choose a sensible default space based on the requested output geometry. + # - For Poincaré output, prefer a hyperbolic (hyperboloid) embedding space if present. + # - For Euclidean output, prefer a Euclidean embedding space if present. + if geometry == "poincare": + preferred = next((s for s in spaces if s.geometry == "hyperboloid"), None) + else: + preferred = next((s for s in spaces if s.geometry != "hyperboloid"), None) + + space_key = (preferred.space_key if preferred is not None else spaces[0].space_key) + + space = storage.get_space(space_key) + if space is None: + raise ValueError(f"Space not found: {space_key}") + + input_geometry = space.geometry + curvature = (space.config or {}).get("curvature") + + ids, vectors = storage.get_embeddings(space_key) + if len(ids) == 0: + raise ValueError(f"No embeddings in space '{space_key}'. Call compute_embeddings() first.") + + if len(ids) < 3: + raise ValueError(f"Need at least 3 samples for visualization, have {len(ids)}") + + layout_params = { + "n_neighbors": n_neighbors, + "min_dist": min_dist, + "metric": metric, + } + layout_key = make_layout_key(space_key, method, geometry, layout_params) + + if not force: + existing_layout = storage.get_layout(layout_key) + if existing_layout is not None: + existing_ids, _ = storage.get_layout_coords(layout_key) + if set(existing_ids) == set(ids): + if show_progress: + print(f"Layout '{layout_key}' already exists with {len(ids)} points") + return layout_key + if show_progress: + print("Layout exists but has different samples, recomputing...") + + if show_progress: + print(f"Computing {geometry} {method} layout for {len(ids)} samples...") + + storage.ensure_layout( + layout_key=layout_key, + space_key=space_key, + method=method, + geometry=geometry, + params=layout_params, + ) + + engine = ProjectionEngine() + coords = engine.project( + vectors, + input_geometry=input_geometry, + output_geometry=geometry, + curvature=curvature, + method=method, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=metric, + ) + + storage.add_layout_coords(layout_key, ids, coords) + + return layout_key diff --git a/src/hyperview/embeddings/projection.py b/src/hyperview/embeddings/projection.py index ecef3c8..83dff50 100644 --- a/src/hyperview/embeddings/projection.py +++ b/src/hyperview/embeddings/projection.py @@ -1,8 +1,7 @@ """Projection methods for dimensionality reduction.""" -from __future__ import annotations - import logging +import warnings import numpy as np import umap @@ -13,44 +12,147 @@ class ProjectionEngine: """Engine for projecting high-dimensional embeddings to 2D.""" - def project_umap( + def to_poincare_ball( + self, + hyperboloid_embeddings: np.ndarray, + curvature: float | None = None, + clamp_radius: float = 0.999999, + ) -> np.ndarray: + """Convert hyperboloid (Lorentz) coordinates to Poincaré ball coordinates. + + Input is expected to be shape (N, D+1) with first coordinate being time-like. + Points are assumed to satisfy: t^2 - ||x||^2 = 1/c (c > 0). + + Returns Poincaré ball coordinates of shape (N, D) in the unit ball. + + Notes: + - Many hyperbolic libraries parameterize curvature as a positive number c + where the manifold has sectional curvature -c. + - We map to the unit ball for downstream distance metrics (UMAP 'poincare'). + """ + if hyperboloid_embeddings.ndim != 2 or hyperboloid_embeddings.shape[1] < 2: + raise ValueError( + "hyperboloid_embeddings must have shape (N, D+1) with D>=1" + ) + + c = float(curvature) if curvature is not None else 1.0 + if c <= 0: + raise ValueError(f"curvature must be > 0, got {c}") + + # Radius R = 1/sqrt(c) for curvature -c + R = 1.0 / np.sqrt(c) + + t = hyperboloid_embeddings[:, :1] + x = hyperboloid_embeddings[:, 1:] + + # Map to ball radius R: u_R = x / (t + R) + denom = t + R + u_R = x / denom + + # Rescale to unit ball: u = u_R / R = sqrt(c) * u_R + u = u_R / R + + # Numerical guard: ensure inside the unit ball + radii = np.linalg.norm(u, axis=1) + mask = radii >= clamp_radius + if np.any(mask): + u[mask] = u[mask] / radii[mask][:, np.newaxis] * clamp_radius + + return u.astype(np.float32) + + def project( self, embeddings: np.ndarray, + *, + input_geometry: str = "euclidean", + output_geometry: str = "euclidean", + curvature: float | None = None, + method: str = "umap", n_neighbors: int = 15, min_dist: float = 0.1, metric: str = "cosine", - n_components: int = 2, random_state: int = 42, ) -> np.ndarray: - """Project embeddings to Euclidean 2D using UMAP. + """Project embeddings to 2D with geometry-aware preprocessing. + + This separates two concerns: + 1) Geometry/model transforms for the *input* embeddings (e.g. hyperboloid -> Poincaré) + 2) Dimensionality reduction / layout (currently UMAP) Args: - embeddings: High-dimensional embeddings (N x D). - n_neighbors: Number of neighbors for UMAP. - min_dist: Minimum distance between points. - metric: Distance metric to use. - n_components: Number of output dimensions. - random_state: Random seed for reproducibility. + embeddings: Input embeddings (N x D) or hyperboloid (N x D+1). + input_geometry: Geometry/model of the input embeddings (euclidean, hyperboloid). + output_geometry: Geometry of the output coordinates (euclidean, poincare). + curvature: Curvature parameter for hyperbolic embeddings (positive c). + method: Layout method (currently only 'umap'). + n_neighbors: UMAP neighbors. + min_dist: UMAP min_dist. + metric: Input metric (used for euclidean inputs). + random_state: Random seed. Returns: 2D coordinates (N x 2). """ - # Safety check for small datasets + if method != "umap": + raise ValueError(f"Invalid method: {method}. Only 'umap' is supported.") + + prepared = embeddings + prepared_metric: str = metric + + if input_geometry == "hyperboloid": + # Convert to unit Poincaré ball and use UMAP's built-in hyperbolic distance. + prepared = self.to_poincare_ball(embeddings, curvature=curvature) + prepared_metric = "poincare" + + if output_geometry == "poincare": + return self.project_to_poincare( + prepared, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=prepared_metric, + random_state=random_state, + ) + + if output_geometry == "euclidean": + return self.project_umap( + prepared, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=prepared_metric, + n_components=2, + random_state=random_state, + ) + + raise ValueError( + f"Invalid output_geometry: {output_geometry}. Must be 'euclidean' or 'poincare'." + ) + + def project_umap( + self, + embeddings: np.ndarray, + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: str = "cosine", + n_components: int = 2, + random_state: int = 42, + ) -> np.ndarray: + """Project embeddings to Euclidean 2D using UMAP.""" n_neighbors = min(n_neighbors, len(embeddings) - 1) if n_neighbors < 2: n_neighbors = 2 + n_jobs = 1 if random_state is not None else -1 + reducer = umap.UMAP( n_neighbors=n_neighbors, min_dist=min_dist, n_components=n_components, metric=metric, random_state=random_state, + n_jobs=n_jobs, ) coords = reducer.fit_transform(embeddings) - - # Normalize to [-1, 1] range for visualization consistency coords = self._normalize_coords(coords) return coords @@ -63,53 +165,35 @@ def project_to_poincare( metric: str = "cosine", random_state: int = 42, ) -> np.ndarray: - """Project embeddings to the Poincaré disk. - - This uses UMAP with a hyperbolic output metric. UMAP computes the embedding - in the Hyperboloid model (Lorentz model). We then project this to the - Poincaré disk. - - Args: - embeddings: High-dimensional embeddings (N x D). - n_neighbors: Number of neighbors for UMAP. - min_dist: Minimum distance between points. - metric: Input distance metric. - random_state: Random seed for reproducibility. - - Returns: - 2D coordinates in Poincaré disk (N x 2), with norm < 1. - """ - # Safety check for small datasets + """Project embeddings to the Poincaré disk using UMAP with hyperboloid output.""" n_neighbors = min(n_neighbors, len(embeddings) - 1) if n_neighbors < 2: n_neighbors = 2 - # The time-like coordinate t is implicit: t = sqrt(1 + x^2 + y^2). - reducer = umap.UMAP( - n_neighbors=n_neighbors, - min_dist=min_dist, - n_components=2, # We want a 2D manifold - metric=metric, - output_metric="hyperboloid", - random_state=random_state, - ) - # These are spatial coordinates (x, y) in the Hyperboloid model - spatial_coords = reducer.fit_transform(embeddings) + n_jobs = 1 if random_state is not None else -1 + + # Suppress warning about missing gradient for poincare metric (only affects inverse_transform) + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", message="gradient function is not yet implemented") + reducer = umap.UMAP( + n_neighbors=n_neighbors, + min_dist=min_dist, + n_components=2, + metric=metric, + output_metric="hyperboloid", + random_state=random_state, + n_jobs=n_jobs, + ) + spatial_coords = reducer.fit_transform(embeddings) - # Calculate implicit time coordinate t - # t = sqrt(1 + x^2 + y^2) - # Note: In some conventions it's t^2 - x^2 - y^2 = 1, so t = sqrt(1 + r^2) squared_norm = np.sum(spatial_coords**2, axis=1) t = np.sqrt(1 + squared_norm) - # Project to Poincaré disk - # Formula: u = x / (1 + t) - # This maps the upper sheet of the hyperboloid (t >= 1) to the unit disk. + # Project to Poincaré disk: u = x / (1 + t) denom = 1 + t poincare_coords = spatial_coords / denom[:, np.newaxis] - # Ensure numerical stability - clamp to slightly less than 1.0 if needed - # theoretically it should be < 1, but float precision might cause issues + # Clamp to unit disk for numerical stability radii = np.linalg.norm(poincare_coords, axis=1) max_radius = 0.999 mask = radii > max_radius @@ -119,12 +203,7 @@ def project_to_poincare( poincare_coords[mask] / radii[mask][:, np.newaxis] * max_radius ) - # Center the embeddings in the Poincaré disk poincare_coords = self._center_poincare(poincare_coords) - - # Apply radial scaling to reduce crowding at the boundary - # This effectively "zooms out" in hyperbolic space, pulling points - # towards the center for better visualization. poincare_coords = self._scale_poincare(poincare_coords, factor=0.65) return poincare_coords @@ -132,57 +211,32 @@ def project_to_poincare( def _scale_poincare(self, coords: np.ndarray, factor: float) -> np.ndarray: """Scale points towards the origin in hyperbolic space. - This scales the hyperbolic distance from the origin by `factor`. - If factor < 1, points move closer to the center. + Scales hyperbolic distance from origin by `factor`. If factor < 1, points move closer to center. """ radii = np.linalg.norm(coords, axis=1) - # Avoid division by zero mask = radii > 1e-6 - # Calculate hyperbolic distance from origin - # d = 2 * arctanh(r) - # We want d_new = factor * d - # r_new = tanh(d_new / 2) = tanh(factor * arctanh(r)) - - # Use numpy operations for efficiency r = radii[mask] - # Clip r to avoid infinity in arctanh r = np.minimum(r, 0.9999999) - - # d = 2 * np.arctanh(r) - # r_new = np.tanh(factor * d / 2) - # Simplified: r_new = tanh(factor * arctanh(r)) r_new = np.tanh(factor * np.arctanh(r)) - # Update coordinates - # new_coords = coords * (r_new / r) scale_ratios = np.ones_like(radii) scale_ratios[mask] = r_new / r return coords * scale_ratios[:, np.newaxis] def _center_poincare(self, coords: np.ndarray) -> np.ndarray: - """Center points in the Poincaré disk using a Möbius transformation. - - This moves the geometric centroid of the points to the origin. - """ + """Center points in the Poincaré disk using a Möbius transformation.""" if len(coords) == 0: return coords - # Treat as complex numbers for easier Möbius math z = coords[:, 0] + 1j * coords[:, 1] - - # Compute the centroid (Euclidean mean in the disk) - # This is a heuristic; the true hyperbolic center of mass is harder - # but this works well for visualization centering. centroid = np.mean(z) - # If centroid is too close to boundary, don't center (unstable) if np.abs(centroid) > 0.99 or np.abs(centroid) < 1e-6: return coords - # Möbius transformation to move centroid to origin: - # w = (z - a) / (1 - conj(a) * z) + # Möbius transformation: w = (z - a) / (1 - conj(a) * z) a = centroid w = (z - a) / (1 - np.conj(a) * z) @@ -193,34 +247,19 @@ def _normalize_coords(self, coords: np.ndarray) -> np.ndarray: if len(coords) == 0: return coords - # Center the coordinates coords = coords - coords.mean(axis=0) - - # Scale to fit in [-1, 1] max_abs = np.abs(coords).max() if max_abs > 0: - coords = coords / max_abs * 0.95 # Leave some margin + coords = coords / max_abs * 0.95 return coords def poincare_distance(self, u: np.ndarray, v: np.ndarray) -> float: - """Compute the Poincaré distance between two points. - - Args: - u: First point in Poincaré disk. - v: Second point in Poincaré disk. - - Returns: - Hyperbolic distance. - """ + """Compute the Poincaré distance between two points.""" u_norm_sq = np.sum(u**2) v_norm_sq = np.sum(v**2) diff_norm_sq = np.sum((u - v) ** 2) - # Poincaré distance formula - # d(u, v) = arccosh(1 + 2 * |u-v|^2 / ((1-|u|^2)(1-|v|^2))) - - # Clip values to avoid division by zero or negative logs u_norm_sq = min(u_norm_sq, 0.99999) v_norm_sq = min(v_norm_sq, 0.99999) diff --git a/src/hyperview/embeddings/providers/__init__.py b/src/hyperview/embeddings/providers/__init__.py new file mode 100644 index 0000000..9bdcc43 --- /dev/null +++ b/src/hyperview/embeddings/providers/__init__.py @@ -0,0 +1,7 @@ +"""Embedding providers. + +HyperView integrates with LanceDB's embedding registry. +Custom providers are registered in `lancedb_providers.py`. +""" + +__all__: list[str] = [] diff --git a/src/hyperview/embeddings/providers/lancedb_providers.py b/src/hyperview/embeddings/providers/lancedb_providers.py new file mode 100644 index 0000000..d64f858 --- /dev/null +++ b/src/hyperview/embeddings/providers/lancedb_providers.py @@ -0,0 +1,196 @@ +"""LanceDB-registered embedding providers for HyperView. + +This module registers HyperView's embedding providers into the LanceDB embedding +registry using the @register decorator. + +Providers: +- embed-anything: CLIP-based image embeddings (torch-free, default) +- hyper-models: Non-Euclidean model zoo via `hyper-models` (torch-free ONNX; downloads from HF Hub) +""" + +from __future__ import annotations + +from typing import Any + +import numpy as np +from lancedb.embeddings import EmbeddingFunction, register +from pydantic import PrivateAttr + +__all__ = [ + "EmbedAnythingEmbeddings", + "HyperModelsEmbeddings", +] + + +@register("embed-anything") +class EmbedAnythingEmbeddings(EmbeddingFunction): + """CLIP-based image embeddings via embed-anything. + + This is the default provider for HyperView - lightweight and torch-free. + + Args: + name: HuggingFace model ID for CLIP (default: openai/clip-vit-base-patch32) + batch_size: Batch size for processing + """ + + name: str = "openai/clip-vit-base-patch32" + batch_size: int = 32 + + _computer: Any = PrivateAttr(default=None) + _ndims: int | None = PrivateAttr(default=None) + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self._computer = None + self._ndims = None + + def _get_computer(self) -> Any: + if self._computer is None: + from hyperview.embeddings.compute import EmbeddingComputer + + self._computer = EmbeddingComputer(model=self.name) + return self._computer + + def ndims(self) -> int: + if self._ndims is None: + if "large" in self.name.lower(): + self._ndims = 768 + elif "clip" in self.name.lower(): + self._ndims = 512 + else: + self._ndims = 512 + return self._ndims + + def compute_source_embeddings( + self, inputs: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + from hyperview.core.sample import Sample + + computer = self._get_computer() + + samples: list[Any] = [] + for inp in self.sanitize_input(inputs): + if isinstance(inp, Sample): + samples.append(inp) + elif isinstance(inp, str): + samples.append(Sample(id=inp, filepath=inp)) + else: + raise TypeError(f"Unsupported input type: {type(inp)}") + + embeddings = computer.compute_batch(samples, batch_size=self.batch_size, show_progress=False) + return list(embeddings) + + def compute_query_embeddings( + self, query: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + return self.compute_source_embeddings([query], *args, **kwargs) + + +@register("hyper-models") +class HyperModelsEmbeddings(EmbeddingFunction): + """Non-Euclidean embeddings via the `hyper-models` package. + + This provider is a thin wrapper around `hyper_models.load(...)`. + Models are downloaded from the Hugging Face Hub on first use. + + Args: + name: Model name in the hyper-models registry (e.g. 'hycoclip-vit-s'). + checkpoint: Optional local path to an ONNX file (skips hub download). + batch_size: Batch size hint. Current HyCoCLIP/MERU ONNX exports may only + support batch_size=1; HyperView encodes one image at a time for + maximum compatibility. + """ + + name: str = "hycoclip-vit-s" + checkpoint: str | None = None + batch_size: int = 1 + + _model: Any = PrivateAttr(default=None) + _model_info: Any = PrivateAttr(default=None) + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self._model = None + self._model_info = None + + def _ensure_model_info(self) -> None: + if self._model_info is not None: + return + + try: + import hyper_models + except ImportError as e: + raise ImportError( + "Provider 'hyper-models' requires the 'hyper-models' package. " + "Install it with: `uv pip install hyper-models`" + ) from e + + try: + self._model_info = hyper_models.get_model_info(self.name) + except KeyError: + available = ", ".join(sorted(hyper_models.list_models())) + raise ValueError( + f"Unknown hyper-models model: '{self.name}'. Available: {available}" + ) from None + + def _ensure_model(self) -> None: + if self._model is not None: + return + + self._ensure_model_info() + import hyper_models + + self._model = hyper_models.load(self.name, local_path=self.checkpoint) + + def ndims(self) -> int: + self._ensure_model_info() + assert self._model_info is not None + return int(getattr(self._model_info, "dim")) + + @property + def geometry(self) -> str: + self._ensure_model_info() + assert self._model_info is not None + return str(getattr(self._model_info, "geometry")) + + def compute_source_embeddings( + self, inputs: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + from hyperview.core.sample import Sample + + self._ensure_model() + assert self._model is not None + + inputs = self.sanitize_input(inputs) + all_embeddings: list[np.ndarray | None] = [] + + from PIL import Image + + for inp in inputs: + if isinstance(inp, Sample): + with inp.load_image() as img: + img.load() + if img.mode != "RGB": + img = img.convert("RGB") + pil_img = img.copy() + elif isinstance(inp, str): + with Image.open(inp) as img: + img.load() + if img.mode != "RGB": + img = img.convert("RGB") + pil_img = img.copy() + elif isinstance(inp, Image.Image): + pil_img = inp.convert("RGB") if inp.mode != "RGB" else inp + else: + raise TypeError(f"Unsupported input type: {type(inp)}") + + emb = self._model.encode_images([pil_img]) + vec = np.asarray(emb[0], dtype=np.float32) + all_embeddings.append(vec) + + return all_embeddings + + def compute_query_embeddings( + self, query: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + return self.compute_source_embeddings([query], *args, **kwargs) diff --git a/src/hyperview/server/app.py b/src/hyperview/server/app.py index d1f6bf9..86d4f9b 100644 --- a/src/hyperview/server/app.py +++ b/src/hyperview/server/app.py @@ -1,20 +1,23 @@ """FastAPI application for HyperView.""" -from __future__ import annotations - import os from pathlib import Path +from typing import Any -from fastapi import FastAPI, HTTPException, Query +from fastapi import Depends, FastAPI, HTTPException, Query from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, JSONResponse from fastapi.staticfiles import StaticFiles from pydantic import BaseModel +import numpy as np + from hyperview.core.dataset import Dataset +from hyperview.core.selection import points_in_polygon # Global dataset reference (set by launch()) _current_dataset: Dataset | None = None +_current_session_id: str | None = None class SelectionRequest(BaseModel): @@ -23,6 +26,30 @@ class SelectionRequest(BaseModel): sample_ids: list[str] +class LassoSelectionRequest(BaseModel): + """Request model for lasso selection queries.""" + + layout_key: str # e.g., "openai_clip-vit-base-patch32__umap" + # Polygon vertices in data space, interleaved: [x0, y0, x1, y1, ...] + polygon: list[float] + offset: int = 0 + limit: int = 100 + include_thumbnails: bool = True + + +class CurationFilterRequest(BaseModel): + """Request model for curation filtering.""" + + min_aesthetic_score: float | None = None + min_motion_score: float | None = None + max_cosine_similarity: float | None = None + caption_query: str | None = None + dedup_status: str | None = None + offset: int = 0 + limit: int = 100 + include_thumbnails: bool = True + + class SampleResponse(BaseModel): """Response model for a sample.""" @@ -32,8 +59,31 @@ class SampleResponse(BaseModel): label: str | None thumbnail: str | None metadata: dict - embedding_2d: list[float] | None = None - embedding_2d_hyperbolic: list[float] | None = None + width: int | None = None + height: int | None = None + + +class LayoutInfoResponse(BaseModel): + """Response model for layout info.""" + + layout_key: str + space_key: str + method: str + geometry: str + count: int + params: dict[str, Any] | None + + +class SpaceInfoResponse(BaseModel): + """Response model for embedding space info.""" + + space_key: str + model_id: str + dim: int + count: int + provider: str + geometry: str + config: dict[str, Any] | None class DatasetResponse(BaseModel): @@ -42,20 +92,185 @@ class DatasetResponse(BaseModel): name: str num_samples: int labels: list[str] - label_colors: dict[str, str] + spaces: list[SpaceInfoResponse] + layouts: list[LayoutInfoResponse] class EmbeddingsResponse(BaseModel): - """Response model for embeddings data.""" + """Response model for embeddings data (for scatter plot).""" + layout_key: str + geometry: str ids: list[str] labels: list[str | None] - euclidean: list[list[float]] - hyperbolic: list[list[float]] - label_colors: dict[str, str] + coords: list[list[float]] + + +class SimilarSampleResponse(BaseModel): + """Response model for a similar sample with distance.""" + + id: str + filepath: str + filename: str + label: str | None + thumbnail: str | None + distance: float + metadata: dict + + +class SimilaritySearchResponse(BaseModel): + """Response model for similarity search results.""" + + query_id: str + k: int + results: list[SimilarSampleResponse] + + +def _extract_caption_sections(caption_text: str | None) -> tuple[str | None, str | None]: + if not caption_text: + return None, None + + reasoning: str | None = None + answer: str | None = None + + think_start = caption_text.find("") + think_end = caption_text.find("") + if think_start != -1 and think_end != -1 and think_end > think_start: + reasoning = caption_text[think_start + len("") : think_end].strip() or None + + answer_start = caption_text.find("") + answer_end = caption_text.find("") + if answer_start != -1 and answer_end != -1 and answer_end > answer_start: + answer = caption_text[answer_start + len("") : answer_end].strip() or None + + if answer is None: + answer = caption_text.strip() or None + + return reasoning, answer + + +def _resolve_video_file(sample: Any) -> Path | None: + metadata = sample.metadata if isinstance(sample.metadata, dict) else {} + candidate_paths: list[str] = [] + + for key in ("video_path", "clip_location"): + value = metadata.get(key) + if isinstance(value, str) and value.strip(): + candidate_paths.append(value.strip()) + + if isinstance(sample.filepath, str) and sample.filepath.lower().endswith(".mp4"): + candidate_paths.append(sample.filepath) + + for candidate in candidate_paths: + path = Path(candidate).expanduser() + if path.exists() and path.is_file(): + return path.resolve() + + return None + + +def _metadata_number(metadata: dict[str, Any], *keys: str) -> float | None: + for key in keys: + value = metadata.get(key) + if isinstance(value, (int, float)): + numeric = float(value) + if np.isfinite(numeric): + return numeric + return None + +def _metadata_text(metadata: dict[str, Any], *keys: str) -> str | None: + for key in keys: + value = metadata.get(key) + if isinstance(value, str) and value.strip(): + return value.strip() + return None -def create_app(dataset: Dataset | None = None) -> FastAPI: + +def _sample_has_video(sample: Any) -> bool: + metadata = sample.metadata if isinstance(sample.metadata, dict) else {} + if _metadata_text(metadata, "video_path", "clip_location"): + return True + return isinstance(sample.filepath, str) and sample.filepath.lower().endswith(".mp4") + + +def _sample_caption_text(metadata: dict[str, Any]) -> str | None: + return _metadata_text( + metadata, + "caption_answer", + "first_caption", + "caption_raw", + "caption", + ) + + +def _histogram(values: list[float], *, bins: int, lower: float, upper: float) -> list[dict[str, float | int]]: + if not values: + return [] + + if upper <= lower: + upper = lower + 1.0 + + counts, edges = np.histogram(np.asarray(values, dtype=np.float32), bins=bins, range=(lower, upper)) + result: list[dict[str, float | int]] = [] + for idx, count in enumerate(counts.tolist()): + result.append( + { + "start": float(edges[idx]), + "end": float(edges[idx + 1]), + "count": int(count), + } + ) + return result + + +def _score_summary(values: list[float]) -> dict[str, float | int | None]: + if not values: + return {"count": 0, "min": None, "max": None, "avg": None} + + arr = np.asarray(values, dtype=np.float32) + return { + "count": int(arr.size), + "min": float(np.min(arr)), + "max": float(np.max(arr)), + "avg": float(np.mean(arr)), + } + + +def _matches_curation_filter(sample: Any, request: CurationFilterRequest) -> bool: + metadata = sample.metadata if isinstance(sample.metadata, dict) else {} + + aesthetic = _metadata_number(metadata, "aesthetic_score") + if request.min_aesthetic_score is not None: + if aesthetic is None or aesthetic < request.min_aesthetic_score: + return False + + motion = _metadata_number(metadata, "motion_score") + if request.min_motion_score is not None: + if motion is None or motion < request.min_motion_score: + return False + + similarity = _metadata_number(metadata, "cosine_sim_score", "dedup_cosine_similarity") + if request.max_cosine_similarity is not None: + if similarity is None or similarity > request.max_cosine_similarity: + return False + + if request.dedup_status: + dedup_status = _metadata_text(metadata, "dedup_status") or "unknown" + if dedup_status != request.dedup_status: + return False + + if request.caption_query: + caption_text = _sample_caption_text(metadata) + if caption_text is None: + return False + if request.caption_query.lower() not in caption_text.lower(): + return False + + return True + + +def create_app(dataset: Dataset | None = None, session_id: str | None = None) -> FastAPI: """Create the FastAPI application. Args: @@ -64,9 +279,11 @@ def create_app(dataset: Dataset | None = None) -> FastAPI: Returns: FastAPI application instance. """ - global _current_dataset + global _current_dataset, _current_session_id if dataset is not None: _current_dataset = dataset + if session_id is not None: + _current_session_id = session_id app = FastAPI( title="HyperView", @@ -74,6 +291,12 @@ def create_app(dataset: Dataset | None = None) -> FastAPI: version="0.1.0", ) + def get_dataset() -> Dataset: + """Dependency that returns the current dataset or raises 404.""" + if _current_dataset is None: + raise HTTPException(status_code=404, detail="No dataset loaded") + return _current_dataset + # CORS middleware for development app.add_middleware( CORSMiddleware, @@ -83,37 +306,44 @@ def create_app(dataset: Dataset | None = None) -> FastAPI: allow_headers=["*"], ) + @app.get("/__hyperview__/health") + async def hyperview_health(): + return { + "name": "hyperview", + "version": app.version, + "session_id": _current_session_id, + "dataset": _current_dataset.name if _current_dataset is not None else None, + "pid": os.getpid(), + } + @app.get("/api/dataset", response_model=DatasetResponse) - async def get_dataset_info(): + async def get_dataset_info(ds: Dataset = Depends(get_dataset)): """Get dataset metadata.""" - if _current_dataset is None: - raise HTTPException(status_code=404, detail="No dataset loaded") + spaces = ds.list_spaces() + space_dicts = [s.to_api_dict() for s in spaces] + + layouts = ds.list_layouts() + layout_dicts = [l.to_api_dict() for l in layouts] return DatasetResponse( - name=_current_dataset.name, - num_samples=len(_current_dataset), - labels=_current_dataset.labels, - label_colors=_current_dataset.get_label_colors(), + name=ds.name, + num_samples=len(ds), + labels=ds.labels, + spaces=space_dicts, + layouts=layout_dicts, ) @app.get("/api/samples") async def get_samples( + ds: Dataset = Depends(get_dataset), offset: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=1000), label: str | None = None, ): """Get paginated samples with thumbnails.""" - if _current_dataset is None: - raise HTTPException(status_code=404, detail="No dataset loaded") - - samples = _current_dataset.samples - - # Filter by label if specified - if label: - samples = [s for s in samples if s.label == label] - - total = len(samples) - samples = samples[offset : offset + limit] + samples, total = ds.get_samples_paginated( + offset=offset, limit=limit, label=label + ) return { "total": total, @@ -123,76 +353,314 @@ async def get_samples( } @app.get("/api/samples/{sample_id}", response_model=SampleResponse) - async def get_sample(sample_id: str): + async def get_sample(sample_id: str, ds: Dataset = Depends(get_dataset)): """Get a single sample by ID.""" - if _current_dataset is None: - raise HTTPException(status_code=404, detail="No dataset loaded") - try: - sample = _current_dataset[sample_id] + sample = ds[sample_id] return SampleResponse(**sample.to_api_dict()) except KeyError: raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") @app.post("/api/samples/batch") - async def get_samples_batch(request: SelectionRequest): + async def get_samples_batch(request: SelectionRequest, ds: Dataset = Depends(get_dataset)): """Get multiple samples by their IDs.""" - if _current_dataset is None: - raise HTTPException(status_code=404, detail="No dataset loaded") - - samples = [] - for sample_id in request.sample_ids: - try: - sample = _current_dataset[sample_id] - samples.append(sample.to_api_dict(include_thumbnail=True)) - except KeyError: - pass # Skip missing samples - - return {"samples": samples} + samples = ds.get_samples_by_ids(request.sample_ids) + return {"samples": [s.to_api_dict(include_thumbnail=True) for s in samples]} @app.get("/api/embeddings", response_model=EmbeddingsResponse) - async def get_embeddings(): - """Get all embeddings for visualization.""" - if _current_dataset is None: - raise HTTPException(status_code=404, detail="No dataset loaded") - - samples = [ - s - for s in _current_dataset.samples - if s.embedding_2d is not None and s.embedding_2d_hyperbolic is not None - ] - - if not samples: + async def get_embeddings(ds: Dataset = Depends(get_dataset), layout_key: str | None = None): + """Get embedding coordinates for visualization.""" + layouts = ds.list_layouts() + if not layouts: raise HTTPException( - status_code=400, detail="No embeddings computed. Call compute_visualization() first." + status_code=400, detail="No layouts computed. Call compute_visualization() first." ) + # Find the requested layout + layout_info = None + if layout_key is None: + layout_info = layouts[0] + layout_key = layout_info.layout_key + else: + layout_info = next((l for l in layouts if l.layout_key == layout_key), None) + if layout_info is None: + raise HTTPException(status_code=404, detail=f"Layout not found: {layout_key}") + + ids, labels, coords = ds.get_visualization_data(layout_key) + + if not ids: + raise HTTPException(status_code=400, detail=f"No data in layout '{layout_key}'.") + return EmbeddingsResponse( - ids=[s.id for s in samples], - labels=[s.label for s in samples], - euclidean=[s.embedding_2d for s in samples], - hyperbolic=[s.embedding_2d_hyperbolic for s in samples], - label_colors=_current_dataset.get_label_colors(), + layout_key=layout_key, + geometry=layout_info.geometry, + ids=ids, + labels=labels, + coords=coords.tolist(), ) + @app.get("/api/spaces") + async def get_spaces(ds: Dataset = Depends(get_dataset)): + """Get all embedding spaces.""" + spaces = ds.list_spaces() + return {"spaces": [s.to_api_dict() for s in spaces]} + + @app.get("/api/layouts") + async def get_layouts(ds: Dataset = Depends(get_dataset)): + """Get all available layouts.""" + layouts = ds.list_layouts() + return {"layouts": [l.to_api_dict() for l in layouts]} + @app.post("/api/selection") async def sync_selection(request: SelectionRequest): """Sync selection state (for future use).""" return {"status": "ok", "selected": request.sample_ids} + @app.post("/api/selection/lasso") + async def lasso_selection(request: LassoSelectionRequest, ds: Dataset = Depends(get_dataset)): + """Compute a lasso selection over the current embeddings. + + Returns a total selected count and a paginated page of selected samples. + + Notes: + - Selection is performed in *data space* (the same coordinates returned + by /api/embeddings). + - For now we use an in-memory scan with a tight AABB prefilter. + """ + if request.offset < 0: + raise HTTPException(status_code=400, detail="offset must be >= 0") + if request.limit < 1 or request.limit > 2000: + raise HTTPException(status_code=400, detail="limit must be between 1 and 2000") + + if len(request.polygon) < 6 or len(request.polygon) % 2 != 0: + raise HTTPException( + status_code=400, + detail="polygon must be an even-length list with at least 3 vertices", + ) + + poly = np.asarray(request.polygon, dtype=np.float32).reshape((-1, 2)) + if not np.all(np.isfinite(poly)): + raise HTTPException(status_code=400, detail="polygon must contain only finite numbers") + + # Tight AABB prefilter. + x_min = float(np.min(poly[:, 0])) + x_max = float(np.max(poly[:, 0])) + y_min = float(np.min(poly[:, 1])) + y_max = float(np.max(poly[:, 1])) + + candidate_ids, candidate_coords = ds.get_lasso_candidates_aabb( + layout_key=request.layout_key, + x_min=x_min, + x_max=x_max, + y_min=y_min, + y_max=y_max, + ) + + if candidate_coords.size == 0: + return {"total": 0, "offset": request.offset, "limit": request.limit, "sample_ids": [], "samples": []} + + inside_mask = points_in_polygon(candidate_coords, poly) + if not np.any(inside_mask): + return {"total": 0, "offset": request.offset, "limit": request.limit, "sample_ids": [], "samples": []} + + selected_ids = [candidate_ids[i] for i in np.flatnonzero(inside_mask)] + total = len(selected_ids) + + start = int(request.offset) + end = int(request.offset + request.limit) + sample_ids = selected_ids[start:end] + + samples = ds.get_samples_by_ids(sample_ids) + sample_dicts = [s.to_api_dict(include_thumbnail=request.include_thumbnails) for s in samples] + + return { + "total": total, + "offset": request.offset, + "limit": request.limit, + "sample_ids": sample_ids, + "samples": sample_dicts, + } + + @app.get("/api/search/similar/{sample_id}", response_model=SimilaritySearchResponse) + async def search_similar( + sample_id: str, + ds: Dataset = Depends(get_dataset), + k: int = Query(10, ge=1, le=100), + space_key: str | None = None, + ): + """Return k nearest neighbors for a given sample.""" + try: + similar = ds.find_similar( + sample_id, k=k, space_key=space_key + ) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + except KeyError: + raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") + + results = [] + for sample, distance in similar: + try: + thumbnail = sample.get_thumbnail_base64() + except Exception: + thumbnail = None + + results.append( + SimilarSampleResponse( + id=sample.id, + filepath=sample.filepath, + filename=sample.filename, + label=sample.label, + thumbnail=thumbnail, + distance=distance, + metadata=sample.metadata, + ) + ) + + return SimilaritySearchResponse( + query_id=sample_id, + k=k, + results=results, + ) + @app.get("/api/thumbnail/{sample_id}") - async def get_thumbnail(sample_id: str): + async def get_thumbnail(sample_id: str, ds: Dataset = Depends(get_dataset)): """Get thumbnail image for a sample.""" - if _current_dataset is None: - raise HTTPException(status_code=404, detail="No dataset loaded") - try: - sample = _current_dataset[sample_id] + sample = ds[sample_id] thumbnail_b64 = sample.get_thumbnail_base64() return JSONResponse({"thumbnail": thumbnail_b64}) except KeyError: raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") + @app.get("/api/video/{sample_id}") + async def get_video(sample_id: str, ds: Dataset = Depends(get_dataset)): + """Stream an MP4 clip for a sample.""" + try: + sample = ds[sample_id] + except KeyError: + raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") + + video_path = _resolve_video_file(sample) + if video_path is None: + raise HTTPException(status_code=404, detail=f"No video file found for sample: {sample_id}") + + return FileResponse(str(video_path), media_type="video/mp4", filename=video_path.name) + + @app.get("/api/annotations/{sample_id}") + async def get_annotations(sample_id: str, ds: Dataset = Depends(get_dataset)): + """Return caption/reasoning and curation scores for a sample.""" + try: + sample = ds[sample_id] + except KeyError: + raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") + + metadata = sample.metadata if isinstance(sample.metadata, dict) else {} + + raw_caption = metadata.get("caption_raw") or metadata.get("first_caption") + raw_caption_str = raw_caption if isinstance(raw_caption, str) else None + + reasoning = metadata.get("caption_reasoning") if isinstance(metadata.get("caption_reasoning"), str) else None + answer = metadata.get("caption_answer") if isinstance(metadata.get("caption_answer"), str) else None + + if answer is None and raw_caption_str: + parsed_reasoning, parsed_answer = _extract_caption_sections(raw_caption_str) + reasoning = reasoning or parsed_reasoning + answer = parsed_answer + + return { + "id": sample.id, + "caption": answer, + "reasoning": reasoning, + "raw_caption": raw_caption_str, + "aesthetic_score": metadata.get("aesthetic_score"), + "motion_score": metadata.get("motion_score"), + "dedup_status": metadata.get("dedup_status"), + "dedup_keep": metadata.get("dedup_keep"), + "cosine_sim_score": metadata.get("cosine_sim_score") or metadata.get("dedup_cosine_similarity"), + "source_video": metadata.get("source_video"), + "video_path": metadata.get("video_path") or metadata.get("clip_location"), + "span": metadata.get("span") or metadata.get("duration_span"), + } + + @app.get("/api/curation/stats") + async def get_curation_stats(ds: Dataset = Depends(get_dataset)): + """Return dataset-level curation statistics for dashboarding.""" + samples = ds.samples + + total = len(samples) + with_video = 0 + with_caption = 0 + dedup_counts: dict[str, int] = {"kept": 0, "removed": 0, "unknown": 0} + aesthetic_values: list[float] = [] + motion_values: list[float] = [] + + for sample in samples: + metadata = sample.metadata if isinstance(sample.metadata, dict) else {} + + if _sample_has_video(sample): + with_video += 1 + + if _sample_caption_text(metadata): + with_caption += 1 + + dedup_status = _metadata_text(metadata, "dedup_status") or "unknown" + dedup_counts[dedup_status] = dedup_counts.get(dedup_status, 0) + 1 + + aesthetic = _metadata_number(metadata, "aesthetic_score") + if aesthetic is not None: + aesthetic_values.append(aesthetic) + + motion = _metadata_number(metadata, "motion_score") + if motion is not None: + motion_values.append(motion) + + return { + "total_samples": total, + "with_video": with_video, + "with_caption": with_caption, + "dedup_counts": dedup_counts, + "score_summary": { + "aesthetic": _score_summary(aesthetic_values), + "motion": _score_summary(motion_values), + }, + "aesthetic_histogram": _histogram(aesthetic_values, bins=12, lower=0.0, upper=10.0), + "motion_histogram": _histogram(motion_values, bins=12, lower=0.0, upper=10.0), + } + + @app.post("/api/curation/filter") + async def post_curation_filter(request: CurationFilterRequest, ds: Dataset = Depends(get_dataset)): + """Filter samples by curation metadata and return paginated results.""" + if request.offset < 0: + raise HTTPException(status_code=400, detail="offset must be >= 0") + if request.limit < 1 or request.limit > 2000: + raise HTTPException(status_code=400, detail="limit must be between 1 and 2000") + + if request.dedup_status and request.dedup_status not in {"kept", "removed", "unknown"}: + raise HTTPException( + status_code=400, + detail="dedup_status must be one of: kept, removed, unknown", + ) + + filtered_ids: list[str] = [] + for sample in ds.samples: + if _matches_curation_filter(sample, request): + filtered_ids.append(sample.id) + + total = len(filtered_ids) + start = int(request.offset) + end = int(request.offset + request.limit) + page_ids = filtered_ids[start:end] + page_samples = ds.get_samples_by_ids(page_ids) + + return { + "total": total, + "offset": request.offset, + "limit": request.limit, + "sample_ids": page_ids, + "samples": [s.to_api_dict(include_thumbnail=request.include_thumbnails) for s in page_samples], + } + # Serve static frontend files static_dir = Path(__file__).parent / "static" if static_dir.exists(): diff --git a/src/hyperview/server/static/404.html b/src/hyperview/server/static/404.html deleted file mode 100644 index 27fc3dd..0000000 --- a/src/hyperview/server/static/404.html +++ /dev/null @@ -1 +0,0 @@ -404: This page could not be found.HyperView

404

This page could not be found.

\ No newline at end of file diff --git a/src/hyperview/server/static/404/index.html b/src/hyperview/server/static/404/index.html deleted file mode 100644 index 27fc3dd..0000000 --- a/src/hyperview/server/static/404/index.html +++ /dev/null @@ -1 +0,0 @@ -404: This page could not be found.HyperView

404

This page could not be found.

\ No newline at end of file diff --git a/src/hyperview/server/static/__next.__PAGE__.txt b/src/hyperview/server/static/__next.__PAGE__.txt deleted file mode 100644 index 61e8c5a..0000000 --- a/src/hyperview/server/static/__next.__PAGE__.txt +++ /dev/null @@ -1,9 +0,0 @@ -1:"$Sreact.fragment" -2:I[47257,["/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"] -3:I[52683,["/_next/static/chunks/640b68f22e2796e6.js","/_next/static/chunks/71c75872eed19356.js"],"default"] -6:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"] -7:"$Sreact.suspense" -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/640b68f22e2796e6.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/71c75872eed19356.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false} -4:{} -5:"$0:rsc:props:children:0:props:serverProvidedParams:params" -8:null diff --git a/src/hyperview/server/static/__next._full.txt b/src/hyperview/server/static/__next._full.txt deleted file mode 100644 index f4d4f19..0000000 --- a/src/hyperview/server/static/__next._full.txt +++ /dev/null @@ -1,17 +0,0 @@ -1:"$Sreact.fragment" -2:I[39756,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -3:I[37457,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -4:I[47257,["/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"] -5:I[52683,["/_next/static/chunks/640b68f22e2796e6.js","/_next/static/chunks/71c75872eed19356.js"],"default"] -8:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"] -9:"$Sreact.suspense" -b:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"] -d:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"] -f:I[68027,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"P":null,"b":"lAwT6e3uaMqLUXxndbn_f","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/19d0d66700a996ca.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/640b68f22e2796e6.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/71c75872eed19356.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$@c"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$@e"}]}]}],null]}],false]],"m":"$undefined","G":["$f",[]],"S":true} -6:{} -7:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" -c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -e:[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]] -a:null diff --git a/src/hyperview/server/static/__next._head.txt b/src/hyperview/server/static/__next._head.txt deleted file mode 100644 index 6739360..0000000 --- a/src/hyperview/server/static/__next._head.txt +++ /dev/null @@ -1,7 +0,0 @@ -1:"$Sreact.fragment" -2:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"] -4:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"] -5:"$Sreact.suspense" -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":"$@3"}],["$","div",null,{"hidden":true,"children":["$","$L4",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@6"}]}]}],null]}],"loading":null,"isPartial":false} -3:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -6:[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]] diff --git a/src/hyperview/server/static/__next._index.txt b/src/hyperview/server/static/__next._index.txt deleted file mode 100644 index 792a2d1..0000000 --- a/src/hyperview/server/static/__next._index.txt +++ /dev/null @@ -1,5 +0,0 @@ -1:"$Sreact.fragment" -2:I[39756,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -3:I[37457,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/19d0d66700a996ca.css","precedence":"next"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]]}],"loading":null,"isPartial":false} diff --git a/src/hyperview/server/static/__next._tree.txt b/src/hyperview/server/static/__next._tree.txt deleted file mode 100644 index b551f3c..0000000 --- a/src/hyperview/server/static/__next._tree.txt +++ /dev/null @@ -1,2 +0,0 @@ -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300} diff --git a/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_buildManifest.js b/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_buildManifest.js deleted file mode 100644 index 1af6a5b..0000000 --- a/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_buildManifest.js +++ /dev/null @@ -1,15 +0,0 @@ -self.__BUILD_MANIFEST = { - "__rewrites": { - "afterFiles": [ - { - "source": "/api/:path*" - } - ], - "beforeFiles": [], - "fallback": [] - }, - "sortedPages": [ - "/_app", - "/_error" - ] -};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_clientMiddlewareManifest.json b/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_clientMiddlewareManifest.json deleted file mode 100644 index 0637a08..0000000 --- a/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_clientMiddlewareManifest.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_ssgManifest.js b/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_ssgManifest.js deleted file mode 100644 index 5b3ff59..0000000 --- a/src/hyperview/server/static/_next/static/bTv_hKoV745UqFKtrs1rd/_ssgManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/19d0d66700a996ca.css b/src/hyperview/server/static/_next/static/chunks/19d0d66700a996ca.css deleted file mode 100644 index 4f6fdf1..0000000 --- a/src/hyperview/server/static/_next/static/chunks/19d0d66700a996ca.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-1{bottom:.25rem}.left-1{left:.25rem}.right-1{right:.25rem}.top-1{top:.25rem}.z-10{z-index:10}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mt-4{margin-top:1rem}.inline-block{display:inline-block}.flex{display:flex}.h-14{height:3.5rem}.h-3{height:.75rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.w-1\/2{width:50%}.w-3{width:.75rem}.w-36{width:9rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-full{max-width:100%}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-border{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1))}.border-primary{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:#0000}.bg-background{--tw-bg-opacity:1;background-color:rgb(10 10 11/var(--tw-bg-opacity,1))}.bg-primary{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.bg-surface{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.bg-surface-light{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.bg-surface\/80{background-color:#18181bcc}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-center{text-align:center}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-text{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity,1))}.text-text-muted{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-70{opacity:.7}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-primary{--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity,1))}.ring-primary-light{--tw-ring-opacity:1;--tw-ring-color:rgb(129 140 248/var(--tw-ring-opacity,1))}.filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150{transition-duration:.15s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}:root{--background:#0a0a0b;--surface:#18181b;--surface-light:#27272a;--border:#3f3f46;--primary:#4f46e5;--primary-light:#818cf8;--text:#fafafa;--text-muted:#a1a1aa}*{box-sizing:border-box}body{background-color:var(--background);color:var(--text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--surface)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#4d4d4d}.hide-scrollbar::-webkit-scrollbar{display:none}.hide-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.hover\:bg-border:hover{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.hover\:bg-surface-light:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))} diff --git a/src/hyperview/server/static/_next/static/chunks/42879de7b8087bc9.js b/src/hyperview/server/static/_next/static/chunks/42879de7b8087bc9.js deleted file mode 100644 index bda8a81..0000000 --- a/src/hyperview/server/static/_next/static/chunks/42879de7b8087bc9.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},91915,(e,r,t)=>{"use strict";function n(e,r={}){if(r.onlyHashChange)return void e();let t=document.documentElement;if("smooth"!==t.dataset.scrollBehavior)return void e();let a=t.style.scrollBehavior;t.style.scrollBehavior="auto",r.dontForceLayout||t.getClientRects(),e(),t.style.scrollBehavior=a}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}}),e.r(33525)},68017,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return i}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),c=e.r(90373),u=e.r(54394);e.r(33525);let l=e.r(8372);class s extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,u.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,u.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,r){return e.pathname!==r.previousPathname&&r.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:r.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:r,unauthorized:t,children:n}=this.props,{triggeredStatus:o}=this.state,c={[u.HTTPAccessErrorStatus.NOT_FOUND]:e,[u.HTTPAccessErrorStatus.FORBIDDEN]:r,[u.HTTPAccessErrorStatus.UNAUTHORIZED]:t};if(o){let l=o===u.HTTPAccessErrorStatus.NOT_FOUND&&e,s=o===u.HTTPAccessErrorStatus.FORBIDDEN&&r,i=o===u.HTTPAccessErrorStatus.UNAUTHORIZED&&t;return l||s||i?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("meta",{name:"robots",content:"noindex"}),!1,c[o]]}):n}return n}}function i({notFound:e,forbidden:r,unauthorized:t,children:n}){let u=(0,c.useUntrackedPathname)(),i=(0,o.useContext)(l.MissingSlotContext);return e||r||t?(0,a.jsx)(s,{pathname:u,notFound:e,forbidden:r,unauthorized:t,missingSlots:i,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},91798,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"useRouterBFCache",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,r){let[t,a]=(0,n.useState)(()=>({tree:e,stateKey:r,next:null}));if(t.tree===e)return t;let o={tree:e,stateKey:r,next:null},c=1,u=t,l=o;for(;null!==u&&c<1;){if(u.stateKey===r){l.next=u.next;break}{c++;let e={tree:u.tree,stateKey:u.stateKey,next:null};l.next=e,l=e}u=u.next}return a(o),o}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},39756,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return T}});let n=e.r(55682),a=e.r(90809),o=e.r(43476),c=e.r(88540),u=a._(e.r(71645)),l=n._(e.r(74080)),s=e.r(8372),i=e.r(87288),d=e.r(1244),f=e.r(72383),p=e.r(56019),h=e.r(91915),m=e.r(58442),g=e.r(68017),y=e.r(70725),b=e.r(84356),P=e.r(41538),_=e.r(91798);e.r(74180);let v=e.r(61994),O=e.r(33906),S=l.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,E=["bottom","height","left","right","top","width","x","y"];function R(e,r){let t=e.getBoundingClientRect();return t.top>=0&&t.top<=r}class j extends u.default.Component{componentDidMount(){this.handlePotentialScroll()}componentDidUpdate(){this.props.focusAndScrollRef.apply&&this.handlePotentialScroll()}render(){return this.props.children}constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focusAndScrollRef:e,segmentPath:r}=this.props;if(e.apply){if(0!==e.segmentPaths.length&&!e.segmentPaths.some(e=>r.every((r,t)=>(0,p.matchSegment)(r,e[t]))))return;let t=null,n=e.hashFragment;if(n&&(t="top"===n?document.body:document.getElementById(n)??document.getElementsByName(n)[0]),t||(t="undefined"==typeof window?null:(0,S.findDOMNode)(this)),!(t instanceof Element))return;for(;!(t instanceof HTMLElement)||function(e){if(["sticky","fixed"].includes(getComputedStyle(e).position))return!0;let r=e.getBoundingClientRect();return E.every(e=>0===r[e])}(t);){if(null===t.nextElementSibling)return;t=t.nextElementSibling}e.apply=!1,e.hashFragment=null,e.segmentPaths=[],(0,h.disableSmoothScrollDuringRouteTransition)(()=>{if(n)return void t.scrollIntoView();let e=document.documentElement,r=e.clientHeight;!R(t,r)&&(e.scrollTop=0,R(t,r)||t.scrollIntoView())},{dontForceLayout:!0,onlyHashChange:e.onlyHashChange}),e.onlyHashChange=!1,t.focus()}}}}function w({segmentPath:e,children:r}){let t=(0,u.useContext)(s.GlobalLayoutRouterContext);if(!t)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,o.jsx)(j,{segmentPath:e,focusAndScrollRef:t.focusAndScrollRef,children:r})}function C({tree:e,segmentPath:r,debugNameContext:t,cacheNode:n,params:a,url:l,isActive:f}){let h=(0,u.useContext)(s.GlobalLayoutRouterContext);if((0,u.useContext)(v.NavigationPromisesContext),!h)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let{tree:m}=h,g=null!==n.prefetchRsc?n.prefetchRsc:n.rsc,y=(0,u.useDeferredValue)(n.rsc,g),_="object"==typeof y&&null!==y&&"function"==typeof y.then?(0,u.use)(y):y;if(!_){if(f){let e=n.lazyData;if(null===e){let t=function e(r,t){if(r){let[n,a]=r,o=2===r.length;if((0,p.matchSegment)(t[0],n)&&t[1].hasOwnProperty(a)){if(o){let r=e(void 0,t[1][a]);return[t[0],{...t[1],[a]:[r[0],r[1],r[2],"refetch"]}]}return[t[0],{...t[1],[a]:e(r.slice(2),t[1][a])}]}}return t}(["",...r],m),a=(0,b.hasInterceptionRouteInCurrentTree)(m),o=Date.now();n.lazyData=e=(0,i.fetchServerResponse)(new URL(l,location.origin),{flightRouterState:t,nextUrl:a?h.previousNextUrl||h.nextUrl:null}).then(e=>((0,u.startTransition)(()=>{(0,P.dispatchAppRouterAction)({type:c.ACTION_SERVER_PATCH,previousTree:m,serverResponse:e,navigatedAt:o})}),e)),(0,u.use)(e)}}(0,u.use)(d.unresolvedThenable)}return(0,o.jsx)(s.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:n,parentSegmentPath:r,parentParams:a,debugNameContext:t,url:l,isActive:f},children:_})}function x({name:e,loading:r,children:t}){let n;if(n="object"==typeof r&&null!==r&&"function"==typeof r.then?(0,u.use)(r):r){let r=n[0],a=n[1],c=n[2];return(0,o.jsx)(u.Suspense,{name:e,fallback:(0,o.jsxs)(o.Fragment,{children:[a,c,r]}),children:t})}return(0,o.jsx)(o.Fragment,{children:t})}function T({parallelRouterKey:e,error:r,errorStyles:t,errorScripts:n,templateStyles:a,templateScripts:c,template:l,notFound:i,forbidden:d,unauthorized:p,segmentViewBoundaries:h}){let b=(0,u.useContext)(s.LayoutRouterContext);if(!b)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:P,parentCacheNode:v,parentSegmentPath:S,parentParams:E,url:R,isActive:j,debugNameContext:T}=b,A=v.parallelRoutes,M=A.get(e);M||(M=new Map,A.set(e,M));let F=P[0],D=null===S?[e]:S.concat([F,e]),k=P[1][e],N=k[0],I=(0,y.createRouterCacheKey)(N,!0),U=(0,_.useRouterBFCache)(k,I),H=[];do{let e=U.tree,u=U.stateKey,h=e[0],b=(0,y.createRouterCacheKey)(h),P=M.get(b);if(void 0===P){let e={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,loading:null,navigatedAt:-1};P=e,M.set(b,e)}let _=E;if(Array.isArray(h)){let e=h[0],r=h[1],t=h[2],n=(0,O.getParamValueFromCacheKey)(r,t);null!==n&&(_={...E,[e]:n})}let S=function(e){if("/"===e)return"/";if("string"==typeof e)if("(slot)"===e)return;else return e+"/";return e[1]+"/"}(h),A=S??T,F=void 0===S?void 0:T,k=v.loading,N=(0,o.jsxs)(s.TemplateContext.Provider,{value:(0,o.jsxs)(w,{segmentPath:D,children:[(0,o.jsx)(f.ErrorBoundary,{errorComponent:r,errorStyles:t,errorScripts:n,children:(0,o.jsx)(x,{name:F,loading:k,children:(0,o.jsx)(g.HTTPAccessFallbackBoundary,{notFound:i,forbidden:d,unauthorized:p,children:(0,o.jsxs)(m.RedirectBoundary,{children:[(0,o.jsx)(C,{url:R,tree:e,params:_,cacheNode:P,segmentPath:D,debugNameContext:A,isActive:j&&u===I}),null]})})})}),null]}),children:[a,c,l]},u);H.push(N),U=U.next}while(null!==U)return H}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},37457,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return u}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),c=e.r(8372);function u(){let e=(0,o.useContext)(c.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},93504,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let r=n.get(e);if(r)return r;let t=Promise.resolve(e);return n.set(e,t),t}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},66996,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},6831,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createRenderParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let r=n.get(e);if(r)return r;let t=Promise.resolve(e);return n.set(e,t),t}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},97689,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},42715,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ReflectAdapter",{enumerable:!0,get:function(){return n}});class n{static get(e,r,t){let n=Reflect.get(e,r,t);return"function"==typeof n?n.bind(e):n}static set(e,r,t,n){return Reflect.set(e,r,t,n)}static has(e,r){return Reflect.has(e,r)}static deleteProperty(e,r){return Reflect.deleteProperty(e,r)}}},76361,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createDedupedByCallsiteServerErrorLoggerDev",{enumerable:!0,get:function(){return l}});let n=function(e,r){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=a(void 0);if(t&&t.has(e))return t.get(e);var n={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var c in e)if("default"!==c&&Object.prototype.hasOwnProperty.call(e,c)){var u=o?Object.getOwnPropertyDescriptor(e,c):null;u&&(u.get||u.set)?Object.defineProperty(n,c,u):n[c]=e[c]}return n.default=e,t&&t.set(e,n),n}(e.r(71645));function a(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(a=function(e){return e?t:r})(e)}let o={current:null},c="function"==typeof n.cache?n.cache:e=>e,u=console.warn;function l(e){return function(...r){u(e(...r))}}c(e=>{try{u(o.current)}finally{o.current=null}})},65932,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={describeHasCheckingStringProperty:function(){return u},describeStringPropertyAccess:function(){return c},wellKnownProperties:function(){return l}};for(var a in n)Object.defineProperty(t,a,{enumerable:!0,get:n[a]});let o=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function c(e,r){return o.test(r)?`\`${e}.${r}\``:`\`${e}[${JSON.stringify(r)}]\``}function u(e,r){let t=JSON.stringify(r);return`\`Reflect.has(${e}, ${t})\`, \`${t} in ${e}\`, or similar`}let l=new Set(["hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toString","valueOf","toLocaleString","then","catch","finally","status","displayName","_debugInfo","toJSON","$$typeof","__esModule"])},83066,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"afterTaskAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},41643,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"afterTaskAsyncStorage",{enumerable:!0,get:function(){return n.afterTaskAsyncStorageInstance}});let n=e.r(83066)},50999,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={isRequestAPICallableInsideAfter:function(){return s},throwForSearchParamsAccessInUseCache:function(){return l},throwWithStaticGenerationBailoutErrorWithDynamicError:function(){return u}};for(var a in n)Object.defineProperty(t,a,{enumerable:!0,get:n[a]});let o=e.r(43248),c=e.r(41643);function u(e,r){throw Object.defineProperty(new o.StaticGenBailoutError(`Route ${e} with \`dynamic = "error"\` couldn't be rendered statically because it used ${r}. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E543",enumerable:!1,configurable:!0})}function l(e,r){let t=Object.defineProperty(Error(`Route ${e.route} used \`searchParams\` inside "use cache". Accessing dynamic request data inside a cache scope is not supported. If you need some search params inside a cached function await \`searchParams\` outside of the cached function and pass only the required search params as arguments to the cached function. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache`),"__NEXT_ERROR_CODE",{value:"E842",enumerable:!1,configurable:!0});throw Error.captureStackTrace(t,r),e.invalidDynamicUsageError??=t,t}function s(){let e=c.afterTaskAsyncStorage.getStore();return(null==e?void 0:e.rootTaskSpawnPhase)==="action"}},69882,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={createPrerenderSearchParamsForClientPage:function(){return g},createSearchParamsFromClient:function(){return p},createServerSearchParamsForMetadata:function(){return h},createServerSearchParamsForServerPage:function(){return m},makeErroringSearchParamsForUseCache:function(){return v}};for(var a in n)Object.defineProperty(t,a,{enumerable:!0,get:n[a]});let o=e.r(42715),c=e.r(67673),u=e.r(62141),l=e.r(12718),s=e.r(63138),i=e.r(76361),d=e.r(65932),f=e.r(50999);function p(e,r){let t=u.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return y(r,t);case"prerender-runtime":throw Object.defineProperty(new l.InvariantError("createSearchParamsFromClient should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E769",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new l.InvariantError("createSearchParamsFromClient should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E739",enumerable:!1,configurable:!0});case"request":return b(e,r,t)}(0,u.throwInvariantForMissingStore)()}e.r(42852);let h=m;function m(e,r){let t=u.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return y(r,t);case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new l.InvariantError("createServerSearchParamsForServerPage should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E747",enumerable:!1,configurable:!0});case"prerender-runtime":var n,a;return n=e,a=t,(0,c.delayUntilRuntimeStage)(a,O(n));case"request":return b(e,r,t)}(0,u.throwInvariantForMissingStore)()}function g(e){if(e.forceStatic)return Promise.resolve({});let r=u.workUnitAsyncStorage.getStore();if(r)switch(r.type){case"prerender":case"prerender-client":return(0,s.makeHangingPromise)(r.renderSignal,e.route,"`searchParams`");case"prerender-runtime":throw Object.defineProperty(new l.InvariantError("createPrerenderSearchParamsForClientPage should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E768",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new l.InvariantError("createPrerenderSearchParamsForClientPage should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E746",enumerable:!1,configurable:!0});case"prerender-ppr":case"prerender-legacy":case"request":return Promise.resolve({})}(0,u.throwInvariantForMissingStore)()}function y(e,r){if(e.forceStatic)return Promise.resolve({});switch(r.type){case"prerender":case"prerender-client":var t=e,n=r;let a=P.get(n);if(a)return a;let u=(0,s.makeHangingPromise)(n.renderSignal,t.route,"`searchParams`"),l=new Proxy(u,{get(e,r,t){if(Object.hasOwn(u,r))return o.ReflectAdapter.get(e,r,t);switch(r){case"then":return(0,c.annotateDynamicAccess)("`await searchParams`, `searchParams.then`, or similar",n),o.ReflectAdapter.get(e,r,t);case"status":return(0,c.annotateDynamicAccess)("`use(searchParams)`, `searchParams.status`, or similar",n),o.ReflectAdapter.get(e,r,t);default:return o.ReflectAdapter.get(e,r,t)}}});return P.set(n,l),l;case"prerender-ppr":case"prerender-legacy":var i=e,d=r;let p=P.get(i);if(p)return p;let h=Promise.resolve({}),m=new Proxy(h,{get(e,r,t){if(Object.hasOwn(h,r))return o.ReflectAdapter.get(e,r,t);if("string"==typeof r&&"then"===r){let e="`await searchParams`, `searchParams.then`, or similar";i.dynamicShouldError?(0,f.throwWithStaticGenerationBailoutErrorWithDynamicError)(i.route,e):"prerender-ppr"===d.type?(0,c.postponeWithTracking)(i.route,e,d.dynamicTracking):(0,c.throwToInterruptStaticGeneration)(e,i,d)}return o.ReflectAdapter.get(e,r,t)}});return P.set(i,m),m;default:return r}}function b(e,r,t){return r.forceStatic?Promise.resolve({}):O(e)}let P=new WeakMap,_=new WeakMap;function v(e){let r=_.get(e);if(r)return r;let t=Promise.resolve({}),n=new Proxy(t,{get:function r(n,a,c){return Object.hasOwn(t,a)||"string"!=typeof a||"then"!==a&&d.wellKnownProperties.has(a)||(0,f.throwForSearchParamsAccessInUseCache)(e,r),o.ReflectAdapter.get(n,a,c)}});return _.set(e,n),n}function O(e){let r=P.get(e);if(r)return r;let t=Promise.resolve(e);return P.set(e,t),t}(0,i.createDedupedByCallsiteServerErrorLoggerDev)(function(e,r){let t=e?`Route "${e}" `:"This route ";return Object.defineProperty(Error(`${t}used ${r}. \`searchParams\` is a Promise and must be unwrapped with \`await\` or \`React.use()\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),"__NEXT_ERROR_CODE",{value:"E848",enumerable:!1,configurable:!0})})},74804,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"dynamicAccessAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},88276,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"dynamicAccessAsyncStorage",{enumerable:!0,get:function(){return n.dynamicAccessAsyncStorageInstance}});let n=e.r(74804)},41489,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={createParamsFromClient:function(){return h},createPrerenderParamsForClientSegment:function(){return b},createServerParamsForMetadata:function(){return m},createServerParamsForRoute:function(){return g},createServerParamsForServerSegment:function(){return y}};for(var a in n)Object.defineProperty(t,a,{enumerable:!0,get:n[a]});let o=e.r(63599),c=e.r(42715),u=e.r(67673),l=e.r(62141),s=e.r(12718),i=e.r(65932),d=e.r(63138),f=e.r(76361),p=e.r(88276);function h(e,r){let t=l.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return P(e,r,t);case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new s.InvariantError("createParamsFromClient should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E736",enumerable:!1,configurable:!0});case"prerender-runtime":throw Object.defineProperty(new s.InvariantError("createParamsFromClient should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E770",enumerable:!1,configurable:!0});case"request":return S(e)}(0,l.throwInvariantForMissingStore)()}e.r(42852);let m=y;function g(e,r){let t=l.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return P(e,r,t);case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new s.InvariantError("createServerParamsForRoute should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E738",enumerable:!1,configurable:!0});case"prerender-runtime":return _(e,t);case"request":return S(e)}(0,l.throwInvariantForMissingStore)()}function y(e,r){let t=l.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return P(e,r,t);case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new s.InvariantError("createServerParamsForServerSegment should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E743",enumerable:!1,configurable:!0});case"prerender-runtime":return _(e,t);case"request":return S(e)}(0,l.throwInvariantForMissingStore)()}function b(e){let r=o.workAsyncStorage.getStore();if(!r)throw Object.defineProperty(new s.InvariantError("Missing workStore in createPrerenderParamsForClientSegment"),"__NEXT_ERROR_CODE",{value:"E773",enumerable:!1,configurable:!0});let t=l.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":let n=t.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return(0,d.makeHangingPromise)(t.renderSignal,r.route,"`params`")}break;case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new s.InvariantError("createPrerenderParamsForClientSegment should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E734",enumerable:!1,configurable:!0})}return Promise.resolve(e)}function P(e,r,t){switch(t.type){case"prerender":case"prerender-client":{let n=t.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return function(e,r,t){let n=v.get(e);if(n)return n;let a=new Proxy((0,d.makeHangingPromise)(t.renderSignal,r.route,"`params`"),O);return v.set(e,a),a}(e,r,t)}break}case"prerender-ppr":{let n=t.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return function(e,r,t,n){let a=v.get(e);if(a)return a;let o={...e},c=Promise.resolve(o);return v.set(e,c),Object.keys(e).forEach(e=>{i.wellKnownProperties.has(e)||r.has(e)&&Object.defineProperty(o,e,{get(){let r=(0,i.describeStringPropertyAccess)("params",e);"prerender-ppr"===n.type?(0,u.postponeWithTracking)(t.route,r,n.dynamicTracking):(0,u.throwToInterruptStaticGeneration)(r,t,n)},enumerable:!0})}),c}(e,n,r,t)}}}return S(e)}function _(e,r){return(0,u.delayUntilRuntimeStage)(r,S(e))}let v=new WeakMap,O={get:function(e,r,t){if("then"===r||"catch"===r||"finally"===r){let n=c.ReflectAdapter.get(e,r,t);return({[r]:(...r)=>{let t=p.dynamicAccessAsyncStorage.getStore();return t&&t.abortController.abort(Object.defineProperty(Error("Accessed fallback `params` during prerendering."),"__NEXT_ERROR_CODE",{value:"E691",enumerable:!1,configurable:!0})),new Proxy(n.apply(e,r),O)}})[r]}return c.ReflectAdapter.get(e,r,t)}};function S(e){let r=v.get(e);if(r)return r;let t=Promise.resolve(e);return v.set(e,t),t}(0,f.createDedupedByCallsiteServerErrorLoggerDev)(function(e,r){let t=e?`Route "${e}" `:"This route ";return Object.defineProperty(Error(`${t}used ${r}. \`params\` is a Promise and must be unwrapped with \`await\` or \`React.use()\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),"__NEXT_ERROR_CODE",{value:"E834",enumerable:!1,configurable:!0})})},47257,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ClientPageRoot",{enumerable:!0,get:function(){return s}});let n=e.r(43476),a=e.r(12718),o=e.r(8372),c=e.r(71645),u=e.r(33906),l=e.r(61994);function s({Component:r,serverProvidedParams:t}){let s,i;if(null!==t)s=t.searchParams,i=t.params;else{let e=(0,c.use)(o.LayoutRouterContext);i=null!==e?e.parentParams:{},s=(0,u.urlSearchParamsToParsedUrlQuery)((0,c.use)(l.SearchParamsContext))}if("undefined"==typeof window){let t,o,{workAsyncStorage:c}=e.r(63599),u=c.getStore();if(!u)throw Object.defineProperty(new a.InvariantError("Expected workStore to exist when handling searchParams in a client Page."),"__NEXT_ERROR_CODE",{value:"E564",enumerable:!1,configurable:!0});let{createSearchParamsFromClient:l}=e.r(69882);t=l(s,u);let{createParamsFromClient:d}=e.r(41489);return o=d(i,u),(0,n.jsx)(r,{params:o,searchParams:t})}{let{createRenderSearchParamsFromClient:t}=e.r(66996),a=t(s),{createRenderParamsFromClient:o}=e.r(97689),c=o(i);return(0,n.jsx)(r,{params:c,searchParams:a})}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},92825,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ClientSegmentRoot",{enumerable:!0,get:function(){return u}});let n=e.r(43476),a=e.r(12718),o=e.r(8372),c=e.r(71645);function u({Component:r,slots:t,serverProvidedParams:u}){let l;if(null!==u)l=u.params;else{let e=(0,c.use)(o.LayoutRouterContext);l=null!==e?e.parentParams:{}}if("undefined"==typeof window){let o,{workAsyncStorage:c}=e.r(63599),u=c.getStore();if(!u)throw Object.defineProperty(new a.InvariantError("Expected workStore to exist when handling params in a client segment such as a Layout or Template."),"__NEXT_ERROR_CODE",{value:"E600",enumerable:!1,configurable:!0});let{createParamsFromClient:s}=e.r(41489);return o=s(l,u),(0,n.jsx)(r,{...t,params:o})}{let{createRenderParamsFromClient:a}=e.r(97689),o=a(l);return(0,n.jsx)(r,{...t,params:o})}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},27201,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"IconMark",{enumerable:!0,get:function(){return a}});let n=e.r(43476),a=()=>"undefined"!=typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/5f8e11d2476d2135.js b/src/hyperview/server/static/_next/static/chunks/5f8e11d2476d2135.js deleted file mode 100644 index b255ea0..0000000 --- a/src/hyperview/server/static/_next/static/chunks/5f8e11d2476d2135.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,68027,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return s}});let n=e.r(43476),o=e.r(12354),i={fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},u={fontSize:"14px",fontWeight:400,lineHeight:"28px",margin:"0 8px"},s=function({error:e}){let t=e?.digest;return(0,n.jsxs)("html",{id:"__next_error__",children:[(0,n.jsx)("head",{}),(0,n.jsxs)("body",{children:[(0,n.jsx)(o.HandleISRError,{error:e}),(0,n.jsx)("div",{style:i,children:(0,n.jsxs)("div",{children:[(0,n.jsxs)("h2",{style:u,children:["Application error: a ",t?"server":"client","-side exception has occurred while loading ",window.location.hostname," (see the"," ",t?"server logs":"browser console"," for more information)."]}),t?(0,n.jsx)("p",{style:u,children:`Digest: ${t}`}):null]})})]})]})};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},35451,(e,t,r)=>{var n={229:function(e){var t,r,n,o=e.exports={};function i(){throw Error("setTimeout has not been defined")}function u(){throw Error("clearTimeout has not been defined")}try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{r="function"==typeof clearTimeout?clearTimeout:u}catch(e){r=u}function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(r){try{return t.call(null,e,0)}catch(r){return t.call(this,e,0)}}}var c=[],a=!1,l=-1;function f(){a&&n&&(a=!1,n.length?c=n.concat(c):l=-1,c.length&&p())}function p(){if(!a){var e=s(f);a=!0;for(var t=c.length;t;){for(n=c,c=[];++l1)for(var r=1;r{"use strict";var n,o;t.exports=(null==(n=e.g.process)?void 0:n.env)&&"object"==typeof(null==(o=e.g.process)?void 0:o.env)?e.g.process:e.r(35451)},45689,(e,t,r)=>{"use strict";var n=Symbol.for("react.transitional.element");function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=""+t.key),"key"in t)for(var i in r={},t)"key"!==i&&(r[i]=t[i]);else r=t;return{$$typeof:n,type:e,key:o,ref:void 0!==(t=r.ref)?t:null,props:r}}r.Fragment=Symbol.for("react.fragment"),r.jsx=o,r.jsxs=o},43476,(e,t,r)=>{"use strict";t.exports=e.r(45689)},90317,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={bindSnapshot:function(){return a},createAsyncLocalStorage:function(){return c},createSnapshot:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let i=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class u{disable(){throw i}getStore(){}run(){throw i}exit(){throw i}enterWith(){throw i}static bind(e){return e}}let s="undefined"!=typeof globalThis&&globalThis.AsyncLocalStorage;function c(){return s?new s:new u}function a(e){return s?s.bind(e):u.bind(e)}function l(){return s?s.snapshot():function(e,...t){return e(...t)}}},42344,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},63599,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorage",{enumerable:!0,get:function(){return n.workAsyncStorageInstance}});let n=e.r(42344)},12354,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HandleISRError",{enumerable:!0,get:function(){return o}});let n="undefined"==typeof window?e.r(63599).workAsyncStorage:void 0;function o({error:e}){if(n){let t=n.getStore();if(t?.isStaticGeneration)throw e&&console.error(e),e}return null}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},50740,(e,t,r)=>{"use strict";var n=e.i(47167),o=Symbol.for("react.transitional.element"),i=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),l=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),g=Symbol.for("react.view_transition"),v=Symbol.iterator,_={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,b={};function S(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r||_}function O(){}function E(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r||_}S.prototype.isReactComponent={},S.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},S.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},O.prototype=S.prototype;var T=E.prototype=new O;T.constructor=E,m(T,S.prototype),T.isPureReactComponent=!0;var w=Array.isArray;function j(){}var R={H:null,A:null,T:null,S:null},x=Object.prototype.hasOwnProperty;function A(e,t,r){var n=r.ref;return{$$typeof:o,type:e,key:t,ref:void 0!==n?n:null,props:r}}function P(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var C=/\/+/g;function H(e,t){var r,n;return"object"==typeof e&&null!==e&&null!=e.key?(r=""+e.key,n={"=":"=0",":":"=2"},"$"+r.replace(/[=:]/g,function(e){return n[e]})):t.toString(36)}function k(e,t,r){if(null==e)return e;var n=[],u=0;return!function e(t,r,n,u,s){var c,a,l,f=typeof t;("undefined"===f||"boolean"===f)&&(t=null);var p=!1;if(null===t)p=!0;else switch(f){case"bigint":case"string":case"number":p=!0;break;case"object":switch(t.$$typeof){case o:case i:p=!0;break;case y:return e((p=t._init)(t._payload),r,n,u,s)}}if(p)return s=s(t),p=""===u?"."+H(t,0):u,w(s)?(n="",null!=p&&(n=p.replace(C,"$&/")+"/"),e(s,r,n,"",function(e){return e})):null!=s&&(P(s)&&(c=s,a=n+(null==s.key||t&&t.key===s.key?"":(""+s.key).replace(C,"$&/")+"/")+p,s=A(c.type,a,c.props)),r.push(s)),1;p=0;var d=""===u?".":u+":";if(w(t))for(var h=0;h{"use strict";t.exports=e.r(50740)},18800,(e,t,r)=>{"use strict";var n=e.r(71645);function o(e){var t="https://react.dev/errors/"+e;if(1{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),t.exports=e.r(18800)}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/640b68f22e2796e6.js b/src/hyperview/server/static/_next/static/chunks/640b68f22e2796e6.js deleted file mode 100644 index 9792225..0000000 --- a/src/hyperview/server/static/_next/static/chunks/640b68f22e2796e6.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,93347,c=>{c.v(t=>Promise.all(["static/chunks/6dd1fc7c515721e7.js"].map(t=>c.l(t))).then(()=>t(42030)))}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/6dd1fc7c515721e7.js b/src/hyperview/server/static/_next/static/chunks/6dd1fc7c515721e7.js deleted file mode 100644 index a7a8e12..0000000 --- a/src/hyperview/server/static/_next/static/chunks/6dd1fc7c515721e7.js +++ /dev/null @@ -1,448 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,25443,(e,t,r)=>{e.e,t.exports=function(){"use strict";var e=function(e){return e instanceof Uint8Array||e instanceof Uint16Array||e instanceof Uint32Array||e instanceof Int8Array||e instanceof Int16Array||e instanceof Int32Array||e instanceof Float32Array||e instanceof Float64Array||e instanceof Uint8ClampedArray},t=function(e,t){for(var r=Object.keys(t),n=0;nt.indexOf(e)&&r("invalid value"+i(n)+". must be one of: "+t)}var s=["gl","canvas","container","attributes","pixelRatio","extensions","optionalExtensions","profile","onDone"];function l(e,t){for(e+="";e.lengths.indexOf(e)&&r('invalid regl constructor argument "'+e+'". must be one of '+s)})},type:function(e,t,n){a(e,t)||r("invalid parameter type"+i(n)+". expected "+t+", got "+typeof e)},commandType:v,isTypedArray:function(t,n){e(t)||r("invalid parameter type"+i(n)+". must be a typed array")},nni:function(e,t){e>=0&&(0|e)===e||r("invalid parameter type, ("+e+")"+i(t)+". must be a nonnegative integer")},oneOf:o,shaderError:function(e,t,r,i,a){if(!e.getShaderParameter(t,e.COMPILE_STATUS)){var o,s=e.getShaderInfoLog(t),f=i===e.FRAGMENT_SHADER?"fragment":"vertex";v(r,"string",f+" shader source must be a string",a);var u=m(r,a);(o=[],s.split("\n").forEach(function(e){if(!(e.length<5)){var t=/^ERROR:\s+(\d+):(\d+):\s*(.*)$/.exec(e);t?o.push(new c(0|t[1],0|t[2],t[3].trim())):e.length>0&&o.push(new c("unknown",0,e))}}),o).forEach(function(e){var t=u[e.file];if(t){var r=t.index[e.line];if(r){r.errors.push(e),t.hasErrors=!0;return}}u.unknown.hasErrors=!0,u.unknown.lines[0].errors.push(e)}),Object.keys(u).forEach(function(e){var t=u[e];if(t.hasErrors){var r=[""],n=[""];i("file number "+e+": "+t.name+"\n","color:red;text-decoration:underline;font-weight:bold"),t.lines.forEach(function(e){if(e.errors.length>0){i(l(e.number,4)+"| ","background-color:yellow; font-weight:bold"),i(e.line+"\n","color:red; background-color:yellow; font-weight:bold");var t=0;e.errors.forEach(function(r){var n=r.message,a=/^\s*'(.*)'\s*:\s*(.*)$/.exec(n);if(a){var o=a[1];n=a[2],"assign"===o&&(o="="),t=Math.max(e.line.indexOf(o,t),0)}else t=0;i(l("| ",6)),i(l("^^^",t+3)+"\n","font-weight:bold"),i(l("| ",6)),i(n+"\n","font-weight:bold")}),i(l("| ",6)+"\n")}else i(l(e.number,4)+"| "),i(e.line+"\n","color:red")}),"undefined"==typeof document||window.chrome?console.log(r.join("")):(n[0]=r.join("%c"),console.log.apply(console,n))}function i(e,t){r.push(e),n.push(t||"")}}),n.raise("Error compiling "+f+" shader, "+u[0].name)}},linkError:function(e,t,r,i,a){if(!e.getProgramParameter(t,e.LINK_STATUS)){var o=e.getProgramInfoLog(t),s=m(r,a),l='Error linking program with vertex shader, "'+m(i,a)[0].name+'", and fragment shader "'+s[0].name+'"';"undefined"!=typeof document?console.log("%c"+l+"\n%c"+o,"color:red;text-decoration:underline;font-weight:bold","color:red"):console.log(l+"\n"+o),n.raise(l)}},callSite:p,saveCommandRef:h,saveDrawInfo:function(e,t,r,n){function i(e,t){Object.keys(t).forEach(function(t){e[n.id(t)]=!0})}h(e),e._fragId=(a=e.static.frag)?n.id(a):0,e._vertId=(o=e.static.vert)?n.id(o):0;var a,o,s=e._uniformSet={};i(s,t.static),i(s,t.dynamic);var l=e._attributeSet={};i(l,r.static),i(l,r.dynamic),e._hasCount="count"in e.static||"count"in e.dynamic||"elements"in e.static||"elements"in e.dynamic},framebufferFormat:function(e,t,r){e.texture?o(e.texture._texture.internalformat,t,"unsupported texture format for attachment"):o(e.renderbuffer._renderbuffer.format,r,"unsupported renderbuffer format for attachment")},guessCommand:d,texture2D:function(e,t,r){var i,a=t.width,o=t.height,s=t.channels;n(a>0&&a<=r.maxTextureSize&&o>0&&o<=r.maxTextureSize,"invalid texture shape"),(33071!==e.wrapS||33071!==e.wrapT)&&n(x(a)&&x(o),"incompatible wrap mode for texture, both width and height must be power of 2"),1===t.mipmask?1!==a&&1!==o&&n(9984!==e.minFilter&&9986!==e.minFilter&&9985!==e.minFilter&&9987!==e.minFilter,"min filter requires mipmap"):(n(x(a)&&x(o),"texture must be a square power of 2 to support mipmapping"),n(t.mipmask===(a<<1)-1,"missing or incomplete mipmap data")),5126===t.type&&(0>r.extensions.indexOf("oes_texture_float_linear")&&n(9728===e.minFilter&&9728===e.magFilter,"filter not supported, must enable oes_texture_float_linear"),n(!e.genMipmaps,"mipmap generation not supported with float textures"));var l=t.images;for(i=0;i<16;++i)if(l[i]){var f=a>>i,u=o>>i;n(t.mipmask&1<0&&a<=i.maxTextureSize&&o>0&&o<=i.maxTextureSize,"invalid texture shape"),n(a===o,"cube map must be square"),n(33071===t.wrapS&&33071===t.wrapT,"wrap mode not supported by cube map");for(var l=0;l>c,m=o>>c;n(f.mipmask&1<1&&r===n&&('"'===r||"'"===r))return['"'+E(t.substr(1,t.length-2))+'"'];var i=/\[(false|true|null|\d+|'[^']*'|"[^"]*")\]/.exec(t);if(i)return e(t.substr(0,i.index)).concat(e(i[1])).concat(e(t.substr(i.index+i[0].length)));var a=t.split(".");if(1===a.length)return['"'+E(t)+'"'];for(var o=[],s=0;s65535)<<4,e>>>=t,r=(e>255)<<3,e>>>=r,t|=r,r=(e>15)<<2,e>>>=r,t|=r,r=(e>3)<<1,e>>>=r,(t|=r)|e>>1}function j(){var e=M(8,function(){return[]});function t(t){var r=function(e){for(var t=16;t<=0x10000000;t*=16)if(e<=t)return t;return 0}(t),n=e[I(r)>>2];return n.length>0?n.pop():new ArrayBuffer(r)}function r(t){e[I(t.byteLength)>>2].push(t)}return{alloc:t,free:r,allocType:function(e,r){var n=null;switch(e){case 5120:n=new Int8Array(t(r),0,r);break;case 5121:n=new Uint8Array(t(r),0,r);break;case 5122:n=new Int16Array(t(2*r),0,r);break;case 5123:n=new Uint16Array(t(2*r),0,r);break;case 5124:n=new Int32Array(t(4*r),0,r);break;case 5125:n=new Uint32Array(t(4*r),0,r);break;case 5126:n=new Float32Array(t(4*r),0,r);break;default:return null}return n.length!==r?n.subarray(0,r):n},freeType:function(e){r(e.buffer)}}}var z=j();z.zero=j();var B=function(e,t){var r=1;t.ext_texture_filter_anisotropic&&(r=e.getParameter(34047));var n=1,i=1;t.webgl_draw_buffers&&(n=e.getParameter(34852),i=e.getParameter(36063));var a=!!t.oes_texture_float;if(a){var o=e.createTexture();e.bindTexture(3553,o),e.texImage2D(3553,0,6408,1,1,0,6408,5126,null);var s=e.createFramebuffer();if(e.bindFramebuffer(36160,s),e.framebufferTexture2D(36160,36064,3553,o,0),e.bindTexture(3553,null),36053!==e.checkFramebufferStatus(36160))a=!1;else{e.viewport(0,0,1,1),e.clearColor(1,0,0,1),e.clear(16384);var l=z.allocType(5126,4);e.readPixels(0,0,1,1,6408,5126,l),e.getError()?a=!1:(e.deleteFramebuffer(s),e.deleteTexture(o),a=1===l[0]),z.freeType(l)}}var f="undefined"!=typeof navigator&&(/MSIE/.test(navigator.userAgent)||/Trident\//.test(navigator.appVersion)||/Edge/.test(navigator.userAgent)),u=!0;if(!f){var c=e.createTexture(),d=z.allocType(5121,36);e.activeTexture(33984),e.bindTexture(34067,c),e.texImage2D(34069,0,6408,3,3,0,6408,5121,d),z.freeType(d),e.bindTexture(34067,null),e.deleteTexture(c),u=!e.getError()}return{colorBits:[e.getParameter(3410),e.getParameter(3411),e.getParameter(3412),e.getParameter(3413)],depthBits:e.getParameter(3414),stencilBits:e.getParameter(3415),subpixelBits:e.getParameter(3408),extensions:Object.keys(t).filter(function(e){return!!t[e]}),maxAnisotropic:r,maxDrawbuffers:n,maxColorAttachments:i,pointSizeDims:e.getParameter(33901),lineWidthDims:e.getParameter(33902),maxViewportDims:e.getParameter(3386),maxCombinedTextureUnits:e.getParameter(35661),maxCubeMapSize:e.getParameter(34076),maxRenderbufferSize:e.getParameter(34024),maxTextureUnits:e.getParameter(34930),maxTextureSize:e.getParameter(3379),maxAttributes:e.getParameter(34921),maxVertexUniforms:e.getParameter(36347),maxVertexTextureUnits:e.getParameter(35660),maxVaryingVectors:e.getParameter(36348),maxFragmentUniforms:e.getParameter(36349),glsl:e.getParameter(35724),renderer:e.getParameter(7937),vendor:e.getParameter(7936),version:e.getParameter(7938),readFloat:a,npotTextureCube:u}};function R(t){return!!t&&"object"==typeof t&&Array.isArray(t.shape)&&Array.isArray(t.stride)&&"number"==typeof t.offset&&t.shape.length===t.stride.length&&(Array.isArray(t.data)||e(t.data))}var L=function(e){return Object.keys(e).map(function(t){return e[t]})},F=function(e){for(var t=[],r=e;r.length;r=r[0])t.push(r.length);return t},V=function(e,t,r,n){var i=1;if(t.length)for(var a=0;a>>31<<15,a=(n<<1>>>24)-127,o=n>>13&1023;if(a<-24)t[r]=i;else if(a<-14){var s=-14-a;t[r]=i+(o+1024>>s)}else a>15?t[r]=i+31744:t[r]=i+(a+15<<10)+o}return t}function J(t){return Array.isArray(t)||e(t)}var ee=function(e){return!(e&e-1)&&!!e},et=[9984,9986,9985,9987],er=[0,6409,6410,6407,6408],en={};function ei(e){return"[object "+e+"]"}en[6409]=en[6406]=en[6402]=1,en[34041]=en[6410]=2,en[6407]=en[35904]=3,en[6408]=en[35906]=4;var ea=ei("HTMLCanvasElement"),eo=ei("OffscreenCanvas"),es=ei("CanvasRenderingContext2D"),el=ei("ImageBitmap"),ef=ei("HTMLImageElement"),eu=ei("HTMLVideoElement"),ec=Object.keys(N).concat([ea,eo,es,el,ef,eu]),ed=[];ed[5121]=1,ed[5126]=4,ed[36193]=2,ed[5123]=2,ed[5125]=4;var ep=[];function em(e){return Array.isArray(e)&&(0===e.length||"number"==typeof e[0])}function eh(e){return!!Array.isArray(e)&&0!==e.length&&!!J(e[0])}function ey(e){return Object.prototype.toString.call(e)}function ev(e){if(!e)return!1;var t=ey(e);return ec.indexOf(t)>=0||em(e)||eh(e)||R(e)}function eg(e){return 0|N[Object.prototype.toString.call(e)]}function eb(e,t){return z.allocType(36193===e.type?5126:e.type,t)}function ex(e,t){36193===e.type?(e.data=X(t),z.freeType(t)):e.data=t}function ew(e,t,r,n,i,a){var o;if(o=void 0!==ep[e]?ep[e]:en[e]*ed[t],a&&(o*=6),!i)return o*r*n;for(var s=0,l=r;l>=1;)s+=o*l*l,l/=2;return s}ep[32854]=2,ep[32855]=2,ep[36194]=2,ep[34041]=4,ep[33776]=.5,ep[33777]=.5,ep[33778]=1,ep[33779]=1,ep[35986]=.5,ep[35987]=1,ep[34798]=1,ep[35840]=.5,ep[35841]=.25,ep[35842]=.5,ep[35843]=.25,ep[36196]=.5;var eA=[];eA[32854]=2,eA[32855]=2,eA[36194]=2,eA[33189]=2,eA[36168]=1,eA[34041]=4,eA[35907]=4,eA[34836]=16,eA[34842]=8,eA[34843]=6;var eS=function(e,t,r,n,i){var a={rgba4:32854,rgb565:36194,"rgb5 a1":32855,depth:33189,stencil:36168,"depth stencil":34041};t.ext_srgb&&(a.srgba=35907),t.ext_color_buffer_half_float&&(a.rgba16f=34842,a.rgb16f=34843),t.webgl_color_buffer_float&&(a.rgba32f=34836);var o=[];Object.keys(a).forEach(function(e){o[a[e]]=e});var s=0,l={};function f(e){this.id=s++,this.refCount=1,this.renderbuffer=e,this.format=32854,this.width=0,this.height=0,i.profile&&(this.stats={size:0})}function u(t){var r=t.renderbuffer;w(r,"must not double destroy renderbuffer"),e.bindRenderbuffer(36161,null),e.deleteRenderbuffer(r),t.renderbuffer=null,t.refCount=0,delete l[t.id],n.renderbufferCount--}return f.prototype.decRef=function(){--this.refCount<=0&&u(this)},i.profile&&(n.getTotalRenderbufferSize=function(){var e=0;return Object.keys(l).forEach(function(t){e+=l[t].stats.size}),e}),{create:function(t,s){var u=new f(e.createRenderbuffer());function c(t,n){var s,l,f,d=0,p=0,m=32854;if("object"==typeof t&&t){if("shape"in t){var h=t.shape;w(Array.isArray(h)&&h.length>=2,"invalid renderbuffer shape"),d=0|h[0],p=0|h[1]}else"radius"in t&&(d=p=0|t.radius),"width"in t&&(d=0|t.width),"height"in t&&(p=0|t.height);"format"in t&&(w.parameter(t.format,a,"invalid renderbuffer format"),m=a[t.format])}else"number"==typeof t?(d=0|t,p="number"==typeof n?0|n:d):t?w.raise("invalid arguments to renderbuffer constructor"):d=p=1;if(w(d>0&&p>0&&d<=r.maxRenderbufferSize&&p<=r.maxRenderbufferSize,"invalid renderbuffer size"),d!==u.width||p!==u.height||m!==u.format)return c.width=u.width=d,c.height=u.height=p,u.format=m,e.bindRenderbuffer(36161,u.renderbuffer),e.renderbufferStorage(36161,m,d,p),w(0===e.getError(),"invalid render buffer format"),i.profile&&(u.stats.size=(s=u.format,l=u.width,f=u.height,eA[s]*l*f)),c.format=o[u.format],c}return l[u.id]=u,n.renderbufferCount++,c(t,s),c.resize=function(t,n){var a,o,s,l=0|t,f=0|n||l;return l===u.width&&f===u.height?c:(w(l>0&&f>0&&l<=r.maxRenderbufferSize&&f<=r.maxRenderbufferSize,"invalid renderbuffer size"),c.width=u.width=l,c.height=u.height=f,e.bindRenderbuffer(36161,u.renderbuffer),e.renderbufferStorage(36161,u.format,l,f),w(0===e.getError(),"invalid render buffer format"),i.profile&&(u.stats.size=(a=u.format,o=u.width,s=u.height,eA[a]*o*s)),c)},c._reglType="renderbuffer",c._renderbuffer=u,i.profile&&(c.stats=u.stats),c.destroy=function(){u.decRef()},c},clear:function(){L(l).forEach(u)},restore:function(){L(l).forEach(function(t){t.renderbuffer=e.createRenderbuffer(),e.bindRenderbuffer(36161,t.renderbuffer),e.renderbufferStorage(36161,t.format,t.width,t.height)}),e.bindRenderbuffer(36161,null)}}},eE=[6407,6408],eT=[];eT[6408]=4,eT[6407]=3;var ek=[];ek[5121]=1,ek[5126]=4,ek[36193]=2;var e_=[32854,32855,36194,35907,34842,34843,34836],eO={};eO[36053]="complete",eO[36054]="incomplete attachment",eO[36057]="incomplete dimensions",eO[36055]="incomplete, missing attachment",eO[36061]="unsupported";var eC=["attributes","elements","offset","count","primitive","instances"];function eD(){this.state=0,this.x=0,this.y=0,this.z=0,this.w=0,this.buffer=null,this.size=0,this.normalized=!1,this.type=5126,this.offset=0,this.stride=0,this.divisor=0}function eP(e){return Array.prototype.slice.call(e)}function eM(e){return eP(e).join("")}var eI="xyzw".split(""),ej="dither",ez="blend.enable",eB="blend.color",eR="blend.equation",eL="blend.func",eF="depth.enable",eV="depth.func",e$="depth.range",eN="depth.mask",eW="colorMask",eU="cull.enable",eZ="cull.face",eG="frontFace",eq="lineWidth",eH="polygonOffset.enable",eK="polygonOffset.offset",eY="sample.alpha",eQ="sample.enable",eX="sample.coverage",eJ="stencil.enable",e0="stencil.mask",e1="stencil.func",e2="stencil.opFront",e3="stencil.opBack",e5="scissor.enable",e6="scissor.box",e4="viewport",e8="profile",e7="framebuffer",e9="vert",te="frag",tt="elements",tr="primitive",tn="count",ti="offset",ta="instances",to="Width",ts="Height",tl=e7+to,tf=e7+ts,tu=e4+to,tc=e4+ts,td="drawingBuffer",tp=td+to,tm=td+ts,th=[eL,eR,e1,e2,e3,eX,e4,e6,eK],ty={0:0,1:1,zero:0,one:1,"src color":768,"one minus src color":769,"src alpha":770,"one minus src alpha":771,"dst color":774,"one minus dst color":775,"dst alpha":772,"one minus dst alpha":773,"constant color":32769,"one minus constant color":32770,"constant alpha":32771,"one minus constant alpha":32772,"src alpha saturate":776},tv=["constant color, constant alpha","one minus constant color, constant alpha","constant color, one minus constant alpha","one minus constant color, one minus constant alpha","constant alpha, constant color","constant alpha, one minus constant color","one minus constant alpha, constant color","one minus constant alpha, one minus constant color"],tg={never:512,less:513,"<":513,equal:514,"=":514,"==":514,"===":514,lequal:515,"<=":515,greater:516,">":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519},tb={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386},tx={frag:35632,vert:35633},tw={cw:2304,ccw:2305};function tA(t){return Array.isArray(t)||e(t)||R(t)}function tS(e){return e.sort(function(e,t){return e===e4?-1:t===e4?1:e=1,n>=2,t)}if(4===r){var i=e.data;return new tE(i.thisDep,i.contextDep,i.propDep,t)}if(5===r)return new tE(!1,!1,!1,t);if(6!==r)return new tE(3===r,2===r,1===r,t);for(var a=!1,o=!1,s=!1,l=0;l=1&&(o=!0),u>=2&&(s=!0)}else 4===f.type&&(a=a||f.data.thisDep,o=o||f.data.contextDep,s=s||f.data.propDep)}return new tE(a,o,s,t)}var tO=new tE(!1,!1,!1,function(){}),tC=function(e,t){if(!t.ext_disjoint_timer_query)return null;var r=[],n=[];function i(){this.startQueryIndex=-1,this.endQueryIndex=-1,this.sum=0,this.stats=null}var a=[],o=[];function s(e,t,r){var n=a.pop()||new i;n.startQueryIndex=e,n.endQueryIndex=t,n.sum=0,n.stats=r,o.push(n)}var l=[],f=[];return{beginQuery:function(e){var i=r.pop()||t.ext_disjoint_timer_query.createQueryEXT();t.ext_disjoint_timer_query.beginQueryEXT(35007,i),n.push(i),s(n.length-1,n.length,e)},endQuery:function(){t.ext_disjoint_timer_query.endQueryEXT(35007)},pushScopeStats:s,update:function(){var e,i,s=n.length;if(0!==s){f.length=Math.max(f.length,s+1),l.length=Math.max(l.length,s+1),l[0]=0,f[0]=0;var u=0;for(i=0,e=0;i0,"invalid pixel ratio")):w.raise("invalid arguments to regl"),r&&("canvas"===r.nodeName.toLowerCase()?i=r:n=r),!a){if(!i){w("undefined"!=typeof document,"must manually specify webgl context outside of DOM environments");var m=function(e,r,n){var i,a=document.createElement("canvas");function o(){var t=window.innerWidth,r=window.innerHeight;if(e!==document.body){var i=a.getBoundingClientRect();t=i.right-i.left,r=i.bottom-i.top}a.width=n*t,a.height=n*r}return t(a.style,{border:0,margin:0,padding:0,top:0,left:0,width:"100%",height:"100%"}),e.appendChild(a),e===document.body&&(a.style.position="absolute",t(e.style,{margin:0,padding:0})),e!==document.body&&"function"==typeof ResizeObserver?(i=new ResizeObserver(function(){setTimeout(o)})).observe(e):window.addEventListener("resize",o,!1),o(),{canvas:a,onDestroy:function(){i?i.disconnect():window.removeEventListener("resize",o),e.removeChild(a)}}}(n||document.body,0,u);if(!m)return null;i=m.canvas,p=m.onDestroy}void 0===s.premultipliedAlpha&&(s.premultipliedAlpha=!0),a=function(e,t){function r(r){try{return e.getContext(r,t)}catch(e){return null}}return r("webgl")||r("experimental-webgl")||r("webgl-experimental")}(i,s)}return a?{gl:a,canvas:i,container:n,extensions:l,optionalExtensions:f,pixelRatio:u,profile:c,onDone:d,onDestroy:p}:(p(),d("webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org"),null)}(r);if(!a)return null;var o=a.gl,s=o.getContextAttributes(),l=o.isContextLost(),f=function(e,t){var r={};function n(t){w.type(t,"string","extension name must be string");var n,i=t.toLowerCase();try{n=r[i]=e.getExtension(i)}catch(e){}return!!n}for(var i=0;i0)if(Array.isArray(r[0])){for(var s,l=F(r),u=1,c=1;c0)if("number"==typeof t[0]){var a=z.allocType(d.dtype,t.length);q(a,t),m(a,i),z.freeType(a)}else if(Array.isArray(t[0])||e(t[0])){n=F(t);var o=V(t,n,d.dtype);m(o,i),z.freeType(o)}else w.raise("invalid buffer data")}else if(R(t)){n=t.shape;var s=t.stride,l=0,f=0,u=0,c=0;1===n.length?(l=n[0],f=1,u=s[0],c=0):2===n.length?(l=n[0],f=n[1],u=s[0],c=s[1]):w.raise("invalid shape");var h=Array.isArray(t.data)?d.dtype:G(t.data),y=z.allocType(h,l*f);H(y,t.data,l,f,u,c,t.offset),m(y,i),z.freeType(y)}else w.raise("invalid data for buffer subdata");return p},n.profile&&(p.stats=d.stats),p.destroy=function(){c(d)},p},createStream:function(e,t){var r=l.pop();return r||(r=new s(e)),r.bind(),u(r,t,35040,0,1,!1),r},destroyStream:function(e){l.push(e)},clear:function(){L(o).forEach(c),l.forEach(c)},getBuffer:function(e){return e&&e._buffer instanceof s?e._buffer:null},restore:function(){L(o).forEach(function(e){e.buffer=t.createBuffer(),t.bindBuffer(e.type,e.buffer),t.bufferData(e.type,e.persistentData||e.byteLength,e.usage)})},_initBuffer:u}}(o,c,a,function(e){return E.destroyBuffer(e)}),A=function(t,r,n,i){var a={},o=0,s={uint8:5121,uint16:5123};function l(e){this.id=o++,a[this.id]=this,this.buffer=e,this.primType=4,this.vertCount=0,this.type=0}r.oes_element_index_uint&&(s.uint32=5125),l.prototype.bind=function(){this.buffer.bind()};var f=[];function u(i,a,o,s,l,f,u){if(i.buffer.bind(),a){var c,d=u;!u&&(!e(a)||R(a)&&!e(a.data))&&(d=r.oes_element_index_uint?5125:5123),n._initBuffer(i.buffer,a,o,d,3)}else t.bufferData(34963,f,o),i.buffer.dtype=c||5121,i.buffer.usage=o,i.buffer.dimension=3,i.buffer.byteLength=f;if(c=u,!u){switch(i.buffer.dtype){case 5121:case 5120:c=5121;break;case 5123:case 5122:c=5123;break;case 5125:case 5124:c=5125;break;default:w.raise("unsupported type for element array")}i.buffer.dtype=c}i.type=c,w(5125!==c||!!r.oes_element_index_uint,"32 bit element buffers not supported, enable oes_element_index_uint first");var p=l;p<0&&(p=i.buffer.byteLength,5123===c?p>>=1:5125===c&&(p>>=2)),i.vertCount=p;var m=s;if(s<0){m=4;var h=i.buffer.dimension;1===h&&(m=0),2===h&&(m=1),3===h&&(m=4)}i.primType=m}function c(e){i.elementsCount--,w(null!==e.buffer,"must not double destroy elements"),delete a[e.id],e.buffer.destroy(),e.buffer=null}return{create:function(t,r){var a=n.create(null,34963,!0),o=new l(a._buffer);function f(t){if(t)if("number"==typeof t)a(t),o.primType=4,o.vertCount=0|t,o.type=5121;else{var r=null,n=35044,i=-1,l=-1,c=0,d=0;Array.isArray(t)||e(t)||R(t)?r=t:(w.type(t,"object","invalid arguments for elements"),"data"in t&&w(Array.isArray(r=t.data)||e(r)||R(r),"invalid data for element buffer"),"usage"in t&&(w.parameter(t.usage,U,"invalid element buffer usage"),n=U[t.usage]),"primitive"in t&&(w.parameter(t.primitive,K,"invalid element buffer primitive"),i=K[t.primitive]),"count"in t&&(w("number"==typeof t.count&&t.count>=0,"invalid vertex count for elements"),l=0|t.count),"type"in t&&(w.parameter(t.type,s,"invalid buffer type"),d=s[t.type]),"length"in t?c=0|t.length:(c=l,5123===d||5122===d?c*=2:(5125===d||5124===d)&&(c*=4))),u(o,r,n,i,l,c,d)}else a(),o.primType=4,o.vertCount=0,o.type=5121;return f}return i.elementsCount++,f(t),f._reglType="elements",f._elements=o,f.subdata=function(e,t){return a.subdata(e,t),f},f.destroy=function(){c(o)},f},createStream:function(e){var t=f.pop();return t||(t=new l(n.create(null,34963,!0,!1)._buffer)),u(t,e,35040,-1,-1,0,0),t},destroyStream:function(e){f.push(e)},getElements:function(e){return"function"==typeof e&&e._elements instanceof l?e._elements:null},clear:function(){L(a).forEach(c)}}}(o,d,x,c),E=function(t,r,n,i,a,o,s){for(var l=n.maxAttributes,f=Array(l),u=0;u{for(var e=Object.keys(t),r=0;r=0,'invalid option for vao: "'+e[r]+'" valid options are '+eC)}),w(Array.isArray(d),"attributes must be an array")}w(d.length0,"must specify at least one attribute");var f={},u=n.attributes;u.length=d.length;for(var c=0;c=y.byteLength?p.subdata(y):(p.destroy(),n.buffers[c]=null)),n.buffers[c]||(p=n.buffers[c]=a.create(m,34962,!1,!0)),h.buffer=a.getBuffer(p),h.size=0|h.buffer.dimension,h.normalized=!1,h.type=h.buffer.dtype,h.offset=0,h.stride=0,h.divisor=0,h.state=1,f[c]=1):a.getBuffer(m)?(h.buffer=a.getBuffer(m),h.size=0|h.buffer.dimension,h.normalized=!1,h.type=h.buffer.dtype,h.offset=0,h.stride=0,h.divisor=0,h.state=1):a.getBuffer(m.buffer)?(h.buffer=a.getBuffer(m.buffer),h.size=0|(+m.size||h.buffer.dimension),h.normalized=!!m.normalized,"type"in m?(w.parameter(m.type,W,"invalid buffer type"),h.type=W[m.type]):h.type=h.buffer.dtype,h.offset=0|(m.offset||0),h.stride=0|(m.stride||0),h.divisor=0|(m.divisor||0),h.state=1,w(h.size>=1&&h.size<=4,"size must be between 1 and 4"),w(h.offset>=0,"invalid offset"),w(h.stride>=0&&h.stride<=255,"stride must be between 0 and 255"),w(h.divisor>=0,"divisor must be positive"),w(!h.divisor||!!r.angle_instanced_arrays,"ANGLE_instanced_arrays must be enabled to use divisor")):"x"in m?(w(c>0,"first attribute must not be a constant"),h.x=+m.x||0,h.y=+m.y||0,h.z=+m.z||0,h.w=+m.w||0,h.state=2):w(!1,"invalid attribute spec for location "+c)}for(var v=0;v1)for(var v=0;ve&&(e=t.stats.uniformsCount)}),e},n.getMaxAttributesCount=function(){var e=0;return c.forEach(function(t){t.stats.attributesCount>e&&(e=t.stats.attributesCount)}),e}),{clear:function(){var t=e.deleteShader.bind(e);L(a).forEach(t),a={},L(o).forEach(t),o={},c.forEach(function(t){e.deleteProgram(t.program)}),c.length=0,u={},n.shaderCount=0},program:function(r,i,s,l){w.command(r>=0,"missing vertex shader",s),w.command(i>=0,"missing fragment shader",s);var f=u[i];f||(f=u[i]={});var d=f[r];if(d&&(d.refCount++,!l))return d;var h=new p(i,r);return n.shaderCount++,m(h,s,l),d||(f[r]=h),c.push(h),t(h,{destroy:function(){if(h.refCount--,h.refCount<=0){e.deleteProgram(h.program);var t=c.indexOf(h);c.splice(t,1),n.shaderCount--}f[h.vertId].refCount<=0&&(e.deleteShader(o[h.vertId]),delete o[h.vertId],delete u[h.fragId][h.vertId]),Object.keys(u[h.fragId]).length||(e.deleteShader(a[h.fragId]),delete a[h.fragId],delete u[h.fragId])}})},restore:function(){a={},o={};for(var e=0;e=0&&(h[e]=t)});var g=Object.keys(h);i.textureFormats=g;var b=[];Object.keys(h).forEach(function(e){b[h[e]]=e});var x=[];Object.keys(m).forEach(function(e){x[m[e]]=e});var A=[];Object.keys(c).forEach(function(e){A[c[e]]=e});var S=[];Object.keys(d).forEach(function(e){S[d[e]]=e});var E=[];Object.keys(u).forEach(function(e){E[u[e]]=e});var T=g.reduce(function(e,t){var r=h[t];return 6409===r||6406===r||6409===r||6410===r||6402===r||34041===r||n.ext_srgb&&(35904===r||35906===r)?e[r]=r:32855===r||t.indexOf("rgba")>=0?e[r]=6408:e[r]=6407,e},{});function k(){this.internalformat=6408,this.format=6408,this.type=5121,this.compressed=!1,this.premultiplyAlpha=!1,this.flipY=!1,this.unpackAlignment=1,this.colorSpace=37444,this.width=0,this.height=0,this.channels=0}function _(e,t){e.internalformat=t.internalformat,e.format=t.format,e.type=t.type,e.compressed=t.compressed,e.premultiplyAlpha=t.premultiplyAlpha,e.flipY=t.flipY,e.unpackAlignment=t.unpackAlignment,e.colorSpace=t.colorSpace,e.width=t.width,e.height=t.height,e.channels=t.channels}function O(e,t){if("object"==typeof t&&t){if("premultiplyAlpha"in t&&(w.type(t.premultiplyAlpha,"boolean","invalid premultiplyAlpha"),e.premultiplyAlpha=t.premultiplyAlpha),"flipY"in t&&(w.type(t.flipY,"boolean","invalid texture flip"),e.flipY=t.flipY),"alignment"in t&&(w.oneOf(t.alignment,[1,2,4,8],"invalid texture unpack alignment"),e.unpackAlignment=t.alignment),"colorSpace"in t&&(w.parameter(t.colorSpace,p,"invalid colorSpace"),e.colorSpace=p[t.colorSpace]),"type"in t){var r=t.type;w(n.oes_texture_float||"float"!==r&&"float32"!==r,"you must enable the OES_texture_float extension in order to use floating point textures."),w(n.oes_texture_half_float||"half float"!==r&&"float16"!==r,"you must enable the OES_texture_half_float extension in order to use 16-bit floating point textures."),w(n.webgl_depth_texture||"uint16"!==r&&"uint32"!==r&&"depth stencil"!==r,"you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures."),w.parameter(r,m,"invalid texture type"),e.type=m[r]}var a=e.width,o=e.height,s=e.channels,l=!1;"shape"in t?(w(Array.isArray(t.shape)&&t.shape.length>=2,"shape must be an array"),a=t.shape[0],o=t.shape[1],3===t.shape.length&&(w((s=t.shape[2])>0&&s<=4,"invalid number of channels"),l=!0),w(a>=0&&a<=i.maxTextureSize,"invalid width"),w(o>=0&&o<=i.maxTextureSize,"invalid height")):("radius"in t&&w((a=o=t.radius)>=0&&a<=i.maxTextureSize,"invalid radius"),"width"in t&&w((a=t.width)>=0&&a<=i.maxTextureSize,"invalid width"),"height"in t&&w((o=t.height)>=0&&o<=i.maxTextureSize,"invalid height"),"channels"in t&&(w((s=t.channels)>0&&s<=4,"invalid number of channels"),l=!0)),e.width=0|a,e.height=0|o,e.channels=0|s;var f=!1;if("format"in t){var u=t.format;w(n.webgl_depth_texture||"depth"!==u&&"depth stencil"!==u,"you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures."),w.parameter(u,h,"invalid texture format");var c=e.internalformat=h[u];e.format=T[c],u in m&&!("type"in t)&&(e.type=m[u]),u in y&&(e.compressed=!0),f=!0}!l&&f?e.channels=en[e.format]:l&&!f?e.channels!==er[e.format]&&(e.format=e.internalformat=er[e.channels]):f&&l&&w(e.channels===en[e.format],"number of channels inconsistent with specified format")}}function C(e){r.pixelStorei(37440,e.flipY),r.pixelStorei(37441,e.premultiplyAlpha),r.pixelStorei(37443,e.colorSpace),r.pixelStorei(3317,e.unpackAlignment)}function D(){k.call(this),this.xOffset=0,this.yOffset=0,this.data=null,this.needsFree=!1,this.element=null,this.needsCopy=!1}function P(t,r){var n=null;if(ev(r)?n=r:r&&(w.type(r,"object","invalid pixel data type"),O(t,r),"x"in r&&(t.xOffset=0|r.x),"y"in r&&(t.yOffset=0|r.y),ev(r.data)&&(n=r.data)),w(!t.compressed||n instanceof Uint8Array,"compressed texture data must be stored in a uint8array"),r.copy){w(!n,"can not specify copy and data field for the same texture");var a=o.viewportWidth,s=o.viewportHeight;t.width=t.width||a-t.xOffset,t.height=t.height||s-t.yOffset,t.needsCopy=!0,w(t.xOffset>=0&&t.xOffset=0&&t.yOffset0&&t.width<=a&&t.height>0&&t.height<=s,"copy texture read out of bounds")}else if(n){if(e(n))t.channels=t.channels||4,t.data=n,"type"in r||5121!==t.type||(t.type=eg(n));else if(em(n)){t.channels=t.channels||4;var l=n,f=l.length;switch(t.type){case 5121:case 5123:case 5125:case 5126:var u=z.allocType(t.type,f);u.set(l),t.data=u;break;case 36193:t.data=X(l);break;default:w.raise("unsupported texture type, must specify a typed array")}t.alignment=1,t.needsFree=!0}else if(R(n)){var c,d,p,m,h,y,v=n.data;Array.isArray(v)||5121!==t.type||(t.type=eg(v));var g=n.shape,b=n.stride;3===g.length?(p=g[2],y=b[2]):(w(2===g.length,"invalid ndarray pixel data, must be 2 or 3D"),p=1,y=1),c=g[0],d=g[1],m=b[0],h=b[1],t.alignment=1,t.width=c,t.height=d,t.channels=p,t.format=t.internalformat=er[p],t.needsFree=!0,function(e,t,r,n,i,a){for(var o=e.width,s=e.height,l=e.channels,f=eb(e,o*s*l),u=0,c=0;c=0,"oes_texture_float extension not enabled"):36193===t.type&&w(i.extensions.indexOf("oes_texture_half_float")>=0,"oes_texture_half_float extension not enabled")}function M(e,t,n,i,o){var s=e.element,l=e.data,f=e.internalformat,u=e.format,c=e.type,d=e.width,p=e.height;C(e),s?r.texSubImage2D(t,o,n,i,u,c,s):e.compressed?r.compressedTexSubImage2D(t,o,n,i,f,d,p,l):e.needsCopy?(a(),r.copyTexSubImage2D(t,o,n,i,e.xOffset,e.yOffset,d,p)):r.texSubImage2D(t,o,n,i,d,p,u,c,l)}var I=[];function j(){return I.pop()||new D}function B(e){e.needsFree&&z.freeType(e.data),D.call(e),I.push(e)}function $(){k.call(this),this.genMipmaps=!1,this.mipmapHint=4352,this.mipmask=0,this.images=Array(16)}function N(e,t,r){var n=e.images[0]=j();e.mipmask=1,n.width=e.width=t,n.height=e.height=r,n.channels=e.channels=4}function W(e,t){var r=null;if(ev(t))_(r=e.images[0]=j(),e),P(r,t),e.mipmask=1;else if(O(e,t),Array.isArray(t.mipmap))for(var n=t.mipmap,i=0;i>=i,r.height>>=i,P(r,n[i]),e.mipmask|=1<=0)||"faces"in t||(e.genMipmaps=!0)}if("mag"in t){var n=t.mag;w.parameter(n,c),e.magFilter=c[n]}var a=e.wrapS,o=e.wrapT;if("wrap"in t){var s=t.wrap;"string"==typeof s?(w.parameter(s,u),a=o=u[s]):Array.isArray(s)&&(w.parameter(s[0],u),w.parameter(s[1],u),a=u[s[0]],o=u[s[1]])}else{if("wrapS"in t){var l=t.wrapS;w.parameter(l,u),a=u[l]}if("wrapT"in t){var p=t.wrapT;w.parameter(p,u),o=u[p]}}if(e.wrapS=a,e.wrapT=o,"anisotropic"in t){var m=t.anisotropic;w("number"==typeof m&&m>=1&&m<=i.maxAnisotropic,"aniso samples must be between 1 and "),e.anisotropic=t.anisotropic}if("mipmap"in t){var h=!1;switch(typeof t.mipmap){case"string":w.parameter(t.mipmap,f,"invalid mipmap hint"),e.mipmapHint=f[t.mipmap],e.genMipmaps=!0,h=!0;break;case"boolean":h=e.genMipmaps=t.mipmap;break;case"object":w(Array.isArray(t.mipmap),"invalid mipmap type"),e.genMipmaps=!1,h=!0;break;default:w.raise("invalid mipmap type")}!h||"min"in t||(e.minFilter=9984)}}function Y(e,t){r.texParameteri(t,10241,e.minFilter),r.texParameteri(t,10240,e.magFilter),r.texParameteri(t,10242,e.wrapS),r.texParameteri(t,10243,e.wrapT),n.ext_texture_filter_anisotropic&&r.texParameteri(t,34046,e.anisotropic),e.genMipmaps&&(r.hint(33170,e.mipmapHint),r.generateMipmap(t))}var Q=0,ei={},ec=i.maxTextureUnits,ed=Array(ec).map(function(){return null});function ep(e){k.call(this),this.mipmask=0,this.internalformat=6408,this.id=Q++,this.refCount=1,this.target=e,this.texture=r.createTexture(),this.unit=-1,this.bindCount=0,this.texInfo=new H,l.profile&&(this.stats={size:0})}function eA(e){r.activeTexture(33984),r.bindTexture(e.target,e.texture)}function eS(){var e=ed[0];e?r.bindTexture(e.target,e.texture):r.bindTexture(3553,null)}function eE(e){var t=e.texture;w(t,"must not double destroy texture");var n=e.unit,i=e.target;n>=0&&(r.activeTexture(33984+n),r.bindTexture(i,null),ed[n]=null),r.deleteTexture(t),e.texture=null,e.params=null,e.pixels=null,e.refCount=0,delete ei[e.id],s.textureCount--}return t(ep.prototype,{bind:function(){this.bindCount+=1;var e=this.unit;if(e<0){for(var t=0;t0)continue;n.unit=-1}ed[t]=this,e=t;break}e>=ec&&w.raise("insufficient number of texture units"),l.profile&&s.maxTextureUnits>l)-o,f.height=f.height||(n.height>>l)-s,w(n.type===f.type&&n.format===f.format&&n.internalformat===f.internalformat,"incompatible format for texture.subimage"),w(o>=0&&s>=0&&o+f.width<=n.width&&s+f.height<=n.height,"texture.subimage write out of bounds"),w(n.mipmask&1<>s;++s){var f=i>>s,u=o>>s;if(!f||!u)break;r.texImage2D(3553,s,n.format,f,u,0,n.format,n.type,null)}return eS(),l.profile&&(n.stats.size=ew(n.internalformat,n.type,i,o,!1,!1)),a},a._reglType="texture2d",a._texture=n,l.profile&&(a.stats=n.stats),a.destroy=function(){n.decRef()},a},createCube:function(e,t,n,a,o,f){var u=new ep(34067);ei[u.id]=u,s.cubeCount++;var c=Array(6);function d(e,t,r,n,a,o){var s,f=u.texInfo;for(H.call(f),s=0;s<6;++s)c[s]=G();if("number"!=typeof e&&e)if("object"==typeof e)if(t)W(c[0],e),W(c[1],t),W(c[2],r),W(c[3],n),W(c[4],a),W(c[5],o);else if(K(f,e),O(u,e),"faces"in e){var p=e.faces;for(w(Array.isArray(p)&&6===p.length,"cube faces must be a length 6 array"),s=0;s<6;++s)w("object"==typeof p[s]&&!!p[s],"invalid input for cube map face"),_(c[s],u),W(c[s],p[s])}else for(s=0;s<6;++s)W(c[s],e);else w.raise("invalid arguments to cube map");else{var m=0|e||1;for(s=0;s<6;++s)N(c[s],m,m)}for(_(u,c[0]),w.optional(function(){i.npotTextureCube||w(ee(u.width)&&ee(u.height),"your browser does not support non power or two texture dimensions")}),f.genMipmaps?u.mipmask=(c[0].width<<1)-1:u.mipmask=c[0].mipmask,w.textureCube(u,f,c,i),u.internalformat=c[0].internalformat,d.width=c[0].width,d.height=c[0].height,eA(u),s=0;s<6;++s)U(c[s],34069+s);for(Y(f,34067),eS(),l.profile&&(u.stats.size=ew(u.internalformat,u.type,d.width,d.height,f.genMipmaps,!0)),d.format=b[u.internalformat],d.type=x[u.type],d.mag=A[f.magFilter],d.min=S[f.minFilter],d.wrapS=E[f.wrapS],d.wrapT=E[f.wrapT],s=0;s<6;++s)q(c[s]);return d}return d(e,t,n,a,o,f),d.subimage=function(e,t,r,n,i){w(!!t,"must specify image data"),w("number"==typeof e&&e===(0|e)&&e>=0&&e<6,"invalid face");var a=0|r,o=0|n,s=0|i,l=j();return _(l,u),l.width=0,l.height=0,P(l,t),l.width=l.width||(u.width>>s)-a,l.height=l.height||(u.height>>s)-o,w(u.type===l.type&&u.format===l.format&&u.internalformat===l.internalformat,"incompatible format for texture.subimage"),w(a>=0&&o>=0&&a+l.width<=u.width&&o+l.height<=u.height,"texture.subimage write out of bounds"),w(u.mipmask&1<>i;++i)r.texImage2D(34069+n,i,u.format,t>>i,t>>i,0,u.format,u.type,null);return eS(),l.profile&&(u.stats.size=ew(u.internalformat,u.type,d.width,d.height,!1,!0)),d}},d._reglType="textureCube",d._texture=u,l.profile&&(d.stats=u.stats),d.destroy=function(){u.decRef()},d},clear:function(){for(var e=0;e>t,e.height>>t,0,e.internalformat,e.type,null);else for(var n=0;n<6;++n)r.texImage2D(34069+n,t,e.internalformat,e.width>>t,e.height>>t,0,e.internalformat,e.type,null);Y(e.texInfo,e.target)})},refresh:function(){for(var e=0;e=34069&&t<34075,"invalid cube map target")):"renderbuffer"===a?(n=i,t=36161):w.raise("invalid regl object for attachment"),new c(t,r,n)}function y(e,t,r,n,o){if(r){var s=i.create2D({width:e,height:t,format:n,type:o});return s._texture.refCount=0,new c(3553,s,null)}var l=a.create({width:e,height:t,format:n});return l._renderbuffer.refCount=0,new c(36161,null,l)}function v(e){return e&&(e.texture||e.renderbuffer)}function g(e,t,r){e&&(e.texture?e.texture.resize(t,r):e.renderbuffer&&e.renderbuffer.resize(t,r),e.width=t,e.height=r)}r.oes_texture_half_float&&u.push("half float","float16"),r.oes_texture_float&&u.push("float","float32");var b=0,x={};function A(){this.id=b++,x[this.id]=this,this.framebuffer=e.createFramebuffer(),this.width=0,this.height=0,this.colorAttachments=[],this.depthAttachment=null,this.stencilAttachment=null,this.depthStencilAttachment=null}function S(e){e.colorAttachments.forEach(d),d(e.depthAttachment),d(e.stencilAttachment),d(e.depthStencilAttachment)}function E(t){var r=t.framebuffer;w(r,"must not double destroy framebuffer"),e.deleteFramebuffer(r),t.framebuffer=null,o.framebufferCount--,delete x[t.id]}function T(t){e.bindFramebuffer(36160,t.framebuffer);var r,i=t.colorAttachments;for(r=0;r=2,"invalid shape for framebuffer"),o=P[0],d=P[1]}else"radius"in e&&(o=d=e.radius),"width"in e&&(o=e.width),"height"in e&&(d=e.height);("color"in e||"colors"in e)&&Array.isArray(b=e.color||e.colors)&&w(1===b.length||r.webgl_draw_buffers,"multiple render targets not supported"),!b&&("colorCount"in e&&w((k=0|e.colorCount)>0,"invalid color buffer count"),"colorTexture"in e&&(x=!!e.colorTexture,A="rgba4"),"colorType"in e&&(E=e.colorType,x?(w(r.oes_texture_float||"float"!==E&&"float32"!==E,"you must enable OES_texture_float in order to use floating point framebuffer objects"),w(r.oes_texture_half_float||"half float"!==E&&"float16"!==E,"you must enable OES_texture_half_float in order to use 16-bit floating point framebuffer objects")):"half float"===E||"float16"===E?(w(r.ext_color_buffer_half_float,"you must enable EXT_color_buffer_half_float to use 16-bit render buffers"),A="rgba16f"):("float"===E||"float32"===E)&&(w(r.webgl_color_buffer_float,"you must enable WEBGL_color_buffer_float in order to use 32-bit floating point renderbuffers"),A="rgba32f"),w.oneOf(E,u,"invalid color type")),"colorFormat"in e&&(A=e.colorFormat,l.indexOf(A)>=0?x=!0:f.indexOf(A)>=0?x=!1:w.optional(function(){x?w.oneOf(e.colorFormat,l,"invalid color format for texture"):w.oneOf(e.colorFormat,f,"invalid color format for renderbuffer")}))),("depthTexture"in e||"depthStencilTexture"in e)&&w(!(D=!!(e.depthTexture||e.depthStencilTexture))||r.webgl_depth_texture,"webgl_depth_texture extension not supported"),"depth"in e&&("boolean"==typeof e.depth?m=e.depth:(_=e.depth,g=!1)),"stencil"in e&&("boolean"==typeof e.stencil?g=e.stencil:(O=e.stencil,m=!1)),"depthStencil"in e&&("boolean"==typeof e.depthStencil?m=g=e.depthStencil:(C=e.depthStencil,m=!1,g=!1))}else o=d=1;var M=null,I=null,j=null,z=null;if(Array.isArray(b))M=b.map(h);else if(b)M=[h(b)];else for(i=0,M=Array(k);i=0||M[i].renderbuffer&&e_.indexOf(M[i].renderbuffer._renderbuffer.format)>=0,"framebuffer color attachment "+i+" is invalid"),M[i]&&M[i].texture){var R=eT[M[i].texture._texture.format]*ek[M[i].texture._texture.type];null===B?B=R:w(B===R,"all color attachments much have the same number of bits per pixel.")}return p(I,o,d),w(!I||I.texture&&6402===I.texture._texture.format||I.renderbuffer&&33189===I.renderbuffer._renderbuffer.format,"invalid depth attachment for framebuffer object"),p(j,o,d),w(!j||j.renderbuffer&&36168===j.renderbuffer._renderbuffer.format,"invalid stencil attachment for framebuffer object"),p(z,o,d),w(!z||z.texture&&34041===z.texture._texture.format||z.renderbuffer&&34041===z.renderbuffer._renderbuffer.format,"invalid depth-stencil attachment for framebuffer object"),S(a),a.width=o,a.height=d,a.colorAttachments=M,a.depthAttachment=I,a.stencilAttachment=j,a.depthStencilAttachment=z,c.color=M.map(v),c.depth=v(I),c.stencil=v(j),c.depthStencil=v(z),c.width=a.width,c.height=a.height,T(a),c}return o.framebufferCount++,c(e,i),t(c,{resize:function(e,t){w(s.next!==a,"can not resize a framebuffer which is currently in use");var r=Math.max(0|e,1),n=Math.max(0|t||r,1);if(r===a.width&&n===a.height)return c;for(var i=a.colorAttachments,o=0;oa.indexOf(s.next),"can not update framebuffer which is currently in use");var n,f,c={color:null},d=0,p=null,m="rgba",h="uint8",y=1;if("number"==typeof e)d=0|e;else if(e){if(w.type(e,"object","invalid arguments for framebuffer"),"shape"in e){var v=e.shape;w(Array.isArray(v)&&v.length>=2,"invalid shape for framebuffer"),w(v[0]===v[1],"cube framebuffer must be square"),d=v[0]}else"radius"in e&&(d=0|e.radius),"width"in e?(d=0|e.width,"height"in e&&w(e.height===d,"must be square")):"height"in e&&(d=0|e.height);("color"in e||"colors"in e)&&Array.isArray(p=e.color||e.colors)&&w(1===p.length||r.webgl_draw_buffers,"multiple render targets not supported"),!p&&("colorCount"in e&&w((y=0|e.colorCount)>0,"invalid color buffer count"),"colorType"in e&&(w.oneOf(e.colorType,u,"invalid color type"),h=e.colorType),"colorFormat"in e&&(m=e.colorFormat,w.oneOf(e.colorFormat,l,"invalid color format for texture"))),"depth"in e&&(c.depth=e.depth),"stencil"in e&&(c.stencil=e.stencil),"depthStencil"in e&&(c.depthStencil=e.depthStencil)}else d=1;if(p)if(Array.isArray(p))for(n=0,f=[];n0&&(c.depth=a[0].depth,c.stencil=a[0].stencil,c.depthStencil=a[0].depthStencil),a[n]?a[n](c):a[n]=k(c)}return t(o,{width:d,height:d,color:f})}return o(e),t(o,{faces:a,resize:function(e){var t,r=0|e;if(w(r>0&&r<=n.maxCubeMapSize,"invalid radius for cube fbo"),r===o.width)return o;var i=o.color;for(t=0;t0&&(r.push(t,"="),r.push.apply(r,eP(arguments)),r.push(";")),t},toString:function(){return eM([n.length>0?"var "+n.join(",")+";":"",eM(r)])}})}function a(){var e=i(),r=i(),n=e.toString,a=r.toString;function o(t,n){r(t,n,"=",e.def(t,n),";")}return t(function(){e.apply(e,eP(arguments))},{def:e.def,entry:e,exit:r,save:o,set:function(t,r,n){o(t,r),e(t,r,"=",n,";")},toString:function(){return n()+a()}})}var o=i(),s={};return{global:o,link:function(t){for(var i=0;i1){for(var k=[],_=[],O=0;O=0","missing vertex count")})):(s=f.def(m,".",tn),w.optional(function(){e.assert(f,s+">=0","missing vertex count")})),s);if("number"==typeof S){if(0===S)return}else r("if(",S,"){"),r.exit("}");g&&(u=v(ta),c=e.instancing);var E=y+".type",T=h.elements&&tT(h.elements)&&!h.vaoActive;function k(){function e(){r(c,".drawElementsInstancedANGLE(",[b,S,E,A+"<<(("+E+"-5121)>>1)",u],");")}function t(){r(c,".drawArraysInstancedANGLE(",[b,A,S,u],");")}y&&"null"!==y?T?e():(r("if(",y,"){"),e(),r("}else{"),t(),r("}")):t()}function _(){function e(){r(p+".drawElements("+[b,S,E,A+"<<(("+E+"-5121)>>1)"]+");")}function t(){r(p+".drawArrays("+[b,A,S]+");")}y&&"null"!==y?T?e():(r("if(",y,"){"),e(),r("}else{"),t(),r("}")):t()}g&&("number"!=typeof u||u>=0)?"string"==typeof u?(r("if(",u,">0){"),k(),r("}else if(",u,"<0){"),_(),r("}")):k():_()}function H(e,t,r,n,i){var a=R(),o=a.proc("body",i);return w.optional(function(){a.commandStr=t.commandStr,a.command=a.link(t.commandStr)}),g&&(a.instancing=o.def(a.shared.extensions,".angle_instanced_arrays")),e(a,o,r,n),a.compile().body}function Y(e,t,r,n){N(e,t),r.useVAO?r.drawVAO?t(e.shared.vao,".setVAO(",r.drawVAO.append(e,t),");"):t(e.shared.vao,".setVAO(",e.shared.vao,".targetVAO);"):(t(e.shared.vao,".setVAO(null);"),Z(e,t,r,n.attributes,function(){return!0})),G(e,t,r,n.uniforms,function(){return!0},!1),q(e,t,t,r)}function Q(e,t,r,n){function i(){return!0}e.batchId="a1",N(e,t),Z(e,t,r,n.attributes,i),G(e,t,r,n.uniforms,i,!1),q(e,t,t,r)}function X(e,t,r,n){N(e,t);var i=r.contextDep,a=t.def(),o=t.def();e.shared.props=o,e.batchId=a;var s=e.scope(),l=e.scope();function f(e){return e.contextDep&&i||e.propDep}function u(e){return!f(e)}if(t(s.entry,"for(",a,"=0;",a,"<","a1",";++",a,"){",o,"=","a0","[",a,"];",l,"}",s.exit),r.needsContext&&L(e,l,r.context),r.needsFramebuffer&&F(e,l,r.framebuffer),$(e,l,r.state,f),r.profile&&f(r.profile)&&U(e,l,r,!1,!0),n)r.useVAO?r.drawVAO?f(r.drawVAO)?l(e.shared.vao,".setVAO(",r.drawVAO.append(e,l),");"):s(e.shared.vao,".setVAO(",r.drawVAO.append(e,s),");"):s(e.shared.vao,".setVAO(",e.shared.vao,".targetVAO);"):(s(e.shared.vao,".setVAO(null);"),Z(e,s,r,n.attributes,u),Z(e,l,r,n.attributes,f)),G(e,s,r,n.uniforms,u,!1),G(e,l,r,n.uniforms,f,!0),q(e,s,l,r);else{var c=e.global.def("{}"),d=r.shader.progVar.append(e,l),p=l.def(d,".id"),m=l.def(c,"[",p,"]");l(e.shared.gl,".useProgram(",d,".program);","if(!",m,"){",m,"=",c,"[",p,"]=",e.link(function(t){return H(Q,e,r,t,2)}),"(",d,");}",m,".call(this,a0[",a,"],",a,");")}}function ee(e,t,r){var n=t.static[r];if(n&&function(e){if(!("object"!=typeof e||J(e))){for(var t=Object.keys(e),r=0;r=0,'unknown parameter "'+t+'"',d.commandStr)})}t(P),t(I)});var j=function(e,t){var r=e.static;if("string"==typeof r[te]&&"string"==typeof r[e9]){if(Object.keys(t.dynamic).length>0)return null;var n=t.static,i=Object.keys(n);if(i.length>0&&"number"==typeof n[i[0]]){for(var a=[],o=0;o=0,"invalid "+e,r.commandStr)):l=!1,"height"in s?(o=0|s.height,w.command(o>=0,"invalid "+e,r.commandStr)):l=!1,new tE(!l&&t&&t.thisDep,!l&&t&&t.contextDep,!l&&t&&t.propDep,function(e,t){var r=e.shared.context,n=a;"width"in s||(n=t.def(r,".",tl,"-",f));var i=o;return"height"in s||(i=t.def(r,".",tf,"-",u)),[f,u,n,i]})}if(e in i){var c=i[e],d=t_(c,function(t,r){var n=t.invoke(r,c);w.optional(function(){t.assert(r,n+"&&typeof "+n+'==="object"',"invalid "+e)});var i=t.shared.context,a=r.def(n,".x|0"),o=r.def(n,".y|0"),s=r.def('"width" in ',n,"?",n,".width|0:","(",i,".",tl,"-",a,")"),l=r.def('"height" in ',n,"?",n,".height|0:","(",i,".",tf,"-",o,")");return w.optional(function(){t.assert(r,s+">=0&&"+l+">=0","invalid "+e)}),[a,o,s,l]});return t&&(d.thisDep=d.thisDep||t.thisDep,d.contextDep=d.contextDep||t.contextDep,d.propDep=d.propDep||t.propDep),d}return t?new tE(t.thisDep,t.contextDep,t.propDep,function(e,t){var r=e.shared.context;return[0,0,t.def(r,".",tl),t.def(r,".",tf)]}):null}var o=a(e4);if(o){var s=o;o=new tE(o.thisDep,o.contextDep,o.propDep,function(e,t){var r=s.append(e,t),n=e.shared.context;return t.set(n,"."+tu,r[2]),t.set(n,"."+tc,r[3]),r})}return{viewport:o,scissor_box:a(e6)}}(e,z,d),R=function(e,t){var r=e.static,n=e.dynamic,i={},a=!1,s=function(){if("vao"in r){var e=r.vao;return null!==e&&null===u.getVAO(e)&&(e=u.createVAO(e)),a=!0,i.vao=e,tk(function(t){var r=u.getVAO(e);return r?t.link(r):"null"})}if("vao"in n){a=!0;var t=n.vao;return t_(t,function(e,r){var n=e.invoke(r,t);return r.def(e.shared.vao+".getVAO("+n+")")})}return null}(),l=!1,f=function(){if(tt in r){var e=r[tt];if(i.elements=e,tA(e)){var f=i.elements=o.create(e,!0);e=o.getElements(f),l=!0}else e&&(e=o.getElements(e),l=!0,w.command(e,"invalid elements",t.commandStr));var u=tk(function(t,r){if(e){var n=t.link(e);return t.ELEMENTS=n,n}return t.ELEMENTS=null,null});return u.value=e,u}if(tt in n){l=!0;var c=n[tt];return t_(c,function(e,t){var r=e.shared,n=r.isBufferArgs,i=r.elements,a=e.invoke(t,c),o=t.def("null"),s=t.def(n,"(",a,")"),l=e.cond(s).then(o,"=",i,".createStream(",a,");").else(o,"=",i,".getElements(",a,");");return w.optional(function(){e.assert(l.else,"!"+a+"||"+o,"invalid elements")}),t.entry(l),t.exit(e.cond(s).then(i,".destroyStream(",o,");")),e.ELEMENTS=o,o})}return a?new tE(s.thisDep,s.contextDep,s.propDep,function(e,t){return t.def(e.shared.vao+".currentVAO?"+e.shared.elements+".getElements("+e.shared.vao+".currentVAO.elements):null")}):null}();function c(e,o){if(e in r){var f=0|r[e];return o?i.offset=f:i.instances=f,w.command(!o||f>=0,"invalid "+e,t.commandStr),tk(function(e,t){return o&&(e.OFFSET=f),f})}if(e in n){var u=n[e];return t_(u,function(t,r){var n=t.invoke(r,u);return o&&(t.OFFSET=n,w.optional(function(){t.assert(r,n+">=0","invalid "+e)})),n})}if(o){if(l)return tk(function(e,t){return e.OFFSET=0,0});else if(a)return new tE(s.thisDep,s.contextDep,s.propDep,function(e,t){return t.def(e.shared.vao+".currentVAO?"+e.shared.vao+".currentVAO.offset:0")})}else if(a)return new tE(s.thisDep,s.contextDep,s.propDep,function(e,t){return t.def(e.shared.vao+".currentVAO?"+e.shared.vao+".currentVAO.instances:-1")});return null}var d=c(ti,!0),p=function(){if(tr in r){var e=r[tr];return i.primitive=e,w.commandParameter(e,K,"invalid primitve",t.commandStr),tk(function(t,r){return K[e]})}if(tr in n){var o=n[tr];return t_(o,function(e,t){var r=e.constants.primTypes,n=e.invoke(t,o);return w.optional(function(){e.assert(t,n+" in "+r,"invalid primitive, must be one of "+Object.keys(K))}),t.def(r,"[",n,"]")})}if(l)if(!tT(f))return new tE(f.thisDep,f.contextDep,f.propDep,function(e,t){var r=e.ELEMENTS;return t.def(r,"?",r,".primType:",4)});else if(f.value)return tk(function(e,t){return t.def(e.ELEMENTS,".primType")});else return tk(function(){return 4});return a?new tE(s.thisDep,s.contextDep,s.propDep,function(e,t){return t.def(e.shared.vao+".currentVAO?"+e.shared.vao+".currentVAO.primitive:4")}):null}(),m=function(){if(tn in r){var e=0|r[tn];return i.count=e,w.command("number"==typeof e&&e>=0,"invalid vertex count",t.commandStr),tk(function(){return e})}if(tn in n){var o=n[tn];return t_(o,function(e,t){var r=e.invoke(t,o);return w.optional(function(){e.assert(t,"typeof "+r+'==="number"&&'+r+">=0&&"+r+"===("+r+"|0)","invalid vertex count")}),r})}if(l)if(tT(f))if(f)if(d)return new tE(d.thisDep,d.contextDep,d.propDep,function(e,t){var r=t.def(e.ELEMENTS,".vertCount-",e.OFFSET);return w.optional(function(){e.assert(t,r+">=0","invalid vertex offset/element buffer too small")}),r});else return tk(function(e,t){return t.def(e.ELEMENTS,".vertCount")});else{var u=tk(function(){return -1});return w.optional(function(){u.MISSING=!0}),u}else{var c=new tE(f.thisDep||d.thisDep,f.contextDep||d.contextDep,f.propDep||d.propDep,function(e,t){var r=e.ELEMENTS;return e.OFFSET?t.def(r,"?",r,".vertCount-",e.OFFSET,":-1"):t.def(r,"?",r,".vertCount:-1")});return w.optional(function(){c.DYNAMIC=!0}),c}return a?new tE(s.thisDep,s.contextDep,s.propDep,function(e,t){return t.def(e.shared.vao,".currentVAO?",e.shared.vao,".currentVAO.count:-1")}):null}();return{elements:f,primitive:p,count:m,instances:c(ta,!1),offset:d,vao:s,vaoActive:a,elementsActive:l,static:i}}(e,d),L=(p=e.static,m=e.dynamic,h={},T.forEach(function(e){var t=D(e);function r(r,n){if(e in p){var i=r(p[e]);h[t]=tk(function(){return i})}else if(e in m){var a=m[e];h[t]=t_(a,function(e,t){return n(e,t,e.invoke(t,a))})}}switch(e){case eU:case ez:case ej:case eJ:case eF:case e5:case eH:case eY:case eQ:case eN:return r(function(t){return w.commandType(t,"boolean",e,d.commandStr),t},function(t,r,n){return w.optional(function(){t.assert(r,"typeof "+n+'==="boolean"',"invalid flag "+e,t.commandStr)}),n});case eV:return r(function(t){return w.commandParameter(t,tg,"invalid "+e,d.commandStr),tg[t]},function(t,r,n){var i=t.constants.compareFuncs;return w.optional(function(){t.assert(r,n+" in "+i,"invalid "+e+", must be one of "+Object.keys(tg))}),r.def(i,"[",n,"]")});case e$:return r(function(e){return w.command(J(e)&&2===e.length&&"number"==typeof e[0]&&"number"==typeof e[1]&&e[0]<=e[1],"depth range is 2d array",d.commandStr),e},function(e,t,r){return w.optional(function(){e.assert(t,e.shared.isArrayLike+"("+r+")&&"+r+".length===2&&typeof "+r+'[0]==="number"&&typeof '+r+'[1]==="number"&&'+r+"[0]<="+r+"[1]","depth range must be a 2d array")}),[t.def("+",r,"[0]"),t.def("+",r,"[1]")]});case eL:return r(function(e){w.commandType(e,"object","blend.func",d.commandStr);var r="srcRGB"in e?e.srcRGB:e.src,n="srcAlpha"in e?e.srcAlpha:e.src,i="dstRGB"in e?e.dstRGB:e.dst,a="dstAlpha"in e?e.dstAlpha:e.dst;return w.commandParameter(r,ty,t+".srcRGB",d.commandStr),w.commandParameter(n,ty,t+".srcAlpha",d.commandStr),w.commandParameter(i,ty,t+".dstRGB",d.commandStr),w.commandParameter(a,ty,t+".dstAlpha",d.commandStr),w.command(-1===tv.indexOf(r+", "+i),"unallowed blending combination (srcRGB, dstRGB) = ("+r+", "+i+")",d.commandStr),[ty[r],ty[i],ty[n],ty[a]]},function(t,r,n){var i=t.constants.blendFuncs;function a(a,o){var s=r.def('"',a,o,'" in ',n,"?",n,".",a,o,":",n,".",a);return w.optional(function(){t.assert(r,s+" in "+i,"invalid "+e+"."+a+o+", must be one of "+Object.keys(ty))}),s}w.optional(function(){t.assert(r,n+"&&typeof "+n+'==="object"',"invalid blend func, must be an object")});var o=a("src","RGB"),s=a("dst","RGB");w.optional(function(){var e=t.constants.invalidBlendCombinations;t.assert(r,e+".indexOf("+o+'+", "+'+s+") === -1 ","unallowed blending combination for (srcRGB, dstRGB)")});var l=r.def(i,"[",o,"]"),f=r.def(i,"[",a("src","Alpha"),"]");return[l,r.def(i,"[",s,"]"),f,r.def(i,"[",a("dst","Alpha"),"]")]});case eR:return r(function(t){return"string"==typeof t?(w.commandParameter(t,v,"invalid "+e,d.commandStr),[v[t],v[t]]):"object"==typeof t?(w.commandParameter(t.rgb,v,e+".rgb",d.commandStr),w.commandParameter(t.alpha,v,e+".alpha",d.commandStr),[v[t.rgb],v[t.alpha]]):void w.commandRaise("invalid blend.equation",d.commandStr)},function(t,r,n){var i=t.constants.blendEquations,a=r.def(),o=r.def(),s=t.cond("typeof ",n,'==="string"');return w.optional(function(){function r(e,r,n){t.assert(e,n+" in "+i,"invalid "+r+", must be one of "+Object.keys(v))}r(s.then,e,n),t.assert(s.else,n+"&&typeof "+n+'==="object"',"invalid "+e),r(s.else,e+".rgb",n+".rgb"),r(s.else,e+".alpha",n+".alpha")}),s.then(a,"=",o,"=",i,"[",n,"];"),s.else(a,"=",i,"[",n,".rgb];",o,"=",i,"[",n,".alpha];"),r(s),[a,o]});case eB:return r(function(e){return w.command(J(e)&&4===e.length,"blend.color must be a 4d array",d.commandStr),M(4,function(t){return+e[t]})},function(e,t,r){return w.optional(function(){e.assert(t,e.shared.isArrayLike+"("+r+")&&"+r+".length===4","blend.color must be a 4d array")}),M(4,function(e){return t.def("+",r,"[",e,"]")})});case e0:return r(function(e){return w.commandType(e,"number",t,d.commandStr),0|e},function(e,t,r){return w.optional(function(){e.assert(t,"typeof "+r+'==="number"',"invalid stencil.mask")}),t.def(r,"|0")});case e1:return r(function(r){w.commandType(r,"object",t,d.commandStr);var n=r.cmp||"keep",i=r.ref||0,a="mask"in r?r.mask:-1;return w.commandParameter(n,tg,e+".cmp",d.commandStr),w.commandType(i,"number",e+".ref",d.commandStr),w.commandType(a,"number",e+".mask",d.commandStr),[tg[n],i,a]},function(e,t,r){var n=e.constants.compareFuncs;return w.optional(function(){function i(){e.assert(t,Array.prototype.join.call(arguments,""),"invalid stencil.func")}i(r+"&&typeof ",r,'==="object"'),i('!("cmp" in ',r,")||(",r,".cmp in ",n,")")}),[t.def('"cmp" in ',r,"?",n,"[",r,".cmp]",":",7680),t.def(r,".ref|0"),t.def('"mask" in ',r,"?",r,".mask|0:-1")]});case e2:case e3:return r(function(r){w.commandType(r,"object",t,d.commandStr);var n=r.fail||"keep",i=r.zfail||"keep",a=r.zpass||"keep";return w.commandParameter(n,tb,e+".fail",d.commandStr),w.commandParameter(i,tb,e+".zfail",d.commandStr),w.commandParameter(a,tb,e+".zpass",d.commandStr),[e===e3?1029:1028,tb[n],tb[i],tb[a]]},function(t,r,n){var i=t.constants.stencilOps;function a(a){return w.optional(function(){t.assert(r,'!("'+a+'" in '+n+")||("+n+"."+a+" in "+i+")","invalid "+e+"."+a+", must be one of "+Object.keys(tb))}),r.def('"',a,'" in ',n,"?",i,"[",n,".",a,"]:",7680)}return w.optional(function(){t.assert(r,n+"&&typeof "+n+'==="object"',"invalid "+e)}),[e===e3?1029:1028,a("fail"),a("zfail"),a("zpass")]});case eK:return r(function(e){w.commandType(e,"object",t,d.commandStr);var r=0|e.factor,n=0|e.units;return w.commandType(r,"number",t+".factor",d.commandStr),w.commandType(n,"number",t+".units",d.commandStr),[r,n]},function(t,r,n){return w.optional(function(){t.assert(r,n+"&&typeof "+n+'==="object"',"invalid "+e)}),[r.def(n,".factor|0"),r.def(n,".units|0")]});case eZ:return r(function(e){var r=0;return"front"===e?r=1028:"back"===e&&(r=1029),w.command(!!r,t,d.commandStr),r},function(e,t,r){return w.optional(function(){e.assert(t,r+'==="front"||'+r+'==="back"',"invalid cull.face")}),t.def(r,'==="front"?',1028,":",1029)});case eq:return r(function(e){return w.command("number"==typeof e&&e>=i.lineWidthDims[0]&&e<=i.lineWidthDims[1],"invalid line width, must be a positive number between "+i.lineWidthDims[0]+" and "+i.lineWidthDims[1],d.commandStr),e},function(e,t,r){return w.optional(function(){e.assert(t,"typeof "+r+'==="number"&&'+r+">="+i.lineWidthDims[0]+"&&"+r+"<="+i.lineWidthDims[1],"invalid line width")}),r});case eG:return r(function(e){return w.commandParameter(e,tw,t,d.commandStr),tw[e]},function(e,t,r){return w.optional(function(){e.assert(t,r+'==="cw"||'+r+'==="ccw"',"invalid frontFace, must be one of cw,ccw")}),t.def(r+'==="cw"?2304:2305')});case eW:return r(function(e){return w.command(J(e)&&4===e.length,"color.mask must be length 4 array",d.commandStr),e.map(function(e){return!!e})},function(e,t,r){return w.optional(function(){e.assert(t,e.shared.isArrayLike+"("+r+")&&"+r+".length===4","invalid color.mask")}),M(4,function(e){return"!!"+r+"["+e+"]"})});case eX:return r(function(e){w.command("object"==typeof e&&e,t,d.commandStr);var r="value"in e?e.value:1,n=!!e.invert;return w.command("number"==typeof r&&r>=0&&r<=1,"sample.coverage.value must be a number between 0 and 1",d.commandStr),[r,n]},function(e,t,r){return w.optional(function(){e.assert(t,r+"&&typeof "+r+'==="object"',"invalid sample.coverage")}),[t.def('"value" in ',r,"?+",r,".value:1"),t.def("!!",r,".invert")]})}}),h),F=function(e,t,n){var i,a=e.static,o=e.dynamic;function s(e){if(e in a){var t=r.id(a[e]);w.optional(function(){c.shader(tx[e],t,w.guessCommand())});var n=tk(function(){return t});return n.id=t,n}if(e in o){var i=o[e];return t_(i,function(t,r){var n=t.invoke(r,i),a=r.def(t.shared.strings,".id(",n,")");return w.optional(function(){r(t.shared.shader,".shader(",tx[e],",",a,",",t.command,");")}),a})}return null}var l=s(te),f=s(e9),u=null;return tT(l)&&tT(f)?(u=c.program(f.id,l.id,null,n),i=tk(function(e,t){return e.link(u)})):i=new tE(l&&l.thisDep||f&&f.thisDep,l&&l.contextDep||f&&f.contextDep,l&&l.propDep||f&&f.propDep,function(e,t){var r,n,i=e.shared.shader;r=l?l.append(e,t):t.def(i,".",te),n=f?f.append(e,t):t.def(i,".",e9);var a=i+".program("+n+","+r;return w.optional(function(){a+=","+e.command}),t.def(a+")")}),{frag:l,vert:f,progVar:i,program:u}}(e,0,j);function V(e){var t=B[e];t&&(L[e]=t)}V(e4),V(D(e6));var $=Object.keys(L).length>0,N={framebuffer:z,draw:R,shader:F,state:L,dirty:$,scopeVAO:null,drawVAO:null,useVAO:!1,attributes:{}};if(N.profile=function(e){var t,r=e.static,n=e.dynamic;if(e8 in r){var i=!!r[e8];(t=tk(function(e,t){return i})).enable=i}else if(e8 in n){var a=n[e8];t=t_(a,function(e,t){return e.invoke(t,a)})}return t}(e,d),b=s.static,x=s.dynamic,A={},Object.keys(b).forEach(function(e){var t,r=b[e];if("number"==typeof r||"boolean"==typeof r)t=tk(function(){return r});else if("function"==typeof r){var n=r._reglType;"texture2d"===n||"textureCube"===n?t=tk(function(e){return e.link(r)}):"framebuffer"===n||"framebufferCube"===n?(w.command(r.color.length>0,'missing color attachment for framebuffer sent to uniform "'+e+'"',d.commandStr),t=tk(function(e){return e.link(r.color[0])})):w.commandRaise('invalid data for uniform "'+e+'"',d.commandStr)}else J(r)?t=tk(function(t){return t.global.def("[",M(r.length,function(n){return w.command("number"==typeof r[n]||"boolean"==typeof r[n],"invalid uniform "+e,t.commandStr),r[n]}),"]")}):w.commandRaise('invalid or missing data for uniform "'+e+'"',d.commandStr);t.value=r,A[e]=t}),Object.keys(x).forEach(function(e){var t=x[e];A[e]=t_(t,function(e,r){return e.invoke(r,t)})}),N.uniforms=A,N.drawVAO=N.scopeVAO=R.vao,!N.drawVAO&&F.program&&!j&&n.angle_instanced_arrays&&R.static.elements){var U=!0,Z=F.program.attributes.map(function(e){var r=t.static[e];return U=U&&!!r,r});if(U&&Z.length>0){var G=u.getVAO(u.createVAO({attributes:Z,elements:R.static.elements}));N.drawVAO=new tE(null,null,null,function(e,t){return e.link(G)}),N.useVAO=!0}}return j?N.useVAO=!0:(S=t.static,E=t.dynamic,k={},Object.keys(S).forEach(function(e){var t=S[e],n=r.id(e),i=new y;if(tA(t))i.state=1,i.buffer=a.getBuffer(a.create(t,34962,!1,!0)),i.type=0;else{var o=a.getBuffer(t);if(o)i.state=1,i.buffer=o,i.type=0;else if(w.command("object"==typeof t&&t,"invalid data for attribute "+e,d.commandStr),"constant"in t){var s=t.constant;i.buffer="null",i.state=2,"number"==typeof s?i.x=s:(w.command(J(s)&&s.length>0&&s.length<=4,"invalid constant for attribute "+e,d.commandStr),eI.forEach(function(e,t){t=0,'invalid offset for attribute "'+e+'"',d.commandStr);var f=0|t.stride;w.command(f>=0&&f<256,'invalid stride for attribute "'+e+'", must be integer betweeen [0, 255]',d.commandStr);var u=0|t.size;w.command(!("size"in t)||u>0&&u<=4,'invalid size for attribute "'+e+'", must be 1,2,3,4',d.commandStr);var c=!!t.normalized,p=0;"type"in t&&(w.commandParameter(t.type,W,"invalid type for attribute "+e,d.commandStr),p=W[t.type]);var m=0|t.divisor;w.optional(function(){"divisor"in t&&(w.command(0===m||g,'cannot specify divisor for attribute "'+e+'", instancing not supported',d.commandStr),w.command(m>=0,'invalid divisor for attribute "'+e+'"',d.commandStr));var r=d.commandStr,n=["buffer","offset","divisor","normalized","type","size","stride"];Object.keys(t).forEach(function(t){w.command(n.indexOf(t)>=0,'unknown parameter "'+t+'" for attribute pointer "'+e+'" (valid parameters are '+n+")",r)})}),i.buffer=o,i.state=1,i.size=u,i.normalized=c,i.type=p||o.dtype,i.offset=l,i.stride=f,i.divisor=m}}k[e]=tk(function(e,t){var r=e.attribCache;if(n in r)return r[n];var a={isStream:!1};return Object.keys(i).forEach(function(e){a[e]=i[e]}),i.buffer&&(a.buffer=e.link(i.buffer),a.type=a.type||a.buffer+".dtype"),r[n]=a,a})}),Object.keys(E).forEach(function(e){var t=E[e];k[e]=t_(t,function(r,n){var i=r.invoke(n,t),a=r.shared,o=r.constants,s=a.isBufferArgs,l=a.buffer;w.optional(function(){r.assert(n,i+"&&(typeof "+i+'==="object"||typeof '+i+'==="function")&&('+s+"("+i+")||"+l+".getBuffer("+i+")||"+l+".getBuffer("+i+".buffer)||"+s+"("+i+'.buffer)||("constant" in '+i+"&&(typeof "+i+'.constant==="number"||'+a.isArrayLike+"("+i+".constant))))",'invalid dynamic attribute "'+e+'"')});var f={isStream:n.def(!1)},u=new y;u.state=1,Object.keys(u).forEach(function(e){f[e]=n.def(""+u[e])});var c=f.buffer,d=f.type;function p(e){n(f[e],"=",i,".",e,"|0;")}return n("if(",s,"(",i,")){",f.isStream,"=true;",c,"=",l,".createStream(",34962,",",i,");",d,"=",c,".dtype;","}else{",c,"=",l,".getBuffer(",i,");","if(",c,"){",d,"=",c,".dtype;",'}else if("constant" in ',i,"){",f.state,"=",2,";","if(typeof "+i+'.constant === "number"){',f[eI[0]],"=",i,".constant;",eI.slice(1).map(function(e){return f[e]}).join("="),"=0;","}else{",eI.map(function(e,t){return f[e]+"="+i+".constant.length>"+t+"?"+i+".constant["+t+"]:0;"}).join(""),"}}else{","if(",s,"(",i,".buffer)){",c,"=",l,".createStream(",34962,",",i,".buffer);","}else{",c,"=",l,".getBuffer(",i,".buffer);","}",d,'="type" in ',i,"?",o.glTypes,"[",i,".type]:",c,".dtype;",f.normalized,"=!!",i,".normalized;"),p("size"),p("offset"),p("stride"),p("divisor"),n("}}"),n.exit("if(",f.isStream,"){",l,".destroyStream(",c,");","}"),f})}),N.attributes=k),_=f.static,O=f.dynamic,C={},Object.keys(_).forEach(function(e){var t=_[e];C[e]=tk(function(e,r){return"number"==typeof t||"boolean"==typeof t?""+t:e.link(t)})}),Object.keys(O).forEach(function(e){var t=O[e];C[e]=t_(t,function(e,r){return e.invoke(r,t)})}),N.context=C,N}(e,s,f,d,m);!function(e,t){var r=e.proc("draw",1);N(e,r),L(e,r,t.context),F(e,r,t.framebuffer),V(e,r,t),$(e,r,t.state),U(e,r,t,!1,!0);var n=t.shader.progVar.append(e,r);if(r(e.shared.gl,".useProgram(",n,".program);"),t.shader.program)Y(e,r,t,t.shader.program);else{r(e.shared.vao,".setVAO(null);");var i=e.global.def("{}"),a=r.def(n,".id"),o=r.def(i,"[",a,"]");r(e.cond(o).then(o,".call(this,a0);").else(o,"=",i,"[",a,"]=",e.link(function(r){return H(Y,e,t,r,1)}),"(",n,");",o,".call(this,a0);"))}Object.keys(t.state).length>0&&r(e.shared.current,".dirty=true;"),e.shared.vao&&r(e.shared.vao,".setVAO(null);")}(m,h);var b=m.proc("scope",3);m.batchId="a2";var x=m.shared,A=x.current;function S(e){var t=h.shader[e];t&&b.set(x.shader,"."+e,t.append(m,b))}return L(m,b,h.context),h.framebuffer&&h.framebuffer.append(m,b),tS(Object.keys(h.state)).forEach(function(e){var t=h.state[e].append(m,b);J(t)?t.forEach(function(t,r){b.set(m.next[e],"["+r+"]",t)}):b.set(x.next,"."+e,t)}),U(m,b,h,!0,!0),[tt,ti,tn,ta,tr].forEach(function(e){var t=h.draw[e];t&&b.set(x.draw,"."+e,""+t.append(m,b))}),Object.keys(h.uniforms).forEach(function(e){var t=h.uniforms[e].append(m,b);Array.isArray(t)&&(t="["+t.join()+"]"),b.set(x.uniforms,"["+r.id(e)+"]",t)}),Object.keys(h.attributes).forEach(function(e){var t=h.attributes[e].append(m,b),r=m.scopeAttrib(e);Object.keys(new y).forEach(function(e){b.set(r,"."+e,t[e])})}),h.scopeVAO&&b.set(x.vao,".targetVAO",h.scopeVAO.append(m,b)),S(e9),S(te),Object.keys(h.state).length>0&&(b(A,".dirty=true;"),b.exit(A,".dirty=true;")),b("a1(",m.shared.context,",a0,",m.batchId,");"),!function(e,t){var r=e.proc("batch",2);e.batchId="0",N(e,r);var n=!1,i=!0;Object.keys(t.context).forEach(function(e){n=n||t.context[e].propDep}),n||(L(e,r,t.context),i=!1);var a=t.framebuffer,o=!1;function s(e){return e.contextDep&&n||e.propDep}a?(a.propDep?n=o=!0:a.contextDep&&n&&(o=!0),o||F(e,r,a)):F(e,r,null),t.state.viewport&&t.state.viewport.propDep&&(n=!0),V(e,r,t),$(e,r,t.state,function(e){return!s(e)}),t.profile&&s(t.profile)||U(e,r,t,!1,"a1"),t.contextDep=n,t.needsContext=i,t.needsFramebuffer=o;var l=t.shader.progVar;if(l.contextDep&&n||l.propDep)X(e,r,t,null);else{var f=l.append(e,r);if(r(e.shared.gl,".useProgram(",f,".program);"),t.shader.program)X(e,r,t,t.shader.program);else{r(e.shared.vao,".setVAO(null);");var u=e.global.def("{}"),c=r.def(f,".id"),d=r.def(u,"[",c,"]");r(e.cond(d).then(d,".call(this,a0,a1);").else(d,"=",u,"[",c,"]=",e.link(function(r){return H(X,e,t,r,2)}),"(",f,");",d,".call(this,a0,a1);"))}}Object.keys(t.state).length>0&&r(e.shared.current,".dirty=true;"),e.shared.vao&&r(e.shared.vao,".setVAO(null);")}(m,h),t(m.compile(),{destroy:function(){h.shader.program.destroy()}})}}}(o,u,d,b,x,A,0,N,{},E,I,g,v,p,a),Q=function(t,r,n,i,a,o,s){function l(l){null===r.next?(w(a.preserveDrawingBuffer,'you must create a webgl context with "preserveDrawingBuffer":true in order to read pixels from the drawing buffer'),f=5121):(w(null!==r.next.colorAttachments[0].texture,"You cannot read from a renderbuffer"),f=r.next.colorAttachments[0].texture._texture.type,w.optional(function(){o.oes_texture_float?(w(5121===f||5126===f,"Reading from a framebuffer is only allowed for the types 'uint8' and 'float'"),5126===f&&w(s.readFloat,"Reading 'float' values is not permitted in your browser. For a fallback, please see: https://www.npmjs.com/package/glsl-read-float")):w(5121===f,"Reading from a framebuffer is only allowed for the type 'uint8'")}));var f,u=0,c=0,d=i.framebufferWidth,p=i.framebufferHeight,m=null;e(l)?m=l:l&&(w.type(l,"object","invalid arguments to regl.read()"),u=0|l.x,c=0|l.y,w(u>=0&&u=0&&c0&&d+u<=i.framebufferWidth,"invalid width for read pixels"),w(p>0&&p+c<=i.framebufferHeight,"invalid height for read pixels"),n();var h=d*p*4;return m||(5121===f?m=new Uint8Array(h):5126===f&&(m=m||new Float32Array(h))),w.isTypedArray(m,"data buffer for regl.read() must be a typedarray"),w(m.byteLength>=h,"data buffer for regl.read() too small"),t.pixelStorei(3333,4),t.readPixels(u,c,d,p,6408,f,m),m}return function(e){var t;return e&&"framebuffer"in e?(r.setFBO({framebuffer:e.framebuffer},function(){t=l(e)}),t):l(e)}}(o,N,Y.procs.poll,v,s,d,b),ei=Y.next,ec=o.canvas,ed=[],ep=[],eA=[],to=[a.onDestroy],ts=null;function td(){if(0===ed.length){p&&p.update(),ts=null;return}ts=O.next(td),tN();for(var e=ed.length-1;e>=0;--e){var t=ed[e];t&&t(v,null,0)}o.flush(),p&&p.update()}function tI(){!ts&&ed.length>0&&(ts=O.next(td))}function tj(){ts&&(O.cancel(td),ts=null)}function tz(e){e.preventDefault(),l=!0,tj(),ep.forEach(function(e){e()})}function tB(e){o.getError(),l=!1,f.restore(),I.restore(),x.restore(),j.restore(),$.restore(),N.restore(),E.restore(),p&&p.restore(),Y.procs.refresh(),tI(),eA.forEach(function(e){e()})}function tR(e){function r(e,t){var r={},n={};return Object.keys(e).forEach(function(i){var a=e[i];if(k(a)){n[i]=_(a,i);return}if(t&&Array.isArray(a)){for(var o=0;o0)return c.call(this,function(e){for(;p.length=0,"cannot cancel a frame twice"),ed[t]=function e(){var t=tM(ed,e);ed[t]=ed[ed.length-1],ed.length-=1,ed.length<=0&&tj()}}}}function t$(){var e=ei.viewport,t=ei.scissor_box;e[0]=e[1]=t[0]=t[1]=0,v.viewportWidth=v.framebufferWidth=v.drawingBufferWidth=e[2]=t[2]=o.drawingBufferWidth,v.viewportHeight=v.framebufferHeight=v.drawingBufferHeight=e[3]=t[3]=o.drawingBufferHeight}function tN(){v.tick+=1,v.time=tU(),t$(),Y.procs.poll()}function tW(){j.refresh(),t$(),Y.procs.refresh(),p&&p.update()}function tU(){return(C()-m)/1e3}tW();var tZ=t(tR,{clear:function(e){if(w("object"==typeof e&&e,"regl.clear() takes an object as input"),"framebuffer"in e)if(e.framebuffer&&"framebufferCube"===e.framebuffer_reglType)for(var r=0;r<6;++r)tL(t({framebuffer:e.framebuffer.faces[r]},e),tF);else tL(e,tF);else tF(null,e)},prop:T.bind(null,1),context:T.bind(null,2),this:T.bind(null,3),draw:tR({}),buffer:function(e){return x.create(e,34962,!1,!1)},elements:function(e){return A.create(e,!1)},texture:j.create2D,cube:j.createCube,renderbuffer:$.create,framebuffer:N.create,framebufferCube:N.createCube,vao:E.createVAO,attributes:s,frame:tV,on:function(e,t){var r;switch(w.type(t,"function","listener callback must be a function"),e){case"frame":return tV(t);case"lost":r=ep;break;case"restore":r=eA;break;case"destroy":r=to;break;default:w.raise("invalid event, must be one of frame,lost,restore,destroy")}return r.push(t),{cancel:function(){for(var e=0;e=0},read:Q,destroy:function(){ed.length=0,tj(),ec&&(ec.removeEventListener(tD,tz),ec.removeEventListener(tP,tB)),I.clear(),N.clear(),$.clear(),E.clear(),j.clear(),A.clear(),x.clear(),p&&p.clear(),to.forEach(function(e){e()})},_gl:o,_refresh:tW,poll:function(){tN(),p&&p.update()},now:tU,stats:c});return a.onDone(null,tZ),tZ}}()},42030,e=>{"use strict";let t,r=new window.BroadcastChannel("pub-sub-es"),n=(e,t)=>"string"==typeof e&&t?e.toLowerCase():e,i=(e,t)=>(r,i,a=1/0)=>{let o=n(r,t?.caseInsensitive),s=e[o]||[];return s.push({handler:i,times:+a||1/0}),e[o]=s,{event:o,handler:i}};function a(e,t){return function(r,i){let a,o;"object"==typeof r?(o=r.handler,a=r.event):(a=r,o=i);let s=e[n(a,t?.caseInsensitive)];if(!s)return;let l=s.findIndex(e=>e.handler===o);-1===l||l>=s.length||s.splice(l,1)}}let o=(e,t)=>{let i=a(e);return(...a)=>{let[o,s,l]=a,f=n(o,t?.caseInsensitive),u=e[f];if(!u)return;let c=[...u];for(let e of c)--e.times<1&&i(f,e.handler);let d=l?.async!==void 0?l.async:t?.async,p=()=>{for(let e of c)e.handler(s)};if(d?setTimeout(p,0):p(),t?.isGlobal&&!l?.isNoGlobalBroadcast)try{r.postMessage({event:f,news:s})}catch(e){if(e instanceof Error&&"DataCloneError"===e.name)console.warn(`Could not broadcast '${f.toString()}' globally. Payload is not clonable.`);else throw e}}},s=e=>()=>{for(let t of Object.keys(e))delete e[t]},l=()=>({}),f=l(),u={publish:o(f,{isGlobal:!0}),subscribe:i(f),unsubscribe:a(f),clear:s(f),stack:f};r.onmessage=({data:{event:e,news:t}})=>u.publish(e,t,{isNoGlobalBroadcast:!0});var c,d,p=e.i(25443);let m=e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1,h=e=>e,y=(e,t)=>{if(e===t)return!0;if(e.length!==t.length)return!1;let r=new Set(e),n=new Set(t);return r.size===n.size&&t.every(e=>r.has(e))},v=(e,t=e=>e)=>{let r=[];for(let n=0;n(t.forEach(t=>{let r=Object.keys(t).reduce((e,r)=>(e[r]=Object.getOwnPropertyDescriptor(t,r),e),{});Object.getOwnPropertySymbols(t).forEach(e=>{let n=Object.getOwnPropertyDescriptor(t,e);n.enumerable&&(r[e]=n)}),Object.defineProperties(e,r)}),e),b=(e,t)=>r=>g(r,{get[e](){return t}}),x=(e=1)=>new Promise(t=>{let r=0,n=()=>requestAnimationFrame(()=>{++r{let n,i=0;r=null===r?t:r;let a=(...t)=>{clearTimeout(n),n=setTimeout(()=>{i>0&&(e(...t),i=0)},r)},o=!1,s=(...r)=>{o?(i++,a(...r)):(e(...r),a(...r),o=!0,i=0,setTimeout(()=>{o=!1},t))};return s.reset=()=>{o=!1},s.cancel=()=>{clearTimeout(n)},s.now=(...t)=>e(...t),s};var A="undefined"!=typeof Float32Array?Float32Array:Array;function S(){var e=new A(16);return A!=Float32Array&&(e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0),e[0]=1,e[5]=1,e[10]=1,e[15]=1,e}function E(e){var t=new A(16);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}function T(e,t){var r=t[0],n=t[1],i=t[2],a=t[3],o=t[4],s=t[5],l=t[6],f=t[7],u=t[8],c=t[9],d=t[10],p=t[11],m=t[12],h=t[13],y=t[14],v=t[15],g=r*s-n*o,b=r*l-i*o,x=r*f-a*o,w=n*l-i*s,A=n*f-a*s,S=i*f-a*l,E=u*h-c*m,T=u*y-d*m,k=u*v-p*m,_=c*y-d*h,O=c*v-p*h,C=d*v-p*y,D=g*C-b*O+x*_+w*k-A*T+S*E;return D?(D=1/D,e[0]=(s*C-l*O+f*_)*D,e[1]=(i*O-n*C-a*_)*D,e[2]=(h*S-y*A+v*w)*D,e[3]=(d*A-c*S-p*w)*D,e[4]=(l*k-o*C-f*T)*D,e[5]=(r*C-i*k+a*T)*D,e[6]=(y*x-m*S-v*b)*D,e[7]=(u*S-d*x+p*b)*D,e[8]=(o*O-s*k+f*E)*D,e[9]=(n*k-r*O-a*E)*D,e[10]=(m*A-h*x+v*g)*D,e[11]=(c*x-u*A-p*g)*D,e[12]=(s*T-o*_-l*E)*D,e[13]=(r*_-n*T+i*E)*D,e[14]=(h*b-m*w-y*g)*D,e[15]=(u*w-c*b+d*g)*D,e):null}function k(e,t,r){var n=t[0],i=t[1],a=t[2],o=t[3],s=t[4],l=t[5],f=t[6],u=t[7],c=t[8],d=t[9],p=t[10],m=t[11],h=t[12],y=t[13],v=t[14],g=t[15],b=r[0],x=r[1],w=r[2],A=r[3];return e[0]=b*n+x*s+w*c+A*h,e[1]=b*i+x*l+w*d+A*y,e[2]=b*a+x*f+w*p+A*v,e[3]=b*o+x*u+w*m+A*g,b=r[4],x=r[5],w=r[6],A=r[7],e[4]=b*n+x*s+w*c+A*h,e[5]=b*i+x*l+w*d+A*y,e[6]=b*a+x*f+w*p+A*v,e[7]=b*o+x*u+w*m+A*g,b=r[8],x=r[9],w=r[10],A=r[11],e[8]=b*n+x*s+w*c+A*h,e[9]=b*i+x*l+w*d+A*y,e[10]=b*a+x*f+w*p+A*v,e[11]=b*o+x*u+w*m+A*g,b=r[12],x=r[13],w=r[14],A=r[15],e[12]=b*n+x*s+w*c+A*h,e[13]=b*i+x*l+w*d+A*y,e[14]=b*a+x*f+w*p+A*v,e[15]=b*o+x*u+w*m+A*g,e}function _(e,t){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=t[0],e[13]=t[1],e[14]=t[2],e[15]=1,e}function O(e,t){return e[0]=t[0],e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=t[1],e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=t[2],e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function C(e,t,r){var n=t[0],i=t[1],a=t[2],o=t[3];return e[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,e[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,e[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,e[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,e}Math.hypot||(Math.hypot=function(){for(var e=0,t=arguments.length;t--;)e+=arguments[t]*arguments[t];return Math.sqrt(e)}),c=new A(4),A!=Float32Array&&(c[0]=0,c[1]=0,c[2]=0,c[3]=0),d=new A(2),A!=Float32Array&&(d[0]=0,d[1]=0);let D=["pan","rotate"],P={alt:"altKey",cmd:"metaKey",ctrl:"ctrlKey",meta:"metaKey",shift:"shiftKey"};function M(e,t){if(!e)return e;t||(t=e);let r=e,n;do if(n=!1,!r.steiner&&(B(r,r.next)||0===z(r.prev,r,r.next))){if(N(r),(r=t=r.prev)===r.next)break;n=!0}else r=r.next;while(n||r!==t)return t}function I(e,t,r,n,i){return(e=((e=((e=((e=((e=(e-r)*i|0)|e<<8)&0xff00ff)|e<<4)&0xf0f0f0f)|e<<2)&0x33333333)|e<<1)&0x55555555)|(t=((t=((t=((t=((t=(t-n)*i|0)|t<<8)&0xff00ff)|t<<4)&0xf0f0f0f)|t<<2)&0x33333333)|t<<1)&0x55555555)<<1}function j(e,t,r,n,i,a,o,s){return(e!==o||t!==s)&&(i-o)*(t-s)>=(e-o)*(a-s)&&(e-o)*(n-s)>=(r-o)*(t-s)&&(r-o)*(a-s)>=(i-o)*(n-s)}function z(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function B(e,t){return e.x===t.x&&e.y===t.y}function R(e,t,r,n){let i=F(z(e,t,r)),a=F(z(e,t,n)),o=F(z(r,n,e)),s=F(z(r,n,t));return!!(i!==a&&o!==s||0===i&&L(e,r,t)||0===a&&L(e,n,t)||0===o&&L(r,e,n)||0===s&&L(r,t,n))}function L(e,t,r){return t.x<=Math.max(e.x,r.x)&&t.x>=Math.min(e.x,r.x)&&t.y<=Math.max(e.y,r.y)&&t.y>=Math.min(e.y,r.y)}function F(e){return e>0?1:e<0?-1:0}function V(e,t){return 0>z(e.prev,e,e.next)?z(e,t,e.next)>=0&&z(e,e.prev,t)>=0:0>z(e,t,e.prev)||0>z(e,e.next,t)}function $(e,t,r,n){let i=W(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function N(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function W(e,t,r){return{i:e,x:t,y:r,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}let U=` -precision mediump float; -varying vec4 color; -void main() { - gl_FragColor = color; -}`,Z=` -uniform mat4 projectionViewModel; -uniform float aspectRatio; - -uniform sampler2D colorTex; -uniform float colorTexRes; -uniform float colorTexEps; -uniform float width; -uniform float useOpacity; -uniform float useColorOpacity; -uniform int miter; - -attribute vec3 prevPosition; -attribute vec3 currPosition; -attribute vec3 nextPosition; -attribute float opacity; -attribute float offsetScale; -attribute float colorIndex; - -varying vec4 color; - -void main() { - vec2 aspectVec = vec2(aspectRatio, 1.0); - vec4 prevProjected = projectionViewModel * vec4(prevPosition, 1.0); - vec4 currProjected = projectionViewModel * vec4(currPosition, 1.0); - vec4 nextProjected = projectionViewModel * vec4(nextPosition, 1.0); - - // get 2D screen space with W divide and aspect correction - vec2 prevScreen = prevProjected.xy / prevProjected.w * aspectVec; - vec2 currScreen = currProjected.xy / currProjected.w * aspectVec; - vec2 nextScreen = nextProjected.xy / nextProjected.w * aspectVec; - - float len = width; - - // starting point uses (next - current) - vec2 dir = vec2(0.0); - if (currScreen == prevScreen) { - dir = normalize(nextScreen - currScreen); - } - // ending point uses (current - previous) - else if (currScreen == nextScreen) { - dir = normalize(currScreen - prevScreen); - } - // somewhere in middle, needs a join - else { - // get directions from (C - B) and (B - A) - vec2 dirA = normalize((currScreen - prevScreen)); - if (miter == 1) { - vec2 dirB = normalize((nextScreen - currScreen)); - // now compute the miter join normal and length - vec2 tangent = normalize(dirA + dirB); - vec2 perp = vec2(-dirA.y, dirA.x); - vec2 miter = vec2(-tangent.y, tangent.x); - len = width / dot(miter, perp); - dir = tangent; - } else { - dir = dirA; - } - } - - vec2 normal = vec2(-dir.y, dir.x) * len; - normal.x /= aspectRatio; - vec4 offset = vec4(normal * offsetScale, 0.0, 0.0); - gl_Position = currProjected + offset; - - // Get color from texture - float colorRowIndex = floor((colorIndex + colorTexEps) / colorTexRes); - vec2 colorTexIndex = vec2( - (colorIndex / colorTexRes) - colorRowIndex + colorTexEps, - colorRowIndex / colorTexRes + colorTexEps - ); - - color = texture2D(colorTex, colorTexIndex); - color.a = useColorOpacity * color.a + useOpacity * opacity; -}`,G=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),q=Float32Array.BYTES_PER_ELEMENT,H=e=>e.length>0&&Array.isArray(e[0]),{push:K,splice:Y}=Array.prototype;function Q(e,t=1,r=1){let n=[],i=Array(2*t);for(let a=0,o=e.length/t;a{let m,h,y,v,g,b,x,w,A,S,E,T,_,O,C,D,P,M;if(!e)return void console.error("Regl instance is undefined.");let I=new Float32Array(16),j=d?2:3,z=()=>+(l.length===h||null!==s),B=()=>{S=e.buffer(),E=e.buffer(),T=e.buffer(),C=e.buffer(),D={prevPosition:{buffer:()=>S,offset:0,stride:3*q},currPosition:{buffer:()=>S,offset:3*q*2,stride:3*q},nextPosition:{buffer:()=>S,offset:3*q*4,stride:3*q},opacity:{buffer:()=>E,offset:2*q,stride:q},offsetScale:{buffer:()=>T,offset:2*q,stride:q},colorIndex:{buffer:()=>C,offset:2*q,stride:q}},P=e.elements(),M=e({attributes:D,depth:{enable:!d},blend:{enable:!0,func:{srcRGB:"src alpha",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}},uniforms:{projectionViewModel:(e,t)=>{let r=e.projection||t.projection,n=e.model||t.model;return k(I,r,k(I,e.view||t.view,n))},aspectRatio:({viewportWidth:e,viewportHeight:t})=>e/t,colorTex:()=>_,colorTexRes:()=>O,colorTexEps:()=>.5/O,pixelRatio:({pixelRatio:e})=>e,width:({pixelRatio:e,viewportHeight:t})=>f/t*e,useOpacity:z,useColorOpacity:()=>Number(!z()),miter:Number(!!c)},elements:()=>P,vert:Z,frag:U})},R=()=>{L(),B()},L=()=>{i=[],v=[],g=new Float32Array,w=[],A=[],S.destroy(),T.destroy(),P.destroy()},F=(e,t)=>{let r=t.flat(2);return r.length===h?r:r.length===m?y.flatMap((e,t)=>Array(e).fill(r[t])):e},V=(e=[],{colorIndices:t=a,opacities:r=l,widths:n=u,is2d:o=d}={})=>{i=e,d=o,j=d?2:3,m=H(i)?i.length:1,h=(y=H(i)?i.map(e=>Math.floor(e.length/j)):[Math.floor(i.length/j)]).reduce((e,t)=>e+t,0),a=F(a,t),l=F(l,r),u=F(u,n),i&&h>1?(()=>{1===m&&i.length%j>0&&console.warn(`The length of points (${h}) does not match the dimensions (${j}). Incomplete points are ignored.`),v=i.flat().slice(0,h*j),d&&(v=function(e,t,r,n=0){let i=[],a=[,,,].fill(n);for(let t=0,r=e.length/2;t{let r=0;for(let n of e){for(let e=0;e65536?"uint32":"uint16",data:A})})():R()},$=()=>{let t=H(o)?o:[o],r=new Uint8Array((O=Math.max(2,Math.ceil(Math.sqrt(t.length))))**2*4);t.forEach((e,t)=>{r[4*t]=Math.min(255,Math.max(0,Math.round(255*e[0]))),r[4*t+1]=Math.min(255,Math.max(0,Math.round(255*e[1]))),r[4*t+2]=Math.min(255,Math.max(0,Math.round(255*e[2]))),r[4*t+3]=Number.isNaN(+e[3])?255:Math.min(255,Math.max(0,Math.round(255*e[3])))}),_=e.texture({data:r,shape:[O,O,4]})},N=(e,t=s)=>{o=e,s=t,_&&_.destroy(),$()};return B(),$(),i&&i.length>1&&V(i),{clear:R,destroy:L,draw:({projection:e,model:a,view:o}={})=>{e&&(t=e),a&&(r=a),o&&(n=o),i&&i.length>1&&M({projection:t,model:r,view:n})},getPoints:()=>i,setPoints:V,getData:()=>({points:g,widths:w,opacities:x,colorIndices:b}),getBuffer:()=>({points:S,widths:T,opacities:E,colorIndices:C}),getStyle:()=>({color:o,miter:c,width:f}),setStyle:({color:e,opacity:t,miter:r,width:n}={})=>{e&&N(e,t||s),r&&(c=!!r),void 0!==n&&Number.isFinite(n)&&(f=n)}}};var ee=()=>{let e=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class t{static from(r){if(!(r instanceof ArrayBuffer))throw Error("Data must be an instance of ArrayBuffer.");let[n,i]=new Uint8Array(r,0,2);if(219!==n)throw Error("Data does not appear to be in a KDBush format.");let a=i>>4;if(1!==a)throw Error(`Got v${a} data when expected v1.`);let o=e[15&i];if(!o)throw Error("Unrecognized array type.");let[s]=new Uint16Array(r,2,1),[l]=new Uint32Array(r,4,1);return new t(l,s,o,r)}constructor(t,r=64,n=Float64Array,i){if(isNaN(t)||t<0)throw Error(`Unexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+r,2),65535),this.ArrayType=n,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const a=e.indexOf(this.ArrayType),o=2*t*this.ArrayType.BYTES_PER_ELEMENT,s=t*this.IndexArrayType.BYTES_PER_ELEMENT,l=(8-s%8)%8;if(a<0)throw Error(`Unexpected typed array class: ${n}.`);i&&i instanceof ArrayBuffer?(this.data=i,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+s+l,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+o+s+l),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+s+l,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+a]),new Uint16Array(this.data,2,1)[0]=r,new Uint32Array(this.data,4,1)[0]=t)}add(e,t){let r=this._pos>>1;return this.ids[r]=r,this.coords[this._pos++]=e,this.coords[this._pos++]=t,r}finish(){let e=this._pos>>1;if(e!==this.numItems)throw Error(`Added ${e} items when expected ${this.numItems}.`);return function e(t,n,i,a,o,s){if(o-a<=i)return;let l=a+o>>1;(function e(t,n,i,a,o,s){for(;o>a;){if(o-a>600){let r=o-a+1,l=i-a+1,f=Math.log(r),u=.5*Math.exp(2*f/3),c=.5*Math.sqrt(f*u*(r-u)/r)*(l-r/2<0?-1:1),d=Math.max(a,Math.floor(i-l*u/r+c)),p=Math.min(o,Math.floor(i+(r-l)*u/r+c));e(t,n,i,d,p,s)}let l=n[2*i+s],f=a,u=o;for(r(t,n,a,i),n[2*o+s]>l&&r(t,n,a,o);fl;)u--}n[2*a+s]===l?r(t,n,a,u):r(t,n,++u,o),u<=i&&(a=u+1),i<=u&&(o=u-1)}})(t,n,l,a,o,s),e(t,n,i,a,l-1,1-s),e(t,n,i,l+1,o,1-s)}(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(e,t,r,n){if(!this._finished)throw Error("Data not yet indexed - call index.finish().");let{ids:i,coords:a,nodeSize:o}=this,s=[0,i.length-1,0],l=[];for(;s.length;){let f=s.pop()||0,u=s.pop()||0,c=s.pop()||0;if(u-c<=o){for(let o=c;o<=u;o++){let s=a[2*o],f=a[2*o+1];s>=e&&s<=r&&f>=t&&f<=n&&l.push(i[o])}continue}let d=c+u>>1,p=a[2*d],m=a[2*d+1];p>=e&&p<=r&&m>=t&&m<=n&&l.push(i[d]),(0===f?e<=p:t<=m)&&(s.push(c),s.push(d-1),s.push(1-f)),(0===f?r>=p:n>=m)&&(s.push(d+1),s.push(u),s.push(1-f))}return l}within(e,t,r){if(!this._finished)throw Error("Data not yet indexed - call index.finish().");let{ids:n,coords:a,nodeSize:o}=this,s=[0,n.length-1,0],l=[],f=r*r;for(;s.length;){let u=s.pop()||0,c=s.pop()||0,d=s.pop()||0;if(c-d<=o){for(let r=d;r<=c;r++)i(a[2*r],a[2*r+1],e,t)<=f&&l.push(n[r]);continue}let p=d+c>>1,m=a[2*p],h=a[2*p+1];i(m,h,e,t)<=f&&l.push(n[p]),(0===u?e-r<=m:t-r<=h)&&(s.push(d),s.push(p-1),s.push(1-u)),(0===u?e+r>=m:t+r>=h)&&(s.push(p+1),s.push(c),s.push(1-u))}return l}}function r(e,t,r,i){n(e,r,i),n(t,2*r,2*i),n(t,2*r+1,2*i+1)}function n(e,t,r){let n=e[t];e[t]=e[r],e[r]=n}function i(e,t,r,n){let i=e-r,a=t-n;return i*i+a*a}return t},et=()=>{addEventListener("message",e=>{let t=e.data.points;0===t.length&&self.postMessage({error:Error("Invalid point data")});let r=new KDBush(t.length,e.data.nodeSize);for(let[e,n]of t)r.add(e,n);r.finish(),postMessage(r.data,[r.data])})};let er=ee(),en=(e,t={nodeSize:16,useWorker:void 0})=>new Promise((r,n)=>{if(e instanceof ArrayBuffer)r(er.from(e));else if((e.length<1e6||!1===t.useWorker)&&!0!==t.useWorker){let n=new er(e.length,t.nodeSize);for(let t of e)n.add(t[0],t[1]);n.finish(),r(n)}else{let i,a,o,s,l,f=(i=ee.toString(),a=et.toString(),o=new Blob([`const createKDBushClass = ${i};KDBush = createKDBushClass();const createWorker = ${a};createWorker();`],{type:"text/javascript"}),l=new Worker(s=URL.createObjectURL(o),{name:"KDBush"}),URL.revokeObjectURL(s),l);f.onmessage=e=>{e.data.error?n(e.data.error):r(er.from(e.data)),f.terminate()},f.postMessage({points:e,nodeSize:t.nodeSize})}}),ei=!0,ea=8,eo=2,es="freeform",el=24,ef="auto",eu=0,ec=Float32Array.BYTES_PER_ELEMENT,ed=["OES_texture_float","OES_element_index_uint","WEBGL_color_buffer_float","EXT_float_blend"],ep={color:[0,0,0,0],depth:1},em="panZoom",eh="lasso",ey="rotate",ev=[em,eh,ey],eg={cubicIn:e=>e*e*e,cubicInOut:m,cubicOut:e=>--e*e*e+1,linear:e=>e,quadIn:e=>e*e,quadInOut:e=>e<.5?2*e*e:-1+(4-2*e)*e,quadOut:e=>e*(2-e)},eb=m,ex="continuous",ew="categorical",eA=[ex,ew],eS="deselect",eE="lassoEnd",eT=[eS,eE],ek=[0,.666666667,1,1],e_=750,eO=500,eC=100,eD=250,eP="lasso",eM="rotate",eI="merge",ej="remove",ez=[eP,eM,eI,ej],eB="ctrl",eR="meta",eL="shift",eF=["alt","cmd",eB,eR,eL],eV={[ej]:"alt",[eM]:"alt",[eP]:eL,[eI]:"cmd"},e$=[.66,.66,.66,1],eN=[0,.55,1,1],eW=[1,1,1,1],eU=[0,0,0,1],eZ=[.66,.66,.66,.2],eG=[0,.55,1,1],eq=[1,1,1,1],eH=[1,1,1,.5],eK=[0,0],eY=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),eQ=[1,1,1,.5],eX=new Set(["z","valueZ","valueA","value1","category"]),eJ=new Set(["w","valueW","valueB","value2","value"]),e0=15e3,e1,e2=Symbol("SKIP_DEPRECATION_VALUE_TRANSLATION"),e3="Points have not been drawn",e5="The instance was already destroyed",e6=(e,t=null)=>null===e?t:e,e4=()=>{if(!t){let e=document.createElement("style");document.head.appendChild(e),t=e.sheet}return t},e8=e=>{let t=e4(),r=t.rules.length;return t.insertRule(e,r),r},e7=e=>{e4().deleteRule(e)},e9=null,te=null,tt=(e,{onDraw:t=h,onStart:r=h,onEnd:n=h,enableInitiator:i=ei,initiatorParentElement:a=document.body,longPressIndicatorParentElement:o=document.body,minDelay:s=ea,minDist:l=eo,pointNorm:f=h,type:u=es,brushSize:c=el}={})=>{let d,p,m,y,v,A,S,E=i,T=a,k=o,_=t,O=r,C=n,D=s,P=l,M=f,I=u,j=c,z=document.createElement("div"),B=Math.random().toString(36).substring(2,5)+Math.random().toString(36).substring(2,5);z.id=`lasso-initiator-${B}`,z.style.position="fixed",z.style.display="flex",z.style.justifyContent="center",z.style.alignItems="center",z.style.zIndex=99,z.style.width="4rem",z.style.height="4rem",z.style.borderRadius="4rem",z.style.opacity=.5,z.style.transform="translate(-50%,-50%) scale(0) rotate(0deg)";let{longPress:R,longPressCircle:L,longPressCircleLeft:F,longPressCircleRight:V,longPressEffect:$}=(d=document.createElement("div"),p=Math.random().toString(36).substring(2,5)+Math.random().toString(36).substring(2,5),d.id=`lasso-long-press-${p}`,d.style.position="fixed",d.style.width="1.25rem",d.style.height="1.25rem",d.style.pointerEvents="none",d.style.transform="translate(-50%,-50%)",(m=document.createElement("div")).style.position="absolute",m.style.top=0,m.style.left=0,m.style.width="1.25rem",m.style.height="1.25rem",m.style.clipPath="inset(0px 0px 0px 50%)",m.style.opacity=0,d.appendChild(m),(y=document.createElement("div")).style.position="absolute",y.style.top=0,y.style.left=0,y.style.width="0.8rem",y.style.height="0.8rem",y.style.border="0.2rem solid currentcolor",y.style.borderRadius="0.8rem",y.style.clipPath="inset(0px 50% 0px 0px)",y.style.transform="rotate(0deg)",m.appendChild(y),(v=document.createElement("div")).style.position="absolute",v.style.top=0,v.style.left=0,v.style.width="0.8rem",v.style.height="0.8rem",v.style.border="0.2rem solid currentcolor",v.style.borderRadius="0.8rem",v.style.clipPath="inset(0px 50% 0px 0px)",v.style.transform="rotate(0deg)",m.appendChild(v),(A=document.createElement("div")).style.position="absolute",A.style.top=0,A.style.left=0,A.style.width="1.25rem",A.style.height="1.25rem",A.style.borderRadius="1.25rem",A.style.background="currentcolor",A.style.transform="scale(0)",A.style.opacity=0,d.appendChild(A),{longPress:d,longPressCircle:m,longPressCircleLeft:y,longPressCircleRight:v,longPressEffect:A}),N=!1,W=!1,U=[],Z=[],G=[],q=[],H=!1,K=null,Y=null,Q=null,X=null,J=null,ee=null,et=null,er=null,en=null,ef=null,eu=()=>{N=!1};window.addEventListener("mouseup",eu);let ec=()=>{z.style.opacity=.5,z.style.transform="translate(-50%,-50%) scale(0) rotate(0deg)"},ed=(e,t)=>{let r=getComputedStyle(e),n=+r.opacity,i=r.transform.match(/([0-9.-]+)+/g),a=+i[0],o=+i[1],s=Math.sqrt(a*a+o*o),l=180/Math.PI*Math.atan2(o,a);return{opacity:n,scale:s,rotate:l=t&&l<=0?360+l:l}},ep=e=>{if(!E||N)return;let t=e.clientX,r=e.clientY;z.style.top=`${r}px`,z.style.left=`${t}px`;let n=ed(z),i=n.opacity,a=n.scale,o=n.rotate;z.style.opacity=i,z.style.transform=`translate(-50%,-50%) scale(${a}) rotate(${o}deg)`,z.style.animation="none",x().then(()=>{null!==e9&&e7(e9),e9=e8(` -@keyframes scaleInFadeOut { - 0% { - opacity: ${i}; - transform: translate(-50%,-50%) scale(${a}) rotate(${o}deg); - } - 10% { - opacity: 1; - transform: translate(-50%,-50%) scale(1) rotate(${o+20}deg); - } - 100% { - opacity: 0; - transform: translate(-50%,-50%) scale(0.9) rotate(${o+60}deg); - } -} -`),z.style.animation="2500ms ease scaleInFadeOut 0s 1 normal backwards",x().then(()=>{ec()})})},em=()=>{let{opacity:e,scale:t,rotate:r}=ed(z);z.style.opacity=e,z.style.transform=`translate(-50%,-50%) scale(${t}) rotate(${r}deg)`,z.style.animation="none",x(2).then(()=>{null!==te&&e7(te),te=e8(` -@keyframes fadeScaleOut { - 0% { - opacity: ${e}; - transform: translate(-50%,-50%) scale(${t}) rotate(${r}deg); - } - 100% { - opacity: 0; - transform: translate(-50%,-50%) scale(0) rotate(${r}deg); - } -} -`),z.style.animation="250ms ease fadeScaleOut 0s 1 normal backwards",x().then(()=>{ec()})})},eh=(e,t,{time:r=e_,extraTime:n=eO,delay:i=eC}={time:e_,extraTime:eO,delay:eC})=>{H=!0;let a=getComputedStyle(R);R.style.color=a.color,R.style.top=`${t}px`,R.style.left=`${e}px`,R.style.animation="none";let o=getComputedStyle(L);L.style.clipPath=o.clipPath,L.style.opacity=o.opacity,L.style.animation="none";let s=ed($);$.style.opacity=s.opacity,$.style.transform=`scale(${s.scale})`,$.style.animation="none";let l=ed(F);F.style.transform=`rotate(${l.rotate}deg)`,F.style.animation="none";let f=ed(V);V.style.transform=`rotate(${f.rotate}deg)`,V.style.animation="none",x().then(()=>{if(!H)return;null!==J&&e7(J),null!==X&&e7(X),null!==Q&&e7(Q),null!==Y&&e7(Y),null!==K&&e7(K);let{rules:e,names:t}=(({time:e=e_,extraTime:t=eO,delay:r=eC,currentColor:n,targetColor:i,effectOpacity:a,effectScale:o,circleLeftRotation:s,circleRightRotation:l,circleClipPath:f,circleOpacity:u})=>{let c,d=s/360,p=(1-d)*e+t,m=Math.round((1-d)*e/p*100),h=Math.round(m/2);return{rules:{main:` - @keyframes mainIn { - 0% { - color: ${n}; - opacity: 0; - } - 0%, ${m}% { - color: ${n}; - opacity: 1; - } - 100% { - color: ${i}; - opacity: 0.8; - } - } -`,effect:(c=m+(100-m)/4,` - @keyframes effectIn { - 0%, ${m}% { - opacity: ${a}; - transform: scale(${o}); - } - ${c}% { - opacity: 0.66; - transform: scale(1.5); - } - 99% { - opacity: 0; - transform: scale(2); - } - 100% { - opacity: 0; - transform: scale(0); - } - } -`),circleRight:` - @keyframes rightSpinIn { - 0% { - transform: rotate(${l}deg); - } - ${h}%, 100% { - transform: rotate(180deg); - } - } -`,circleLeft:` - @keyframes leftSpinIn { - 0% { - transform: rotate(${s}deg); - } - ${m}%, 100% { - transform: rotate(360deg); - } - } -`,circle:` - @keyframes circleIn { - 0% { - clip-path: ${f}; - opacity: ${u}; - } - ${h}% { - clip-path: ${f}; - opacity: 1; - } - ${h+.01}%, 100% { - clip-path: inset(0); - opacity: 1; - } - } -`},names:{main:`${p}ms ease-out mainIn ${r}ms 1 normal forwards`,effect:`${p}ms ease-out effectIn ${r}ms 1 normal forwards`,circleLeft:`${p}ms linear leftSpinIn ${r}ms 1 normal forwards`,circleRight:`${p}ms linear rightSpinIn ${r}ms 1 normal forwards`,circle:`${p}ms linear circleIn ${r}ms 1 normal forwards`}}})({time:r,extraTime:n,delay:i,currentColor:a.color||"currentcolor",targetColor:R.dataset.activeColor,effectOpacity:s.opacity||0,effectScale:s.scale||0,circleLeftRotation:l.rotate||0,circleRightRotation:f.rotate||0,circleClipPath:o.clipPath||"inset(0 0 0 50%)",circleOpacity:o.opacity||0});K=e8(e.main),Y=e8(e.effect),Q=e8(e.circleLeft),X=e8(e.circleRight),J=e8(e.circle),R.style.animation=t.main,$.style.animation=t.effect,F.style.animation=t.circleLeft,V.style.animation=t.circleRight,L.style.animation=t.circle})},ey=({time:e=eD}={time:eD})=>{if(!H)return;H=!1;let t=getComputedStyle(R);R.style.color=t.color,R.style.animation="none";let r=getComputedStyle(L);L.style.clipPath=r.clipPath,L.style.opacity=r.opacity,L.style.animation="none";let n=ed($);$.style.opacity=n.opacity,$.style.transform=`scale(${n.scale})`,$.style.animation="none";let i=ed(F,"x"===r.clipPath.slice(-2,-1));F.style.transform=`rotate(${i.rotate}deg)`,F.style.animation="none";let a=ed(V);V.style.transform=`rotate(${a.rotate}deg)`,V.style.animation="none",x().then(()=>{null!==ef&&e7(ef),null!==en&&e7(en),null!==er&&e7(er),null!==et&&e7(et),null!==ee&&e7(ee);let{rules:o,names:s}=(({time:e=eD,currentColor:t,targetColor:r,effectOpacity:n,effectScale:i,circleLeftRotation:a,circleRightRotation:o,circleClipPath:s,circleOpacity:l})=>{let f=a/360,u=f*e,c=Math.min(100,100*f),d=c>50?Math.round((1-50/c)*100):0;return{rules:{main:` - @keyframes mainOut { - 0% { - color: ${t}; - } - 100% { - color: ${r}; - } - } -`,effect:` - @keyframes effectOut { - 0% { - opacity: ${n}; - transform: scale(${i}); - } - 99% { - opacity: 0; - transform: scale(${i+.5}); - } - 100% { - opacity: 0; - transform: scale(0); - } - } -`,circleRight:` - @keyframes rightSpinOut { - 0%, ${d}% { - transform: rotate(${o}deg); - } - 100% { - transform: rotate(0deg); - } -`,circleLeft:` - @keyframes leftSpinOut { - 0% { - transform: rotate(${a}deg); - } - 100% { - transform: rotate(0deg); - } - } -`,circle:` - @keyframes circleOut { - 0%, ${d}% { - clip-path: ${s}; - opacity: ${l}; - } - ${d+.01}% { - clip-path: inset(0 0 0 50%); - opacity: ${l}; - } - 100% { - clip-path: inset(0 0 0 50%); - opacity: 0; - } - } -`},names:{main:`${u}ms linear mainOut 0s 1 normal forwards`,effect:`${u}ms linear effectOut 0s 1 normal forwards`,circleRight:`${u}ms linear leftSpinOut 0s 1 normal forwards`,circleLeft:`${u}ms linear rightSpinOut 0s 1 normal forwards`,circle:`${u}ms linear circleOut 0s 1 normal forwards`}}})({time:e,currentColor:t.color||"currentcolor",targetColor:R.dataset.color,effectOpacity:n.opacity||0,effectScale:n.scale||0,circleLeftRotation:i.rotate||0,circleRightRotation:a.rotate||0,circleClipPath:r.clipPath||"inset(0px)",circleOpacity:r.opacity||1});ee=e8(o.main),et=e8(o.effect),er=e8(o.circleLeft),en=e8(o.circleRight),ef=e8(o.circle),R.style.animation=s.main,$.style.animation=s.effect,F.style.animation=s.circleLeft,V.style.animation=s.circleRight,L.style.animation=s.circle})},ev=()=>{_(U,Z)},eg=e=>{U.push(e),Z.push(e[0],e[1])},eb=e=>{let[t,r]=e,[n,i]=U[0];U[1]=[t,i],U[2]=[t,r],U[3]=[n,r],U[4]=[n,i],Z[2]=t,Z[3]=i,Z[4]=t,Z[5]=r,Z[6]=n,Z[7]=r,Z[8]=n,Z[9]=i},ex=e=>{G.push(e)},ew=(e,t,r)=>{let[n,i]=e,[a,o]=t,s=n-a,l=i-o,f=Math.sqrt([s,l].reduce((e,t)=>e+t**2,0));return[l/f*r,-s/f*r]},eA=e=>{let t=G.at(-1),r=Math.abs(M([0,0])[0]-M([j/2,0])[0]),[n,i]=ew(e,t,r),a=G.length;if(1===a){let e=[t[0]+n,t[1]+i],r=[t[0]-n,t[1]-i];U.push(e,r),Z.push(e[0],e[1],r[0],r[1]),q.push([n,i])}else{[n,i]=ew(e,t,r);let o=[...q,[n,i]];[n,i]=((e,t,r)=>{if(0===e.length)return 0;if(1===e.length)return e[0];let n=2**(-1/t),i=Math.max(0,e.length-r),a=e.slice(i),o=0,s=0,l=0;for(let e=a.length-1;e>=0;e--){let t=a.length-1-e,r=n**t;o+=a[e][0]*r,s+=a[e][1]*r,l+=r}return[o/l,s/l]})(o,1,10);let[s,l]=q.at(-1),f=(n+s)/2,u=(i+l)/2,c=[t[0]+f,t[1]+u],d=[t[0]-f,t[1]-u];U.splice(a-1,2,c,d),Z.splice(2*(a-1),4,c[0],c[1],d[0],d[1]),q.splice(a,1,[f,u])}let o=[e[0]+n,e[1]+i],s=[e[0]-n,e[1]-i];U.splice(a,0,o,s),Z.splice(2*a,0,o[0],o[1],s[0],s[1]),G.push(e),q.push([n,i])},eS=eg,eE=eg,eT=e=>{if(S){let t,r;t=e[0],r=e[1],Math.sqrt((t-S[0])**2+(r-S[1])**2)>P&&(S=e,eS(M(e)),U.length>1&&ev())}else{W||(W=!0,O()),S=e;let t=M(e);eE(t)}},ek=w(eT,D,D),eP=(t,r)=>{let n=(t=>{let{left:r,top:n}=e.getBoundingClientRect();return[t.clientX-r,t.clientY-n]})(t);return r?ek(n):eT(n)},eM=()=>{U=[],Z=[],G=[],q=[],S=void 0,ev()},eI=e=>{ep(e)},ej=()=>{N=!0,W=!0,eM(),O()},ez=()=>{em()},eB=({merge:e=!1,remove:t=!1}={})=>{W=!1;let r=[...U],n=[...Z];return ek.cancel(),eM(),r.length>0&&C(r,n,{merge:e,remove:t}),r},eR=e=>"onDraw"===e?_:"onStart"===e?O:"onEnd"===e?C:"enableInitiator"===e?E:"minDelay"===e?D:"minDist"===e?P:"pointNorm"===e?M:"type"===e?I:"brushSize"===e?j:void 0,eL=({onDraw:e=null,onStart:t=null,onEnd:r=null,enableInitiator:n=null,initiatorParentElement:i=null,longPressIndicatorParentElement:a=null,minDelay:o=null,minDist:s=null,pointNorm:l=null,type:f=null,brushSize:u=null}={})=>{_=e6(e,_),O=e6(t,O),C=e6(r,C),E=e6(n,E),D=e6(o,D),P=e6(s,P),M=e6(l,M),j=e6(u,j),null!==i&&i!==T&&(T.removeChild(z),i.appendChild(z),T=i),null!==a&&a!==k&&(k.removeChild(R),a.appendChild(R),k=a),E?(z.addEventListener("click",eI),z.addEventListener("mousedown",ej),z.addEventListener("mouseleave",ez)):(z.removeEventListener("mousedown",ej),z.removeEventListener("mouseleave",ez)),null!==f&&(e=>{switch(e){case"rectangle":I=e,eS=eb,eE=eg;break;case"brush":I=e,eS=eA,eE=ex;break;default:I="freeform",eS=eg,eE=eg}})(f)},eF=()=>{T.removeChild(z),k.removeChild(R),window.removeEventListener("mouseup",eu),z.removeEventListener("click",eI),z.removeEventListener("mousedown",ej),z.removeEventListener("mouseleave",ez)};return T.appendChild(z),k.appendChild(R),eL({onDraw:_,onStart:O,onEnd:C,enableInitiator:E,initiatorParentElement:T,type:I,brushSize:j}),((...e)=>t=>e.reduce((e,t)=>t(e),t))(b("initiator",z),b("longPressIndicator",R),e=>g(e,{clear:eM,destroy:eF,end:eB,extend:eP,get:eR,set:eL,showInitiator:ep,hideInitiator:em,showLongPressIndicator:eh,hideLongPressIndicator:ey}),e=>g({__proto__:{constructor:tt}},e))({})},tr=(e,t)=>!!e&&ed.reduce((r,n)=>e.hasExtension(n)?r:(t||console.warn(`WebGL: ${n} extension not supported. Scatterplot might not render properly`),!1),!0),tn=e=>{let t=e.getContext("webgl",{antialias:!0,preserveDrawingBuffer:!0}),r=[];for(let e of ed)t.getExtension(e)?r.push(e):console.warn(`WebGL: ${e} extension not supported. Scatterplot might not render properly`);return(0,p.default)({gl:t,extensions:r})},ti=(e,t,r,n)=>Math.sqrt((e-r)**2+(t-n)**2),ta=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,to=(e,t,{minLength:r=0}={})=>Array.isArray(e)&&e.length>=r&&e.every(t),ts=e=>!Number.isNaN(+e)&&+e>=0,tl=e=>!Number.isNaN(+e)&&+e>0,tf=(e,t)=>r=>e.indexOf(r)>=0?r:t,tu=(e,t,r=e0)=>new Promise((n,i)=>{((e,t=!1,r=e0)=>new Promise((n,i)=>{let a=new Image;t&&(a.crossOrigin="anonymous"),a.src=e,a.onload=()=>{n(a)};let o=()=>{i(Error("IMAGE_LOAD_ERROR"))};a.onerror=o,setTimeout(o,r)}))(t,0!==t.indexOf(window.location.origin)&&-1===t.indexOf("base64"),r).then(t=>{n(e.texture(t))}).catch(e=>{i(e)})}),tc=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i,td=e=>e>=0&&e<=1,tp=e=>Array.isArray(e)&&e.every(td),tm=(e,[t,r]=[])=>{let n=0;for(let i=0,a=e.length-2;ir&&(l-o)*(r-s)-(t-o)*(f-s)>0&&n++:f<=r&&(l-o)*(r-s)-(t-o)*(f-s)<0&&n--,a=i}return 0!==n},th=e=>"string"==typeof e||e instanceof String,ty=e=>Number.isInteger(e)&&e>=0&&e<=255,tv=e=>Array.isArray(e)&&e.every(ty),tg=e=>Array.isArray(e)&&e.length>0&&(Array.isArray(e[0])||th(e[0])),tb=(e,t)=>e>t?e:t,tx=(e,t)=>e{if(4===e.length&&(tp(e)||tv(e))){let r=tp(e);return t&&r||!(t||r)?e:t&&!r?e.map(e=>e/255):e.map(e=>255*e)}if(3===e.length&&(tp(e)||tv(e))){let r=255**!t,n=tp(e);return t&&n||!(t||n)?[...e,r]:t&&!n?[...e.map(e=>e/255),r]:[...e.map(e=>255*e),r]}return tc.test(e)?((e,t=!1)=>[...((e,t=!1)=>e.replace(ta,(e,t,r,n)=>`#${t}${t}${r}${r}${n}${n}`).substring(1).match(/.{2}/g).map(e=>Number.parseInt(e,16)/255**t))(e,t),255**!t])(e,t):(console.warn("Only HEX, RGB, and RGBA are handled by this function. Returning white instead."),t?[1,1,1,1]:[255,255,255,255])},tA=e=>.21*e[0]+.72*e[1]+.07*e[2],tS=e=>new Promise((t,r)=>{if(!e||Array.isArray(e))t(e);else{let n,i,a=Array.isArray(e.x)||ArrayBuffer.isView(e.x)?e.x.length:0,o=(Array.isArray(e.x)||ArrayBuffer.isView(e.x))&&(t=>e.x[t]),s=(Array.isArray(e.y)||ArrayBuffer.isView(e.y))&&(t=>e.y[t]),l=(Array.isArray(e.line)||ArrayBuffer.isView(e.line))&&(t=>e.line[t]),f=(Array.isArray(e.lineOrder)||ArrayBuffer.isView(e.lineOrder))&&(t=>e.lineOrder[t]),u=Object.keys(e),c=(n=u.find(e=>eX.has(e)))&&(Array.isArray(e[n])||ArrayBuffer.isView(e[n]))&&(t=>e[n][t]),d=(i=u.find(e=>eJ.has(e)))&&(Array.isArray(e[i])||ArrayBuffer.isView(e[i]))&&(t=>e[i][t]);o&&s&&c&&d&&l&&f?t(e.x.map((e,t)=>[e,s(t),c(t),d(t),l(t),f(t)])):o&&s&&c&&d&&l?t(Array.from({length:a},(e,t)=>[o(t),s(t),c(t),d(t),l(t)])):o&&s&&c&&d?t(Array.from({length:a},(e,t)=>[o(t),s(t),c(t),d(t)])):o&&s&&c?t(Array.from({length:a},(e,t)=>[o(t),s(t),c(t)])):o&&s?t(Array.from({length:a},(e,t)=>[o(t),s(t)])):r(Error("You need to specify at least x and y"))}}),tE=e=>Number.isFinite(e.y)&&!("x"in e),tT=e=>Number.isFinite(e.x)&&!("y"in e),tk=e=>Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height),t_=e=>Number.isFinite(e.x1)&&Number.isFinite(e.y1)&&Number.isFinite(e.x2)&&Number.isFinite(e.x2),tO=e=>"vertices"in e&&e.vertices.length>1,tC=(e={})=>{let{regl:t,canvas:r=document.createElement("canvas"),gamma:n=1}=e,i=!1;t||(t=tn(r));let a=tr(t),o=[r.width,r.height],s=t.framebuffer({width:o[0],height:o[1],colorFormat:"rgba",colorType:"float"}),l=t({vert:` - precision highp float; - attribute vec2 xy; - void main () { - gl_Position = vec4(xy, 0, 1); - }`,frag:` - precision highp float; - uniform vec2 srcRes; - uniform sampler2D src; - uniform float gamma; - - vec3 approxLinearToSRGB (vec3 rgb, float gamma) { - return pow(clamp(rgb, vec3(0), vec3(1)), vec3(1.0 / gamma)); - } - - void main () { - vec4 color = texture2D(src, gl_FragCoord.xy / srcRes); - gl_FragColor = vec4(approxLinearToSRGB(color.rgb, gamma), color.a); - }`,attributes:{xy:[-4,-4,4,-4,0,4]},uniforms:{src:()=>s,srcRes:()=>o,gamma:()=>n},count:3,depth:{enable:!1},blend:{enable:!0,func:{srcRGB:"one",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}}}),f=new Set,u=t.frame(()=>{let e=f.values(),t=e.next();for(;!t.done;)t.value(),t=e.next()}),c=(e,t)=>{let n=void 0===e?Math.min(window.innerWidth,window.screen.availWidth):e,i=void 0===t?Math.min(window.innerHeight,window.screen.availHeight):t;r.width=n*window.devicePixelRatio,r.height=i*window.devicePixelRatio,o[0]=r.width,o[1]=r.height,s.resize(...o)},d=()=>{c()};return e.canvas||(window.addEventListener("resize",d),window.addEventListener("orientationchange",d),c()),{get canvas(){return r},get regl(){return t},get gamma(){return n},set gamma(newGamma){n=+newGamma},get isSupported(){return a},get isDestroyed(){return i},render:(e,n)=>{let i;t.clear(ep),s.use(()=>{t.clear(ep),e()}),l(),(i=n.getContext("2d")).clearRect(0,0,n.width,n.height),i.drawImage(r,(r.width-n.width)/2,(r.height-n.height)/2,n.width,n.height,0,0,n.width,n.height)},resize:c,onFrame:e=>(f.add(e),()=>{f.delete(e)}),refresh:()=>{t.poll()},destroy:()=>{i=!0,window.removeEventListener("resize",d),window.removeEventListener("orientationchange",d),u.cancel(),r=void 0,t.destroy(),t=void 0}}},tD=` -precision mediump float; - -uniform sampler2D texture; - -varying vec2 uv; - -void main () { - gl_FragColor = texture2D(texture, uv); -} -`,tP=` -precision mediump float; - -uniform mat4 modelViewProjection; - -attribute vec2 position; - -varying vec2 uv; - -void main () { - uv = position; - gl_Position = modelViewProjection * vec4(-1.0 + 2.0 * uv.x, 1.0 - 2.0 * uv.y, 0, 1); -} -`,tM=`precision highp float; - -varying vec4 color; - -void main() { - gl_FragColor = color; -} -`,tI=`precision highp float; - -uniform sampler2D startStateTex; -uniform sampler2D endStateTex; -uniform float t; - -varying vec2 particleTextureIndex; - -void main() { - // Interpolate x, y, and value - vec3 start = texture2D(startStateTex, particleTextureIndex).xyw; - vec3 end = texture2D(endStateTex, particleTextureIndex).xyw; - vec3 curr = start * (1.0 - t) + end * t; - - // The category cannot be interpolated - float endCategory = texture2D(endStateTex, particleTextureIndex).z; - - gl_FragColor = vec4(curr.xy, endCategory, curr.z); -}`,tj=`precision highp float; - -attribute vec2 position; -varying vec2 particleTextureIndex; - -void main() { - // map normalized device coords to texture coords - particleTextureIndex = 0.5 * (1.0 + position); - - gl_Position = vec4(position, 0, 1); -}`,tz=` -precision highp float; - -uniform float antiAliasing; - -varying vec4 color; -varying float finalPointSize; - -float linearstep(float edge0, float edge1, float x) { - return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); -} - -void main() { - vec2 c = gl_PointCoord * 2.0 - 1.0; - float sdf = length(c) * finalPointSize; - float alpha = linearstep(finalPointSize + antiAliasing, finalPointSize - antiAliasing, sdf); - - gl_FragColor = vec4(color.rgb, alpha * color.a); -} -`,tB=function(){let e=(e,t,r,n,i)=>{let a=(n-t)*.5,o=(i-r)*.5;return(2*r-2*n+a+o)*e*e*e+(-3*r+3*n-2*a-o)*e*e+a*e+r},t=(t,r,n)=>{let i=n*t,a=Math.floor(i),o=i-a,s=r[Math.max(0,a-1)],l=r[a],f=r[Math.min(n,a+1)],u=r[Math.min(n,a+2)];return[e(o,s[0],l[0],f[0],u[0]),e(o,s[1],l[1],f[1],u[1])]},r=(e,t,r,n)=>(e-r)**2+(t-n)**2,n=(e,t,r)=>{let n=t[0],i=t[1],a=r[0]-n,o=r[1]-i;if(0!==a||0!==o){let t=((e[0]-n)*a+(e[1]-i)*o)/(a*a+o*o);t>1?(n=r[0],i=r[1]):t>0&&(n+=a*t,i+=o*t)}return(a=e[0]-n)*a+(o=e[1]-i)*o},i=(e,t,r,a,o)=>{let s,l=a;for(let i=t+1;il&&(s=i,l=a)}l>a&&(s-t>1&&i(e,t,s,a,o),o.push(e[s]),r-s>1&&i(e,s,r,a,o))},a=(e,t)=>{let r=e.length-1,n=[e[0]];return i(e,0,r,t,n),n.push(e[r]),n};self.onmessage=function(e){var n;let i,o;(e.data.points?+e.data.points.length:0)||self.postMessage({error:Error("No points provided")}),e.data.points;let s=(n=e.data.points,i={},o=!Number.isNaN(+n[0][5]),n.forEach(e=>{let t=e[4];i[t]||(i[t]=[]),o?i[t][e[5]]=e:i[t].push(e)}),Object.entries(i).forEach(e=>{i[e[0]]=e[1].filter(e=>e),i[e[0]].reference=e[1][0]}),i);self.postMessage({points:Object.entries(s).reduce((n,i)=>(n[i[0]]=((e,{maxIntPointsPerSegment:n=100,tolerance:i=.002}={})=>{let o,s=e.length,l=s-1,f=l*n+1,u=i**2,c=[];for(let i=0;iu&&(s.push(c),o=c)}s.push(e[i+1]),s=a(s,u),c=c.concat(s.slice(0,s.length-1))}return c.push(e[e.length-1].slice(0,2)),c.flat()})(i[1],e.data.options),n[i[0]].reference=i[1].reference,n),{})})}},tR={showRecticle:{replacement:"showReticle",removalVersion:"2",translation:h},recticleColor:{replacement:"reticleColor",removalVersion:"2",translation:h},keyMap:{replacement:"actionKeyMap",removalVersion:"2",translation:e=>Object.entries(e).reduce((e,[t,r])=>(e[r]?e[r]=[...e[r],t]:e[r]=t,e),{})}},tL=e=>{for(let t of Object.keys(e).filter(e=>tR[e])){let{replacement:r,removalVersion:n,translation:i}=tR[t];console.warn(`regl-scatterplot: the "${t}" property is deprecated and will be removed in v${n}. Please use "${r}" instead.`),e[tR[t].replacement]=e[t]!==e2?i(e[t]):e[t],delete e[t]}return e},tF=(e,t,{allowSegment:r=!1,allowDensity:n=!1,allowInherit:i=!1}={})=>eX.has(e)?"valueZ":eJ.has(e)?"valueW":"segment"===e?r?"segment":t:"density"===e?n?"density":t:"inherit"===e&&i?"inherit":t,tV=e=>{switch(e){case"valueZ":return 2;case"valueW":return 3;default:return null}},t$=(e={})=>{var t;let r,n,f,u,c,d,p,m,g,b,x,A,L,F,U,Z,G,q,H,K,Y,Q,X,ee,et,er,ei,ea,eo,es,el,ed,ep,eX,eJ,e6,e4,e8,e7=(t={async:!e.syncEvents,caseInsensitive:!0},eJ=!!t?.async,e6=!!t?.caseInsensitive,{publish:o(e4=t?.stack||l(),{async:eJ,caseInsensitive:e6}),subscribe:i(e4,{caseInsensitive:e6}),unsubscribe:a(e4,{caseInsensitive:e6}),clear:s(e4),stack:e4}),e9=new Float32Array(16),te=new Float32Array(16),tr=[0,0];tL(e);let{renderer:tn,antiAliasing:ta=.5,pixelAligned:tc=!1,backgroundColor:td=eU,backgroundImage:tp=null,canvas:ty=document.createElement("canvas"),colorBy:tv=null,deselectOnDblClick:tR=!0,deselectOnEscape:t$=!0,lassoColor:tN=ek,lassoLineWidth:tW=2,lassoMinDelay:tU=10,lassoMinDist:tZ=3,lassoClearEvent:tG=eE,lassoInitiator:tq=!1,lassoInitiatorParentElement:tH=document.body,lassoLongPressIndicatorParentElement:tK=document.body,lassoOnLongPress:tY=!1,lassoLongPressTime:tQ=e_,lassoLongPressAfterEffectTime:tX=eO,lassoLongPressEffectDelay:tJ=eC,lassoLongPressRevertEffectTime:t0=eD,lassoType:t1="lasso",lassoBrushSize:t2=24,actionKeyMap:t3=eV,mouseMode:t5=em,showReticle:t6=!1,reticleColor:t4=eQ,pointColor:t8=e$,pointColorActive:t7=eN,pointColorHover:t9=eW,showPointConnections:re=!1,pointConnectionColor:rt=eZ,pointConnectionColorActive:rr=eG,pointConnectionColorHover:rn=eq,pointConnectionColorBy:ri=null,pointConnectionOpacity:ra=null,pointConnectionOpacityBy:ro=null,pointConnectionOpacityActive:rs=.66,pointConnectionSize:rl=2,pointConnectionSizeActive:rf=2,pointConnectionSizeBy:ru=null,pointConnectionMaxIntPointsPerSegment:rc=100,pointConnectionTolerance:rd=.002,pointSize:rp=6,pointSizeSelected:rm=2,pointSizeMouseDetection:rh="auto",pointOutlineWidth:ry=2,opacity:rv=ef,opacityBy:rg=null,opacityByDensityFill:rb=.15,opacityInactiveMax:rx=1,opacityInactiveScale:rw=1,sizeBy:rA=null,pointScaleMode:rS="asinh",height:rE=ef,width:rT=ef,annotationLineColor:rk=eH,annotationLineWidth:r_=1,annotationHVLineLimit:rO=1e3,cameraIsFixed:rC=!1}=e,rD=rT===ef?1:rT,rP=rE===ef?1:rE,{performanceMode:rM=!1,opacityByDensityDebounceTime:rI=25,spatialIndexUseWorker:rj=e1}=e,rz=!!(e.renderPointsAsSquares||rM),rB=!!(e.disableAlphaBlending||rM);t5=tf(ev,em)(t5),tn||(tn=tC({regl:e.regl,gamma:e.gamma})),td=tw(td,!0),tN=tw(tN,!0),t4=tw(t4,!0);let rR=!1,rL=!1,rF=tA(td),rV=!1,r$=null,rN=[0,0],rW=-1,rU=[],rZ=new Set,rG=new Set,rq=!1,rH=new Set,rK=[],rY=0,rQ=0,rX=!1,rJ=[],r0=e.aspectRatio||1,r1=!1,r2=!0,r3=!1;t8=tg(t8)?[...t8]:[t8],t7=tg(t7)?[...t7]:[t7],t9=tg(t9)?[...t9]:[t9],t8=t8.map(e=>tw(e,!0)),t7=t7.map(e=>tw(e,!0)),t9=t9.map(e=>tw(e,!0)),rv=to(rv=!Array.isArray(rv)&&Number.isNaN(+rv)?t8[0][3]:rv,ts,{minLength:1})?[...rv]:[rv];let r5=1/(rp=to(rp,ts,{minLength:1})?[...rp]:[rp])[0];rt="inherit"===rt?[...t8]:(rt=tg(rt)?[...rt]:[rt]).map(e=>tw(e,!0)),rr="inherit"===rr?[...t7]:(rr=tg(rr)?[...rr]:[rr]).map(e=>tw(e,!0)),rn="inherit"===rn?[...t9]:(rn=tg(rn)?[...rn]:[rn]).map(e=>tw(e,!0)),ra="inherit"===ra?[...rv]:to(ra,ts,{minLength:1})?[...ra]:[ra],rl="inherit"===rl?[...rp]:to(rl,ts,{minLength:1})?[...rl]:[rl],tv=tF(tv,null),rg=tF(rg,null,{allowDensity:!0}),rA=tF(rA,null),ri=tF(ri,null,{allowSegment:!0,allowInherit:!0}),ro=tF(ro,null,{allowSegment:!0}),ru=tF(ru,null,{allowSegment:!0});let r6=0,r4=0,r8=!1,r7=null,r9=t6,ne=0,nt=0,nr=!1,nn=!1,ni=!1,na=!1,no=ew,ns=ew,nl=!1,nf=e.xScale||null,nu=e.yScale||null,nc=0,nd=0,np=0,nm=0;nf&&(nc=nf.domain()[0],nd=nf.domain()[1]-nf.domain()[0],nf.range([0,rD])),nu&&(np=nu.domain()[0],nm=nu.domain()[1]-nu.domain()[0],nu.range([rP,0]));let nh=e=>-1+e/rD*2,ny=e=>1+-(e/rP*2),nv=(e,t)=>{let n=[e,t,1,1];return C(n,n,T(e9,k(e9,d,k(e9,r.view,m)))),n.slice(0,2)},ng=(e=0)=>{let t=id(),r=(Z[1]-G[1])/ty.height;return(F*t+e)*r},nb=()=>rq?rK.filter((e,t)=>rH.has(t)):rK,nx=(e,t,r,n)=>{let i=u.range(e,t,r,n);return rq?i.filter(e=>rH.has(e)):i},nw=()=>{let[e,t]=[nh(tr[0]),ny(tr[1])],[r,n]=nv(e,t),i=ng(4),a=nx(r-i,n-i,r+i,n+i),o=i,s=-1;for(let e of a){let[t,i]=rK[e],a=ti(t,i,r,n);a{rJ=[],n&&n.clear()},nS=e=>e&&e.length>4,nE=(e,t)=>{if(x||!re||!nS(rK[e[0]]))return;let r=0===t,n=1===t?e=>rG.add(e):h,i=Object.keys(e.reduce((e,t)=>{let r=rK[t];return e[Array.isArray(r[4])?r[4][0]:r[4]]=!0,e},{})),a=g.getData().opacities;for(let e of i.filter(e=>!rG.has(+e))){let t=b[e][0],i=b[e][2],o=4*t+2*b[e][3],s=o+2*i+4;void 0===a.__original__&&(a.__original__=a.slice());for(let e=o;e[e%r6/r6+r4,Math.floor(e/r6)/r6+r4],nk=e=>rq&&!rH.has(e),n_=({preventEvent:e=!1}={})=>{tG===eS&&nA(),rU.length>0&&(e||e7.publish("deselect"),rG.clear(),nE(rU,0),rU=[],rZ.clear(),r2=!0)},nO=(e,{merge:t=!1,remove:r=!1,preventEvent:n=!1}={})=>{let i=Array.isArray(e)?e:[e],a=[...rU];if(t){let e;if(e=[],rU.forEach(t=>{e[t]=!0}),i.forEach(t=>{e[t]=!0}),rU=e.reduce((e,t,r)=>(t&&e.push(r),e),[]),a.length===rU.length){r2=!0;return}}else if(r){let e=new Set(i);if(rU=rU.filter(t=>!e.has(t)),a.length===rU.length){r2=!0;return}}else{if(rU?.length>0&&nE(rU,0),a.length>0&&0===i.length)return void n_({preventEvent:n});rU=i}if(y(a,rU)){r2=!0;return}let o=[];rZ.clear(),rG.clear();for(let e=rU.length-1;e>=0;e--){let t=rU[e];if(t<0||t>=rY||nk(t)){rU.splice(e,1);continue}rZ.add(t),o.push.apply(o,nT(t))}ee({usage:"dynamic",type:"float",data:o}),nE(rU,1),n||e7.publish("select",{points:rU}),r2=!0},nC=(e,{showReticleOnce:t=!1,preventEvent:r=!1}={})=>{let n=!1;if(!(rq&&!rH.has(e))&&e>=0&&e=0&&i&&!rZ.has(t)&&nE([t],0),eX=e,et.subdata(nT(e)),rZ.has(e)||nE([e],2),i&&!r&&e7.publish("pointover",eX)}else(n=+eX>=0)&&(rZ.has(eX)||nE([eX],0),r||e7.publish("pointout",eX)),eX=void 0;n&&(r2=!0,r3=t)},nD=e=>{let t=ty.getBoundingClientRect();return tr[0]=e.clientX-t.left,tr[1]=e.clientY-t.top,[...tr]},nP=tt(ty,{onStart:()=>{r.config({isFixed:!0}),rV=!0,rX=!0,nA(),rW>=0&&(clearTimeout(rW),rW=-1),e7.publish("lassoStart")},onDraw:(e,t)=>{rJ=e,n.setPoints(t),e7.publish("lassoExtend",{coordinates:e})},onEnd:(e,t,{merge:n=!1,remove:i=!1}={})=>{r.config({isFixed:rC}),rJ=[...e],nO((e=>{let t=(e=>{let t=1/0,r=-1/0,n=1/0,i=-1/0;for(let a=0;ar?e[a]:r,n=e[a+1]i?e[a+1]:i;return[t,n,r,i]})(e);if(!(([e,t,r,n])=>Number.isFinite(e)&&Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(n)&&r-e>0&&n-t>0)(t))return[];let r=nx(...t),n=[];for(let t of r)tm(e,rK[t])&&n.push(t);return n})(t),{merge:n,remove:i}),e7.publish("lassoEnd",{coordinates:rJ}),tG===eE&&nA()},enableInitiator:tq,initiatorParentElement:tH,longPressIndicatorParentElement:tK,pointNorm:([e,t])=>nv(nh(e),ny(t)),minDelay:tU,minDist:"brush"===t1?Math.max(3,tZ):tZ,type:t1}),nM=(e,t)=>{switch(t3[t]){case"alt":return e.altKey;case"cmd":return e.metaKey;case eB:return e.ctrlKey;case eR:return e.metaKey;case eL:return e.shiftKey;default:return!1}},nI=e=>{nn&&1===e.buttons&&(rV=!0,r$=performance.now(),rN=nD(e),(rX=t5===eh||nM(e,eP))||!tY||(nP.showLongPressIndicator(e.clientX,e.clientY,{time:tQ,extraTime:tX,delay:tJ}),rW=setTimeout(()=>{rW=-1,rX=!0},tQ)))},nj=e=>{nn&&(rV=!1,rW>=0&&(clearTimeout(rW),rW=-1),rX&&(e.preventDefault(),rX=!1,nP.end({merge:nM(e,eI),remove:nM(e,ej)})),tY&&nP.hideLongPressIndicator({time:t0}))},nz=e=>{if(!nn||(e.preventDefault(),ti(...nD(e),...rN)>=tZ))return;let t=performance.now()-r$;if(!tq||t<500){let t=nw();t>=0?(rU.length>0&&tG===eS&&nA(),nO([t],{merge:nM(e,eI),remove:nM(e,ej)})):U||(U=setTimeout(()=>{U=null,nP.showInitiator(e)},200))}},nB=e=>{nP.hideInitiator(),U&&(clearTimeout(U),U=null),tR&&(e.preventDefault(),n_())},nR=e=>{!na&&(nl=document.elementsFromPoint(e.clientX,e.clientY).some(e=>e===ty),na=!0);if(!(nn&&(nl||rV)))return;let t=ti(...nD(e),...rN)>=tZ;nl&&!rX&&nC(nw()),rX?(e.preventDefault(),nP.extend(e,!0)):rV&&tY&&t&&nP.hideLongPressIndicator({time:t0}),rW>=0&&t&&(clearTimeout(rW),rW=-1),rV&&(r2=!0)},nL=()=>{eX=void 0,nl=!1,na=!1,nn&&(+eX>=0&&!rZ.has(eX)&&nE([eX],0),nj(),r2=!0)},nF=()=>{let e=Math.max(rp.length,rv.length),t=new Float32Array((nt=Math.max(2,Math.ceil(Math.sqrt(e))))**2*4);for(let r=0;r{let n=e.length,i=t.length,a=r.length,o=[];if(n===i&&i===a)for(let i=0;i{let e=nV(),t=new Float32Array((ne=Math.max(2,Math.ceil(Math.sqrt(e.length))))**2*4);return e.forEach((e,r)=>{t[4*r]=e[0],t[4*r+1]=e[1],t[4*r+2]=e[2],t[4*r+3]=e[3]}),tn.regl.texture({data:t,shape:[ne,ne,4],type:"float"})},nN=()=>{d=O([],[1/(c=rD/rP),1,1]),p=O([],[1/c,1,1]),m=O([],[r0,1,1])},nW=(e,t)=>r=>{var n;if(!r||0===r.length)return;let i=[...e()],a=tg(r)?r:[r];if(a=a.map(e=>tw(e,!0)),n=a,!(Array.isArray(i)&&Array.isArray(n)&&i.length===n.length&&(0===i.length||Array.isArray(i[0])&&Array.isArray(n[0])&&i.every(([e,t,r,i],a)=>{let[o,s,l,f]=n[a];return e===o&&t===s&&r===l&&i===f})))){ed&&ed.destroy();try{t(a),ed=n$()}catch(e){console.error("Invalid colors. Switching back to default colors."),t(i),ed=n$()}}},nU=nW(()=>t8,e=>{t8=e}),nZ=nW(()=>t7,e=>{t7=e}),nG=nW(()=>t9,e=>{t9=e}),nq=()=>{let e,t,r,n,i,a;if(!(nf||nu))return;let[o,s]=(e=nv(-1,-1),t=nv(1,1),r=(e[0]+1)/2,n=(t[0]+1)/2,i=(e[1]+1)/2,a=(t[1]+1)/2,[[nc+r*nd,nc+n*nd],[np+i*nm,np+a*nm]]);nf&&nf.domain(o),nu&&nu.domain(s)},nH=(e,t)=>{rP=Math.max(1,e),ty.height=Math.floor(rP*window.devicePixelRatio),nu&&(nu.range([rP,0]),t||nq())},nK=e=>{if(e===ef){rE=e,ty.style.height="100%",window.requestAnimationFrame(()=>{ty&&nH(ty.getBoundingClientRect().height)});return}+e&&!(0>=+e)&&(nH(rE=+e),ty.style.height=`${rE}px`)},nY=()=>{F=rh,rh===ef&&(F=Array.isArray(rp)?rp.reduce((e,t)=>t>e?t:e,-1/0):rp)},nQ=e=>{let t=Array.isArray(rp)?[...rp]:rp;to(e,ts,{minLength:1})?rp=[...e]:tl(+e)&&(rp=[+e]),t===rp||y(t,rp)||(ep&&ep.destroy(),r5=1/rp[0],ep=nF(),nY())},nX=(e,t)=>{rD=Math.max(1,e),ty.width=Math.floor(rD*window.devicePixelRatio),nf&&(nf.range([0,rD]),t||nq())},nJ=e=>{if(e===ef){rT=e,ty.style.width="100%",window.requestAnimationFrame(()=>{ty&&nX(ty.getBoundingClientRect().width)});return}+e&&!(0>=+e)&&(nX(rT=+e),ty.style.width=`${rD}px`)},n0=e=>{switch(e){case"valueZ":return no;case"valueW":return ns;default:return null}},n1=(e,t)=>e===ex?e=>Math.round(e*(t.length-1)):h,n2=()=>ta,n3=()=>[ty.width,ty.height],n5=()=>ed,n6=()=>ne,n4=()=>.5/ne,n8=()=>window.devicePixelRatio,n7=()=>ee,n9=()=>ep,ie=()=>nt,it=()=>.5/nt,ir=()=>0,ii=()=>Y||H,ia=()=>r6,io=()=>.5/r6,is=()=>k(te,p,k(te,r.view,m)),il=()=>window.devicePixelRatio,iu=()=>tb(r5,r.scaling[0])*window.devicePixelRatio,ic=()=>r.scaling[0]>1?Math.asinh(tb(1,r.scaling[0]))/Math.asinh(1)*window.devicePixelRatio:tb(r5,r.scaling[0])*window.devicePixelRatio,id=ic;"linear"===rS?id=iu:"constant"===rS&&(id=il);let ip=()=>rq?rH.size:rY,im=()=>rU.length,ih=()=>im()>0?rx:1,iy=()=>im()>0?rw:1,iv=()=>+("valueZ"===tv),ig=()=>+("valueW"===tv),ib=()=>+("valueZ"===rg),ix=()=>+("valueW"===rg),iw=()=>+("density"===rg),iA=()=>+("valueZ"===rA),iS=()=>+("valueW"===rA),iE=()=>+tc,iT=()=>"valueZ"===tv?no===ex?t8.length-1:1:ns===ex?t8.length-1:1,ik=()=>"valueZ"===rg?no===ex?rv.length-1:1:ns===ex?rv.length-1:1,i_=()=>"valueZ"===rA?no===ex?rp.length-1:1:ns===ex?rp.length-1:1,iO=e=>{if("density"!==rg)return 1;let t=id(),n=rp[0]*t,i=2/(2/r.view[0])*(2/(2/r.view[5])),a=e.viewportHeight,o=e.viewportWidth,s=rb*o*a/(rQ*n*n)*tx(1,i);s*=rz?1:1/(.25*Math.PI);let l=tb(1,n)+.5;return tx(1,tb(0,s*=(n/l)**2))},iC=tn.regl({framebuffer:()=>Q,vert:tj,frag:tI,attributes:{position:[-4,0,4,4,4,-4]},uniforms:{startStateTex:()=>K,endStateTex:()=>H,t:(e,t)=>t.t},count:3}),iD=(e,t,r,n=eu,i=ih,a=iy)=>tn.regl({frag:rz?tM:tz,vert:` -precision highp float; - -uniform sampler2D colorTex; -uniform float colorTexRes; -uniform float colorTexEps; -uniform sampler2D stateTex; -uniform float stateTexRes; -uniform float stateTexEps; -uniform float devicePixelRatio; -uniform sampler2D encodingTex; -uniform float encodingTexRes; -uniform float encodingTexEps; -uniform float pointSizeExtra; -uniform float pointOpacityMax; -uniform float pointOpacityScale; -uniform float numPoints; -uniform float globalState; -uniform float isColoredByZ; -uniform float isColoredByW; -uniform float isOpacityByZ; -uniform float isOpacityByW; -uniform float isOpacityByDensity; -uniform float isSizedByZ; -uniform float isSizedByW; -uniform float isPixelAligned; -uniform float colorMultiplicator; -uniform float opacityMultiplicator; -uniform float opacityDensity; -uniform float sizeMultiplicator; -uniform float numColorStates; -uniform float pointScale; -uniform float drawingBufferWidth; -uniform float drawingBufferHeight; -uniform mat4 modelViewProjection; - -attribute vec2 stateIndex; - -varying vec4 color; -varying float finalPointSize; - -void main() { - vec4 state = texture2D(stateTex, stateIndex); - - if (isPixelAligned < 0.5) { - gl_Position = modelViewProjection * vec4(state.x, state.y, 0.0, 1.0); - } else { - vec4 clipSpacePosition = modelViewProjection * vec4(state.x, state.y, 0.0, 1.0); - vec2 ndcPosition = clipSpacePosition.xy / clipSpacePosition.w; - vec2 pixelPos = 0.5 * (ndcPosition + 1.0) * vec2(drawingBufferWidth, drawingBufferHeight); - pixelPos = floor(pixelPos + 0.5); // Snap to nearest pixel - vec2 snappedPosition = (pixelPos / vec2(drawingBufferWidth, drawingBufferHeight)) * 2.0 - 1.0; - gl_Position = vec4(snappedPosition, 0.0, 1.0); - } - - - // Determine color index - float colorIndexZ = isColoredByZ * floor(state.z * colorMultiplicator); - float colorIndexW = isColoredByW * floor(state.w * colorMultiplicator); - - // Multiply by the number of color states per color - // I.e., normal, active, hover, background, etc. - float colorIndex = (colorIndexZ + colorIndexW) * numColorStates; - - // Half a "pixel" or "texel" in texture coordinates - float colorLinearIndex = colorIndex + globalState; - - // Need to add cEps here to avoid floating point issue that can lead to - // dramatic changes in which color is loaded as floor(3/2.9999) = 1 but - // floor(3/3.0001) = 0! - float colorRowIndex = floor((colorLinearIndex + colorTexEps) / colorTexRes); - - vec2 colorTexIndex = vec2( - (colorLinearIndex / colorTexRes) - colorRowIndex + colorTexEps, - colorRowIndex / colorTexRes + colorTexEps - ); - - color = texture2D(colorTex, colorTexIndex); - - // Retrieve point size - float pointSizeIndexZ = isSizedByZ * floor(state.z * sizeMultiplicator); - float pointSizeIndexW = isSizedByW * floor(state.w * sizeMultiplicator); - float pointSizeIndex = pointSizeIndexZ + pointSizeIndexW; - - float pointSizeRowIndex = floor((pointSizeIndex + encodingTexEps) / encodingTexRes); - vec2 pointSizeTexIndex = vec2( - (pointSizeIndex / encodingTexRes) - pointSizeRowIndex + encodingTexEps, - pointSizeRowIndex / encodingTexRes + encodingTexEps - ); - float pointSize = texture2D(encodingTex, pointSizeTexIndex).x; - - // Retrieve opacity - ${3===n?"":` - if (isOpacityByDensity < 0.5) { - float opacityIndexZ = isOpacityByZ * floor(state.z * opacityMultiplicator); - float opacityIndexW = isOpacityByW * floor(state.w * opacityMultiplicator); - float opacityIndex = opacityIndexZ + opacityIndexW; - - float opacityRowIndex = floor((opacityIndex + encodingTexEps) / encodingTexRes); - vec2 opacityTexIndex = vec2( - (opacityIndex / encodingTexRes) - opacityRowIndex + encodingTexEps, - opacityRowIndex / encodingTexRes + encodingTexEps - ); - color.a = texture2D(encodingTex, opacityTexIndex)[${1+n}]; - } else { - color.a = min(1.0, opacityDensity + globalState); - } - `} - - color.a = min(pointOpacityMax, color.a) * pointOpacityScale; - finalPointSize = (pointSize * pointScale) + pointSizeExtra; - gl_PointSize = finalPointSize; -} -`,blend:{enable:!rB,func:{srcRGB:"src alpha",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}},depth:{enable:!1},attributes:{stateIndex:{buffer:r,size:2}},uniforms:{antiAliasing:n2,resolution:n3,modelViewProjection:is,devicePixelRatio:n8,pointScale:()=>id(),encodingTex:n9,encodingTexRes:ie,encodingTexEps:it,pointOpacityMax:i,pointOpacityScale:a,pointSizeExtra:e,globalState:n,colorTex:n5,colorTexRes:n6,colorTexEps:n4,stateTex:ii,stateTexRes:ia,stateTexEps:io,isColoredByZ:iv,isColoredByW:ig,isOpacityByZ:ib,isOpacityByW:ix,isOpacityByDensity:iw,isSizedByZ:iA,isSizedByW:iS,isPixelAligned:iE,colorMultiplicator:iT,opacityMultiplicator:ik,opacityDensity:iO,sizeMultiplicator:i_,numColorStates:4,drawingBufferWidth:e=>e.drawingBufferWidth,drawingBufferHeight:e=>e.drawingBufferHeight},count:t,primitive:"points"}),iP=iD(ir,ip,()=>X),iM=iD(ir,()=>1,()=>et,2,()=>1,()=>1),iI=iD(()=>(rm+2*ry)*window.devicePixelRatio,im,n7,1,()=>1,()=>1),ij=iD(()=>(rm+ry)*window.devicePixelRatio,im,n7,3,()=>1,()=>1),iz=iD(()=>rm*window.devicePixelRatio,im,n7,1,()=>1,()=>1),iB=tn.regl({frag:tD,vert:tP,attributes:{position:[0,1,0,0,1,0,0,1,1,1,1,0]},uniforms:{modelViewProjection:is,texture:()=>tp},count:6}),iR=tn.regl({vert:` - precision mediump float; - uniform mat4 modelViewProjection; - attribute vec2 position; - void main () { - gl_Position = modelViewProjection * vec4(position, 0, 1); - }`,frag:` - precision mediump float; - uniform vec4 color; - void main () { - gl_FragColor = vec4(color.rgb, 0.2); - }`,depth:{enable:!1},blend:{enable:!0,func:{srcRGB:"src alpha",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}},attributes:{position:()=>rJ},uniforms:{modelViewProjection:is,color:()=>tN},elements:()=>(function(e,t,r=2){let n,i,a,o=e.length,s=function(e,t,r,n,i){let a;if(i===function(e,t,r,n){let i=0;for(let a=t,o=r-n;a0)for(let t=0;t=0;t-=n)a=$(t/n|0,e[t],e[t+1],a);return a&&B(a,a.next)&&(N(a),a=a.next),a}(e,0,o,r,!0),l=[];if(!s||s.next===s.prev)return l;if(e.length>80*r){n=1/0,i=1/0;let t=-1/0,s=-1/0;for(let a=r;at&&(t=r),o>s&&(s=o)}a=0!==(a=Math.max(t-n,s-i))?32767/a:0}return function e(t,r,n,i,a,o,s){if(!t)return;!s&&o&&function(e,t,r,n){let i=e;do 0===i.z&&(i.z=I(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e)i.prevZ.nextZ=null,i.prevZ=null,function(e){let t,r=1;do{let n,i=e;e=null;let a=null;for(t=0;i;){t++;let o=i,s=0;for(let e=0;e0||l>0&&o;)0!==s&&(0===l||!o||i.z<=o.z)?(n=i,i=i.nextZ,s--):(n=o,o=o.nextZ,l--),a?a.nextZ=n:e=n,n.prevZ=a,a=n;i=o}a.nextZ=null,r*=2}while(t>1)}(i)}(t,i,a,o);let l=t;for(;t.prev!==t.next;){let f=t.prev,u=t.next;if(o?function(e,t,r,n){let i=e.prev,a=e.next;if(z(i,e,a)>=0)return!1;let o=i.x,s=e.x,l=a.x,f=i.y,u=e.y,c=a.y,d=Math.min(o,s,l),p=Math.min(f,u,c),m=Math.max(o,s,l),h=Math.max(f,u,c),y=I(d,p,t,r,n),v=I(m,h,t,r,n),g=e.prevZ,b=e.nextZ;for(;g&&g.z>=y&&b&&b.z<=v;){if(g.x>=d&&g.x<=m&&g.y>=p&&g.y<=h&&g!==i&&g!==a&&j(o,f,s,u,l,c,g.x,g.y)&&z(g.prev,g,g.next)>=0||(g=g.prevZ,b.x>=d&&b.x<=m&&b.y>=p&&b.y<=h&&b!==i&&b!==a&&j(o,f,s,u,l,c,b.x,b.y)&&z(b.prev,b,b.next)>=0))return!1;b=b.nextZ}for(;g&&g.z>=y;){if(g.x>=d&&g.x<=m&&g.y>=p&&g.y<=h&&g!==i&&g!==a&&j(o,f,s,u,l,c,g.x,g.y)&&z(g.prev,g,g.next)>=0)return!1;g=g.prevZ}for(;b&&b.z<=v;){if(b.x>=d&&b.x<=m&&b.y>=p&&b.y<=h&&b!==i&&b!==a&&j(o,f,s,u,l,c,b.x,b.y)&&z(b.prev,b,b.next)>=0)return!1;b=b.nextZ}return!0}(t,i,a,o):function(e){let t=e.prev,r=e.next;if(z(t,e,r)>=0)return!1;let n=t.x,i=e.x,a=r.x,o=t.y,s=e.y,l=r.y,f=Math.min(n,i,a),u=Math.min(o,s,l),c=Math.max(n,i,a),d=Math.max(o,s,l),p=r.next;for(;p!==t;){if(p.x>=f&&p.x<=c&&p.y>=u&&p.y<=d&&j(n,o,i,s,a,l,p.x,p.y)&&z(p.prev,p,p.next)>=0)return!1;p=p.next}return!0}(t)){r.push(f.i,t.i,u.i),N(t),t=u.next,l=u.next;continue}if((t=u)===l){s?1===s?e(t=function(e,t){let r=e;do{let n=r.prev,i=r.next.next;!B(n,i)&&R(n,r,r.next,i)&&V(n,i)&&V(i,n)&&(t.push(n.i,r.i,i.i),N(r),N(r.next),r=e=i),r=r.next}while(r!==e)return M(r)}(M(t),r),r,n,i,a,o,2):2===s&&function(t,r,n,i,a,o){let s=t;do{let t=s.next.next;for(;t!==s.prev;){var l,f;if(s.i!==t.i&&(l=s,f=t,l.next.i!==f.i&&l.prev.i!==f.i&&!function(e,t){let r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&R(r,r.next,e,t))return!0;r=r.next}while(r!==e)return!1}(l,f)&&(V(l,f)&&V(f,l)&&function(e,t){let r=e,n=!1,i=(e.x+t.x)/2,a=(e.y+t.y)/2;do r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;while(r!==e)return n}(l,f)&&(z(l.prev,l,f.prev)||z(l,f.prev,f))||B(l,f)&&z(l.prev,l,l.next)>0&&z(f.prev,f,f.next)>0))){let l=function(e,t){let r=W(e.i,e.x,e.y),n=W(t.i,t.x,t.y),i=e.next,a=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}(s,t);s=M(s,s.next),l=M(l,l.next),e(s,r,n,i,a,o,0),e(l,r,n,i,a,o,0);return}t=t.next}s=s.next}while(s!==t)}(t,r,n,i,a,o):e(M(t),r,n,i,a,o,1);break}}}(s,l,r,n,i,a,0),l})(n.getPoints())}),iL=e=>{let t=new Float32Array(2*e),r=0;for(let n=0;n{let r=e.length;r4=.5/(r6=Math.max(2,Math.ceil(Math.sqrt(r))));let n=new Float32Array(r6**2*4),i=!0,a=!0,o=0,s=0,l=0;for(let t=0;tnew Promise(r=>{nn=!1;let n=t?.preventFilterReset&&e.length===rY;rQ=rY=e.length,H&&H.destroy(),H=iF(e,{z:t.zDataType,w:t.wDataType}),n||X({usage:"static",type:"float",data:iL(rY)}),en(t.spatialIndex||e,{useWorker:rj}).then(t=>{u=t,rK=e,nn=!0}).then(r)}),i$=(e,t)=>{er=r.target,ei=e,ea=r.distance[0],eo=t},iN=e=>new Promise(t=>{g.setPoints([]),e?.length>0?(x=!0,((e,t={tolerance:.002,maxIntPointsPerSegment:100})=>new Promise((r,n)=>{let i=new Worker(window.URL.createObjectURL(new Blob([`(${tB.toString()})()`],{type:"text/javascript"})));i.onmessage=e=>{e.data.error?n(e.data.error):r(e.data.points),i.terminate()},i.postMessage({points:e,options:t})}))(e,{maxIntPointsPerSegment:rc,tolerance:rd}).then(e=>{let r;b=[],r=0,Object.keys(e).forEach((t,n)=>{b[t]=[n,e[t].reference,e[t].length/2,r],r+=e[t].length/2});let n=Object.values(e);g.setPoints(1===n.length?n[0]:n,{colorIndices:(e=>{let t="inherit"===ri?tv:ri;if("segment"===t){let t=rt.length-1;return t<1?[]:e.reduce((e,r,n)=>{let i=0,a=[];for(let e=2;e(t[n]=4*r(i[e]),t),[])}return Array(b.length).fill(0)})(n),opacities:(()=>{let e="inherit"===ro?rg:ro;if("segment"===e){let e=ra.length-1;return e<1?[]:b.reduce((t,[r,n,i])=>(t[r]=v(i,t=>ra[Math.floor(t/(i-1)*e)]),t),[])}if(e){let t=tV(e),r="inherit"===ro?rv:ra,n=n1(n0(e),r);return b.reduce((e,[i,a])=>(e[i]=r[n(a[t])],e),[])}})(),widths:(()=>{let e="inherit"===ru?rA:ru;if("segment"===e){let e=rl.length-1;return e<1?[]:b.reduce((t,[r,n,i])=>(t[r]=v(i,t=>rl[Math.floor(t/(i-1)*e)]),t),[])}if(e){let t=tV(e),r="inherit"===ru?rp:rl,n=n1(n0(e),r);return b.reduce((e,[i,a])=>(e[i]=r[n(a[t])],e),[])}})()}),x=!1,t()})):t()}),iW=(e,{preventEvent:t=!1}={})=>{rq=!0,rH.clear();let r=Array.isArray(e)?e:[e],n=[],i=[],a=[];for(let e of r)Number.isFinite(e)&&!(e<0)&&!(e>=rY)&&(n.push(e),rH.add(e),rZ.has(e)&&a.push(e));for(let e of(e=>{let t=e.length;for(let r=1;r-1&&t{let r=()=>{e7.subscribe("draw",()=>{t||e7.publish("filter",{points:n}),e()},1),r2=!0};re||nS(rK[0])?iN(nb()).then(()=>{t||e7.publish("pointConnectionsDraw"),nO(a,{preventEvent:t}),r()}):r()})},iU=()=>nx(G[0],G[1],Z[0],Z[1]),iZ=w(()=>{rQ=iU().length},rI),iG=({duration:e=500,easing:t=eb})=>{r8&&e7.publish("transitionEnd"),r8=!0,r7=null,es=e,el=th(t)?eg[t]||eb:t,r9=t6,t6=!1,e7.publish("transitionStart")},iq=e=>rL?Promise.reject(new e5):new Promise((ni=!1,0===e.length)?e=>{f.clear(),e7.subscribe("draw",e,1),ni=!0,r2=!0}:t=>{let r=[],n=new Map,i=[],a=[],o=-1,s=e=>{a.push(e.lineWidth||r_);let t=tw(e.lineColor||rk,!0),r=`[${t.join(",")}]`;if(n.has(r)){let{idx:e}=n.get(r);i.push(e)}else{let e=++o;n.set(r,{idx:e,color:t}),i.push(e)}};for(let t of e){if(tE(t)){r.push([t.x1??-rO,t.y,t.x2??rO,t.y]),s(t);continue}if(tT(t)){r.push([t.x,t.y1??-rO,t.x,t.y2??rO]),s(t);continue}if(t_(t)){r.push([t.x1,t.y1,t.x2,t.y1,t.x2,t.y2,t.x1,t.y2,t.x1,t.y1]),s(t);continue}if(tk(t)){r.push([t.x,t.y,t.x+t.width,t.y,t.x+t.width,t.y+t.height,t.x,t.y+t.height,t.x,t.y]),s(t);continue}tO(t)&&(r.push(t.vertices.flatMap(h)),s(t))}f.setStyle({color:Array.from(n.values()).sort((e,t)=>e.idx>t.idx?1:-1).map(({color:e})=>e)}),f.setPoints(1===r.length?r.flat():r,{colorIndices:i,widths:a}),e7.subscribe("draw",t,1),ni=!0,r2=!0}),iH=e=>(...t)=>{let r=e(...t);return r2=!0,new Promise(e=>{e7.subscribe("draw",()=>e(r),1)})},iK=(e,t={})=>new Promise(n=>{let i=C([],[e.x+e.width/2,e.y+e.height/2,0,0],m).slice(0,2),a=2*Math.atan(1),o=c/r0,s=e.height*o>=e.width?e.height/2/Math.tan(a/2):e.width/2/Math.tan(a/2)/o;t.transition?(r.config({isFixed:!0}),i$(i,s),e7.subscribe("transitionEnd",()=>{n(),r.config({isFixed:rC})},1),iG({duration:t.transitionDuration,easing:t.transitionEasing})):(r.lookAt(i,s),e7.subscribe("draw",n,1),r2=!0)}),iY=(e,t,n={})=>new Promise(i=>{n.transition?(r.config({isFixed:!0}),i$(e,t),e7.subscribe("transitionEnd",()=>{i(),r.config({isFixed:rC})},1),iG({duration:n.transitionDuration,easing:n.transitionEasing})):(r.lookAt(e,t),e7.subscribe("draw",i,1),r2=!0)}),iQ=()=>{g.setStyle({color:nV(rt,rr,rn),opacity:null===ra?null:ra[0],width:rl[0]})},iX=()=>{let e=Math.round(rF)>.5?0:255;nP.initiator.style.border=`1px dashed rgba(${e}, ${e}, ${e}, 0.33)`,nP.initiator.style.background=`rgba(${e}, ${e}, ${e}, 0.1)`},iJ=()=>{let e=Math.round(rF)>.5?0:255;nP.longPressIndicator.style.color=`rgb(${e}, ${e}, ${e})`,nP.longPressIndicator.dataset.color=`rgb(${e}, ${e}, ${e})`;let t=tN.map(e=>Math.round(255*e));nP.longPressIndicator.dataset.activeColor=`rgb(${t[0]}, ${t[1]}, ${t[2]})`},i0=e=>{e&&r.setView(e)},i1=(e,t)=>r=>{"inherit"===r?e([...t()]):e((tg(r)?r:[r]).map(e=>tw(e,!0))),iQ()},i2=i1(e=>{rt=e},()=>t8),i3=i1(e=>{rr=e},()=>t7),i5=i1(e=>{rn=e},()=>t9),i6=e=>{ta=Number(e)||.5},i4=e=>{tc=!!e},i8=(e={})=>{var t,i,a,o,s,l,f,u,c,d,p,m,h,v,g,b,x,w,S,E,T,k,_,O;let C;return rL?Promise.reject(Error(e5)):(tL(e),(void 0!==e.backgroundColor||void 0!==e.background)&&(t=e.backgroundColor||e.background)&&(rF=tA(td=tw(t,!0)),iX(),iJ()),void 0!==e.backgroundImage&&((i=e.backgroundImage)?th(i)?tu(tn.regl,i).then(e=>{tp=e,r2=!0,e7.publish("backgroundImageReady")}).catch(()=>{console.error(`Count not create texture from ${i}`),tp=null}):tp="texture2d"===i._reglType?i:null:tp=null),void 0!==e.cameraTarget&&(a=e.cameraTarget)&&r.lookAt(a,r.distance[0],r.rotation),void 0!==e.cameraDistance&&(o=e.cameraDistance)>0&&r.lookAt(r.target,o,r.rotation),void 0!==e.cameraRotation&&null!==(s=e.cameraRotation)&&r.lookAt(r.target,r.distance[0],s),void 0!==e.cameraView&&i0(e.cameraView),void 0!==e.cameraIsFixed&&(rC=!!e.cameraIsFixed,r.config({isFixed:rC})),void 0!==e.colorBy&&(tv=tF(e.colorBy,null)),void 0!==e.pointColor&&nU(e.pointColor),void 0!==e.pointColorActive&&nZ(e.pointColorActive),void 0!==e.pointColorHover&&nG(e.pointColorHover),void 0!==e.pointSize&&nQ(e.pointSize),void 0!==e.pointSizeSelected&&+(l=e.pointSizeSelected)&&!(0>+l)&&(rm=+l),void 0!==e.pointSizeMouseDetection&&(rh=e.pointSizeMouseDetection,nY()),void 0!==e.sizeBy&&(rA=tF(e.sizeBy,null)),void 0!==e.opacity&&(f=e.opacity,C=Array.isArray(rv)?[...rv]:rv,to(f,ts,{minLength:1})?rv=[...f]:tl(+f)&&(rv=[+f]),C===rv||y(C,rv)||(ep&&ep.destroy(),ep=nF())),void 0!==e.showPointConnections&&((re=!!e.showPointConnections)?nn&&nS(rK[0])&&iN(nb()).then(()=>{e7.publish("pointConnectionsDraw"),r2=!0}):iN()),void 0!==e.pointConnectionColor&&i2(e.pointConnectionColor),void 0!==e.pointConnectionColorActive&&i3(e.pointConnectionColorActive),void 0!==e.pointConnectionColorHover&&i5(e.pointConnectionColorHover),void 0!==e.pointConnectionColorBy&&(ri=tF(e.pointConnectionColorBy,null,{allowSegment:!0,allowInherit:!0})),void 0!==e.pointConnectionOpacityBy&&(ro=tF(e.pointConnectionOpacityBy,null,{allowSegment:!0})),void 0!==e.pointConnectionOpacity&&(to(u=e.pointConnectionOpacity,ts,{minLength:1})&&(ra=[...u]),tl(+u)&&(ra=[+u]),rt=rt.map(e=>(e[3]=Number.isNaN(+ra[0])?e[3]:+ra[0],e)),iQ()),void 0!==e.pointConnectionOpacityActive&&!Number.isNaN(+(c=e.pointConnectionOpacityActive))&&+c&&(rs=+c),void 0!==e.pointConnectionSize&&(to(d=e.pointConnectionSize,ts,{minLength:1})&&(rl=[...d]),tl(+d)&&(rl=[+d]),iQ()),void 0!==e.pointConnectionSizeActive&&!Number.isNaN(+(p=e.pointConnectionSizeActive))&&+p&&(rf=Math.max(0,p)),void 0!==e.pointConnectionSizeBy&&(ru=tF(e.pointConnectionSizeBy,null,{allowSegment:!0})),void 0!==e.pointConnectionMaxIntPointsPerSegment&&(rc=Math.max(0,e.pointConnectionMaxIntPointsPerSegment)),void 0!==e.pointConnectionTolerance&&(rd=Math.max(0,e.pointConnectionTolerance)),void 0!==e.pointScaleMode&&(e=>{switch(e){case"linear":rS=e,id=iu;break;case"constant":rS=e,id=il;break;default:rS="asinh",id=ic}})(e.pointScaleMode),void 0!==e.opacityBy&&(rg=tF(e.opacityBy,null,{allowDensity:!0})),void 0!==e.lassoColor&&(e=>{if(!e)return;tN=tw(e,!0),n.setStyle({color:tN});let t=tN.map(e=>Math.round(255*e));nP.longPressIndicator.dataset.activeColor=`rgb(${t[0]}, ${t[1]}, ${t[2]})`})(e.lassoColor),void 0!==e.lassoLineWidth&&(Number.isNaN(+(m=e.lassoLineWidth))||1>+m||(tW=+m,n.setStyle({width:tW}))),void 0!==e.lassoMinDelay&&+(h=e.lassoMinDelay)&&(tU=+h,nP.set({minDelay:tU})),void 0!==e.lassoMinDist&&+(v=e.lassoMinDist)&&(tZ=+v,nP.set({minDist:tZ})),void 0!==e.lassoClearEvent&&(g=e.lassoClearEvent,tG=tf(eT,tG)(g)),void 0!==e.lassoInitiator&&(tq=!!e.lassoInitiator,nP.set({enableInitiator:tq})),void 0!==e.lassoInitiatorParentElement&&(tH=e.lassoInitiatorParentElement,nP.set({initiatorParentElement:tH})),void 0!==e.lassoLongPressIndicatorParentElement&&(tK=e.lassoLongPressIndicatorParentElement,nP.set({longPressIndicatorParentElement:tK})),void 0!==e.lassoOnLongPress&&(tY=!!e.lassoOnLongPress),void 0!==e.lassoLongPressTime&&(tQ=Number(e.lassoLongPressTime)),void 0!==e.lassoLongPressAfterEffectTime&&(tX=Number(e.lassoLongPressAfterEffectTime)),void 0!==e.lassoLongPressEffectDelay&&(tJ=Number(e.lassoLongPressEffectDelay)),void 0!==e.lassoLongPressRevertEffectTime&&(t0=Number(e.lassoLongPressRevertEffectTime)),void 0!==e.lassoType&&("brush"===(b=e.lassoType)?nP.set({type:b,minDist:Math.max(3,tZ)}):nP.set({type:b,minDist:tZ}),t1=nP.get("type")),void 0!==e.lassoBrushSize&&(t2=Number(e.lassoBrushSize)||t2,nP.set({brushSize:t2})),void 0!==e.actionKeyMap&&((t3=Object.entries(e.actionKeyMap).reduce((e,[t,r])=>(eF.includes(r)&&ez.includes(t)&&(e[t]=r),e),{}))[eM]?r.config({isRotate:!0,mouseDownMoveModKey:t3[eM]}):r.config({isRotate:!1})),void 0!==e.mouseMode&&(x=e.mouseMode,t5=tf(ev,em)(x),r.config({defaultMouseDownMoveAction:t5===ey?"rotate":"pan"})),void 0!==e.showReticle&&null!==(w=e.showReticle)&&(t6=w),void 0!==e.reticleColor&&(S=e.reticleColor)&&(t4=tw(S,!0),A.setStyle({color:t4}),L.setStyle({color:t4})),void 0!==e.pointOutlineWidth&&+(E=e.pointOutlineWidth)&&!(0>+E)&&(ry=+E),void 0!==e.height&&nK(e.height),void 0!==e.width&&nJ(e.width),void 0!==e.aspectRatio&&(0>=+(T=e.aspectRatio)||(r0=T)),void 0!==e.xScale&&(k=e.xScale)&&(nf=k,nc=k.domain()[0],nd=k?k.domain()[1]-k.domain()[0]:0,nf.range([0,rD]),nq()),void 0!==e.yScale&&(_=e.yScale)&&(np=(nu=_).domain()[0],nm=nu?nu.domain()[1]-nu.domain()[0]:0,nu.range([rP,0]),nq()),void 0!==e.deselectOnDblClick&&(tR=!!e.deselectOnDblClick),void 0!==e.deselectOnEscape&&(t$=!!e.deselectOnEscape),void 0!==e.opacityByDensityFill&&(rb=+e.opacityByDensityFill),void 0!==e.opacityInactiveMax&&(rx=+e.opacityInactiveMax),void 0!==e.opacityInactiveScale&&(rw=+e.opacityInactiveScale),void 0!==e.gamma&&(O=e.gamma,tn.gamma=O),void 0!==e.annotationLineColor&&(rk=tw(e.annotationLineColor)),void 0!==e.annotationLineWidth&&(r_=+e.annotationLineWidth),void 0!==e.annotationHVLineLimit&&(rO=+e.annotationHVLineLimit),void 0!==e.antiAliasing&&i6(e.antiAliasing),void 0!==e.pixelAligned&&i4(e.pixelAligned),new Promise(e=>{window.requestAnimationFrame(()=>{!rL&&ty&&(nN(),r.refresh(),tn.refresh(),al(),e())})}))},i7=()=>{r||(r=((e,{distance:t=1,target:r=[0,0],rotation:n=0,isNdc:i=!0,isFixed:a=!1,isPan:o=!0,isPanInverted:s=[!1,!0],panSpeed:l=1,isRotate:f=!0,rotateSpeed:u=1,defaultMouseDownMoveAction:c="pan",mouseDownMoveModKey:d="alt",isZoom:p=!0,zoomSpeed:m=1,viewCenter:h,scaleBounds:y,translationBounds:v,onKeyDown:g=()=>{},onKeyUp:b=()=>{},onMouseDown:x=()=>{},onMouseUp:w=()=>{},onMouseMove:A=()=>{},onWheel:E=()=>{}}={})=>{let M=((e=[0,0],t=1,r=0,n=[0,0],i=[[0,1/0],[0,1/0]],a=[[-1/0,1/0],[-1/0,1/0]])=>{let o=new Float32Array(16),s=new Float32Array(16),l=new Float32Array(16),f=S(),u=[...n.slice(0,2),0,1],c=Array.isArray(i[0])?[...i[0]]:[...i],d=Array.isArray(i[0])?[...i[1]]:[...i],p=Array.isArray(a[0])?[...a[0]]:[...a],m=Array.isArray(a[0])?[...a[1]]:[...a],h=()=>{var e,t,r,n,i,a,s,l,u,c;return(t=(e=f)[0],r=e[1],n=e[2],i=e[4],a=e[5],s=e[6],l=e[8],u=e[9],c=e[10],o[0]=Math.hypot(t,r,n),o[1]=Math.hypot(i,a,s),o[2]=Math.hypot(l,u,c),o).slice(0,2)},y=()=>{let e=h();return Math.min(e[0],e[1])},v=()=>{let e=h();return Math.max(e[0],e[1])},g=([e=0,t=0]=[],r=1,n=0)=>{f=S(),b([-e,-t]),w(n),x(1/r)},b=([e=0,t=0]=[])=>{o[0]=e,o[1]=t,o[2]=0;let r=_(s,o);k(f,r,f)},x=(e,t)=>{let r=Array.isArray(e),n=r?e[0]:e,i=r?e[1]:e;if(n<=0||i<=0||1===n&&1===i)return;let a=h(),p=a[0]*n,m=a[1]*i;if(n=Math.max(c[0],Math.min(p,c[1]))/a[0],i=Math.max(d[0],Math.min(m,d[1]))/a[1],1===n&&1===i)return;o[0]=n,o[1]=i,o[2]=1;let y=O(s,o),v=_(o,t?[...t,0]:u);k(f,v,k(f,y,k(f,T(l,v),f)))},w=e=>{var t,r,n,i,a,o,s,l;let u=S();a=(t=[0,0,1])[0],(l=Math.hypot(a,o=0,s=1))<1e-6||(a*=l=1/l,o*=l,s*=l,r=Math.sin(e),i=1-(n=Math.cos(e)),u[0]=a*a*i+n,u[1]=o*a*i+s*r,u[2]=s*a*i-o*r,u[3]=0,u[4]=a*o*i-s*r,u[5]=o*o*i+n,u[6]=s*o*i+a*r,u[7]=0,u[8]=a*s*i+o*r,u[9]=o*s*i-a*r,u[10]=s*s*i+n,u[11]=0,u[12]=0,u[13]=0,u[14]=0,u[15]=1),k(f,u,f)},A=e=>{e&&!(e.length<16)&&(f=e)};return g(e,t,r),{get translation(){var E;return(E=f,o[0]=E[12],o[1]=E[13],o[2]=E[14],o).slice(0,2)},get target(){return C(o,u,T(l,f)).slice(0,2)},get scaling(){return h()},get minScaling(){return y()},get maxScaling(){return v()},get scaleBounds(){return[[...c],[...d]]},get translationBounds(){return[[...p],[...m]]},get distance(){let e;return[1/(e=h())[0],1/e[1]]},get minDistance(){return 1/y()},get maxDistance(){return 1/v()},get rotation(){return Math.acos(f[0]/v())},get view(){return f},get viewCenter(){return u.slice(0,2)},lookAt:g,translate:b,pan:b,rotate:w,scale:x,zoom:x,reset:()=>{g(e,t,r)},set:(...e)=>(console.warn("`set()` is deprecated. Please use `setView()` instead."),A(...e)),setScaleBounds:e=>{let t=Array.isArray(e[0]);c[0]=t?e[0][0]:e[0],c[1]=t?e[0][1]:e[1],d[0]=t?e[1][0]:e[0],d[1]=t?e[1][1]:e[1]},setTranslationBounds:e=>{let t=Array.isArray(e[0]);p[0]=t?e[0][0]:e[0],p[1]=t?e[0][1]:e[1],m[0]=t?e[1][0]:e[0],m[1]=t?e[1][1]:e[1]},setView:A,setViewCenter:e=>{u=[...e.slice(0,2),0,1]}}})(r,t,n,h,y,v),I=0,j=0,z=0,B=0,R=0,L=0,F=!1,V=0,$=1,N=1,W=1,U=!1,Z=!1,G=!1,q="pan"===c,H=o,K=o,Y=s,Q=s,X=p,J=p,ee=()=>{H=Array.isArray(o)?!!o[0]:o,K=Array.isArray(o)?!!o[1]:o,Y=Array.isArray(s)?!!s[0]:s,Q=Array.isArray(s)?!!s[1]:s,X=Array.isArray(p)?!!p[0]:p,J=Array.isArray(p)?!!p[1]:p};ee();let et=i?e=>e/$*2*W:e=>e,er=i?e=>e/N*2:e=>-e,en=i?e=>(-1+e/$*2)*W:e=>e,ei=i?e=>1-e/N*2:e=>e,ea=()=>{let t=e.getBoundingClientRect();$=t.width,N=t.height,W=$/N},eo=e=>{G=!1,b(e)},es=e=>{G=e[P[d]],g(e)},el=e=>{F=!1,w(e)},ef=e=>{F=1===e.buttons,x(e)},eu=void 0!==document.createEvent("MouseEvent").offsetX?e=>{z=e.offsetX,B=e.offsetY}:t=>{let r=e.getBoundingClientRect();z=t.clientX-r.left,B=t.clientY-r.top},ec=e=>{I=e.clientX,j=e.clientY},ed=e=>{ec(e),A(e)},ep=e=>{if((X||J)&&!a){e.preventDefault(),ec(e),eu(e);let t=1===e.deltaMode?12:1;V+=t*(e.deltaY||e.deltaX||0)}E(e)};window.addEventListener("keydown",es,{passive:!0}),window.addEventListener("keyup",eo,{passive:!0}),e.addEventListener("mousedown",ef,{passive:!0}),window.addEventListener("mouseup",el,{passive:!0}),window.addEventListener("mousemove",ed,{passive:!0}),e.addEventListener("wheel",ep,{passive:!1}),M.config=({defaultMouseDownMoveAction:e=null,isFixed:t=null,isPan:r=null,isPanInverted:n=null,isRotate:i=null,isZoom:h=null,panSpeed:y=null,rotateSpeed:v=null,zoomSpeed:g=null,mouseDownMoveModKey:b=null}={})=>{q="pan"===(c=null!==e&&D.includes(e)?e:c),a=null!==t?t:a,o=null!==r?r:o,s=null!==n?n:s,f=null!==i?i:f,p=null!==h?h:p,l=+y>0?y:l,u=+v>0?v:u,m=+g>0?g:m,ee(),d=null!==b&&Object.keys(P).includes(b)?b:d},M.dispose=()=>{M=void 0,window.removeEventListener("keydown",es),window.removeEventListener("keyup",eo),e.removeEventListener("mousedown",ef),window.removeEventListener("mouseup",el),window.removeEventListener("mousemove",ed),e.removeEventListener("wheel",ep)},M.refresh=ea,M.tick=()=>{if(a){let e=Z;return Z=!1,e}U=!1;let e=I,t=j;if((H||K)&&F&&(q&&!G||!q&&G)){let r=Y?R-e:e-R,n=H?et(l*r):0,i=Q?L-t:t-L,a=K?er(l*i):0;(0!==n||0!==a)&&(M.pan([n,a]),U=!0)}if((X||J)&&V){let e=m*Math.exp(V/N),t=en(z),r=ei(B);M.scale([X?1/e:1,J?1/e:1],[t,r]),U=!0}if(f&&F&&(q&&G||!q&&!G)&&Math.abs(R-e)+Math.abs(L-t)>0){var r,n,i,o,s,c,d;let a=$/2,l=N/2,f=R-a,p=l-L,m=e-a,h=l-t,y=(r=[f,p],n=[m,h],i=r[0],o=r[1],Math.acos(Math.min(Math.max((d=Math.sqrt(i*i+o*o)*Math.sqrt((s=n[0])*s+(c=n[1])*c))&&(i*s+o*c)/d,-1),1)));M.rotate(u*y*Math.sign(f*h-m*p)),U=!0}V=0,R=e,L=t;let p=U||Z;return Z=!1,p};let em=e=>function(){e.apply(null,arguments),Z=!0};return M.lookAt=em(M.lookAt),M.translate=em(M.translate),M.pan=em(M.pan),M.rotate=em(M.rotate),M.scale=em(M.scale),M.zoom=em(M.zoom),M.reset=em(M.reset),M.set=em(M.set),M.setScaleBounds=em(M.setScaleBounds),M.setTranslationBounds=em(M.setTranslationBounds),M.setView=em(M.setView),M.setViewCenter=em(M.setViewCenter),ea(),M})(ty,{isFixed:rC,isPanInverted:[!1,!0],defaultMouseDownMoveAction:t5===ey?"rotate":"pan"})),e.cameraView?r.setView(E(e.cameraView)):e.cameraTarget||e.cameraDistance||e.cameraRotation?r.lookAt([...e.cameraTarget||eK],e.cameraDistance||1,e.cameraRotation||0):r.setView(E(eY)),Z=nv(1,1),G=nv(-1,-1)},i9=({key:e})=>{"Escape"===e&&t$&&n_()},ae=()=>{nl=!0,na=!0},at=()=>{nC(),nl=!1,na=!0,r2=!0},ar=()=>{r2=!0},an=()=>{iV([]),g.clear()},ai=()=>{iq([])},aa=()=>{let e=rT===ef,t=rE===ef;if(e||t){let{width:r,height:n}=ty.getBoundingClientRect();e&&nX(r,!0),t&&nH(n,!0),nN(),nq(),r2=!0}r.refresh()},ao=async e=>{ty.style.userSelect="none";let t=window.devicePixelRatio,r=rp,n=rT,i=rE,a=tn.canvas.width/t,o=tn.canvas.height/t,s=tc,l=ta,f=e?.scale||1,u=Array.isArray(rp)?rp.map(e=>e*f):rp*f,c=rD*f,d=rP*f;nQ(u),nJ(c),nK(d),i4(e?.pixelAligned||tc),i6(e?.antiAliasing||ta),tn.resize(rT,rE),tn.refresh(),await new Promise(e=>{e7.subscribe("draw",e,1),al()});let p=ty.getContext("2d").getImageData(0,0,ty.width,ty.height);return tn.resize(a,o),tn.refresh(),nQ(r),nJ(n),nK(i),i4(s),i6(l),await new Promise(e=>{e7.subscribe("draw",e,1),al()}),ty.style.userSelect=null,p},as=tn.onFrame(()=>{var e,t;let i,a;if(nr=r.tick(),!((nn||ni)&&(r2||r8)))return;r8&&(e=es,t=el,r7||(r7=performance.now()),a=Math.min(1,Math.max(0,t((i=performance.now()-r7)/e))),K&&Y&&iC({t:a}),void 0!==er&&void 0!==ei&&void 0!==ea&&void 0!==eo&&(e=>{let[t,n]=er,[i,a]=ei,o=1-e,s=ea*o+eo*e;r.lookAt([t*o+i*e,n*o+a*e],s)})(a),!(i{let e=ty.width/tn.canvas.width,t=ty.height/tn.canvas.height;p[0]=e/c,p[5]=t,tp?._reglType&&iB(),rJ.length>2&&iR(),r8||g.draw({projection:p,model:m,view:r.view});let i=ip();nn&&i>0&&iP(),!rV&&(t6||r3)&&(()=>{if(!(eX>=0))return;let[e,t]=rK[eX].slice(0,2),n=[e,t,0,1];k(e9,p,k(e9,r.view,m)),C(n,n,e9),A.setPoints([-1,n[1],1,n[1]]),L.setPoints([n[0],1,n[0],-1]),A.draw(),L.draw(),iD(()=>(rm+2*ry)*window.devicePixelRatio,()=>1,et,1)(),iD(()=>(rm+ry)*window.devicePixelRatio,()=>1,et,3)()})(),eX>=0&&iM(),rU.length>0&&(iI(),ij(),iz()),f.draw({projection:p,model:m,view:r.view}),n.draw({projection:p,model:m,view:r.view})},ty);let o={view:r.view,isViewChanged:nr,camera:r,xScale:nf,yScale:nu};nr&&(nq(),r1?r1=!1:e7.publish("view",o)),r2=!1,r3=!1,e7.publish("drawing",o,{async:!1}),e7.publish("draw",o)}),al=()=>{r2=!0};return nN(),i7(),nq(),n=J(tn.regl,{color:tN,width:tW,is2d:!0}),g=J(tn.regl,{color:nV(rt,rr,rn),opacity:null===ra?null:ra[0],width:rl[0],is2d:!0}),A=J(tn.regl,{color:t4,width:1,is2d:!0}),L=J(tn.regl,{color:t4,width:1,is2d:!0}),f=J(tn.regl,{color:rk,width:r_,is2d:!0}),nY(),ty.addEventListener("wheel",ar),X=tn.regl.buffer(),ee=tn.regl.buffer(),et=tn.regl.buffer({usage:"dynamic",type:"float",length:2*ec}),ed=n$(),ep=nF(),e8=i8({backgroundImage:tp,width:rT,height:rE,actionKeyMap:t3}),iX(),iJ(),window.addEventListener("keyup",i9,!1),window.addEventListener("blur",nL,!1),window.addEventListener("mouseup",nj,!1),window.addEventListener("mousemove",nR,!1),ty.addEventListener("mousedown",nI,!1),ty.addEventListener("mouseenter",ae,!1),ty.addEventListener("mouseleave",at,!1),ty.addEventListener("click",nz,!1),ty.addEventListener("dblclick",nB,!1),"ResizeObserver"in window?(q=new ResizeObserver(aa)).observe(ty):(window.addEventListener("resize",aa),window.addEventListener("orientationchange",aa)),e8.then(()=>{e7.publish("init")}),{get isSupported(){return tn.isSupported},clear:iH(()=>{an(),ai()}),clearPoints:iH(an),clearPointConnections:iH(()=>{g.clear()}),clearAnnotations:iH(ai),createTextureFromUrl:(e,t=e0)=>tu(tn.regl,e,t),deselect:n_,destroy:()=>{nn=!1,ni=!1,rL=!0,as(),window.removeEventListener("keyup",i9,!1),window.removeEventListener("blur",nL,!1),window.removeEventListener("mouseup",nj,!1),window.removeEventListener("mousemove",nR,!1),ty.removeEventListener("mousedown",nI,!1),ty.removeEventListener("mouseenter",ae,!1),ty.removeEventListener("mouseleave",at,!1),ty.removeEventListener("click",nz,!1),ty.removeEventListener("dblclick",nB,!1),ty.removeEventListener("wheel",ar,!1),q?q.disconnect():(window.removeEventListener("resize",aa),window.removeEventListener("orientationchange",aa)),ty=void 0,r.dispose(),r=void 0,n.destroy(),nP.destroy(),g.destroy(),A.destroy(),L.destroy(),ed&&ed.destroy(),ep&&ep.destroy(),e.renderer||tn.isDestroyed||tn.destroy(),e7.publish("destroy"),e7.clear()},draw:(e,t={})=>rL?Promise.reject(Error(e5)):rR?Promise.reject(Error("Ignoring draw call as the previous draw call has not yet finished. To avoid this warning `await` the draw call.")):(rR=!0,tS(e).then(e=>new Promise(r=>{if(rL)return void r();let n=!1;t.preventFilterReset&&e?.length===rY||(rq=!1,rH.clear());let i=e&&nS(e[0])&&(re||t.showPointConnectionsOnce),{zDataType:a,wDataType:o}=t;new Promise(s=>{e?(t.transition&&(e.length===rY?n=((e,t={})=>{if(!H)return!1;if(r8){let e=K;K=Y,e.destroy()}else K=H;return Y=iF(e,t),Q=tn.regl.framebuffer({color:Y,depth:!1,stencil:!1}),H=void 0,!0})(e,{z:a,w:o}):console.warn("Cannot transition! The number of points between the previous and current draw call must be identical.")),iV(e,{zDataType:a,wDataType:o,preventFilterReset:t.preventFilterReset,spatialIndex:t.spatialIndex}).then(()=>{void 0!==t.hover&&nC(t.hover,{preventEvent:!0}),void 0!==t.select&&nO(t.select,{preventEvent:!0}),void 0!==t.filter&&iW(t.filter,{preventEvent:!0}),i?iN(e).then(()=>{e7.publish("pointConnectionsDraw"),r2=!0,r3=t.showReticleOnce}).then(()=>r()):s()})):s()}).then(()=>{t.transition&&n?(i?Promise.all([new Promise(e=>{e7.subscribe("transitionEnd",()=>{r2=!0,r3=t.showReticleOnce,e()},1)}),new Promise(e=>{e7.subscribe("pointConnectionsDraw",e,1)})]).then(()=>r()):e7.subscribe("transitionEnd",()=>{r2=!0,r3=t.showReticleOnce,r()},1),iG({duration:t.transitionDuration,easing:t.transitionEasing})):(i?Promise.all([new Promise(e=>{e7.subscribe("draw",e,1)}),new Promise(e=>{e7.subscribe("pointConnectionsDraw",e,1)})]).then(()=>r()):e7.subscribe("draw",()=>r(),1),r2=!0,r3=t.showReticleOnce)})}).finally(()=>{rR=!1}))),drawAnnotations:iq,filter:iW,get:e=>{let[t]=Object.keys(tL({[e]:e2}));return"aspectRatio"===t?r0:"background"===t||"backgroundColor"===t?td:"backgroundImage"===t?tp:"camera"===t?r:"cameraTarget"===t?r.target:"cameraDistance"===t?r.distance[0]:"cameraRotation"===t?r.rotation:"cameraView"===t?r.view:"cameraIsFixed"===t?rC:"canvas"===t?ty:"colorBy"===t?tv:"sizeBy"===t?rA:"deselectOnDblClick"===t?tR:"deselectOnEscape"===t?t$:"height"===t?rE:"lassoColor"===t?tN:"lassoLineWidth"===t?tW:"lassoMinDelay"===t?tU:"lassoMinDist"===t?tZ:"lassoClearEvent"===t?tG:"lassoInitiator"===t?tq:"lassoInitiatorElement"===t?nP.initiator:"lassoInitiatorParentElement"===t?tH:"lassoLongPressIndicatorParentElement"===t?tK:"lassoOnLongPress"===t?tY:"lassoType"===t?t1:"lassoBrushSize"===t?t2:"mouseMode"===t?t5:"opacity"===t?1===rv.length?rv[0]:rv:"opacityBy"===t?rg:"opacityByDensityFill"===t?rb:"opacityByDensityDebounceTime"===t?rI:"opacityInactiveMax"===t?rx:"opacityInactiveScale"===t?rw:"points"===t?rK:"hoveredPoint"===t?eX:"selectedPoints"===t?[...rU]:"filteredPoints"===t?rq?Array.from(rH):Array.from({length:rK.length},(e,t)=>t):"pointsInView"===t?iU():"pointColor"===t?1===t8.length?t8[0]:t8:"pointColorActive"===t?1===t7.length?t7[0]:t7:"pointColorHover"===t?1===t9.length?t9[0]:t9:"pointOutlineWidth"===t?ry:"pointSize"===t?1===rp.length?rp[0]:rp:"pointSizeSelected"===t?rm:"pointSizeMouseDetection"===t?rh:"showPointConnections"===t?re:"pointConnectionColor"===t?1===rt.length?rt[0]:rt:"pointConnectionColorActive"===t?1===rr.length?rr[0]:rr:"pointConnectionColorHover"===t?1===rn.length?rn[0]:rn:"pointConnectionColorBy"===t?ri:"pointConnectionOpacity"===t?1===ra.length?ra[0]:ra:"pointConnectionOpacityBy"===t?ro:"pointConnectionOpacityActive"===t?rs:"pointConnectionSize"===t?1===rl.length?rl[0]:rl:"pointConnectionSizeActive"===t?rf:"pointConnectionSizeBy"===t?ru:"pointConnectionMaxIntPointsPerSegment"===t?rc:"pointConnectionTolerance"===t?rd:"pointScaleMode"===t?rS:"reticleColor"===t?t4:"regl"===t?tn.regl:"showReticle"===t?t6:"version"===t?"1.14.1":"width"===t?rT:"xScale"===t?nf:"yScale"===t?nu:"performanceMode"===t?rM:"renderPointsAsSquares"===t?rz:"disableAlphaBlending"===t?rB:"gamma"===t?tn.gamma:"renderer"===t?tn:"isDestroyed"===t?rL:"isDrawing"===t?rR:"isPointsDrawn"===t?nn:"isPointsFiltered"===t?rq:"isAnnotationsDrawn"===t?ni:"zDataType"===t?no:"wDataType"===t?ns:"spatialIndex"===t?u?.data:"annotationLineColor"===t?rk:"annotationLineWidth"===t?r_:"annotationHVLineLimit"===t?rO:"antiAliasing"===t?ta:"pixelAligned"===t?tc:"actionKeyMap"===t?{...t3}:void 0},getScreenPosition:e=>{if(!nn)throw Error(e3);let t=rK[e];if(!t)return;let n=[t[0],t[1],0,1];return k(e9,d,k(e9,r.view,m)),C(n,n,e9),[rD*(n[0]+1)/2,rP*(.5-n[1]/2)]},hover:nC,redraw:al,refresh:tn.refresh,reset:iH(({preventEvent:e=!1}={})=>{i7(),nq(),e||e7.publish("view",{view:r.view,camera:r,xScale:nf,yScale:nu})}),select:nO,set:i8,export:e=>void 0===e?ty.getContext("2d").getImageData(0,0,ty.width,ty.height):ao(e),subscribe:e7.subscribe,unfilter:({preventEvent:e=!1}={})=>(rq=!1,rH.clear(),X.subdata(iL(rY)),new Promise(t=>{let r=()=>{e7.subscribe("draw",()=>{e||e7.publish("unfilter"),t()},1),r2=!0};re||nS(rK[0])?iN(nb()).then(()=>{e||e7.publish("pointConnectionsDraw"),r()}):r()})),unsubscribe:e7.unsubscribe,view:(e,{preventEvent:t=!1}={})=>{i0(e),r2=!0,r1=t},zoomToLocation:iY,zoomToArea:iK,zoomToPoints:(e,t={})=>{if(!nn)return Promise.reject(Error(e3));let r=(e=>{let t=1/0,r=-1/0,n=1/0,i=-1/0;for(let a of e){let[e,o]=rK[a];t=Math.min(t,e),r=Math.max(r,e),n=Math.min(n,o),i=Math.max(i,o)}return{x:t,y:n,width:r-t,height:i-n}})(e),n=r.x+r.width/2,i=r.y+r.height/2,a=ng(),o=1+(t.padding||0),s=Math.max(r.width,a)*o,l=Math.max(r.height,a)*o;return iK({x:n-s/2,y:i-l/2,width:s,height:l},t)},zoomToOrigin:(e={})=>iY([0,0],1,e)}},tN=(e,t)=>tS(e).then(e=>en(e,{useWorker:t})).then(e=>e.data);e.s(["checkSupport",()=>tr,"createRegl",()=>tn,"createRenderer",()=>tC,"createSpatialIndex",()=>tN,"createTextureFromUrl",()=>tu,"default",()=>t$],42030)}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/71c75872eed19356.js b/src/hyperview/server/static/_next/static/chunks/71c75872eed19356.js deleted file mode 100644 index 7374efe..0000000 --- a/src/hyperview/server/static/_next/static/chunks/71c75872eed19356.js +++ /dev/null @@ -1,9 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,52683,e=>{"use strict";let t;var n,r,i,s,l=e.i(43476),a=e.i(71645),o=e.i(74080);function c(e,t,n){let r,i=n.initialDeps??[];function s(){var s,l,a,o;let c,h;n.key&&(null==(s=n.debug)?void 0:s.call(n))&&(c=Date.now());let u=e();if(!(u.length!==i.length||u.some((e,t)=>i[t]!==e)))return r;if(i=u,n.key&&(null==(l=n.debug)?void 0:l.call(n))&&(h=Date.now()),r=t(...u),n.key&&(null==(a=n.debug)?void 0:a.call(n))){let e=Math.round((Date.now()-c)*100)/100,t=Math.round((Date.now()-h)*100)/100,r=t/16,i=(e,t)=>{for(e=String(e);e.length{i=e},s}function h(e,t){if(void 0!==e)return e;throw Error(`Unexpected undefined${t?`: ${t}`:""}`)}e.i(47167);let u=e=>{let{offsetWidth:t,offsetHeight:n}=e;return{width:t,height:n}},d=e=>e,f=e=>{let t=Math.max(e.startIndex-e.overscan,0),n=Math.min(e.endIndex+e.overscan,e.count-1),r=[];for(let e=t;e<=n;e++)r.push(e);return r},m=(e,t)=>{let n=e.scrollElement;if(!n)return;let r=e.targetWindow;if(!r)return;let i=e=>{let{width:n,height:r}=e;t({width:Math.round(n),height:Math.round(r)})};if(i(u(n)),!r.ResizeObserver)return()=>{};let s=new r.ResizeObserver(t=>{let r=()=>{let e=t[0];if(null==e?void 0:e.borderBoxSize){let t=e.borderBoxSize[0];if(t)return void i({width:t.inlineSize,height:t.blockSize})}i(u(n))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(r):r()});return s.observe(n,{box:"border-box"}),()=>{s.unobserve(n)}},g={passive:!0},x="undefined"==typeof window||"onscrollend"in window,p=(e,t)=>{var n,r;let i,s=e.scrollElement;if(!s)return;let l=e.targetWindow;if(!l)return;let a=0,o=e.options.useScrollendEvent&&x?()=>void 0:(n=()=>{t(a,!1)},r=e.options.isScrollingResetDelay,function(...e){l.clearTimeout(i),i=l.setTimeout(()=>n.apply(this,e),r)}),c=n=>()=>{let{horizontal:r,isRtl:i}=e.options;a=r?s.scrollLeft*(i&&-1||1):s.scrollTop,o(),t(a,n)},h=c(!0),u=c(!1);u(),s.addEventListener("scroll",h,g);let d=e.options.useScrollendEvent&&x;return d&&s.addEventListener("scrollend",u,g),()=>{s.removeEventListener("scroll",h),d&&s.removeEventListener("scrollend",u)}},b=(e,t,n)=>{if(null==t?void 0:t.borderBoxSize){let e=t.borderBoxSize[0];if(e)return Math.round(e[n.options.horizontal?"inlineSize":"blockSize"])}return e[n.options.horizontal?"offsetWidth":"offsetHeight"]},v=(e,{adjustments:t=0,behavior:n},r)=>{var i,s;null==(s=null==(i=r.scrollElement)?void 0:i.scrollTo)||s.call(i,{[r.options.horizontal?"left":"top"]:e+t,behavior:n})};class y{constructor(e){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.measurementsCache=[],this.itemSizeCache=new Map,this.pendingMeasuredCacheIndexes=[],this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this.elementsCache=new Map,this.observer=(()=>{let e=null,t=()=>e||(this.targetWindow&&this.targetWindow.ResizeObserver?e=new this.targetWindow.ResizeObserver(e=>{e.forEach(e=>{let t=()=>{this._measureElement(e.target,e)};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(t):t()})}):null);return{disconnect:()=>{var n;null==(n=t())||n.disconnect(),e=null},observe:e=>{var n;return null==(n=t())?void 0:n.observe(e,{box:"border-box"})},unobserve:e=>{var n;return null==(n=t())?void 0:n.unobserve(e)}}})(),this.range=null,this.setOptions=e=>{Object.entries(e).forEach(([t,n])=>{void 0===n&&delete e[t]}),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:d,rangeExtractor:f,onChange:()=>{},measureElement:b,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,...e}},this.notify=e=>{var t,n;null==(n=(t=this.options).onChange)||n.call(t,this,e)},this.maybeNotify=c(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var e;let t=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==t){if(this.cleanup(),!t)return void this.maybeNotify();this.scrollElement=t,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=(null==(e=this.scrollElement)?void 0:e.window)??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,t)=>{this.scrollAdjustments=0,this.scrollDirection=t?this.getScrollOffset()this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??("function"==typeof this.options.initialOffset?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,t)=>{let n=new Map,r=new Map;for(let i=t-1;i>=0;i--){let t=e[i];if(n.has(t.lane))continue;let s=r.get(t.lane);if(null==s||t.end>s.end?r.set(t.lane,t):t.ende.end===t.end?e.index-t.index:e.end-t.end)[0]:void 0},this.getMeasurementOptions=c(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled],(e,t,n,r,i)=>(this.pendingMeasuredCacheIndexes=[],{count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i}),{key:!1}),this.getMeasurements=c(()=>[this.getMeasurementOptions(),this.itemSizeCache],({count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i},s)=>{if(!i)return this.measurementsCache=[],this.itemSizeCache.clear(),[];0===this.measurementsCache.length&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(e=>{this.itemSizeCache.set(e.key,e.size)}));let l=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];let a=this.measurementsCache.slice(0,l);for(let i=l;ithis.options.debug}),this.calculateRange=c(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,n,r)=>this.range=e.length>0&&t>0?function({measurements:e,outerSize:t,scrollOffset:n,lanes:r}){let i=e.length-1;if(e.length<=r)return{startIndex:0,endIndex:i};let s=w(0,i,t=>e[t].start,n),l=s;if(1===r)for(;l1){let a=Array(r).fill(0);for(;le=0&&o.some(e=>e>=n);){let t=e[s];o[t.lane]=t.start,s--}s=Math.max(0,s-s%r),l=Math.min(i,l+(r-1-l%r))}return{startIndex:s,endIndex:l}}({measurements:e,outerSize:t,scrollOffset:n,lanes:r}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=c(()=>{let e=null,t=null,n=this.calculateRange();return n&&(e=n.startIndex,t=n.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t]},(e,t,n,r,i)=>null===r||null===i?[]:e({startIndex:r,endIndex:i,overscan:t,count:n}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{let t=this.options.indexAttribute,n=e.getAttribute(t);return n?parseInt(n,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this._measureElement=(e,t)=>{let n=this.indexFromElement(e),r=this.measurementsCache[n];if(!r)return;let i=r.key,s=this.elementsCache.get(i);s!==e&&(s&&this.observer.unobserve(s),this.observer.observe(e),this.elementsCache.set(i,e)),e.isConnected&&this.resizeItem(n,this.options.measureElement(e,t,this))},this.resizeItem=(e,t)=>{let n=this.measurementsCache[e];if(!n)return;let r=t-(this.itemSizeCache.get(n.key)??n.size);0!==r&&((void 0!==this.shouldAdjustScrollPositionOnItemSizeChange?this.shouldAdjustScrollPositionOnItemSizeChange(n,r,this):n.start{e?this._measureElement(e,void 0):this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))})},this.getVirtualItems=c(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{let n=[];for(let r=0,i=e.length;rthis.options.debug}),this.getVirtualItemForOffset=e=>{let t=this.getMeasurements();if(0!==t.length)return h(t[w(0,t.length-1,e=>h(t[e]).start,e)])},this.getOffsetForAlignment=(e,t,n=0)=>{let r=this.getSize(),i=this.getScrollOffset();return"auto"===t&&(t=e>=i+r?"end":"start"),"center"===t?e+=(n-r)/2:"end"===t&&(e-=r),Math.max(Math.min(this.getTotalSize()+this.options.scrollMargin-r,e),0)},this.getOffsetForIndex=(e,t="auto")=>{e=Math.max(0,Math.min(e,this.options.count-1));let n=this.measurementsCache[e];if(!n)return;let r=this.getSize(),i=this.getScrollOffset();if("auto"===t)if(n.end>=i+r-this.options.scrollPaddingEnd)t="end";else{if(!(n.start<=i+this.options.scrollPaddingStart))return[i,t];t="start"}let s="end"===t?n.end+this.options.scrollPaddingEnd:n.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(s,t,n.size),t]},this.isDynamicMode=()=>this.elementsCache.size>0,this.scrollToOffset=(e,{align:t="start",behavior:n}={})=>{"smooth"===n&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getOffsetForAlignment(e,t),{adjustments:void 0,behavior:n})},this.scrollToIndex=(e,{align:t="auto",behavior:n}={})=>{"smooth"===n&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),e=Math.max(0,Math.min(e,this.options.count-1));let r=0,i=t=>{if(!this.targetWindow)return;let r=this.getOffsetForIndex(e,t);if(!r)return void console.warn("Failed to get offset for index:",e);let[i,l]=r;this._scrollToOffset(i,{adjustments:void 0,behavior:n}),this.targetWindow.requestAnimationFrame(()=>{let t=this.getScrollOffset(),n=this.getOffsetForIndex(e,l);n?1.01>Math.abs(n[0]-t)||s(l):console.warn("Failed to get offset for index:",e)})},s=t=>{this.targetWindow&&(++r<10?this.targetWindow.requestAnimationFrame(()=>i(t)):console.warn(`Failed to scroll to index ${e} after 10 attempts.`))};i(t)},this.scrollBy=(e,{behavior:t}={})=>{"smooth"===t&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getScrollOffset()+e,{adjustments:void 0,behavior:t})},this.getTotalSize=()=>{var e;let t,n=this.getMeasurements();if(0===n.length)t=this.options.paddingStart;else if(1===this.options.lanes)t=(null==(e=n[n.length-1])?void 0:e.end)??0;else{let e=Array(this.options.lanes).fill(null),r=n.length-1;for(;r>=0&&e.some(e=>null===e);){let t=n[r];null===e[t.lane]&&(e[t.lane]=t.end),r--}t=Math.max(...e.filter(e=>null!==e))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this._scrollToOffset=(e,{adjustments:t,behavior:n})=>{this.options.scrollToFn(e,{behavior:n,adjustments:t},this)},this.measure=()=>{this.itemSizeCache=new Map,this.notify(!1)},this.setOptions(e)}}let w=(e,t,n,r)=>{for(;e<=t;){let i=(e+t)/2|0,s=n(i);if(sr))return i;t=i-1}}return e>0?e-1:0},M="undefined"!=typeof document?a.useLayoutEffect:a.useEffect,N=e=>{let t,n=new Set,r=(e,r)=>{let i="function"==typeof e?e(t):e;if(!Object.is(i,t)){let e=t;t=(null!=r?r:"object"!=typeof i||null===i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,s={setState:r,getState:i,getInitialState:()=>l,subscribe:e=>(n.add(e),()=>n.delete(e))},l=t=e(r,i,s);return s},j=e=>{let t=e?N(e):N,n=e=>(function(e,t=e=>e){let n=a.default.useSyncExternalStore(e.subscribe,a.default.useCallback(()=>t(e.getState()),[e,t]),a.default.useCallback(()=>t(e.getInitialState()),[e,t]));return a.default.useDebugValue(n),n})(t,e);return Object.assign(n,t),n},S=(t=(e,t)=>({datasetInfo:null,setDatasetInfo:t=>e({datasetInfo:t}),samples:[],totalSamples:0,setSamples:(t,n)=>e({samples:t,totalSamples:n}),appendSamples:t=>e(e=>({samples:[...e.samples,...t]})),addSamplesIfMissing:t=>e(e=>{let n=new Set(e.samples.map(e=>e.id)),r=t.filter(e=>!n.has(e.id));return 0===r.length?e:{samples:[...e.samples,...r]}}),embeddings:null,setEmbeddings:t=>e({embeddings:t}),viewMode:"hyperbolic",setViewMode:t=>e({viewMode:t}),selectedIds:new Set,setSelectedIds:t=>e({selectedIds:t}),toggleSelection:t=>e(e=>{let n=new Set(e.selectedIds);return n.has(t)?n.delete(t):n.add(t),{selectedIds:n}}),addToSelection:t=>e(e=>{let n=new Set(e.selectedIds);return t.forEach(e=>n.add(e)),{selectedIds:n}}),clearSelection:()=>e({selectedIds:new Set}),hoveredId:null,setHoveredId:t=>e({hoveredId:t}),isLoading:!1,setIsLoading:t=>e({isLoading:t}),error:null,setError:t=>e({error:t}),filterLabel:null,setFilterLabel:t=>e({filterLabel:t}),showLabels:!0,setShowLabels:t=>e({showLabels:t})}))?j(t):j;function k({samples:e,onLoadMore:t,hasMore:n}){let r=(0,a.useRef)(null),{selectedIds:i,toggleSelection:s,addToSelection:c,setHoveredId:h,hoveredId:u}=S(),d=(0,a.useMemo)(()=>{if(0===i.size)return e;let t=[],n=[];return e.forEach(e=>{i.has(e.id)?t.push(e):n.push(e)}),[...t,...n]},[e,i]),f=function(e){let t=a.useReducer(()=>({}),{})[1],n={...e,onChange:(n,r)=>{var i;r?(0,o.flushSync)(t):t(),null==(i=e.onChange)||i.call(e,n,r)}},[r]=a.useState(()=>new y(n));return r.setOptions(n),M(()=>r._didMount(),[]),M(()=>r._willUpdate()),r}({observeElementRect:m,observeElementOffset:p,scrollToFn:v,...{count:Math.ceil(d.length/4),getScrollElement:()=>r.current,estimateSize:()=>148,overscan:5,getItemKey:(0,a.useCallback)(e=>{let t=4*e;return d.slice(t,t+4).map(e=>e.id).join("-")||`row-${e}`},[d])}});(0,a.useEffect)(()=>{let e=r.current;if(!e||!t||!n)return;let i=()=>{let{scrollTop:n,scrollHeight:r,clientHeight:i}=e;r-n-i<500&&t()};return e.addEventListener("scroll",i),()=>e.removeEventListener("scroll",i)},[t,n]);let g=(0,a.useRef)(new Set);(0,a.useEffect)(()=>{let e=g.current;(e.size!==i.size||[...i].some(t=>!e.has(t)))&&i.size>0&&(f.measure(),f.scrollToOffset(0,{behavior:"smooth"})),g.current=new Set(i)},[i,f]);let x=(0,a.useCallback)((e,t)=>{if(t.metaKey||t.ctrlKey)s(e.id);else if(t.shiftKey&&i.size>0){let t=Array.from(i),n=t[t.length-1],r=d.findIndex(e=>e.id===n),s=d.findIndex(t=>t.id===e.id);if(-1!==r&&-1!==s){let e=Math.min(r,s),t=Math.max(r,s);c(d.slice(e,t+1).map(e=>e.id))}}else{let t=new Set;t.add(e.id),S.getState().setSelectedIds(t)}},[d,i,s,c]),b=f.getVirtualItems();return(0,l.jsxs)("div",{className:"flex flex-col h-full bg-surface rounded-lg overflow-hidden",children:[(0,l.jsx)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border bg-surface-light",children:(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"text-sm font-medium",children:"Samples"}),(0,l.jsxs)("span",{className:"text-xs text-text-muted",children:[d.length," items",i.size>0&&` (${i.size} selected)`]})]})}),(0,l.jsx)("div",{ref:r,className:"flex-1 overflow-auto p-2",children:(0,l.jsx)("div",{style:{height:`${f.getTotalSize()}px`,width:"100%",position:"relative"},children:b.map(e=>{let t=4*e.index,n=d.slice(t,t+4);return(0,l.jsxs)("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"140px",transform:`translateY(${e.start}px)`},className:"flex gap-2 px-1",children:[n.map(e=>{let t=i.has(e.id),n=u===e.id;return(0,l.jsxs)("div",{className:` - relative flex-1 rounded-md overflow-hidden cursor-pointer - transition-all duration-150 ease-out - ${t?"ring-2 ring-primary":""} - ${n?"ring-2 ring-primary-light":""} - `,onClick:t=>x(e,t),onMouseEnter:()=>h(e.id),onMouseLeave:()=>h(null),children:[e.thumbnail?(0,l.jsx)("img",{src:`data:image/jpeg;base64,${e.thumbnail}`,alt:e.filename,className:"w-full h-full object-cover",loading:"lazy"}):(0,l.jsx)("div",{className:"w-full h-full bg-surface-light flex items-center justify-center",children:(0,l.jsx)("span",{className:"text-text-muted text-xs",children:"No image"})}),e.label&&(0,l.jsx)("div",{className:"absolute bottom-1 left-1 right-1",children:(0,l.jsx)("span",{className:"inline-block px-1.5 py-0.5 text-xs rounded truncate max-w-full",style:{backgroundColor:"rgba(0,0,0,0.7)",color:"#fff"},children:e.label})}),t&&(0,l.jsx)("div",{className:"absolute top-1 right-1 w-5 h-5 rounded-full bg-primary flex items-center justify-center",children:(0,l.jsx)("svg",{className:"w-3 h-3 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,l.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})})]},e.id)}),Array.from({length:4-n.length}).map((e,t)=>(0,l.jsx)("div",{className:"flex-1"},`empty-${t}`))]},e.key)})})})]})}let E=Math.sqrt(50),z=Math.sqrt(10),$=Math.sqrt(2);function C(e,t,n){let r,i,s,l=(t-e)/Math.max(0,n),a=Math.floor(Math.log10(l)),o=l/Math.pow(10,a),c=o>=E?10:o>=z?5:o>=$?2:1;return(a<0?(r=Math.round(e*(s=Math.pow(10,-a)/c)),i=Math.round(t*s),r/st&&--i,s=-s):(r=Math.round(e/(s=Math.pow(10,a)*c)),i=Math.round(t/s),r*st&&--i),it?1:e>=t?0:NaN}function A(e,t){return null==e||null==t?NaN:te?1:t>=e?0:NaN}function R(e){let t,n,r;function i(e,r,s=0,l=e.length){if(s>>1;0>n(e[t],r)?s=t+1:l=t}while(sI(e(t),n),r=(t,n)=>e(t)-n):(t=e===I||e===A?e:F,n=e,r=e),{left:i,center:function(e,t,n=0,s=e.length){let l=i(e,t,n,s-1);return l>n&&r(e[l-1],t)>-r(e[l],t)?l-1:l},right:function(e,r,i=0,s=e.length){if(i>>1;0>=n(e[t],r)?i=t+1:s=t}while(i>8&15|t>>4&240,t>>4&15|240&t,(15&t)<<4|15&t,1):8===n?en(t>>24&255,t>>16&255,t>>8&255,(255&t)/255):4===n?en(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|240&t,((15&t)<<4|15&t)/255):null):(t=B.exec(e))?new ei(t[1],t[2],t[3],1):(t=K.exec(e))?new ei(255*t[1]/100,255*t[2]/100,255*t[3]/100,1):(t=U.exec(e))?en(t[1],t[2],t[3],t[4]):(t=X.exec(e))?en(255*t[1]/100,255*t[2]/100,255*t[3]/100,t[4]):(t=Y.exec(e))?eh(t[1],t[2]/100,t[3]/100,1):(t=G.exec(e))?eh(t[1],t[2]/100,t[3]/100,t[4]):J.hasOwnProperty(e)?et(J[e]):"transparent"===e?new ei(NaN,NaN,NaN,0):null}function et(e){return new ei(e>>16&255,e>>8&255,255&e,1)}function en(e,t,n,r){return r<=0&&(e=t=n=NaN),new ei(e,t,n,r)}function er(e,t,n,r){var i;return 1==arguments.length?((i=e)instanceof P||(i=ee(i)),i)?new ei((i=i.rgb()).r,i.g,i.b,i.opacity):new ei:new ei(e,t,n,null==r?1:r)}function ei(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}function es(){return`#${ec(this.r)}${ec(this.g)}${ec(this.b)}`}function el(){let e=ea(this.opacity);return`${1===e?"rgb(":"rgba("}${eo(this.r)}, ${eo(this.g)}, ${eo(this.b)}${1===e?")":`, ${e})`}`}function ea(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function eo(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function ec(e){return((e=eo(e))<16?"0":"")+e.toString(16)}function eh(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new ed(e,t,n,r)}function eu(e){if(e instanceof ed)return new ed(e.h,e.s,e.l,e.opacity);if(e instanceof P||(e=ee(e)),!e)return new ed;if(e instanceof ed)return e;var t=(e=e.rgb()).r/255,n=e.g/255,r=e.b/255,i=Math.min(t,n,r),s=Math.max(t,n,r),l=NaN,a=s-i,o=(s+i)/2;return a?(l=t===s?(n-r)/a+(n0&&o<1?0:l,new ed(l,a,o,e.opacity)}function ed(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}function ef(e){return(e=(e||0)%360)<0?e+360:e}function em(e){return Math.max(0,Math.min(1,e||0))}function eg(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}function ex(e,t,n,r,i){var s=e*e,l=s*e;return((1-3*e+3*s-l)*t+(4-6*s+3*l)*n+(1+3*e+3*s-3*l)*r+l*i)/6}W(P,ee,{copy(e){return Object.assign(new this.constructor,this,e)},displayable(){return this.rgb().displayable()},hex:Z,formatHex:Z,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return eu(this).formatHsl()},formatRgb:Q,toString:Q}),W(ei,er,D(P,{brighter(e){return e=null==e?1.4285714285714286:Math.pow(1.4285714285714286,e),new ei(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=null==e?.7:Math.pow(.7,e),new ei(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new ei(eo(this.r),eo(this.g),eo(this.b),ea(this.opacity))},displayable(){return -.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:es,formatHex:es,formatHex8:function(){return`#${ec(this.r)}${ec(this.g)}${ec(this.b)}${ec((isNaN(this.opacity)?1:this.opacity)*255)}`},formatRgb:el,toString:el})),W(ed,function(e,t,n,r){return 1==arguments.length?eu(e):new ed(e,t,n,null==r?1:r)},D(P,{brighter(e){return e=null==e?1.4285714285714286:Math.pow(1.4285714285714286,e),new ed(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=null==e?.7:Math.pow(.7,e),new ed(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*t,i=2*n-r;return new ei(eg(e>=240?e-240:e+120,i,r),eg(e,i,r),eg(e<120?e+240:e-120,i,r),this.opacity)},clamp(){return new ed(ef(this.h),em(this.s),em(this.l),ea(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let e=ea(this.opacity);return`${1===e?"hsl(":"hsla("}${ef(this.h)}, ${100*em(this.s)}%, ${100*em(this.l)}%${1===e?")":`, ${e})`}`}}));let ep=e=>()=>e;function eb(e,t){var n=t-e;return n?function(t){return e+t*n}:ep(isNaN(e)?t:e)}let ev=function e(t){var n,r=1==(n=+t)?eb:function(e,t){var r,i,s;return t-e?(r=e,i=t,r=Math.pow(r,s=n),i=Math.pow(i,s)-r,s=1/s,function(e){return Math.pow(r+e*i,s)}):ep(isNaN(e)?t:e)};function i(e,t){var n=r((e=er(e)).r,(t=er(t)).r),i=r(e.g,t.g),s=r(e.b,t.b),l=eb(e.opacity,t.opacity);return function(t){return e.r=n(t),e.g=i(t),e.b=s(t),e.opacity=l(t),e+""}}return i.gamma=e,i}(1);function ey(e){return function(t){var n,r,i=t.length,s=Array(i),l=Array(i),a=Array(i);for(n=0;n=1?(n=1,t-1):Math.floor(n*t),i=e[r],s=e[r+1],l=r>0?e[r-1]:2*i-s,a=r1?r[0]+r.slice(2):r,+e.slice(n+1)]}function eA(e){return(e=eI(Math.abs(e)))?e[1]:NaN}var eR=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function eF(e){var t;if(!(t=eR.exec(e)))throw Error("invalid format: "+e);return new eT({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}function eT(e){this.fill=void 0===e.fill?" ":e.fill+"",this.align=void 0===e.align?">":e.align+"",this.sign=void 0===e.sign?"-":e.sign+"",this.symbol=void 0===e.symbol?"":e.symbol+"",this.zero=!!e.zero,this.width=void 0===e.width?void 0:+e.width,this.comma=!!e.comma,this.precision=void 0===e.precision?void 0:+e.precision,this.trim=!!e.trim,this.type=void 0===e.type?"":e.type+""}function eL(e,t){var n=eI(e,t);if(!n)return e+"";var r=n[0],i=n[1];return i<0?"0."+Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+Array(i-r.length+2).join("0")}eF.prototype=eT.prototype,eT.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};let eW={"%":(e,t)=>(100*e).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:function(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)},e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>eL(100*e,t),r:eL,s:function(e,t){var r=eI(e,t);if(!r)return e+"";var i=r[0],s=r[1],l=s-(n=3*Math.max(-8,Math.min(8,Math.floor(s/3))))+1,a=i.length;return l===a?i:l>a?i+Array(l-a+1).join("0"):l>0?i.slice(0,l)+"."+i.slice(l):"0."+Array(1-l).join("0")+eI(e,Math.max(0,t+l-1))[0]},X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function eD(e){return e}var eP=Array.prototype.map,e_=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function eq(){var e,t=(function(){var e,t,n,r,i,s,l=ek,a=ek,o=function e(t,n){var r,i,s=typeof n;return null==n||"boolean"===s?ep(n):("number"===s?ew:"string"===s?(i=ee(n))?(n=i,ev):function(e,t){var n,r,i,s,l,a=eM.lastIndex=eN.lastIndex=0,o=-1,c=[],h=[];for(e+="",t+="";(i=eM.exec(e))&&(s=eN.exec(t));)(l=s.index)>a&&(l=t.slice(a,l),c[o]?c[o]+=l:c[++o]=l),(i=i[0])===(s=s[0])?c[o]?c[o]+=s:c[++o]=s:(c[++o]=null,h.push({i:o,x:ew(i,s)})),a=eN.lastIndex;return at&&(n=e,e=t,t=n),c=function(n){return Math.max(e,Math.min(t,n))}),r=o>2?eC:e$,i=s=null,u}function u(t){return null==t||isNaN(t*=1)?n:(i||(i=r(l.map(e),a,o)))(e(c(t)))}return u.invert=function(n){return c(t((s||(s=r(a,l.map(e),ew)))(n)))},u.domain=function(e){return arguments.length?(l=Array.from(e,eS),h()):l.slice()},u.range=function(e){return arguments.length?(a=Array.from(e),h()):a.slice()},u.rangeRound=function(e){return a=Array.from(e),o=ej,h()},u.clamp=function(e){return arguments.length?(c=!!e||eE,h()):c!==eE},u.interpolate=function(e){return arguments.length?(o=e,h()):o},u.unknown=function(e){return arguments.length?(n=e,u):n},function(n,r){return e=n,t=r,h()}})()(eE,eE);return t.copy=function(){return eq().domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())},eO.apply(t,arguments),e=t.domain,t.ticks=function(t){var n=e();return function(e,t,n){if(t*=1,e*=1,!((n*=1)>0))return[];if(e===t)return[e];let r=t=i))return[];let a=s-i+1,o=Array(a);if(r)if(l<0)for(let e=0;e0;){if((i=O(o,c,n))===r)return s[l]=o,s[a]=c,e(s);if(i>0)o=Math.floor(o/i)*i,c=Math.ceil(c/i)*i;else if(i<0)o=Math.ceil(o*i)/i,c=Math.floor(c*i)/i;else break;r=i}return t},t}i=(r=function(e){var t,r,i,s=void 0===e.grouping||void 0===e.thousands?eD:(t=eP.call(e.grouping,Number),r=e.thousands+"",function(e,n){for(var i=e.length,s=[],l=0,a=t[0],o=0;i>0&&a>0&&(o+a+1>n&&(a=Math.max(1,n-o)),s.push(e.substring(i-=a,i+a)),!((o+=a+1)>n));)a=t[l=(l+1)%t.length];return s.reverse().join(r)}),l=void 0===e.currency?"":e.currency[0]+"",a=void 0===e.currency?"":e.currency[1]+"",o=void 0===e.decimal?".":e.decimal+"",c=void 0===e.numerals?eD:(i=eP.call(e.numerals,String),function(e){return e.replace(/[0-9]/g,function(e){return i[+e]})}),h=void 0===e.percent?"%":e.percent+"",u=void 0===e.minus?"−":e.minus+"",d=void 0===e.nan?"NaN":e.nan+"";function f(e){var t=(e=eF(e)).fill,r=e.align,i=e.sign,f=e.symbol,m=e.zero,g=e.width,x=e.comma,p=e.precision,b=e.trim,v=e.type;"n"===v?(x=!0,v="g"):eW[v]||(void 0===p&&(p=12),b=!0,v="g"),(m||"0"===t&&"="===r)&&(m=!0,t="0",r="=");var y="$"===f?l:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",w="$"===f?a:/[%p]/.test(v)?h:"",M=eW[v],N=/[defgprs%]/.test(v);function j(e){var l,a,h,f=y,j=w;if("c"===v)j=M(e)+j,e="";else{var S=(e*=1)<0||1/e<0;if(e=isNaN(e)?d:M(Math.abs(e),p),b&&(e=function(e){e:for(var t,n=e.length,r=1,i=-1;r0&&(i=0)}return i>0?e.slice(0,i)+e.slice(t+1):e}(e)),S&&0==+e&&"+"!==i&&(S=!1),f=(S?"("===i?i:u:"-"===i||"("===i?"":i)+f,j=("s"===v?e_[8+n/3]:"")+j+(S&&"("===i?")":""),N){for(l=-1,a=e.length;++l(h=e.charCodeAt(l))||h>57){j=(46===h?o+e.slice(l+1):e.slice(l))+j,e=e.slice(0,l);break}}}x&&!m&&(e=s(e,1/0));var k=f.length+e.length+j.length,E=k>1)+f+e+j+E.slice(k);break;default:e=E+f+e+j}return c(e)}return p=void 0===p?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p)),j.toString=function(){return e+""},j}return{format:f,formatPrefix:function(e,t){var n=f(((e=eF(e)).type="f",e)),r=3*Math.max(-8,Math.min(8,Math.floor(eA(t)/3))),i=Math.pow(10,-r),s=e_[8+r/3];return function(e){return n(i*e)+s}}}}({thousands:",",grouping:[3],currency:["$",""]})).format,s=r.formatPrefix;let eH=["#e6194b","#3cb44b","#ffe119","#4363d8","#f58231","#911eb4","#46f0f0","#f032e6","#bcf60c","#fabebe","#008080","#e6beff","#9a6324","#fffac8","#800000"];function eV({className:t=""}){let n=(0,a.useRef)(null),r=(0,a.useRef)(null),i=(0,a.useRef)(null),s=(0,a.useRef)(null),[o,c]=(0,a.useState)(!1),{embeddings:h,viewMode:u,setViewMode:d,selectedIds:f,setSelectedIds:m,hoveredId:g,setHoveredId:x}=S(),p=(0,a.useCallback)(e=>{let{xScale:t,yScale:n}=e;if(i.current&&t&&n){let e=t(1)-t(0),r=n(1)-n(0),s=t(0),l=n(0);i.current.setAttribute("transform",`matrix(${e}, 0, 0, ${r}, ${s}, ${l})`)}},[]);(0,a.useEffect)(()=>{if(n.current&&r.current&&!o)return(async()=>{try{let t=(await e.A(93347)).default;if(!n.current||!r.current)return;let{width:i,height:l}=r.current.getBoundingClientRect(),a=eq().domain([-1,1]),o=eq().domain([-1,1]),h=t({canvas:n.current,width:i,height:l,xScale:a,yScale:o,pointSize:4,pointSizeSelected:8,opacity:.8,opacityInactiveMax:.2,lassoColor:[.31,.27,.9,1],lassoMinDelay:10,lassoMinDist:2,showReticle:!0,reticleColor:[1,1,1,.5],colorBy:"category",pointColor:eH});h.subscribe("view",p);let u=h.get("xScale"),d=h.get("yScale");u&&d&&p({xScale:u,yScale:d}),h.subscribe("select",({points:e})=>{if(e.length>0){let t=S.getState().embeddings;if(t){let n=new Set(e.map(e=>t.ids[e]));m(n)}}}),h.subscribe("deselect",()=>{m(new Set)}),h.subscribe("pointOver",e=>{let t=S.getState().embeddings;t&&e>=0&&x(t.ids[e])}),h.subscribe("pointOut",()=>{x(null)}),s.current=h,c(!0)}catch(e){console.error("Failed to initialize scatterplot:",e)}})(),()=>{s.current&&(s.current.destroy(),s.current=null,c(!1))}},[p]),(0,a.useEffect)(()=>{if(!s.current||!h)return;let e="euclidean"===u?h.euclidean:h.hyperbolic;"hyperbolic"===u&&setTimeout(()=>{if(s.current){let e=s.current.get("xScale"),t=s.current.get("yScale");e&&t&&p({xScale:e,yScale:t})}},0);let t=[...new Set(h.labels.map(e=>e||"undefined"))],n={};t.forEach((e,t)=>{n[e]=t});let r=h.labels.map(e=>n[e||"undefined"]),i=t.map(e=>"undefined"===e?"#008080":h.label_colors[e]||"#808080");i.length>0&&s.current.set({pointColor:i}),s.current.draw({x:e.map(e=>e[0]),y:e.map(e=>e[1]),category:r}),s.current.reset(),"hyperbolic"===u&&setTimeout(()=>{let e=s.current.get("view");e&&p(e)},100)},[h,u,o,p]),(0,a.useEffect)(()=>{if(!s.current||!h)return;let e=Array.from(f).map(e=>h.ids.indexOf(e)).filter(e=>-1!==e);s.current.select(e,{preventEvent:!0})},[f,h,o]),(0,a.useEffect)(()=>{if(!r.current||!s.current)return;let e=new ResizeObserver(e=>{for(let t of e){let{width:e,height:n}=t.contentRect;e>0&&n>0&&s.current&&s.current.set({width:e,height:n})}});return e.observe(r.current),()=>e.disconnect()},[o]);let b=h?[...new Set(h.labels.map(e=>e||"undefined"))]:[];return(0,l.jsxs)("div",{className:`flex flex-col h-full bg-surface rounded-lg overflow-hidden ${t}`,children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border bg-surface-light",children:[(0,l.jsxs)("div",{className:"flex items-center gap-4",children:[(0,l.jsx)("span",{className:"text-sm font-medium",children:"Embeddings"}),(0,l.jsxs)("div",{className:"flex rounded-md overflow-hidden border border-border",children:[(0,l.jsx)("button",{onClick:()=>d("euclidean"),className:`px-3 py-1 text-xs transition-colors ${"euclidean"===u?"bg-primary text-white":"bg-surface hover:bg-surface-light text-text-muted"}`,children:"Euclidean"}),(0,l.jsx)("button",{onClick:()=>d("hyperbolic"),className:`px-3 py-1 text-xs transition-colors ${"hyperbolic"===u?"bg-primary text-white":"bg-surface hover:bg-surface-light text-text-muted"}`,children:"Hyperbolic"})]})]}),(0,l.jsx)("span",{className:"text-xs text-text-muted",children:h?`${h.ids.length} points`:"Loading..."})]}),(0,l.jsxs)("div",{className:"flex-1 flex",children:[(0,l.jsxs)("div",{ref:r,className:"flex-1 relative",children:[(0,l.jsx)("canvas",{ref:n,className:"absolute inset-0",style:{zIndex:1}}),"hyperbolic"===u&&(0,l.jsx)("svg",{className:"absolute inset-0 pointer-events-none",width:"100%",height:"100%",style:{zIndex:10},children:(0,l.jsxs)("g",{ref:i,children:[(0,l.jsx)("circle",{cx:"0",cy:"0",r:"1",fill:"none",stroke:"rgba(255,255,255,0.6)",strokeWidth:"0.01"}),(0,l.jsx)("circle",{cx:"0",cy:"0",r:"0.462",fill:"none",stroke:"rgba(255,255,255,0.2)",strokeWidth:"0.005"}),(0,l.jsx)("circle",{cx:"0",cy:"0",r:"0.761",fill:"none",stroke:"rgba(255,255,255,0.2)",strokeWidth:"0.005"}),(0,l.jsx)("circle",{cx:"0",cy:"0",r:"0.905",fill:"none",stroke:"rgba(255,255,255,0.2)",strokeWidth:"0.005"}),(0,l.jsx)("line",{x1:"-1",y1:"0",x2:"1",y2:"0",stroke:"rgba(255,255,255,0.2)",strokeWidth:"0.005"}),(0,l.jsx)("line",{x1:"0",y1:"-1",x2:"0",y2:"1",stroke:"rgba(255,255,255,0.2)",strokeWidth:"0.005"}),(0,l.jsx)("line",{x1:"-0.707",y1:"-0.707",x2:"0.707",y2:"0.707",stroke:"rgba(255,255,255,0.2)",strokeWidth:"0.005"}),(0,l.jsx)("line",{x1:"-0.707",y1:"0.707",x2:"0.707",y2:"-0.707",stroke:"rgba(255,255,255,0.2)",strokeWidth:"0.005"})]})}),!h&&(0,l.jsx)("div",{className:"absolute inset-0 flex items-center justify-center bg-surface/80 z-10",children:(0,l.jsx)("div",{className:"text-text-muted",children:"Loading embeddings..."})})]}),b.length>0&&(0,l.jsxs)("div",{className:"w-36 border-l border-border bg-surface-light p-2 overflow-y-auto",children:[(0,l.jsx)("div",{className:"text-xs font-medium mb-2 text-text-muted",children:"Labels"}),(0,l.jsxs)("div",{className:"space-y-1",children:[b.slice(0,20).map(e=>(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("div",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:"undefined"===e?"#008080":h?.label_colors[e]||"#888"}}),(0,l.jsx)("span",{className:"text-xs truncate",title:e,children:e})]},e)),b.length>20&&(0,l.jsxs)("div",{className:"text-xs text-text-muted",children:["+",b.length-20," more"]})]})]})]}),(0,l.jsx)("div",{className:"px-3 py-2 text-xs text-text-muted border-t border-border bg-surface-light",children:(0,l.jsx)("span",{className:"opacity-70",children:"Shift+drag to lasso select • Scroll to zoom • Drag to pan"})})]})}function eB(){let{datasetInfo:e,selectedIds:t,clearSelection:n}=S();return(0,l.jsxs)("header",{className:"h-14 bg-surface border-b border-border flex items-center justify-between px-4",children:[(0,l.jsxs)("div",{className:"flex items-center gap-3",children:[(0,l.jsx)("div",{className:"w-8 h-8 rounded-lg bg-primary flex items-center justify-center",children:(0,l.jsx)("svg",{className:"w-5 h-5 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,l.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"})})}),(0,l.jsxs)("div",{children:[(0,l.jsx)("h1",{className:"text-lg font-semibold text-text",children:"HyperView"}),e&&(0,l.jsx)("p",{className:"text-xs text-text-muted",children:e.name})]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-4",children:[e&&(0,l.jsxs)("div",{className:"flex items-center gap-4 text-sm",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"text-text-muted",children:"Samples:"}),(0,l.jsx)("span",{className:"text-text font-medium",children:e.num_samples.toLocaleString()})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"text-text-muted",children:"Labels:"}),(0,l.jsx)("span",{className:"text-text font-medium",children:e.labels.length})]})]}),t.size>0&&(0,l.jsxs)("button",{onClick:n,className:"px-3 py-1.5 text-sm bg-surface-light hover:bg-border rounded-md transition-colors",children:["Clear selection (",t.size,")"]})]})]})}async function eK(){let e=await fetch("/api/dataset");if(!e.ok)throw Error(`Failed to fetch dataset: ${e.statusText}`);return e.json()}async function eU(e=0,t=100,n){let r=new URLSearchParams({offset:e.toString(),limit:t.toString()});n&&r.set("label",n);let i=await fetch(`/api/samples?${r}`);if(!i.ok)throw Error(`Failed to fetch samples: ${i.statusText}`);return i.json()}async function eX(){let e=await fetch("/api/embeddings");if(!e.ok)throw Error(`Failed to fetch embeddings: ${e.statusText}`);return e.json()}async function eY(e){let t=await fetch("/api/samples/batch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sample_ids:e})});if(!t.ok)throw Error(`Failed to fetch samples batch: ${t.statusText}`);return(await t.json()).samples}function eG(){let{samples:e,totalSamples:t,setSamples:n,appendSamples:r,addSamplesIfMissing:i,setDatasetInfo:s,setEmbeddings:o,setIsLoading:c,isLoading:h,error:u,setError:d,selectedIds:f}=S(),[m,g]=(0,a.useState)(!1);(0,a.useEffect)(()=>{(async()=>{c(!0),d(null);try{let[e,t,r]=await Promise.all([eK(),eU(0,100),eX()]);s(e),n(t.samples,t.total),o(r)}catch(e){console.error("Failed to load data:",e),d(e instanceof Error?e.message:"Failed to load data")}finally{c(!1)}})()},[]),(0,a.useEffect)(()=>{(async()=>{if(0===f.size)return;let t=new Set(e.map(e=>e.id)),n=Array.from(f).filter(e=>!t.has(e));if(0!==n.length)try{let e=await eY(n);i(e)}catch(e){console.error("Failed to fetch selected samples:",e)}})()},[f,e,i]);let x=(0,a.useCallback)(async()=>{if(!m&&!(e.length>=t)){g(!0);try{let t=await eU(e.length,100);r(t.samples)}catch(e){console.error("Failed to load more samples:",e)}finally{g(!1)}}},[e.length,t,m,r]);return u?(0,l.jsxs)("div",{className:"h-screen flex flex-col bg-background",children:[(0,l.jsx)(eB,{}),(0,l.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,l.jsxs)("div",{className:"text-center",children:[(0,l.jsx)("div",{className:"text-red-500 text-lg mb-2",children:"Error"}),(0,l.jsx)("div",{className:"text-text-muted",children:u}),(0,l.jsx)("p",{className:"text-text-muted mt-4 text-sm",children:"Make sure the HyperView backend is running on port 5151."})]})})]}):h?(0,l.jsxs)("div",{className:"h-screen flex flex-col bg-background",children:[(0,l.jsx)(eB,{}),(0,l.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,l.jsxs)("div",{className:"text-center",children:[(0,l.jsx)("div",{className:"w-8 h-8 border-2 border-primary border-t-transparent rounded-full animate-spin mx-auto mb-4"}),(0,l.jsx)("div",{className:"text-text-muted",children:"Loading dataset..."})]})})]}):(0,l.jsxs)("div",{className:"h-screen flex flex-col bg-background",children:[(0,l.jsx)(eB,{}),(0,l.jsxs)("div",{className:"flex-1 flex gap-2 p-2 overflow-hidden",children:[(0,l.jsx)("div",{className:"w-1/2 min-w-0",children:(0,l.jsx)(k,{samples:e,onLoadMore:x,hasMore:e.lengtheG],52683)}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/8061f65b291e8aa9.css b/src/hyperview/server/static/_next/static/chunks/8061f65b291e8aa9.css deleted file mode 100644 index c3faed2..0000000 --- a/src/hyperview/server/static/_next/static/chunks/8061f65b291e8aa9.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-1{bottom:.25rem}.left-1{left:.25rem}.right-1{right:.25rem}.top-1{top:.25rem}.z-10{z-index:10}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mt-4{margin-top:1rem}.inline-block{display:inline-block}.flex{display:flex}.h-14{height:3.5rem}.h-3{height:.75rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.w-1\/2{width:50%}.w-3{width:.75rem}.w-36{width:9rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-full{max-width:100%}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-border{--tw-border-opacity:1;border-color:rgb(61 61 61/var(--tw-border-opacity,1))}.border-primary{--tw-border-opacity:1;border-color:rgb(255 107 53/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:#0000}.bg-background{--tw-bg-opacity:1;background-color:rgb(26 26 26/var(--tw-bg-opacity,1))}.bg-primary{--tw-bg-opacity:1;background-color:rgb(255 107 53/var(--tw-bg-opacity,1))}.bg-surface{--tw-bg-opacity:1;background-color:rgb(37 37 37/var(--tw-bg-opacity,1))}.bg-surface-light{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity,1))}.bg-surface\/80{background-color:#252525cc}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-center{text-align:center}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-text{--tw-text-opacity:1;color:rgb(224 224 224/var(--tw-text-opacity,1))}.text-text-muted{--tw-text-opacity:1;color:rgb(136 136 136/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-70{opacity:.7}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-primary{--tw-ring-opacity:1;--tw-ring-color:rgb(255 107 53/var(--tw-ring-opacity,1))}.ring-primary-light{--tw-ring-opacity:1;--tw-ring-color:rgb(255 140 90/var(--tw-ring-opacity,1))}.filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150{transition-duration:.15s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}:root{--background:#1a1a1a;--surface:#252525;--surface-light:#2d2d2d;--border:#3d3d3d;--primary:#ff6b35;--primary-light:#ff8c5a;--text:#e0e0e0;--text-muted:#888}*{box-sizing:border-box}body{background-color:var(--background);color:var(--text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--surface)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#4d4d4d}.hide-scrollbar::-webkit-scrollbar{display:none}.hide-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.hover\:bg-border:hover{--tw-bg-opacity:1;background-color:rgb(61 61 61/var(--tw-bg-opacity,1))}.hover\:bg-surface-light:hover{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity,1))} diff --git a/src/hyperview/server/static/_next/static/chunks/89b87b2c88f720ee.js b/src/hyperview/server/static/_next/static/chunks/89b87b2c88f720ee.js deleted file mode 100644 index c051167..0000000 --- a/src/hyperview/server/static/_next/static/chunks/89b87b2c88f720ee.js +++ /dev/null @@ -1,9 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,52683,e=>{"use strict";let t;var s=e.i(43476),i=e.i(71645),l=e.i(74080);function n(e,t,s){let i,l=s.initialDeps??[];function n(){var n,r,a,o;let d,c;s.key&&(null==(n=s.debug)?void 0:n.call(s))&&(d=Date.now());let h=e();if(!(h.length!==l.length||h.some((e,t)=>l[t]!==e)))return i;if(l=h,s.key&&(null==(r=s.debug)?void 0:r.call(s))&&(c=Date.now()),i=t(...h),s.key&&(null==(a=s.debug)?void 0:a.call(s))){let e=Math.round((Date.now()-d)*100)/100,t=Math.round((Date.now()-c)*100)/100,i=t/16,l=(e,t)=>{for(e=String(e);e.length{l=e},n}function r(e,t){if(void 0!==e)return e;throw Error(`Unexpected undefined${t?`: ${t}`:""}`)}e.i(47167);let a=e=>{let{offsetWidth:t,offsetHeight:s}=e;return{width:t,height:s}},o=e=>e,d=e=>{let t=Math.max(e.startIndex-e.overscan,0),s=Math.min(e.endIndex+e.overscan,e.count-1),i=[];for(let e=t;e<=s;e++)i.push(e);return i},c=(e,t)=>{let s=e.scrollElement;if(!s)return;let i=e.targetWindow;if(!i)return;let l=e=>{let{width:s,height:i}=e;t({width:Math.round(s),height:Math.round(i)})};if(l(a(s)),!i.ResizeObserver)return()=>{};let n=new i.ResizeObserver(t=>{let i=()=>{let e=t[0];if(null==e?void 0:e.borderBoxSize){let t=e.borderBoxSize[0];if(t)return void l({width:t.inlineSize,height:t.blockSize})}l(a(s))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(i):i()});return n.observe(s,{box:"border-box"}),()=>{n.unobserve(s)}},h={passive:!0},u="undefined"==typeof window||"onscrollend"in window,m=(e,t)=>{var s,i;let l,n=e.scrollElement;if(!n)return;let r=e.targetWindow;if(!r)return;let a=0,o=e.options.useScrollendEvent&&u?()=>void 0:(s=()=>{t(a,!1)},i=e.options.isScrollingResetDelay,function(...e){r.clearTimeout(l),l=r.setTimeout(()=>s.apply(this,e),i)}),d=s=>()=>{let{horizontal:i,isRtl:l}=e.options;a=i?n.scrollLeft*(l&&-1||1):n.scrollTop,o(),t(a,s)},c=d(!0),m=d(!1);m(),n.addEventListener("scroll",c,h);let f=e.options.useScrollendEvent&&u;return f&&n.addEventListener("scrollend",m,h),()=>{n.removeEventListener("scroll",c),f&&n.removeEventListener("scrollend",m)}},f=(e,t,s)=>{if(null==t?void 0:t.borderBoxSize){let e=t.borderBoxSize[0];if(e)return Math.round(e[s.options.horizontal?"inlineSize":"blockSize"])}return e[s.options.horizontal?"offsetWidth":"offsetHeight"]},g=(e,{adjustments:t=0,behavior:s},i)=>{var l,n;null==(n=null==(l=i.scrollElement)?void 0:l.scrollTo)||n.call(l,{[i.options.horizontal?"left":"top"]:e+t,behavior:s})};class x{constructor(e){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.measurementsCache=[],this.itemSizeCache=new Map,this.pendingMeasuredCacheIndexes=[],this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this.elementsCache=new Map,this.observer=(()=>{let e=null,t=()=>e||(this.targetWindow&&this.targetWindow.ResizeObserver?e=new this.targetWindow.ResizeObserver(e=>{e.forEach(e=>{let t=()=>{this._measureElement(e.target,e)};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(t):t()})}):null);return{disconnect:()=>{var s;null==(s=t())||s.disconnect(),e=null},observe:e=>{var s;return null==(s=t())?void 0:s.observe(e,{box:"border-box"})},unobserve:e=>{var s;return null==(s=t())?void 0:s.unobserve(e)}}})(),this.range=null,this.setOptions=e=>{Object.entries(e).forEach(([t,s])=>{void 0===s&&delete e[t]}),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:o,rangeExtractor:d,onChange:()=>{},measureElement:f,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,...e}},this.notify=e=>{var t,s;null==(s=(t=this.options).onChange)||s.call(t,this,e)},this.maybeNotify=n(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var e;let t=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==t){if(this.cleanup(),!t)return void this.maybeNotify();this.scrollElement=t,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=(null==(e=this.scrollElement)?void 0:e.window)??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,t)=>{this.scrollAdjustments=0,this.scrollDirection=t?this.getScrollOffset()this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??("function"==typeof this.options.initialOffset?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,t)=>{let s=new Map,i=new Map;for(let l=t-1;l>=0;l--){let t=e[l];if(s.has(t.lane))continue;let n=i.get(t.lane);if(null==n||t.end>n.end?i.set(t.lane,t):t.ende.end===t.end?e.index-t.index:e.end-t.end)[0]:void 0},this.getMeasurementOptions=n(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled],(e,t,s,i,l)=>(this.pendingMeasuredCacheIndexes=[],{count:e,paddingStart:t,scrollMargin:s,getItemKey:i,enabled:l}),{key:!1}),this.getMeasurements=n(()=>[this.getMeasurementOptions(),this.itemSizeCache],({count:e,paddingStart:t,scrollMargin:s,getItemKey:i,enabled:l},n)=>{if(!l)return this.measurementsCache=[],this.itemSizeCache.clear(),[];0===this.measurementsCache.length&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(e=>{this.itemSizeCache.set(e.key,e.size)}));let r=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];let a=this.measurementsCache.slice(0,r);for(let l=r;lthis.options.debug}),this.calculateRange=n(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,s,i)=>this.range=e.length>0&&t>0?function({measurements:e,outerSize:t,scrollOffset:s,lanes:i}){let l=e.length-1;if(e.length<=i)return{startIndex:0,endIndex:l};let n=p(0,l,t=>e[t].start,s),r=n;if(1===i)for(;r1){let a=Array(i).fill(0);for(;re=0&&o.some(e=>e>=s);){let t=e[n];o[t.lane]=t.start,n--}n=Math.max(0,n-n%i),r=Math.min(l,r+(i-1-r%i))}return{startIndex:n,endIndex:r}}({measurements:e,outerSize:t,scrollOffset:s,lanes:i}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=n(()=>{let e=null,t=null,s=this.calculateRange();return s&&(e=s.startIndex,t=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t]},(e,t,s,i,l)=>null===i||null===l?[]:e({startIndex:i,endIndex:l,overscan:t,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{let t=this.options.indexAttribute,s=e.getAttribute(t);return s?parseInt(s,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this._measureElement=(e,t)=>{let s=this.indexFromElement(e),i=this.measurementsCache[s];if(!i)return;let l=i.key,n=this.elementsCache.get(l);n!==e&&(n&&this.observer.unobserve(n),this.observer.observe(e),this.elementsCache.set(l,e)),e.isConnected&&this.resizeItem(s,this.options.measureElement(e,t,this))},this.resizeItem=(e,t)=>{let s=this.measurementsCache[e];if(!s)return;let i=t-(this.itemSizeCache.get(s.key)??s.size);0!==i&&((void 0!==this.shouldAdjustScrollPositionOnItemSizeChange?this.shouldAdjustScrollPositionOnItemSizeChange(s,i,this):s.start{e?this._measureElement(e,void 0):this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))})},this.getVirtualItems=n(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{let s=[];for(let i=0,l=e.length;ithis.options.debug}),this.getVirtualItemForOffset=e=>{let t=this.getMeasurements();if(0!==t.length)return r(t[p(0,t.length-1,e=>r(t[e]).start,e)])},this.getOffsetForAlignment=(e,t,s=0)=>{let i=this.getSize(),l=this.getScrollOffset();return"auto"===t&&(t=e>=l+i?"end":"start"),"center"===t?e+=(s-i)/2:"end"===t&&(e-=i),Math.max(Math.min(this.getTotalSize()+this.options.scrollMargin-i,e),0)},this.getOffsetForIndex=(e,t="auto")=>{e=Math.max(0,Math.min(e,this.options.count-1));let s=this.measurementsCache[e];if(!s)return;let i=this.getSize(),l=this.getScrollOffset();if("auto"===t)if(s.end>=l+i-this.options.scrollPaddingEnd)t="end";else{if(!(s.start<=l+this.options.scrollPaddingStart))return[l,t];t="start"}let n="end"===t?s.end+this.options.scrollPaddingEnd:s.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(n,t,s.size),t]},this.isDynamicMode=()=>this.elementsCache.size>0,this.scrollToOffset=(e,{align:t="start",behavior:s}={})=>{"smooth"===s&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getOffsetForAlignment(e,t),{adjustments:void 0,behavior:s})},this.scrollToIndex=(e,{align:t="auto",behavior:s}={})=>{"smooth"===s&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),e=Math.max(0,Math.min(e,this.options.count-1));let i=0,l=t=>{if(!this.targetWindow)return;let i=this.getOffsetForIndex(e,t);if(!i)return void console.warn("Failed to get offset for index:",e);let[l,r]=i;this._scrollToOffset(l,{adjustments:void 0,behavior:s}),this.targetWindow.requestAnimationFrame(()=>{let t=this.getScrollOffset(),s=this.getOffsetForIndex(e,r);s?1.01>Math.abs(s[0]-t)||n(r):console.warn("Failed to get offset for index:",e)})},n=t=>{this.targetWindow&&(++i<10?this.targetWindow.requestAnimationFrame(()=>l(t)):console.warn(`Failed to scroll to index ${e} after 10 attempts.`))};l(t)},this.scrollBy=(e,{behavior:t}={})=>{"smooth"===t&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getScrollOffset()+e,{adjustments:void 0,behavior:t})},this.getTotalSize=()=>{var e;let t,s=this.getMeasurements();if(0===s.length)t=this.options.paddingStart;else if(1===this.options.lanes)t=(null==(e=s[s.length-1])?void 0:e.end)??0;else{let e=Array(this.options.lanes).fill(null),i=s.length-1;for(;i>=0&&e.some(e=>null===e);){let t=s[i];null===e[t.lane]&&(e[t.lane]=t.end),i--}t=Math.max(...e.filter(e=>null!==e))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this._scrollToOffset=(e,{adjustments:t,behavior:s})=>{this.options.scrollToFn(e,{behavior:s,adjustments:t},this)},this.measure=()=>{this.itemSizeCache=new Map,this.notify(!1)},this.setOptions(e)}}let p=(e,t,s,i)=>{for(;e<=t;){let l=(e+t)/2|0,n=s(l);if(ni))return l;t=l-1}}return e>0?e-1:0},b="undefined"!=typeof document?i.useLayoutEffect:i.useEffect,v=e=>{let t,s=new Set,i=(e,i)=>{let l="function"==typeof e?e(t):e;if(!Object.is(l,t)){let e=t;t=(null!=i?i:"object"!=typeof l||null===l)?l:Object.assign({},t,l),s.forEach(s=>s(t,e))}},l=()=>t,n={setState:i,getState:l,getInitialState:()=>r,subscribe:e=>(s.add(e),()=>s.delete(e))},r=t=e(i,l,n);return n},y=e=>{let t=e?v(e):v,s=e=>(function(e,t=e=>e){let s=i.default.useSyncExternalStore(e.subscribe,i.default.useCallback(()=>t(e.getState()),[e,t]),i.default.useCallback(()=>t(e.getInitialState()),[e,t]));return i.default.useDebugValue(s),s})(t,e);return Object.assign(s,t),s},w=(t=(e,t)=>({datasetInfo:null,setDatasetInfo:t=>e({datasetInfo:t}),samples:[],totalSamples:0,setSamples:(t,s)=>e({samples:t,totalSamples:s}),appendSamples:t=>e(e=>({samples:[...e.samples,...t]})),embeddings:null,setEmbeddings:t=>e({embeddings:t}),viewMode:"euclidean",setViewMode:t=>e({viewMode:t}),selectedIds:new Set,setSelectedIds:t=>e({selectedIds:t}),toggleSelection:t=>e(e=>{let s=new Set(e.selectedIds);return s.has(t)?s.delete(t):s.add(t),{selectedIds:s}}),addToSelection:t=>e(e=>{let s=new Set(e.selectedIds);return t.forEach(e=>s.add(e)),{selectedIds:s}}),clearSelection:()=>e({selectedIds:new Set}),hoveredId:null,setHoveredId:t=>e({hoveredId:t}),isLoading:!1,setIsLoading:t=>e({isLoading:t}),error:null,setError:t=>e({error:t}),filterLabel:null,setFilterLabel:t=>e({filterLabel:t}),showLabels:!0,setShowLabels:t=>e({showLabels:t})}))?y(t):y;function j({samples:e,onLoadMore:t,hasMore:n}){let r=(0,i.useRef)(null),{selectedIds:a,toggleSelection:o,addToSelection:d,setHoveredId:h,hoveredId:u}=w(),f=function(e){let t=i.useReducer(()=>({}),{})[1],s={...e,onChange:(s,i)=>{var n;i?(0,l.flushSync)(t):t(),null==(n=e.onChange)||n.call(e,s,i)}},[n]=i.useState(()=>new x(s));return n.setOptions(s),b(()=>n._didMount(),[]),b(()=>n._willUpdate()),n}({observeElementRect:c,observeElementOffset:m,scrollToFn:g,...{count:Math.ceil(e.length/4),getScrollElement:()=>r.current,estimateSize:()=>148,overscan:5}});(0,i.useEffect)(()=>{let e=r.current;if(!e||!t||!n)return;let s=()=>{let{scrollTop:s,scrollHeight:i,clientHeight:l}=e;i-s-l<500&&t()};return e.addEventListener("scroll",s),()=>e.removeEventListener("scroll",s)},[t,n]);let p=(0,i.useCallback)((t,s)=>{if(s.metaKey||s.ctrlKey)o(t.id);else if(s.shiftKey&&a.size>0){let s=Array.from(a),i=s[s.length-1],l=e.findIndex(e=>e.id===i),n=e.findIndex(e=>e.id===t.id);if(-1!==l&&-1!==n){let t=Math.min(l,n),s=Math.max(l,n);d(e.slice(t,s+1).map(e=>e.id))}}else{let e=new Set;e.add(t.id),w.getState().setSelectedIds(e)}},[e,a,o,d]),v=f.getVirtualItems();return(0,s.jsxs)("div",{className:"flex flex-col h-full bg-surface rounded-lg overflow-hidden",children:[(0,s.jsx)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border bg-surface-light",children:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:"Samples"}),(0,s.jsxs)("span",{className:"text-xs text-text-muted",children:[e.length," items",a.size>0&&` (${a.size} selected)`]})]})}),(0,s.jsx)("div",{ref:r,className:"flex-1 overflow-auto p-2",children:(0,s.jsx)("div",{style:{height:`${f.getTotalSize()}px`,width:"100%",position:"relative"},children:v.map(t=>{let i=4*t.index,l=e.slice(i,i+4);return(0,s.jsxs)("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"140px",transform:`translateY(${t.start}px)`},className:"flex gap-2 px-1",children:[l.map(e=>{let t=a.has(e.id),i=u===e.id;return(0,s.jsxs)("div",{className:` - relative flex-1 rounded-md overflow-hidden cursor-pointer - transition-all duration-150 ease-out - ${t?"ring-2 ring-primary":""} - ${i?"ring-2 ring-primary-light":""} - `,onClick:t=>p(e,t),onMouseEnter:()=>h(e.id),onMouseLeave:()=>h(null),children:[e.thumbnail?(0,s.jsx)("img",{src:`data:image/jpeg;base64,${e.thumbnail}`,alt:e.filename,className:"w-full h-full object-cover",loading:"lazy"}):(0,s.jsx)("div",{className:"w-full h-full bg-surface-light flex items-center justify-center",children:(0,s.jsx)("span",{className:"text-text-muted text-xs",children:"No image"})}),e.label&&(0,s.jsx)("div",{className:"absolute bottom-1 left-1 right-1",children:(0,s.jsx)("span",{className:"inline-block px-1.5 py-0.5 text-xs rounded truncate max-w-full",style:{backgroundColor:"rgba(0,0,0,0.7)",color:"#fff"},children:e.label})}),t&&(0,s.jsx)("div",{className:"absolute top-1 right-1 w-5 h-5 rounded-full bg-primary flex items-center justify-center",children:(0,s.jsx)("svg",{className:"w-3 h-3 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})})]},e.id)}),Array.from({length:4-l.length}).map((e,t)=>(0,s.jsx)("div",{className:"flex-1"},`empty-${t}`))]},t.key)})})})]})}function S({className:t=""}){let l=(0,i.useRef)(null),n=(0,i.useRef)(null),r=(0,i.useRef)(null),[a,o]=(0,i.useState)(!1),{embeddings:d,viewMode:c,setViewMode:h,selectedIds:u,setSelectedIds:m,hoveredId:f,setHoveredId:g}=w();(0,i.useEffect)(()=>{if(l.current&&n.current&&!a)return(async()=>{try{let t=(await e.A(93347)).default,{width:s,height:i}=n.current.getBoundingClientRect(),a=t({canvas:l.current,width:s,height:i,pointSize:4,pointSizeSelected:8,opacity:.8,opacityInactiveMax:.2,lassoColor:[1,.41,.21,1],lassoMinDelay:10,lassoMinDist:2,showReticle:!0,reticleColor:[1,1,1,.5]});a.subscribe("select",({points:e})=>{if(e.length>0){let t=w.getState().embeddings;if(t){let s=new Set(e.map(e=>t.ids[e]));m(s)}}}),a.subscribe("deselect",()=>{m(new Set)}),a.subscribe("pointOver",e=>{let t=w.getState().embeddings;t&&e>=0&&g(t.ids[e])}),a.subscribe("pointOut",()=>{g(null)}),r.current=a,o(!0)}catch(e){console.error("Failed to initialize scatterplot:",e)}})(),()=>{r.current&&(r.current.destroy(),r.current=null,o(!1))}},[]),(0,i.useEffect)(()=>{if(!r.current||!d)return;let e="euclidean"===c?d.euclidean:d.hyperbolic,t=[...new Set(d.labels.filter(Boolean))],s={};t.forEach((e,t)=>{e&&(s[e]=t)});let i=d.labels.map(e=>e&&void 0!==s[e]?s[e]:0),l=t.map(e=>{if(e&&d.label_colors[e]){var t;let s;return[...(t=d.label_colors[e],(s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t))?[parseInt(s[1],16)/255,parseInt(s[2],16)/255,parseInt(s[3],16)/255]:[.5,.5,.5]),1]}return[.5,.5,.5,1]});l.length>0&&r.current.set({pointColor:l}),r.current.draw({x:e.map(e=>e[0]),y:e.map(e=>e[1]),category:i})},[d,c,a]),(0,i.useEffect)(()=>{if(!r.current||!d)return;let e=Array.from(u).map(e=>d.ids.indexOf(e)).filter(e=>-1!==e);r.current.select(e,{preventEvent:!0})},[u,d,a]),(0,i.useEffect)(()=>{if(!n.current||!r.current)return;let e=new ResizeObserver(e=>{for(let t of e){let{width:e,height:s}=t.contentRect;e>0&&s>0&&r.current&&r.current.set({width:e,height:s})}});return e.observe(n.current),()=>e.disconnect()},[a]);let x=d?[...new Set(d.labels.filter(Boolean))]:[];return(0,s.jsxs)("div",{className:`flex flex-col h-full bg-surface rounded-lg overflow-hidden ${t}`,children:[(0,s.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border bg-surface-light",children:[(0,s.jsxs)("div",{className:"flex items-center gap-4",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:"Embeddings"}),(0,s.jsxs)("div",{className:"flex rounded-md overflow-hidden border border-border",children:[(0,s.jsx)("button",{onClick:()=>h("euclidean"),className:`px-3 py-1 text-xs transition-colors ${"euclidean"===c?"bg-primary text-white":"bg-surface hover:bg-surface-light text-text-muted"}`,children:"Euclidean"}),(0,s.jsx)("button",{onClick:()=>h("hyperbolic"),className:`px-3 py-1 text-xs transition-colors ${"hyperbolic"===c?"bg-primary text-white":"bg-surface hover:bg-surface-light text-text-muted"}`,children:"Hyperbolic"})]})]}),(0,s.jsx)("span",{className:"text-xs text-text-muted",children:d?`${d.ids.length} points`:"Loading..."})]}),(0,s.jsxs)("div",{className:"flex-1 flex",children:[(0,s.jsxs)("div",{ref:n,className:"flex-1 relative",children:["hyperbolic"===c&&(0,s.jsx)("svg",{className:"absolute inset-0 pointer-events-none",width:"100%",height:"100%",style:{zIndex:0},children:(0,s.jsx)("circle",{cx:"50%",cy:"50%",r:"45%",fill:"none",stroke:"rgba(255,255,255,0.2)",strokeWidth:"2",strokeDasharray:"4,4"})}),(0,s.jsx)("canvas",{ref:l,className:"absolute inset-0",style:{zIndex:1}}),!d&&(0,s.jsx)("div",{className:"absolute inset-0 flex items-center justify-center bg-surface/80 z-10",children:(0,s.jsx)("div",{className:"text-text-muted",children:"Loading embeddings..."})})]}),x.length>0&&(0,s.jsxs)("div",{className:"w-36 border-l border-border bg-surface-light p-2 overflow-y-auto",children:[(0,s.jsx)("div",{className:"text-xs font-medium mb-2 text-text-muted",children:"Labels"}),(0,s.jsxs)("div",{className:"space-y-1",children:[x.slice(0,20).map(e=>(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("div",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:d?.label_colors[e]||"#888"}}),(0,s.jsx)("span",{className:"text-xs truncate",title:e,children:e})]},e)),x.length>20&&(0,s.jsxs)("div",{className:"text-xs text-text-muted",children:["+",x.length-20," more"]})]})]})]}),(0,s.jsx)("div",{className:"px-3 py-2 text-xs text-text-muted border-t border-border bg-surface-light",children:(0,s.jsx)("span",{className:"opacity-70",children:"Shift+drag to lasso select • Scroll to zoom • Drag to pan"})})]})}function N(){let{datasetInfo:e,selectedIds:t,clearSelection:i}=w();return(0,s.jsxs)("header",{className:"h-14 bg-surface border-b border-border flex items-center justify-between px-4",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)("div",{className:"w-8 h-8 rounded-lg bg-primary flex items-center justify-center",children:(0,s.jsx)("svg",{className:"w-5 h-5 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h1",{className:"text-lg font-semibold text-text",children:"HyperView"}),e&&(0,s.jsx)("p",{className:"text-xs text-text-muted",children:e.name})]})]}),(0,s.jsxs)("div",{className:"flex items-center gap-4",children:[e&&(0,s.jsxs)("div",{className:"flex items-center gap-4 text-sm",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Samples:"}),(0,s.jsx)("span",{className:"text-text font-medium",children:e.num_samples.toLocaleString()})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Labels:"}),(0,s.jsx)("span",{className:"text-text font-medium",children:e.labels.length})]})]}),t.size>0&&(0,s.jsxs)("button",{onClick:i,className:"px-3 py-1.5 text-sm bg-surface-light hover:bg-border rounded-md transition-colors",children:["Clear selection (",t.size,")"]})]})]})}async function M(){let e=await fetch("/api/dataset");if(!e.ok)throw Error(`Failed to fetch dataset: ${e.statusText}`);return e.json()}async function E(e=0,t=100,s){let i=new URLSearchParams({offset:e.toString(),limit:t.toString()});s&&i.set("label",s);let l=await fetch(`/api/samples?${i}`);if(!l.ok)throw Error(`Failed to fetch samples: ${l.statusText}`);return l.json()}async function z(){let e=await fetch("/api/embeddings");if(!e.ok)throw Error(`Failed to fetch embeddings: ${e.statusText}`);return e.json()}function C(){let{samples:e,totalSamples:t,setSamples:l,appendSamples:n,setDatasetInfo:r,setEmbeddings:a,setIsLoading:o,isLoading:d,error:c,setError:h}=w(),[u,m]=(0,i.useState)(!1);(0,i.useEffect)(()=>{(async()=>{o(!0),h(null);try{let[e,t,s]=await Promise.all([M(),E(0,100),z()]);r(e),l(t.samples,t.total),a(s)}catch(e){console.error("Failed to load data:",e),h(e instanceof Error?e.message:"Failed to load data")}finally{o(!1)}})()},[]);let f=(0,i.useCallback)(async()=>{if(!u&&!(e.length>=t)){m(!0);try{let t=await E(e.length,100);n(t.samples)}catch(e){console.error("Failed to load more samples:",e)}finally{m(!1)}}},[e.length,t,u,n]);return c?(0,s.jsxs)("div",{className:"h-screen flex flex-col bg-background",children:[(0,s.jsx)(N,{}),(0,s.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,s.jsxs)("div",{className:"text-center",children:[(0,s.jsx)("div",{className:"text-red-500 text-lg mb-2",children:"Error"}),(0,s.jsx)("div",{className:"text-text-muted",children:c}),(0,s.jsx)("p",{className:"text-text-muted mt-4 text-sm",children:"Make sure the HyperView backend is running on port 5151."})]})})]}):d?(0,s.jsxs)("div",{className:"h-screen flex flex-col bg-background",children:[(0,s.jsx)(N,{}),(0,s.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,s.jsxs)("div",{className:"text-center",children:[(0,s.jsx)("div",{className:"w-8 h-8 border-2 border-primary border-t-transparent rounded-full animate-spin mx-auto mb-4"}),(0,s.jsx)("div",{className:"text-text-muted",children:"Loading dataset..."})]})})]}):(0,s.jsxs)("div",{className:"h-screen flex flex-col bg-background",children:[(0,s.jsx)(N,{}),(0,s.jsxs)("div",{className:"flex-1 flex gap-2 p-2 overflow-hidden",children:[(0,s.jsx)("div",{className:"w-1/2 min-w-0",children:(0,s.jsx)(j,{samples:e,onLoadMore:f,hasMore:e.lengthC],52683)},93347,e=>{e.v(t=>Promise.all(["static/chunks/6dd1fc7c515721e7.js"].map(t=>e.l(t))).then(()=>t(42030)))}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/9367d18603aececf.js b/src/hyperview/server/static/_next/static/chunks/9367d18603aececf.js deleted file mode 100644 index 5ab9960..0000000 --- a/src/hyperview/server/static/_next/static/chunks/9367d18603aececf.js +++ /dev/null @@ -1,2 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,74575,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"getAssetPrefix",{enumerable:!0,get:function(){return l}});let r=e.r(12718);function l(){let e=document.currentScript;if(!(e instanceof HTMLScriptElement))throw Object.defineProperty(new r.InvariantError(`Expected document.currentScript to be a ",a=a.removeChild(a.firstChild);break;case"select":a="string"==typeof r.is?u.createElement("select",{is:r.is}):u.createElement("select"),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a="string"==typeof r.is?u.createElement(l,{is:r.is}):u.createElement(l)}}a[eW]=t,a[eK]=r;e:for(u=t.child;null!==u;){if(5===u.tag||6===u.tag)a.appendChild(u.stateNode);else if(4!==u.tag&&27!==u.tag&&null!==u.child){u.child.return=u,u=u.child;continue}if(u===t)break;for(;null===u.sibling;){if(null===u.return||u.return===t)break e;u=u.return}u.sibling.return=u.return,u=u.sibling}switch(t.stateNode=a,cl(a,l,r),l){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break;case"img":r=!0;break;default:r=!1}r&&ou(t)}}return of(t),t.subtreeFlags&=-0x2000001,oo(t,t.type,null===e?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&ou(t);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));if(e=en.current,rY(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(l=rB))switch(l.tag){case 27:case 5:r=l.memoizedProps}e[eW]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||ct(e.nodeValue,n)))||rQ(t,!0)}else(e=ci(e).createTextNode(r))[eW]=t,t.stateNode=e}return of(t),null;case 31:if(n=t.memoizedState,null===e||null!==e.memoizedState){if(r=rY(t),null!==n){if(null===e){if(!r)throw Error(i(318));if(!(e=null!==(e=t.memoizedState)?e.dehydrated:null))throw Error(i(557));e[eW]=t}else rJ(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;of(t),e=!1}else n=rZ(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e){if(256&t.flags)return l9(t),t;return l9(t),null}if(0!=(128&t.flags))throw Error(i(558))}return of(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(l=rY(t),null!==r&&null!==r.dehydrated){if(null===e){if(!l)throw Error(i(318));if(!(l=null!==(l=t.memoizedState)?l.dehydrated:null))throw Error(i(317));l[eW]=t}else rJ(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;of(t),l=!1}else l=rZ(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=l),l=!0;if(!l){if(256&t.flags)return l9(t),t;return l9(t),null}}if(l9(t),0!=(128&t.flags))return t.lanes=n,t;return n=null!==r,e=null!==e&&null!==e.memoizedState,n&&(r=t.child,l=null,null!==r.alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(l=r.alternate.memoizedState.cachePool.pool),a=null,null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(a=r.memoizedState.cachePool.pool),a!==l&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),os(t,t.updateQueue),of(t),null;case 4:return ea(),null===e&&s1(t.stateNode.containerInfo),t.flags|=0x4000000,of(t),null;case 10:return r5(t.type),of(t),null;case 19:if(an(t),null===(r=t.memoizedState))return of(t),null;if(l=0!=(128&t.flags),null===(a=r.rendering))if(l)oc(r,!1);else{if(0!==iM||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(a=ar(e))){for(t.flags|=128,oc(r,!1),t.updateQueue=e=a.updateQueue,os(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)rS(n,e),n=n.sibling;return at(t,1&ae.current|2),rq&&rA(t,r.treeForkCount),t.child}e=e.sibling}null!==r.tail&&ey()>iV&&(t.flags|=128,l=!0,oc(r,!1),t.lanes=4194304)}else{if(!l)if(null!==(e=ar(a))){if(t.flags|=128,l=!0,t.updateQueue=e=e.updateQueue,os(t,e),oc(r,!0),null===r.tail&&"collapsed"!==r.tailMode&&"visible"!==r.tailMode&&!a.alternate&&!rq)return of(t),null}else 2*ey()-r.renderingStartTime>iV&&0x20000000!==n&&(t.flags|=128,l=!0,oc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(null!==(e=r.last)?e.sibling=a:t.child=a,r.last=a)}if(null!==r.tail){e=r.tail;e:{for(n=e;null!==n;){if(null!==n.alternate){n=!1;break e}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ey(),e.sibling=null,a=ae.current,a=l?1&a|2:1&a,"visible"===r.tailMode||"collapsed"===r.tailMode||!n||rq?at(t,a):(n=a,Z(l3,t),Z(ae,n),null===l4&&(l4=t)),rq&&rA(t,r.treeForkCount),e}return of(t),null;case 22:case 23:return l9(t),l2(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?0!=(0x20000000&n)&&0==(128&t.flags)&&(of(t),6&t.subtreeFlags&&(t.flags|=8192)):of(t),null!==(n=t.updateQueue)&&os(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&J(lv),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),r5(lo),of(t),null;case 25:return null;case 30:return t.flags|=0x2000000,of(t),null}throw Error(i(156,t.tag))}(t.alternate,t,iN);if(null!==n){iP=n;return}if(null!==(t=t.sibling)){iP=t;return}iP=t=e}while(null!==t)0===iM&&(iM=5)}function sh(e,t){do{var n=function(e,t){switch(rU(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return r5(lo),ea(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return eo(t),null;case 31:if(null!==t.memoizedState){if(l9(t),null===t.alternate)throw Error(i(340));rJ()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 13:if(l9(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(i(340));rJ()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return an(t),65536&(e=t.flags)?(t.flags=-65537&e|128,null!==(e=t.memoizedState)&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return ea(),null;case 10:return r5(t.type),null;case 22:case 23:return l9(t),l2(),null!==e&&J(lv),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return r5(lo),null;default:return null}}(e.alternate,e);if(null!==n){n.flags&=32767,iP=n;return}if(null!==(n=e.return)&&(n.flags|=32768,n.subtreeFlags=0,n.deletions=null),!t&&null!==(e=e.sibling)){iP=e;return}iP=e=n}while(null!==e)iM=6,iP=null}function sm(e,t,n,r,l,a,u,o,s,c,f){e.cancelPendingCommit=null;do sE();while(0!==iW)if(0!=(6&iE))throw Error(i(327));if(null!==t){var d;if(t===e.current)throw Error(i(177));if(!function(e,t,n,r,l,a){var u=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var o=e.entanglements,i=e.expirationTimes,s=e.hiddenUpdates;for(n=u&~n;0fc){o.length=u;break}d=new Promise(cR.bind(d)),o.push(d)}}}return 0g&&(u=g,g=m,m=u);var y=nH(o,m),v=nH(o,g);if(y&&v&&(1!==p.rangeCount||p.anchorNode!==y.node||p.anchorOffset!==y.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var b=f.createRange();b.setStart(y.node,y.offset),p.removeAllRanges(),m>g?(p.addRange(b),p.extend(v.node,v.offset)):(b.setEnd(v.node,v.offset),p.addRange(b))}}}}for(f=[],p=o;p=p.parentNode;)1===p.nodeType&&f.push({element:p,left:p.scrollLeft,top:p.scrollTop});for("function"==typeof o.focus&&o.focus(),o=0;on?32:n,W.T=null,n=iY,iY=null;var a=iK,u=iG;if(iW=0,iQ=iK=null,iG=0,0!=(6&iE))throw Error(i(331));var o=iE;if(iE|=4,iv(a.current),ic(a,a.current,u,n),iE=o,sI(0,!1),ek&&"function"==typeof ek.onPostCommitFiberRoot)try{ek.onPostCommitFiberRoot(eP,a)}catch(e){}return!0}finally{K.p=l,W.T=r,sw(e,t)}}function sP(e,t,n){t=rT(n,t),t=uF(e.stateNode,t,2),null!==(e=lq(e,t,2))&&(eA(e,2),sA(e))}function sk(e,t,n){if(3===e.tag)sP(e,e,n);else for(;null!==t;){if(3===t.tag){sP(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===i$||!i$.has(r))){e=rT(n,e),null!==(r=lq(t,n=uA(2),2))&&(uI(n,r,t,e),eA(r,2),sA(r));break}}t=t.return}}function sR(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new iw;var l=new Set;r.set(t,l)}else void 0===(l=r.get(t))&&(l=new Set,r.set(t,l));l.has(n)||(iC=!0,l.add(n),e=sT.bind(null,e,t,n),t.then(e,e))}function sT(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,i_===e&&(ik&n)===n&&(4===iM||3===iM&&(0x3c00000&ik)===ik&&300>ey()-iH?0==(2&iE)&&sr(e,0):ij|=n,iA===ik&&(iA=0)),sA(e)}function sx(e,t){0===t&&(t=ej()),null!==(e=rd(e,t))&&(eA(e,t),sA(e))}function sO(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),sx(e,n)}function sC(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,l=e.memoizedState;null!==l&&(n=l.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}null!==r&&r.delete(t),sx(e,n)}var sN=null,sM=null,sL=!1,sz=!1,sj=!1,sF=0;function sA(e){e!==sM&&null===e.next&&(null===sM?sN=sM=e:sM=sM.next=e),sz=!0,sL||(sL=!0,cg(function(){0!=(6&iE)?ep(eb,sD):sU()}))}function sI(e,t){if(!sj&&sz){sj=!0;do for(var n=!1,r=sN;null!==r;){if(!t)if(0!==e){var l=r.pendingLanes;if(0===l)var a=0;else{var u=r.suspendedLanes,o=r.pingedLanes;a=0xc000095&(a=(1<<31-eR(42|e)+1)-1&(l&~(u&~o)))?0xc000095&a|1:a?2|a:0}0!==a&&(n=!0,sV(r,a))}else a=ik,0==(3&(a=eL(r,r===i_?a:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||ez(r,a)||(n=!0,sV(r,a));r=r.next}while(n)sj=!1}}function sD(){sU()}function sU(){sz=sL=!1;var e,t=0;0===sF||((e=window.event)&&"popstate"===e.type?e===cd||(cd=e,0):(cd=null,1))||(t=sF);for(var n=ey(),r=null,l=sN;null!==l;){var a=l.next,u=sH(l,n);0===u?(l.next=null,null===r?sN=a:r.next=a,null===a&&(sM=r)):(r=l,(0!==t||0!=(3&u))&&(sz=!0)),l=a}0!==iW&&5!==iW||sI(t,!1),0!==sF&&(sF=0)}function sH(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,a=-0x3c00001&e.pendingLanes;0 title"):null)}function fu(e,t){return"img"===e&&null!=t.src&&""!==t.src&&null==t.onLoad&&"lazy"!==t.loading}function fo(e){return"stylesheet"!==e.type||0!=(3&e.state.loading)}function fi(e){return(e.width||100)*(e.height||100)*("number"==typeof devicePixelRatio?devicePixelRatio:1)*.25}function fs(e,t){"function"==typeof t.decode&&(e.imgCount++,t.complete||(e.imgBytes+=fi(t),e.suspenseyImages.push(t)),e=fp.bind(e),t.decode().then(e,e))}var fc=0;function ff(e){if(0===e.count&&(0===e.imgCount||!e.waitingForImages)){if(e.stylesheets)fm(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function fd(){this.count--,ff(this)}function fp(){this.imgCount--,ff(this)}var fh=null;function fm(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,fh=new Map,t.forEach(fg,e),fh=null,fd.call(e))}function fg(e,t){if(!(4&t.state.loading)){var n=fh.get(e);if(n)var r=n.get(null);else{n=new Map,fh.set(e,n);for(var l=e.querySelectorAll("link[data-precedence],style[data-precedence]"),a=0;a{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),t.exports=e.r(46480)},42732,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"HeadManagerContext",{enumerable:!0,get:function(){return r}});let r=e.r(55682)._(e.r(71645)).default.createContext({})},51323,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={onCaughtError:function(){return d},onUncaughtError:function(){return p}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(55682),u=e.r(65713),o=e.r(32061),i=e.r(28279),s=e.r(72383),c=a._(e.r(68027)),f={decorateDevError:e=>e,handleClientError:()=>{},originConsoleError:console.error.bind(console)};function d(e,t){let n,r=t.errorBoundary?.constructor;if(n=n||r===s.ErrorBoundaryHandler&&t.errorBoundary.props.errorComponent===c.default)return p(e);(0,o.isBailoutToCSRError)(e)||(0,u.isNextRouterError)(e)||f.originConsoleError(e)}function p(e){(0,o.isBailoutToCSRError)(e)||(0,u.isNextRouterError)(e)||(0,i.reportGlobalError)(e)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},34727,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={computeChangedPath:function(){return f},extractPathFromFlightRouterState:function(){return c},getSelectedParams:function(){return function e(t,n={}){for(let r of Object.values(t[1])){let t=r[0],l=Array.isArray(t),a=l?t[1]:t;!a||a.startsWith(u.PAGE_SEGMENT_KEY)||(l&&("c"===t[2]||"oc"===t[2])?n[t[0]]=t[1].split("/"):l&&(n[t[0]]=t[1]),n=e(r,n))}return n}}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(91463),u=e.r(13258),o=e.r(56019),i=e=>"string"==typeof e?"children"===e?"":e:e[1];function s(e){return e.reduce((e,t)=>{let n;return""===(t="/"===(n=t)[0]?n.slice(1):n)||(0,u.isGroupSegment)(t)?e:`${e}/${t}`},"")||"/"}function c(e){let t=Array.isArray(e[0])?e[0][1]:e[0];if(t===u.DEFAULT_SEGMENT_KEY||a.INTERCEPTION_ROUTE_MARKERS.some(e=>t.startsWith(e)))return;if(t.startsWith(u.PAGE_SEGMENT_KEY))return"";let n=[i(t)],r=e[1]??{},l=r.children?c(r.children):void 0;if(void 0!==l)n.push(l);else for(let[e,t]of Object.entries(r)){if("children"===e)continue;let r=c(t);void 0!==r&&n.push(r)}return s(n)}function f(e,t){let n=function e(t,n){let[r,l]=t,[u,s]=n,f=i(r),d=i(u);if(a.INTERCEPTION_ROUTE_MARKERS.some(e=>f.startsWith(e)||d.startsWith(e)))return"";if(!(0,o.matchSegment)(r,u))return c(n)??"";for(let t in l)if(s[t]){let n=e(l[t],s[t]);if(null!==n)return`${i(u)}/${n}`}return null}(e,t);return null==n||"/"===n?n:s(n.split("/"))}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},47442,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"handleMutable",{enumerable:!0,get:function(){return a}});let r=e.r(34727);function l(e){return void 0!==e}function a(e,t){let n=t.shouldScroll??!0,a=e.previousNextUrl,u=e.nextUrl;if(l(t.patchedTree)){let n=(0,r.computeChangedPath)(e.tree,t.patchedTree);n?(a=u,u=n):u||(u=e.canonicalUrl)}return{canonicalUrl:t.canonicalUrl??e.canonicalUrl,renderedSearch:t.renderedSearch??e.renderedSearch,pushRef:{pendingPush:l(t.pendingPush)?t.pendingPush:e.pushRef.pendingPush,mpaNavigation:l(t.mpaNavigation)?t.mpaNavigation:e.pushRef.mpaNavigation,preserveCustomHistoryState:l(t.preserveCustomHistoryState)?t.preserveCustomHistoryState:e.pushRef.preserveCustomHistoryState},focusAndScrollRef:{apply:!!n&&(!!l(t?.scrollableSegments)||e.focusAndScrollRef.apply),onlyHashChange:t.onlyHashChange||!1,hashFragment:n?t.hashFragment&&""!==t.hashFragment?decodeURIComponent(t.hashFragment.slice(1)):e.focusAndScrollRef.hashFragment:null,segmentPaths:n?t?.scrollableSegments??e.focusAndScrollRef.segmentPaths:[]},cache:t.cache?t.cache:e.cache,tree:l(t.patchedTree)?t.patchedTree:e.tree,nextUrl:u,previousNextUrl:a,debugInfo:t.collectedDebugInfo??null}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},48919,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isNavigatingToNewRootLayout",{enumerable:!0,get:function(){return function e(t,n){let r=t[0],l=n[0];if(Array.isArray(r)&&Array.isArray(l)){if(r[0]!==l[0]||r[2]!==l[2])return!0}else if(r!==l)return!0;if(t[4])return!n[4];if(n[4])return!0;let a=Object.values(t[1])[0],u=Object.values(n[1])[0];return!a||!u||e(a,u)}}}),("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},95871,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={abortTask:function(){return y},listenForDynamicRequest:function(){return g},startPPRNavigation:function(){return d},updateCacheNodeOnPopstateRestoration:function(){return function e(t,n){let r=n[1],l=t.parallelRoutes,a=new Map(l);for(let t in r){let n=r[t],u=n[0],o=(0,i.createRouterCacheKey)(u),s=l.get(t);if(void 0!==s){let r=s.get(o);if(void 0!==r){let l=e(r,n),u=new Map(s);u.set(o,l),a.set(t,u)}}}let u=t.rsc,o=S(u)&&"pending"===u.status;return{lazyData:null,rsc:u,head:t.head,prefetchHead:o?t.prefetchHead:[null,null],prefetchRsc:o?t.prefetchRsc:null,loading:t.loading,parallelRoutes:a,navigatedAt:t.navigatedAt}}}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(13258),u=e.r(56019),o=e.r(51191),i=e.r(70725),s=e.r(48919),c=e.r(54069),f={route:null,node:null,dynamicRequestTree:null,children:null};function d(e,t,n,r,l,s,c,d,m,g){return function e(t,n,r,l,s,c,d,m,g,y,v,b){let S=l[1],w=s[1],E=null!==d?d[1]:null;c||!0===s[4]&&(c=!0);let _=r.parallelRoutes,P=new Map(_),k={},R=null,T=!1,x={};for(let r in w){let l,s=w[r],d=S[r],O=_.get(r),C=null!==E?E[r]:null,N=s[0],M=v.concat([r,N]),L=(0,i.createRouterCacheKey)(N),z=void 0!==d?d[0]:void 0,j=void 0!==O?O.get(L):void 0;if(null!==(l=N===a.DEFAULT_SEGMENT_KEY?void 0!==d?function(e,t){let n;return"refresh"===t[3]?n=t:((n=h(t,t[1]))[2]=(0,o.createHrefFromUrl)(e),n[3]="refresh"),{route:n,node:null,dynamicRequestTree:null,children:null}}(n,d):p(t,d,s,j,c,void 0!==C?C:null,m,g,M,b):y&&0===Object.keys(s[1]).length?p(t,d,s,j,c,void 0!==C?C:null,m,g,M,b):void 0!==d&&void 0!==z&&(0,u.matchSegment)(N,z)&&void 0!==j&&void 0!==d?e(t,n,j,d,s,c,C,m,g,y,M,b):p(t,d,s,j,c,void 0!==C?C:null,m,g,M,b))){if(null===l.route)return f;null===R&&(R=new Map),R.set(r,l);let e=l.node;if(null!==e){let t=new Map(O);t.set(L,e),P.set(r,t)}let t=l.route;k[r]=t;let n=l.dynamicRequestTree;null!==n?(T=!0,x[r]=n):x[r]=t}else k[r]=s,x[r]=s}if(null===R)return null;let O={lazyData:null,rsc:r.rsc,prefetchRsc:r.prefetchRsc,head:r.head,prefetchHead:r.prefetchHead,loading:r.loading,parallelRoutes:P,navigatedAt:t};return{route:h(s,k),node:O,dynamicRequestTree:T?h(s,x):null,children:R}}(e,t,n,r,l,!1,s,c,d,m,[],g)}function p(e,t,n,r,l,a,u,o,d,p){return!l&&(void 0===t||(0,s.isNavigatingToNewRootLayout)(t,n))?f:function e(t,n,r,l,a,u,o,s){let f,d,p,g,y=n[1],v=0===Object.keys(y).length;if(void 0!==r&&r.navigatedAt+c.DYNAMIC_STALETIME_MS>t)f=r.rsc,d=r.loading,p=r.head,g=r.navigatedAt;else if(null===l)return m(t,n,null,a,u,o,s);else if(f=l[0],d=l[2],p=v?a:null,g=t,l[3]||u&&v)return m(t,n,l,a,u,o,s);let b=null!==l?l[1]:null,S=new Map,w=void 0!==r?r.parallelRoutes:null,E=new Map(w),_={},P=!1;if(v)s.push(o);else for(let n in y){let r=y[n],l=null!==b?b[n]:null,c=null!==w?w.get(n):void 0,f=r[0],d=o.concat([n,f]),p=(0,i.createRouterCacheKey)(f),h=e(t,r,void 0!==c?c.get(p):void 0,l,a,u,d,s);S.set(n,h);let m=h.dynamicRequestTree;null!==m?(P=!0,_[n]=m):_[n]=r;let g=h.node;if(null!==g){let e=new Map;e.set(p,g),E.set(n,e)}}return{route:n,node:{lazyData:null,rsc:f,prefetchRsc:null,head:p,prefetchHead:null,loading:d,parallelRoutes:E,navigatedAt:g},dynamicRequestTree:P?h(n,_):null,children:S}}(e,n,r,a,u,o,d,p)}function h(e,t){let n=[e[0],t];return 2 in e&&(n[2]=e[2]),3 in e&&(n[3]=e[3]),4 in e&&(n[4]=e[4]),n}function m(e,t,n,r,l,a,u){let o=h(t,t[1]);return o[3]="refetch",{route:t,node:function e(t,n,r,l,a,u,o){let s=n[1],c=null!==r?r[1]:null,f=new Map;for(let n in s){let r=s[n],d=null!==c?c[n]:null,p=r[0],h=u.concat([n,p]),m=(0,i.createRouterCacheKey)(p),g=e(t,r,void 0===d?null:d,l,a,h,o),y=new Map;y.set(m,g),f.set(n,y)}let d=0===f.size;d&&o.push(u);let p=null!==r?r[0]:null;return{lazyData:null,parallelRoutes:f,prefetchRsc:void 0!==p?p:null,prefetchHead:d?l:[null,null],rsc:w(),head:d?w():null,loading:null!==r?r[2]??null:w(),navigatedAt:t}}(e,t,n,r,l,a,u),dynamicRequestTree:o,children:null}}function g(e,t){t.then(t=>{if("string"==typeof t)return;let{flightData:n,debugInfo:r}=t;for(let t of n){let{segmentPath:n,tree:l,seedData:a,head:o}=t;a&&function(e,t,n,r,l,a){let o=e;for(let e=0;e{y(e,t,null)})}function y(e,t,n){let r=e.node;if(null===r)return;let l=e.children;if(null===l)v(e.route,r,t,n);else for(let e of l.values())y(e,t,n);e.dynamicRequestTree=null}function v(e,t,n,r){let l=e[1],a=t.parallelRoutes;for(let e in l){let t=l[e],u=a.get(e);if(void 0===u)continue;let o=t[0],s=(0,i.createRouterCacheKey)(o),c=u.get(s);void 0!==c&&v(t,c,n,r)}let u=t.rsc;S(u)&&(null===n?u.resolve(null,r):u.reject(n,r));let o=t.loading;S(o)&&o.resolve(null,r);let s=t.head;S(s)&&s.resolve(null,r)}let b=Symbol();function S(e){return e&&"object"==typeof e&&e.tag===b}function w(){let e,t,n=[],r=new Promise((n,r)=>{e=n,t=r});return r.status="pending",r.resolve=(t,l)=>{"pending"===r.status&&(r.status="fulfilled",r.value=t,null!==l&&n.push.apply(n,l),e(t))},r.reject=(e,l)=>{"pending"===r.status&&(r.status="rejected",r.reason=e,null!==l&&n.push.apply(n,l),t(e))},r.tag=b,r._debugInfo=n,r}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},22744,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"HasLoadingBoundary",{enumerable:!0,get:function(){return l}});var r,l=((r={})[r.SegmentHasLoadingBoundary=1]="SegmentHasLoadingBoundary",r[r.SubtreeHasLoadingBoundary=2]="SubtreeHasLoadingBoundary",r[r.SubtreeHasNoLoadingBoundary=3]="SubtreeHasNoLoadingBoundary",r)},9396,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r,l,a,u={FetchStrategy:function(){return c},NavigationResultTag:function(){return i},PrefetchPriority:function(){return s}};for(var o in u)Object.defineProperty(n,o,{enumerable:!0,get:u[o]});var i=((r={})[r.MPA=0]="MPA",r[r.Success=1]="Success",r[r.NoOp=2]="NoOp",r[r.Async=3]="Async",r),s=((l={})[l.Intent=2]="Intent",l[l.Default=1]="Default",l[l.Background=0]="Background",l),c=((a={})[a.LoadingBoundary=0]="LoadingBoundary",a[a.PPR=1]="PPR",a[a.PPRRuntime=2]="PPRRuntime",a[a.Full=3]="Full",a);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},73861,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={deleteFromLru:function(){return f},lruPut:function(){return s},updateLruSize:function(){return c}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(511),u=null,o=!1,i=0;function s(e){if(u===e)return;let t=e.prev,n=e.next;if(null===n||null===t?(i+=e.size,d()):(t.next=n,n.prev=t),null===u)e.prev=e,e.next=e;else{let t=u.prev;e.prev=t,null!==t&&(t.next=e),e.next=u,u.prev=e}u=e}function c(e,t){let n=e.size;e.size=t,null!==e.next&&(i=i-n+t,d())}function f(e){let t=e.next,n=e.prev;null!==t&&null!==n&&(i-=e.size,e.next=null,e.prev=null,u===e?u=t===u?null:t:(n.next=t,t.prev=n))}function d(){o||i<=0x3200000||(o=!0,h(p))}function p(){o=!1;for(;i>0x2d00000&&null!==u;){let e=u.prev;null!==e&&(0,a.deleteFromCacheMap)(e.value)}}let h="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},511,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={Fallback:function(){return u},createCacheMap:function(){return i},deleteFromCacheMap:function(){return h},getFromCacheMap:function(){return s},isValueExpired:function(){return c},setInCacheMap:function(){return f},setSizeInCacheMap:function(){return g}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(73861),u={},o={};function i(){return{parent:null,key:null,value:null,map:null,prev:null,next:null,size:0}}function s(e,t,n,r,l){let i=function e(t,n,r,l,a,i){let s,f;if(null!==l)s=l.value,f=l.parent;else if(a&&i!==o)s=o,f=null;else return null===r.value?r:c(t,n,r.value)?(m(r),null):r;let d=r.map;if(null!==d){let r=d.get(s);if(void 0!==r){let l=e(t,n,r,f,a,s);if(null!==l)return l}let l=d.get(u);if(void 0!==l)return e(t,n,l,f,a,s)}return null}(e,t,n,r,l,0);return null===i||null===i.value?null:((0,a.lruPut)(i),i.value)}function c(e,t,n){return n.staleAt<=e||n.version{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={appendLayoutVaryPath:function(){return c},clonePageVaryPathWithNewSearchParams:function(){return m},finalizeLayoutVaryPath:function(){return f},finalizeMetadataVaryPath:function(){return p},finalizePageVaryPath:function(){return d},getFulfilledRouteVaryPath:function(){return s},getRouteVaryPath:function(){return i},getSegmentVaryPathForRequest:function(){return h}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(9396),u=e.r(511),o=e.r(67764);function i(e,t,n){return{value:e,parent:{value:t,parent:{value:n,parent:null}}}}function s(e,t,n,r){return{value:e,parent:{value:t,parent:{value:r?n:u.Fallback,parent:null}}}}function c(e,t){return{value:t,parent:e}}function f(e,t){return{value:e,parent:t}}function d(e,t,n){return{value:e,parent:{value:t,parent:n}}}function p(e,t,n){return{value:e+o.HEAD_REQUEST_KEY,parent:{value:t,parent:n}}}function h(e,t){let n=t.varyPath;if(t.isPage&&e!==a.FetchStrategy.Full&&e!==a.FetchStrategy.PPRRuntime){let e=n.parent.parent;return{value:n.value,parent:{value:u.Fallback,parent:e}}}return n}function m(e,t){let n=e.parent;return{value:e.value,parent:{value:t,parent:n.parent}}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},77048,(e,t,n)=>{"use strict";function r(e,t){let n=new URL(e);return{pathname:n.pathname,search:n.search,nextUrl:t}}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"createCacheKey",{enumerable:!0,get:function(){return r}}),("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},77709,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={cancelPrefetchTask:function(){return w},isPrefetchTaskDirty:function(){return _},pingPrefetchTask:function(){return O},reschedulePrefetchTask:function(){return E},schedulePrefetchTask:function(){return S},startRevalidationCooldown:function(){return b}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(22744),u=e.r(56019),o=e.r(20896),i=e.r(56655),s=e.r(77048),c=e.r(9396),f=e.r(13258),d="function"==typeof queueMicrotask?queueMicrotask:e=>Promise.resolve().then(e).catch(e=>setTimeout(()=>{throw e})),p=[],h=0,m=0,g=!1,y=null,v=null;function b(){null!==v&&clearTimeout(v),v=setTimeout(()=>{v=null,k()},300)}function S(e,t,n,r,l){let a={key:e,treeAtTimeOfPrefetch:t,cacheVersion:(0,o.getCurrentCacheVersion)(),priority:r,phase:1,hasBackgroundWork:!1,spawnedRuntimePrefetches:null,fetchStrategy:n,sortId:m++,isCanceled:!1,onInvalidate:l,_heapIndex:-1};return P(a),H(p,a),k(),a}function w(e){e.isCanceled=!0,function(e,t){let n=t._heapIndex;if(-1!==n&&(t._heapIndex=-1,0!==e.length)){let r=e.pop();r!==t&&(e[n]=r,r._heapIndex=n,W(e,r,n))}}(p,e)}function E(e,t,n,r){e.isCanceled=!1,e.phase=1,e.sortId=m++,e.priority=e===y?c.PrefetchPriority.Intent:r,e.treeAtTimeOfPrefetch=t,e.fetchStrategy=n,P(e),-1!==e._heapIndex?q(p,e):H(p,e),k()}function _(e,t,n){let r=(0,o.getCurrentCacheVersion)();return e.cacheVersion!==r||e.treeAtTimeOfPrefetch!==n||e.key.nextUrl!==t}function P(e){e.priority===c.PrefetchPriority.Intent&&e!==y&&(null!==y&&y.priority!==c.PrefetchPriority.Background&&(y.priority=c.PrefetchPriority.Default,q(p,y)),y=e)}function k(){g||(g=!0,d(C))}function R(e){return null===v&&(e.priority===c.PrefetchPriority.Intent?h<12:h<4)}function T(e){return h++,e.then(e=>null===e?(x(),null):(e.closed.then(x),e.value))}function x(){h--,k()}function O(e){e.isCanceled||-1!==e._heapIndex||(H(p,e),k())}function C(){g=!1;let e=Date.now(),t=B(p);for(;null!==t&&R(t);){t.cacheVersion=(0,o.getCurrentCacheVersion)();let n=function(e,t){let n=t.key,r=(0,o.readOrCreateRouteCacheEntry)(e,t,n),l=function(e,t,n){switch(n.status){case o.EntryStatus.Empty:T((0,o.fetchRouteOnCacheMiss)(n,t,t.key)),n.staleAt=e+6e4,n.status=o.EntryStatus.Pending;case o.EntryStatus.Pending:{let e=n.blockedTasks;return null===e?n.blockedTasks=new Set([t]):e.add(t),1}case o.EntryStatus.Rejected:break;case o.EntryStatus.Fulfilled:{if(0!==t.phase)return 2;if(!R(t))return 0;let i=n.tree,s=t.fetchStrategy===c.FetchStrategy.PPR?n.isPPREnabled?c.FetchStrategy.PPR:c.FetchStrategy.LoadingBoundary:t.fetchStrategy;switch(s){case c.FetchStrategy.PPR:{var r,l,u;if(z(r=e,l=t,u=n,(0,o.readOrCreateSegmentCacheEntry)(r,c.FetchStrategy.PPR,u,u.metadata),l.key,u.metadata),0===function e(t,n,r,l,a){let u=(0,o.readOrCreateSegmentCacheEntry)(t,n.fetchStrategy,r,a);z(t,n,r,u,n.key,a);let i=l[1],s=a.slots;if(null!==s)for(let l in s){if(!R(n))return 0;let a=s[l],u=a.segment,c=i[l],f=c?.[0];if(0===(void 0!==f&&D(r,u,f)?e(t,n,r,c,a):function e(t,n,r,l){if(l.hasRuntimePrefetch)return null===n.spawnedRuntimePrefetches?n.spawnedRuntimePrefetches=new Set([l.requestKey]):n.spawnedRuntimePrefetches.add(l.requestKey),2;let a=(0,o.readOrCreateSegmentCacheEntry)(t,n.fetchStrategy,r,l);if(z(t,n,r,a,n.key,l),null!==l.slots){if(!R(n))return 0;for(let a in l.slots)if(0===e(t,n,r,l.slots[a]))return 0}return 2}(t,n,r,a)))return 0}return 2}(e,t,n,t.treeAtTimeOfPrefetch,i))return 0;let a=t.spawnedRuntimePrefetches;if(null!==a){let r=new Map;M(e,t,n,r,c.FetchStrategy.PPRRuntime);let l=function e(t,n,r,l,a,u){if(a.has(l.requestKey))return L(t,n,r,l,!1,u,c.FetchStrategy.PPRRuntime);let o={},i=l.slots;if(null!==i)for(let l in i){let s=i[l];o[l]=e(t,n,r,s,a,u)}return[l.segment,o,null,null]}(e,t,n,i,a,r);r.size>0&&T((0,o.fetchSegmentPrefetchesUsingDynamicRequest)(t,n,c.FetchStrategy.PPRRuntime,l,r))}return 2}case c.FetchStrategy.Full:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.LoadingBoundary:{let r=new Map;M(e,t,n,r,s);let l=function e(t,n,r,l,u,i,s){let f=l[1],d=u.slots,p={};if(null!==d)for(let l in d){let u=d[l],h=u.segment,m=f[l],g=m?.[0];if(void 0!==g&&D(r,h,g)){let a=e(t,n,r,m,u,i,s);p[l]=a}else switch(s){case c.FetchStrategy.LoadingBoundary:{let e=u.hasLoadingBoundary!==a.HasLoadingBoundary.SubtreeHasNoLoadingBoundary?function e(t,n,r,l,u,i){let s=null===u?"inside-shared-layout":null,f=(0,o.readOrCreateSegmentCacheEntry)(t,n.fetchStrategy,r,l);switch(f.status){case o.EntryStatus.Empty:i.set(l.requestKey,(0,o.upgradeToPendingSegment)(f,c.FetchStrategy.LoadingBoundary)),"refetch"!==u&&(s=u="refetch");break;case o.EntryStatus.Fulfilled:if(l.hasLoadingBoundary===a.HasLoadingBoundary.SegmentHasLoadingBoundary)return(0,o.convertRouteTreeToFlightRouterState)(l);case o.EntryStatus.Pending:case o.EntryStatus.Rejected:}let d={};if(null!==l.slots)for(let a in l.slots){let o=l.slots[a];d[a]=e(t,n,r,o,u,i)}return[l.segment,d,null,s,l.isRootLayout]}(t,n,r,u,null,i):(0,o.convertRouteTreeToFlightRouterState)(u);p[l]=e;break}case c.FetchStrategy.PPRRuntime:{let e=L(t,n,r,u,!1,i,s);p[l]=e;break}case c.FetchStrategy.Full:{let e=L(t,n,r,u,!1,i,s);p[l]=e}}}return[u.segment,p,null,null,u.isRootLayout]}(e,t,n,t.treeAtTimeOfPrefetch,i,r,s);return r.size>0&&T((0,o.fetchSegmentPrefetchesUsingDynamicRequest)(t,n,s,l,r)),2}}}}return 2}(e,t,r);if(0!==l&&""!==n.search){let r=new URL(n.pathname,location.origin),l=(0,s.createCacheKey)(r.href,n.nextUrl),a=(0,o.readOrCreateRouteCacheEntry)(e,t,l);switch(a.status){case o.EntryStatus.Empty:N(t)&&(a.status=o.EntryStatus.Pending,T((0,o.fetchRouteOnCacheMiss)(a,t,l)));case o.EntryStatus.Pending:case o.EntryStatus.Fulfilled:case o.EntryStatus.Rejected:}}return l}(e,t),r=t.hasBackgroundWork;switch(t.hasBackgroundWork=!1,t.spawnedRuntimePrefetches=null,n){case 0:return;case 1:V(p),t=B(p);continue;case 2:1===t.phase?(t.phase=0,q(p,t)):r?(t.priority=c.PrefetchPriority.Background,q(p,t)):V(p),t=B(p);continue}}}function N(e){return e.priority===c.PrefetchPriority.Background||(e.hasBackgroundWork=!0,!1)}function M(e,t,n,r,l){L(e,t,n,n.metadata,!1,r,l===c.FetchStrategy.LoadingBoundary?c.FetchStrategy.Full:l)}function L(e,t,n,r,l,a,u){let i=(0,o.readOrCreateSegmentCacheEntry)(e,u,n,r),s=null;switch(i.status){case o.EntryStatus.Empty:s=(0,o.upgradeToPendingSegment)(i,u);break;case o.EntryStatus.Fulfilled:i.isPartial&&(0,o.canNewFetchStrategyProvideMoreContent)(i.fetchStrategy,u)&&(s=F(e,n,r,u));break;case o.EntryStatus.Pending:case o.EntryStatus.Rejected:(0,o.canNewFetchStrategyProvideMoreContent)(i.fetchStrategy,u)&&(s=F(e,n,r,u))}let c={};if(null!==r.slots)for(let o in r.slots){let i=r.slots[o];c[o]=L(e,t,n,i,l||null!==s,a,u)}null!==s&&a.set(r.requestKey,s);let f=l||null===s?null:"refetch";return[r.segment,c,null,f,r.isRootLayout]}function z(e,t,n,r,l,a){switch(r.status){case o.EntryStatus.Empty:T((0,o.fetchSegmentOnCacheMiss)(n,(0,o.upgradeToPendingSegment)(r,c.FetchStrategy.PPR),l,a));break;case o.EntryStatus.Pending:switch(r.fetchStrategy){case c.FetchStrategy.PPR:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.Full:break;case c.FetchStrategy.LoadingBoundary:N(t)&&j(e,n,l,a);break;default:r.fetchStrategy}break;case o.EntryStatus.Rejected:switch(r.fetchStrategy){case c.FetchStrategy.PPR:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.Full:break;case c.FetchStrategy.LoadingBoundary:j(e,n,l,a);break;default:r.fetchStrategy}case o.EntryStatus.Fulfilled:}}function j(e,t,n,r){let l=(0,o.readOrCreateRevalidatingSegmentEntry)(e,c.FetchStrategy.PPR,t,r);switch(l.status){case o.EntryStatus.Empty:I(T((0,o.fetchSegmentOnCacheMiss)(t,(0,o.upgradeToPendingSegment)(l,c.FetchStrategy.PPR),n,r)),(0,i.getSegmentVaryPathForRequest)(c.FetchStrategy.PPR,r));case o.EntryStatus.Pending:case o.EntryStatus.Fulfilled:case o.EntryStatus.Rejected:}}function F(e,t,n,r){let l=(0,o.readOrCreateRevalidatingSegmentEntry)(e,r,t,n);if(l.status===o.EntryStatus.Empty){let e=(0,o.upgradeToPendingSegment)(l,r);return I((0,o.waitForSegmentCacheEntry)(e),(0,i.getSegmentVaryPathForRequest)(r,n)),e}if((0,o.canNewFetchStrategyProvideMoreContent)(l.fetchStrategy,r)){let e=(0,o.overwriteRevalidatingSegmentCacheEntry)(r,t,n),l=(0,o.upgradeToPendingSegment)(e,r);return I((0,o.waitForSegmentCacheEntry)(l),(0,i.getSegmentVaryPathForRequest)(r,n)),l}switch(l.status){case o.EntryStatus.Pending:case o.EntryStatus.Fulfilled:case o.EntryStatus.Rejected:default:return null}}let A=()=>{};function I(e,t){e.then(e=>{null!==e&&(0,o.upsertSegmentEntry)(Date.now(),t,e)},A)}function D(e,t,n){return n===f.PAGE_SEGMENT_KEY?t===(0,f.addSearchParamsIfPageSegment)(f.PAGE_SEGMENT_KEY,Object.fromEntries(new URLSearchParams(e.renderedSearch))):(0,u.matchSegment)(n,t)}function U(e,t){let n=t.priority-e.priority;if(0!==n)return n;let r=t.phase-e.phase;return 0!==r?r:t.sortId-e.sortId}function H(e,t){let n=e.length;e.push(t),t._heapIndex=n,$(e,t,n)}function B(e){return 0===e.length?null:e[0]}function V(e){if(0===e.length)return null;let t=e[0];t._heapIndex=-1;let n=e.pop();return n!==t&&(e[0]=n,n._heapIndex=0,W(e,n,0)),t}function q(e,t){let n=t._heapIndex;-1!==n&&(0===n?W(e,t,0):U(e[n-1>>>1],t)>0?$(e,t,n):W(e,t,n))}function $(e,t,n){let r=n;for(;r>0;){let n=r-1>>>1,l=e[n];if(!(U(l,t)>0))return;e[n]=t,t._heapIndex=n,e[r]=l,l._heapIndex=r,r=n}}function W(e,t,n){let r=n,l=e.length,a=l>>>1;for(;rU(a,t))uU(o,a)?(e[r]=o,o._heapIndex=r,e[u]=t,t._heapIndex=u,r=u):(e[r]=a,a._heapIndex=r,e[n]=t,t._heapIndex=n,r=n);else{if(!(uU(o,t)))return;e[r]=o,o._heapIndex=r,e[u]=t,t._heapIndex=u,r=u}}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},72463,(e,t,n)=>{"use strict";function r(e){let t=e.indexOf("#"),n=e.indexOf("?"),r=n>-1&&(t<0||n-1?{pathname:e.substring(0,r?n:t),query:r?e.substring(n,t>-1?t:void 0):"",hash:t>-1?e.slice(t):""}:{pathname:e,query:"",hash:""}}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"parsePath",{enumerable:!0,get:function(){return r}})},41858,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"addPathPrefix",{enumerable:!0,get:function(){return l}});let r=e.r(72463);function l(e,t){if(!e.startsWith("/")||!t)return e;let{pathname:n,query:l,hash:a}=(0,r.parsePath)(e);return`${t}${n}${l}${a}`}},38281,(e,t,n)=>{"use strict";function r(e){return e.replace(/\/$/,"")||"/"}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"removeTrailingSlash",{enumerable:!0,get:function(){return r}})},82823,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"normalizePathTrailingSlash",{enumerable:!0,get:function(){return a}});let r=e.r(38281),l=e.r(72463),a=e=>{if(!e.startsWith("/"))return e;let{pathname:t,query:n,hash:a}=(0,l.parsePath)(e);return/\.[^/]+\/?$/.test(t)?`${(0,r.removeTrailingSlash)(t)}${n}${a}`:t.endsWith("/")?`${t}${n}${a}`:`${t}/${n}${a}`};("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},5550,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"addBasePath",{enumerable:!0,get:function(){return a}});let r=e.r(41858),l=e.r(82823);function a(e,t){return(0,l.normalizePathTrailingSlash)((0,r.addPathPrefix)(e,""))}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},57630,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={createPrefetchURL:function(){return i},isExternalURL:function(){return o}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(82604),u=e.r(5550);function o(e){return e.origin!==window.location.origin}function i(e){let t;if((0,a.isBot)(window.navigator.userAgent))return null;try{t=new URL((0,u.addBasePath)(e),window.location.href)}catch(t){throw Object.defineProperty(Error(`Cannot prefetch '${e}' because it cannot be converted to a URL.`),"__NEXT_ERROR_CODE",{value:"E234",enumerable:!1,configurable:!0})}return o(t)?null:t}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},91949,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={IDLE_LINK_STATUS:function(){return f},PENDING_LINK_STATUS:function(){return c},mountFormInstance:function(){return S},mountLinkInstance:function(){return b},onLinkVisibilityChanged:function(){return E},onNavigationIntent:function(){return _},pingVisibleLinks:function(){return k},setLinkForCurrentNavigation:function(){return d},unmountLinkForCurrentNavigation:function(){return p},unmountPrefetchableInstance:function(){return w}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(9396),u=e.r(77048),o=e.r(77709),i=e.r(71645),s=null,c={pending:!0},f={pending:!1};function d(e){(0,i.startTransition)(()=>{s?.setOptimisticLinkStatus(f),e?.setOptimisticLinkStatus(c),s=e})}function p(e){s===e&&(s=null)}let h="function"==typeof WeakMap?new WeakMap:new Map,m=new Set,g="function"==typeof IntersectionObserver?new IntersectionObserver(function(e){for(let t of e){let e=t.intersectionRatio>0;E(t.target,e)}},{rootMargin:"200px"}):null;function y(e,t){void 0!==h.get(e)&&w(e),h.set(e,t),null!==g&&g.observe(e)}function v(t){if("undefined"==typeof window)return null;{let{createPrefetchURL:n}=e.r(57630);try{return n(t)}catch{return("function"==typeof reportError?reportError:console.error)(`Cannot prefetch '${t}' because it cannot be converted to a URL.`),null}}}function b(e,t,n,r,l,a){if(l){let l=v(t);if(null!==l){let t={router:n,fetchStrategy:r,isVisible:!1,prefetchTask:null,prefetchHref:l.href,setOptimisticLinkStatus:a};return y(e,t),t}}return{router:n,fetchStrategy:r,isVisible:!1,prefetchTask:null,prefetchHref:null,setOptimisticLinkStatus:a}}function S(e,t,n,r){let l=v(t);null===l||y(e,{router:n,fetchStrategy:r,isVisible:!1,prefetchTask:null,prefetchHref:l.href,setOptimisticLinkStatus:null})}function w(e){let t=h.get(e);if(void 0!==t){h.delete(e),m.delete(t);let n=t.prefetchTask;null!==n&&(0,o.cancelPrefetchTask)(n)}null!==g&&g.unobserve(e)}function E(e,t){let n=h.get(e);void 0!==n&&(n.isVisible=t,t?m.add(n):m.delete(n),P(n,a.PrefetchPriority.Default))}function _(e,t){let n=h.get(e);void 0!==n&&void 0!==n&&P(n,a.PrefetchPriority.Intent)}function P(t,n){if("undefined"!=typeof window){let r=t.prefetchTask;if(!t.isVisible){null!==r&&(0,o.cancelPrefetchTask)(r);return}let{getCurrentAppRouterState:l}=e.r(99781),a=l();if(null!==a){let e=a.tree;if(null===r){let r=a.nextUrl,l=(0,u.createCacheKey)(t.prefetchHref,r);t.prefetchTask=(0,o.schedulePrefetchTask)(l,e,t.fetchStrategy,n,null)}else(0,o.reschedulePrefetchTask)(r,e,t.fetchStrategy,n)}}}function k(e,t){for(let n of m){let r=n.prefetchTask;if(null!==r&&!(0,o.isPrefetchTaskDirty)(r,e,t))continue;null!==r&&(0,o.cancelPrefetchTask)(r);let l=(0,u.createCacheKey)(n.prefetchHref,e);n.prefetchTask=(0,o.schedulePrefetchTask)(l,t,n.fetchStrategy,a.PrefetchPriority.Default,null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},95282,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={DOC_PREFETCH_RANGE_HEADER_VALUE:function(){return u},doesExportedHtmlMatchBuildId:function(){return s},insertBuildIdComment:function(){return i}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a="",u="bytes=0-63";function o(e){return e.slice(0,24).replace(/-/g,"_")}function i(e,t){return t.includes("-->")||!e.startsWith(a)?e:e.replace(a,a+"")}function s(e,t){return e.startsWith(a+"")}},20896,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r,l={EntryStatus:function(){return k},canNewFetchStrategyProvideMoreContent:function(){return el},convertRouteTreeToFlightRouterState:function(){return function e(t){let n={};if(null!==t.slots)for(let r in t.slots)n[r]=e(t.slots[r]);return[t.segment,n,null,null,t.isRootLayout]}},createDetachedSegmentCacheEntry:function(){return q},fetchRouteOnCacheMiss:function(){return X},fetchSegmentOnCacheMiss:function(){return Y},fetchSegmentPrefetchesUsingDynamicRequest:function(){return J},getCurrentCacheVersion:function(){return N},getStaleTimeMs:function(){return P},overwriteRevalidatingSegmentCacheEntry:function(){return B},pingInvalidationListeners:function(){return L},readOrCreateRevalidatingSegmentEntry:function(){return H},readOrCreateRouteCacheEntry:function(){return A},readOrCreateSegmentCacheEntry:function(){return U},readRouteCacheEntry:function(){return z},readSegmentCacheEntry:function(){return j},requestOptimisticRouteCacheEntry:function(){return I},revalidateEntireCache:function(){return M},upgradeToPendingSegment:function(){return $},upsertSegmentEntry:function(){return V},waitForSegmentCacheEntry:function(){return F}};for(var a in l)Object.defineProperty(n,a,{enumerable:!0,get:l[a]});let u=e.r(22744),o=e.r(21768),i=e.r(87288),s=e.r(77709),c=e.r(56655),f=e.r(14297),d=e.r(51191),p=e.r(77048),h=e.r(33906),m=e.r(511),g=e.r(67764),y=e.r(50590),v=e.r(54069),b=e.r(91949),S=e.r(13258),w=e.r(95282),E=e.r(9396),_=e.r(39470);function P(e){return 1e3*Math.max(e,30)}var k=((r={})[r.Empty=0]="Empty",r[r.Pending=1]="Pending",r[r.Fulfilled=2]="Fulfilled",r[r.Rejected=3]="Rejected",r);let R=["",{},null,"metadata-only"],T=(0,m.createCacheMap)(),x=(0,m.createCacheMap)(),O=null,C=0;function N(){return C}function M(e,t){C++,(0,s.startRevalidationCooldown)(),(0,b.pingVisibleLinks)(e,t),L(e,t)}function L(e,t){if(null!==O){let n=O;for(let r of(O=null,n))(0,s.isPrefetchTaskDirty)(r,e,t)&&function(e){let t=e.onInvalidate;if(null!==t){e.onInvalidate=null;try{t()}catch(e){"function"==typeof reportError?reportError(e):console.error(e)}}}(r)}}function z(e,t){let n=(0,c.getRouteVaryPath)(t.pathname,t.search,t.nextUrl);return(0,m.getFromCacheMap)(e,C,T,n,!1)}function j(e,t){return(0,m.getFromCacheMap)(e,C,x,t,!1)}function F(e){let t=e.promise;return null===t&&(t=e.promise=(0,_.createPromiseWithResolvers)()),t.promise}function A(e,t,n){null!==t.onInvalidate&&(null===O?O=new Set([t]):O.add(t));let r=z(e,n);if(null!==r)return r;let l={canonicalUrl:null,status:0,blockedTasks:null,tree:null,metadata:null,couldBeIntercepted:!0,isPPREnabled:!1,renderedSearch:null,ref:null,size:0,staleAt:1/0,version:C},a=(0,c.getRouteVaryPath)(n.pathname,n.search,n.nextUrl);return(0,m.setInCacheMap)(T,a,l,!1),l}function I(e,t,n){let r=t.search;if(""===r)return null;let l=new URL(t);l.search="";let a=z(e,(0,p.createCacheKey)(l.href,n));if(null===a||2!==a.status)return null;let u=new URL(a.canonicalUrl,t.origin),o=""!==u.search?u.search:r,i=""!==a.renderedSearch?a.renderedSearch:r,s=new URL(a.canonicalUrl,location.origin);return s.search=o,{canonicalUrl:(0,d.createHrefFromUrl)(s),status:2,blockedTasks:null,tree:D(a.tree,i),metadata:D(a.metadata,i),couldBeIntercepted:a.couldBeIntercepted,isPPREnabled:a.isPPREnabled,renderedSearch:i,ref:null,size:0,staleAt:a.staleAt,version:a.version}}function D(e,t){let n=null,r=e.slots;if(null!==r)for(let e in n={},r){let l=r[e];n[e]=D(l,t)}return e.isPage?{requestKey:e.requestKey,segment:e.segment,varyPath:(0,c.clonePageVaryPathWithNewSearchParams)(e.varyPath,t),isPage:!0,slots:n,isRootLayout:e.isRootLayout,hasLoadingBoundary:e.hasLoadingBoundary,hasRuntimePrefetch:e.hasRuntimePrefetch}:{requestKey:e.requestKey,segment:e.segment,varyPath:e.varyPath,isPage:!1,slots:n,isRootLayout:e.isRootLayout,hasLoadingBoundary:e.hasLoadingBoundary,hasRuntimePrefetch:e.hasRuntimePrefetch}}function U(e,t,n,r){let l=j(e,r.varyPath);if(null!==l)return l;let a=(0,c.getSegmentVaryPathForRequest)(t,r),u=q(n.staleAt);return(0,m.setInCacheMap)(x,a,u,!1),u}function H(e,t,n,r){var l;let a=(l=r.varyPath,(0,m.getFromCacheMap)(e,C,x,l,!0));if(null!==a)return a;let u=(0,c.getSegmentVaryPathForRequest)(t,r),o=q(n.staleAt);return(0,m.setInCacheMap)(x,u,o,!0),o}function B(e,t,n){let r=(0,c.getSegmentVaryPathForRequest)(e,n),l=q(t.staleAt);return(0,m.setInCacheMap)(x,r,l,!0),l}function V(e,t,n){if((0,m.isValueExpired)(e,C,n))return null;let r=j(e,t);if(null!==r){var l;if(n.fetchStrategy!==r.fetchStrategy&&(l=r.fetchStrategy,!(l""!==e),r=g.ROOT_SEGMENT_REQUEST_KEY,function e(t,n,r,l,a,o,i,s){let f,d,p=null,m=t.slots;if(null!==m)for(let t in f=!1,d=(0,c.finalizeLayoutVaryPath)(l,r),p={},m){let n,u,f,d=m[t],y=d.name,v=d.paramType,b=d.paramKey;if(null!==v){let e=(0,h.parseDynamicParamFromURLPart)(v,a,o),t=null!==b?b:(0,h.getCacheKeyForDynamicParam)(e,"");f=(0,c.appendLayoutVaryPath)(r,t),u=[y,t,v],n=!0}else f=r,u=y,n=(0,h.doesStaticSegmentAppearInURL)(y);let S=n?o+1:o,w=(0,g.createSegmentRequestKeyPart)(u),E=(0,g.appendSegmentRequestKeyPart)(l,t,w);p[t]=e(d,u,f,E,a,S,i,s)}else l.endsWith(S.PAGE_SEGMENT_KEY)?(f=!0,d=(0,c.finalizePageVaryPath)(l,i,r),null===s.metadataVaryPath&&(s.metadataVaryPath=(0,c.finalizeMetadataVaryPath)(l,i,r))):(f=!1,d=(0,c.finalizeLayoutVaryPath)(l,r));return{requestKey:l,segment:n,varyPath:d,isPage:f,slots:p,isRootLayout:t.isRootLayout,hasLoadingBoundary:u.HasLoadingBoundary.SegmentHasLoadingBoundary,hasRuntimePrefetch:t.hasRuntimePrefetch}}(o.tree,r,null,g.ROOT_SEGMENT_REQUEST_KEY,n,0,d,v)),E=v.metadataVaryPath;if(null===E)return Q(e,Date.now()+1e4),null;let _=P(o.staleTime);y=Date.now()+_,l={requestKey:g.HEAD_REQUEST_KEY,segment:g.HEAD_REQUEST_KEY,varyPath:E,isPage:!0,slots:null,isRootLayout:!1,hasLoadingBoundary:u.HasLoadingBoundary.SubtreeHasNoLoadingBoundary,hasRuntimePrefetch:!1},e.status=2,e.tree=w,e.metadata=l,e.staleAt=y,e.couldBeIntercepted=k,e.canonicalUrl=b,e.renderedSearch=d,e.isPPREnabled=x,W(e)}if(!k){let t=(0,c.getFulfilledRouteVaryPath)(r,l,a,k);(0,m.setInCacheMap)(T,t,e,!1)}return{value:null,closed:R.promise}}catch(t){return Q(e,Date.now()+1e4),null}}async function Y(e,t,n,r){let l=new URL(e.canonicalUrl,location.origin),a=n.nextUrl,u=r.requestKey,s=u===g.ROOT_SEGMENT_REQUEST_KEY?"/_index":u,c={[o.RSC_HEADER]:"1",[o.NEXT_ROUTER_PREFETCH_HEADER]:"1",[o.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]:s};null!==a&&(c[o.NEXT_URL]=a);let d=er(l,s);try{let n=await et(d,c);if(!n||!n.ok||204===n.status||"2"!==n.headers.get(o.NEXT_DID_POSTPONE_HEADER)&&0||!n.body)return G(t,Date.now()+1e4),null;let r=(0,_.createPromiseWithResolvers)(),l=en(n.body,r.resolve,function(e){(0,m.setSizeInCacheMap)(t,e)}),a=await (0,i.createFromNextReadableStream)(l,c);if(a.buildId!==(0,f.getAppBuildId)())return G(t,Date.now()+1e4),null;return{value:K(t,a.rsc,a.loading,e.staleAt,a.isPartial),closed:r.promise}}catch(e){return G(t,Date.now()+1e4),null}}async function J(e,t,n,r,l){let a=e.key,u=new URL(t.canonicalUrl,location.origin),s=a.nextUrl;1===l.size&&l.has(t.metadata.requestKey)&&(r=R);let c={[o.RSC_HEADER]:"1",[o.NEXT_ROUTER_STATE_TREE_HEADER]:(0,y.prepareFlightRouterStateForRequest)(r)};switch(null!==s&&(c[o.NEXT_URL]=s),n){case E.FetchStrategy.Full:break;case E.FetchStrategy.PPRRuntime:c[o.NEXT_ROUTER_PREFETCH_HEADER]="2";break;case E.FetchStrategy.LoadingBoundary:c[o.NEXT_ROUTER_PREFETCH_HEADER]="1"}try{let r=await et(u,c);if(!r||!r.ok||!r.body||(0,h.getRenderedSearch)(r)!==t.renderedSearch)return Z(l,Date.now()+1e4),null;let a=(0,_.createPromiseWithResolvers)(),s=null,d=en(r.body,a.resolve,function(e){if(null===s)return;let t=e/s.length;for(let e of s)(0,m.setSizeInCacheMap)(e,t)}),p=await (0,i.createFromNextReadableStream)(d,c),g=n===E.FetchStrategy.PPRRuntime&&p.rp?.[0]===!0;return s=function(e,t,n,r,l,a,u,i){if(l.b!==(0,f.getAppBuildId)())return null!==i&&Z(i,e+1e4),null;let s=(0,y.normalizeFlightData)(l.f);if("string"==typeof s)return null;let c="number"==typeof l.rp?.[1]?l.rp[1]:parseInt(r.headers.get(o.NEXT_ROUTER_STALE_TIME_HEADER)??"",10),d=e+(isNaN(c)?v.STATIC_STALETIME_MS:P(c));for(let r of s){let l=r.seedData;if(null!==l){let o=r.segmentPath,s=u.tree;for(let t=0;t{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"navigate",{enumerable:!0,get:function(){return c}});let r=e.r(87288),l=e.r(95871),a=e.r(51191),u=e.r(20896),o=e.r(77048),i=e.r(13258),s=e.r(9396);function c(e,t,n,r,l,a,i){let c=Date.now(),d=e.href,g=d===window.location.href,y=(0,o.createCacheKey)(d,l),v=(0,u.readRouteCacheEntry)(c,y);if(null!==v&&v.status===u.EntryStatus.Fulfilled){let u=p(c,v,v.tree),o=u.flightRouterState,i=u.seedData,s=h(c,v),d=s.rsc,m=s.isPartial,y=v.canonicalUrl+e.hash;return f(c,e,t,l,g,n,r,o,i,d,m,y,v.renderedSearch,a,e.hash)}if(null===v||v.status!==u.EntryStatus.Rejected){let o=(0,u.requestOptimisticRouteCacheEntry)(c,e,l);if(null!==o){let u=p(c,o,o.tree),i=u.flightRouterState,s=u.seedData,d=h(c,o),m=d.rsc,y=d.isPartial,v=o.canonicalUrl+e.hash;return f(c,e,t,l,g,n,r,i,s,m,y,v,o.renderedSearch,a,e.hash)}}let b=i.collectedDebugInfo??[];return void 0===i.collectedDebugInfo&&(b=i.collectedDebugInfo=[]),{tag:s.NavigationResultTag.Async,data:m(c,e,t,l,g,n,r,a,e.hash,b)}}function f(e,t,n,a,u,o,i,c,f,p,h,m,g,y,v){let b=[],S=(0,l.startPPRNavigation)(e,n,o,i,c,f,p,h,u,b);if(null!==S){let e=S.dynamicRequestTree;if(null!==e){let n=(0,r.fetchServerResponse)(new URL(m,t.origin),{flightRouterState:e,nextUrl:a});(0,l.listenForDynamicRequest)(S,n)}return d(S,o,m,g,b,y,v)}return{tag:s.NavigationResultTag.NoOp,data:{canonicalUrl:m,shouldScroll:y}}}function d(e,t,n,r,l,a,u){let o=e.route;if(null===o)return{tag:s.NavigationResultTag.MPA,data:n};let i=e.node;return{tag:s.NavigationResultTag.Success,data:{flightRouterState:o,cacheNode:null!==i?i:t,canonicalUrl:n,renderedSearch:r,scrollableSegments:l,shouldScroll:a,hash:u}}}function p(e,t,n){let r={},l={},a=n.slots;if(null!==a)for(let n in a){let u=p(e,t,a[n]);r[n]=u.flightRouterState,l[n]=u.seedData}let o=null,s=null,c=!0,f=(0,u.readSegmentCacheEntry)(e,n.varyPath);if(null!==f)switch(f.status){case u.EntryStatus.Fulfilled:o=f.rsc,s=f.loading,c=f.isPartial;break;case u.EntryStatus.Pending:{let e=(0,u.waitForSegmentCacheEntry)(f);o=e.then(e=>null!==e?e.rsc:null),s=e.then(e=>null!==e?e.loading:null),c=!0}case u.EntryStatus.Empty:case u.EntryStatus.Rejected:}return{flightRouterState:[(0,i.addSearchParamsIfPageSegment)(n.segment,Object.fromEntries(new URLSearchParams(t.renderedSearch))),r,null,null,n.isRootLayout],seedData:[o,l,s,c,!1]}}function h(e,t){let n=null,r=!0,l=(0,u.readSegmentCacheEntry)(e,t.metadata.varyPath);if(null!==l)switch(l.status){case u.EntryStatus.Fulfilled:n=l.rsc,r=l.isPartial;break;case u.EntryStatus.Pending:n=(0,u.waitForSegmentCacheEntry)(l).then(e=>null!==e?e.rsc:null),r=!0;case u.EntryStatus.Empty:case u.EntryStatus.Rejected:}return{rsc:n,isPartial:r}}async function m(e,t,n,u,o,i,c,f,p,h){let m=(0,r.fetchServerResponse)(t,{flightRouterState:c,nextUrl:u}),g=await m;if("string"==typeof g)return{tag:s.NavigationResultTag.MPA,data:g};let{flightData:y,canonicalUrl:v,renderedSearch:b,debugInfo:S}=g;null!==S&&h.push(...S);let w=function(e,t){let n=e;for(let{segmentPath:r,tree:l}of t){let t=n!==e;n=function e(t,n,r,l,a){if(a===r.length)return n;let u=r[a],o=t[1],i={};for(let t in o)if(t===u){let u=o[t];i[t]=e(u,n,r,l,a+2)}else i[t]=o[t];if(l)return t[1]=i,t;let s=[t[0],i];return 2 in t&&(s[2]=t[2]),3 in t&&(s[3]=t[3]),4 in t&&(s[4]=t[4]),s}(n,l,r,t,0)}return n}(c,y),E=[],_=(0,l.startPPRNavigation)(e,n,i,c,w,null,null,!0,o,E);return null!==_?(null!==_.dynamicRequestTree&&(0,l.listenForDynamicRequest)(_,m),d(_,i,(0,a.createHrefFromUrl)(v),b,E,f,p)):{tag:s.NavigationResultTag.NoOp,data:{canonicalUrl:(0,a.createHrefFromUrl)(v),shouldScroll:f}}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},54069,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={DYNAMIC_STALETIME_MS:function(){return c},STATIC_STALETIME_MS:function(){return f},generateSegmentsFromPatch:function(){return function e(t){let n=[],[r,l]=t;if(0===Object.keys(l).length)return[[r]];for(let[t,a]of Object.entries(l))for(let l of e(a))""===r?n.push([t,...l]):n.push([r,t,...l]);return n}},handleExternalUrl:function(){return d},navigateReducer:function(){return p}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(51191),u=e.r(47442),o=e.r(60355),i=e.r(9396),s=e.r(20896),c=1e3*Number("0"),f=(0,s.getStaleTimeMs)(Number("300"));function d(e,t,n,r){return t.mpaNavigation=!0,t.canonicalUrl=n,t.pendingPush=r,t.scrollableSegments=void 0,(0,u.handleMutable)(e,t)}function p(e,t){let{url:n,isExternalUrl:r,navigateType:l,shouldScroll:s}=t,c={},f=(0,a.createHrefFromUrl)(n),p="push"===l;if(c.preserveCustomHistoryState=!1,c.pendingPush=p,r)return d(e,c,n.toString(),p);if(document.getElementById("__next-page-redirect"))return d(e,c,f,p);let h=new URL(e.canonicalUrl,location.origin),m=(0,o.navigate)(n,h,e.cache,e.tree,e.nextUrl,s,c);return function e(t,n,r,l,a){switch(a.tag){case i.NavigationResultTag.MPA:return d(n,r,a.data,l);case i.NavigationResultTag.NoOp:{r.canonicalUrl=a.data.canonicalUrl;let e=new URL(n.canonicalUrl,t);return t.pathname===e.pathname&&t.search===e.search&&t.hash!==e.hash&&(r.onlyHashChange=!0,r.shouldScroll=a.data.shouldScroll,r.hashFragment=t.hash,r.scrollableSegments=[]),(0,u.handleMutable)(n,r)}case i.NavigationResultTag.Success:return r.cache=a.data.cacheNode,r.patchedTree=a.data.flightRouterState,r.renderedSearch=a.data.renderedSearch,r.canonicalUrl=a.data.canonicalUrl,r.scrollableSegments=a.data.scrollableSegments,r.shouldScroll=a.data.shouldScroll,r.hashFragment=a.data.hash,(0,u.handleMutable)(n,r);case i.NavigationResultTag.Async:return a.data.then(a=>e(t,n,r,l,a),()=>n);default:return n}}(n,e,c,p,m)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},1764,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"fillLazyItemsTillLeafWithHead",{enumerable:!0,get:function(){return function e(t,n,l,a,u,o){if(0===Object.keys(a[1]).length){n.head=o;return}for(let i in a[1]){let s,c=a[1][i],f=c[0],d=(0,r.createRouterCacheKey)(f),p=null!==u&&void 0!==u[1][i]?u[1][i]:null;if(l){let r=l.parallelRoutes.get(i);if(r){let l,a=new Map(r),u=a.get(d);l=null!==p?{lazyData:null,rsc:p[0],prefetchRsc:null,head:null,prefetchHead:null,loading:p[2],parallelRoutes:new Map(u?.parallelRoutes),navigatedAt:t}:{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map(u?.parallelRoutes),loading:null,navigatedAt:t},a.set(d,l),e(t,l,u,c,p||null,o),n.parallelRoutes.set(i,a);continue}}if(null!==p){let e=p[0],n=p[2];s={lazyData:null,rsc:e,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,loading:n,navigatedAt:t}}else s={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,loading:null,navigatedAt:t};let h=n.parallelRoutes.get(i);h?h.set(d,s):n.parallelRoutes.set(i,new Map([[d,s]])),e(t,s,void 0,c,p,o)}}}});let r=e.r(70725);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},51565,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"invalidateCacheByRouterState",{enumerable:!0,get:function(){return l}});let r=e.r(70725);function l(e,t,n){for(let l in n[1]){let a=n[1][l][0],u=(0,r.createRouterCacheKey)(a),o=t.parallelRoutes.get(l);if(o){let t=new Map(o);t.delete(u),e.parallelRoutes.set(l,t)}}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},87752,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={fillCacheWithNewSubTreeData:function(){return c},fillCacheWithNewSubTreeDataButOnlyLoading:function(){return f}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(51565),u=e.r(1764),o=e.r(70725),i=e.r(13258);function s(e,t,n,r,l){let{segmentPath:s,seedData:c,tree:f,head:d}=r,p=t,h=n;for(let t=0;t{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"applyFlightData",{enumerable:!0,get:function(){return a}});let r=e.r(1764),l=e.r(87752);function a(e,t,n,a){let{tree:u,seedData:o,head:i,isRootRender:s}=a;if(null===o)return!1;if(s){let l=o[0];n.loading=o[2],n.rsc=l,n.prefetchRsc=null,(0,r.fillLazyItemsTillLeafWithHead)(e,n,t,u,o,i)}else n.rsc=t.rsc,n.prefetchRsc=t.prefetchRsc,n.parallelRoutes=new Map(t.parallelRoutes),n.loading=t.loading,(0,l.fillCacheWithNewSubTreeData)(e,n,t,a);return!0}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},13576,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={addRefreshMarkerToActiveParallelSegments:function(){return function e(t,n){let[r,l,,a]=t;for(let u in r.includes(o.PAGE_SEGMENT_KEY)&&"refresh"!==a&&(t[2]=n,t[3]="refresh"),l)e(l[u],n)}},refreshInactiveParallelSegments:function(){return i}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(10827),u=e.r(87288),o=e.r(13258);async function i(e){let t=new Set;await s({...e,rootTree:e.updatedTree,fetchedSegments:t})}async function s({navigatedAt:e,state:t,updatedTree:n,updatedCache:r,includeNextUrl:l,fetchedSegments:o,rootTree:i=n,canonicalUrl:c}){let[,f,d,p]=n,h=[];if(d&&d!==c&&"refresh"===p&&!o.has(d)){o.add(d);let n=(0,u.fetchServerResponse)(new URL(d,location.origin),{flightRouterState:[i[0],i[1],i[2],"refetch"],nextUrl:l?t.nextUrl:null}).then(t=>{if("string"!=typeof t){let{flightData:n}=t;for(let t of n)(0,a.applyFlightData)(e,r,r,t)}});h.push(n)}for(let n in f){let a=s({navigatedAt:e,state:t,updatedTree:f[n],updatedCache:r,includeNextUrl:l,fetchedSegments:o,rootTree:i,canonicalUrl:c});h.push(a)}await Promise.all(h)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},22719,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"applyRouterStatePatchToTree",{enumerable:!0,get:function(){return function e(t,n,r,i){let s,[c,f,d,p,h]=n;if(1===t.length){let e=o(n,r);return(0,u.addRefreshMarkerToActiveParallelSegments)(e,i),e}let[m,g]=t;if(!(0,a.matchSegment)(m,c))return null;if(2===t.length)s=o(f[g],r);else if(null===(s=e((0,l.getNextFlightSegmentPath)(t),f[g],r,i)))return null;let y=[t[0],{...f,[g]:s},d,p];return h&&(y[4]=!0),(0,u.addRefreshMarkerToActiveParallelSegments)(y,i),y}}});let r=e.r(13258),l=e.r(50590),a=e.r(56019),u=e.r(13576);function o(e,t){let[n,l]=e,[u,i]=t;if(u===r.DEFAULT_SEGMENT_KEY&&n!==r.DEFAULT_SEGMENT_KEY)return e;if((0,a.matchSegment)(n,u)){let t={};for(let e in l)void 0!==i[e]?t[e]=o(l[e],i[e]):t[e]=l[e];for(let e in i)t[e]||(t[e]=i[e]);let r=[n,t];return e[2]&&(r[2]=e[2]),e[3]&&(r[3]=e[3]),e[4]&&(r[4]=e[4]),r}return t}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},62634,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"AppRouterAnnouncer",{enumerable:!0,get:function(){return u}});let r=e.r(71645),l=e.r(74080),a="next-route-announcer";function u({tree:e}){let[t,n]=(0,r.useState)(null);(0,r.useEffect)(()=>(n(function(){let e=document.getElementsByName(a)[0];if(e?.shadowRoot?.childNodes[0])return e.shadowRoot.childNodes[0];{let e=document.createElement(a);e.style.cssText="position:absolute";let t=document.createElement("div");return t.ariaLive="assertive",t.id="__next-route-announcer__",t.role="alert",t.style.cssText="position:absolute;border:0;height:1px;margin:-1px;padding:0;width:1px;clip:rect(0 0 0 0);overflow:hidden;white-space:nowrap;word-wrap:normal",e.attachShadow({mode:"open"}).appendChild(t),document.body.appendChild(e),t}}()),()=>{let e=document.getElementsByTagName(a)[0];e?.isConnected&&document.body.removeChild(e)}),[]);let[u,o]=(0,r.useState)(""),i=(0,r.useRef)(void 0);return(0,r.useEffect)(()=>{let e="";if(document.title)e=document.title;else{let t=document.querySelector("h1");t&&(e=t.innerText||t.textContent||"")}void 0!==i.current&&i.current!==e&&o(e),i.current=e},[e]),t?(0,l.createPortal)(u,t):null}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},25018,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"findHeadInCache",{enumerable:!0,get:function(){return a}});let r=e.r(13258),l=e.r(70725);function a(e,t){return function e(t,n,a,u){if(0===Object.keys(n).length)return[t,a,u];let o=Object.keys(n).filter(e=>"children"!==e);for(let u of("children"in n&&o.unshift("children"),o)){let[o,i]=n[u];if(o===r.DEFAULT_SEGMENT_KEY)continue;let s=t.parallelRoutes.get(u);if(!s)continue;let c=(0,l.createRouterCacheKey)(o),f=(0,l.createRouterCacheKey)(o,!0),d=s.get(c);if(!d)continue;let p=e(d,i,a+"/"+c,a+"/"+f);if(p)return p}return null}(e,t,"","")}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},39584,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"pathHasPrefix",{enumerable:!0,get:function(){return l}});let r=e.r(72463);function l(e,t){if("string"!=typeof e)return!1;let{pathname:n}=(0,r.parsePath)(e);return n===t||n.startsWith(t+"/")}},52817,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"hasBasePath",{enumerable:!0,get:function(){return l}});let r=e.r(39584);function l(e){return(0,r.pathHasPrefix)(e,"")}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},87250,(e,t,n)=>{"use strict";function r(e){return e}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"removeBasePath",{enumerable:!0,get:function(){return r}}),e.r(52817),("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},41624,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={GracefulDegradeBoundary:function(){return o},default:function(){return i}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(43476),u=e.r(71645);class o extends u.Component{constructor(e){super(e),this.state={hasError:!1},this.rootHtml="",this.htmlAttributes={},this.htmlRef=(0,u.createRef)()}static getDerivedStateFromError(e){return{hasError:!0}}componentDidMount(){let e=this.htmlRef.current;this.state.hasError&&e&&Object.entries(this.htmlAttributes).forEach(([t,n])=>{e.setAttribute(t,n)})}render(){let{hasError:e}=this.state;return("undefined"==typeof window||this.rootHtml||(this.rootHtml=document.documentElement.innerHTML,this.htmlAttributes=function(e){let t={};for(let n=0;n{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return s}});let r=e.r(55682),l=e.r(43476);e.r(71645);let a=r._(e.r(41624)),u=e.r(72383),o=e.r(82604),i="undefined"!=typeof window&&(0,o.isBot)(window.navigator.userAgent);function s({children:e,errorComponent:t,errorStyles:n,errorScripts:r}){return i?(0,l.jsx)(a.default,{children:e}):(0,l.jsx)(u.ErrorBoundary,{errorComponent:t,errorStyles:n,errorScripts:r,children:e})}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},75530,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={createEmptyCacheNode:function(){return N},default:function(){return j}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(55682),u=e.r(90809),o=e.r(43476),i=u._(e.r(71645)),s=e.r(8372),c=e.r(88540),f=e.r(51191),d=e.r(61994),p=e.r(41538),h=e.r(62634),m=e.r(58442),g=e.r(25018),y=e.r(1244),v=e.r(87250),b=e.r(52817),S=e.r(34727),w=e.r(78377),E=e.r(99781),_=e.r(24063),P=e.r(68391),k=e.r(91949),R=a._(e.r(94109)),T=a._(e.r(68027)),x=e.r(97367),O={};function C({appRouterState:e}){return(0,i.useInsertionEffect)(()=>{let{tree:t,pushRef:n,canonicalUrl:r,renderedSearch:l}=e,a={...n.preserveCustomHistoryState?window.history.state:{},__NA:!0,__PRIVATE_NEXTJS_INTERNALS_TREE:{tree:t,renderedSearch:l}};n.pendingPush&&(0,f.createHrefFromUrl)(new URL(window.location.href))!==r?(n.pendingPush=!1,window.history.pushState(a,"",r)):window.history.replaceState(a,"",r)},[e]),(0,i.useEffect)(()=>{(0,k.pingVisibleLinks)(e.nextUrl,e.tree)},[e.nextUrl,e.tree]),null}function N(){return{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,loading:null,navigatedAt:-1}}function M(e){null==e&&(e={});let t=window.history.state,n=t?.__NA;n&&(e.__NA=n);let r=t?.__PRIVATE_NEXTJS_INTERNALS_TREE;return r&&(e.__PRIVATE_NEXTJS_INTERNALS_TREE=r),e}function L({headCacheNode:e}){let t=null!==e?e.head:null,n=null!==e?e.prefetchHead:null,r=null!==n?n:t;return(0,i.useDeferredValue)(t,r)}function z({actionQueue:e,globalError:t,webSocket:n,staticIndicatorState:r}){let l,a=(0,p.useActionQueue)(e),{canonicalUrl:u}=a,{searchParams:f,pathname:w}=(0,i.useMemo)(()=>{let e=new URL(u,"undefined"==typeof window?"http://n":window.location.href);return{searchParams:e.searchParams,pathname:(0,b.hasBasePath)(e.pathname)?(0,v.removeBasePath)(e.pathname):e.pathname}},[u]);(0,i.useEffect)(()=>{function e(e){e.persisted&&window.history.state?.__PRIVATE_NEXTJS_INTERNALS_TREE&&(O.pendingMpaPath=void 0,(0,p.dispatchAppRouterAction)({type:c.ACTION_RESTORE,url:new URL(window.location.href),historyState:window.history.state.__PRIVATE_NEXTJS_INTERNALS_TREE}))}return window.addEventListener("pageshow",e),()=>{window.removeEventListener("pageshow",e)}},[]),(0,i.useEffect)(()=>{function e(e){let t="reason"in e?e.reason:e.error;if((0,P.isRedirectError)(t)){e.preventDefault();let n=(0,_.getURLFromRedirectError)(t);(0,_.getRedirectTypeFromError)(t)===P.RedirectType.push?E.publicAppRouterInstance.push(n,{}):E.publicAppRouterInstance.replace(n,{})}}return window.addEventListener("error",e),window.addEventListener("unhandledrejection",e),()=>{window.removeEventListener("error",e),window.removeEventListener("unhandledrejection",e)}},[]);let{pushRef:k}=a;if(k.mpaNavigation){if(O.pendingMpaPath!==u){let e=window.location;k.pendingPush?e.assign(u):e.replace(u),O.pendingMpaPath=u}throw y.unresolvedThenable}(0,i.useEffect)(()=>{let e=window.history.pushState.bind(window.history),t=window.history.replaceState.bind(window.history),n=e=>{let t=window.location.href,n=window.history.state?.__PRIVATE_NEXTJS_INTERNALS_TREE;(0,i.startTransition)(()=>{(0,p.dispatchAppRouterAction)({type:c.ACTION_RESTORE,url:new URL(e??t,t),historyState:n})})};window.history.pushState=function(t,r,l){return t?.__NA||t?._N||(t=M(t),l&&n(l)),e(t,r,l)},window.history.replaceState=function(e,r,l){return e?.__NA||e?._N||(e=M(e),l&&n(l)),t(e,r,l)};let r=e=>{if(e.state){if(!e.state.__NA)return void window.location.reload();(0,i.startTransition)(()=>{(0,E.dispatchTraverseAction)(window.location.href,e.state.__PRIVATE_NEXTJS_INTERNALS_TREE)})}};return window.addEventListener("popstate",r),()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener("popstate",r)}},[]);let{cache:T,tree:N,nextUrl:z,focusAndScrollRef:j,previousNextUrl:F}=a,A=(0,i.useMemo)(()=>(0,g.findHeadInCache)(T,N[1]),[T,N]),D=(0,i.useMemo)(()=>(0,S.getSelectedParams)(N),[N]),U=(0,i.useMemo)(()=>({parentTree:N,parentCacheNode:T,parentSegmentPath:null,parentParams:{},debugNameContext:"/",url:u,isActive:!0}),[N,T,u]),H=(0,i.useMemo)(()=>({tree:N,focusAndScrollRef:j,nextUrl:z,previousNextUrl:F}),[N,j,z,F]);if(null!==A){let[e,t,n]=A;l=(0,o.jsx)(L,{headCacheNode:e},"undefined"==typeof window?n:t)}else l=null;let B=(0,o.jsxs)(m.RedirectBoundary,{children:[l,(0,o.jsx)(x.RootLayoutBoundary,{children:T.rsc}),(0,o.jsx)(h.AppRouterAnnouncer,{tree:N})]});return B=(0,o.jsx)(R.default,{errorComponent:t[0],errorStyles:t[1],children:B}),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(C,{appRouterState:a}),(0,o.jsx)(I,{}),(0,o.jsx)(d.NavigationPromisesContext.Provider,{value:null,children:(0,o.jsx)(d.PathParamsContext.Provider,{value:D,children:(0,o.jsx)(d.PathnameContext.Provider,{value:w,children:(0,o.jsx)(d.SearchParamsContext.Provider,{value:f,children:(0,o.jsx)(s.GlobalLayoutRouterContext.Provider,{value:H,children:(0,o.jsx)(s.AppRouterContext.Provider,{value:E.publicAppRouterInstance,children:(0,o.jsx)(s.LayoutRouterContext.Provider,{value:U,children:B})})})})})})})]})}function j({actionQueue:e,globalErrorState:t,webSocket:n,staticIndicatorState:r}){(0,w.useNavFailureHandler)();let l=(0,o.jsx)(z,{actionQueue:e,globalError:t,webSocket:n,staticIndicatorState:r});return(0,o.jsx)(R.default,{errorComponent:T.default,children:l})}let F=new Set,A=new Set;function I(){let[,e]=i.default.useState(0),t=F.size;return(0,i.useEffect)(()=>{let n=()=>e(e=>e+1);return A.add(n),t!==F.size&&n(),()=>{A.delete(n)}},[t,e]),[...F].map((e,t)=>(0,o.jsx)("link",{rel:"stylesheet",href:`${e}`,precedence:"next"},t))}globalThis._N_E_STYLE_LOAD=function(e){let t=F.size;return F.add(e),F.size!==t&&A.forEach(e=>e()),Promise.resolve()},("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},91668,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"serverPatchReducer",{enumerable:!0,get:function(){return c}});let r=e.r(51191),l=e.r(22719),a=e.r(48919),u=e.r(54069),o=e.r(10827),i=e.r(47442),s=e.r(75530);function c(e,t){let{serverResponse:n,navigatedAt:c}=t,f={};if(f.preserveCustomHistoryState=!1,"string"==typeof n)return(0,u.handleExternalUrl)(e,f,n,e.pushRef.pendingPush);let{flightData:d,canonicalUrl:p,renderedSearch:h}=n,m=e.tree,g=e.cache;for(let t of d){let{segmentPath:n,tree:i}=t,d=(0,l.applyRouterStatePatchToTree)(["",...n],m,i,e.canonicalUrl);if(null===d)return e;if((0,a.isNavigatingToNewRootLayout)(m,d))return(0,u.handleExternalUrl)(e,f,e.canonicalUrl,e.pushRef.pendingPush);f.canonicalUrl=(0,r.createHrefFromUrl)(p);let y=(0,s.createEmptyCacheNode)();(0,o.applyFlightData)(c,g,y,t),f.patchedTree=d,f.renderedSearch=h,f.cache=y,g=y,m=d}return(0,i.handleMutable)(e,f)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},73790,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"restoreReducer",{enumerable:!0,get:function(){return a}});let r=e.r(51191),l=e.r(34727);function a(e,t){let n,a,{url:u,historyState:o}=t,i=(0,r.createHrefFromUrl)(u);o?(n=o.tree,a=o.renderedSearch):(n=e.tree,a=e.renderedSearch);let s=e.cache;return{canonicalUrl:i,renderedSearch:a,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:e.focusAndScrollRef,cache:s,tree:n,nextUrl:(0,l.extractPathFromFlightRouterState)(n)??u.pathname,previousNextUrl:null,debugInfo:null}}e.r(95871),("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},54003,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"handleSegmentMismatch",{enumerable:!0,get:function(){return l}});let r=e.r(54069);function l(e,t,n){return(0,r.handleExternalUrl)(e,{},e.canonicalUrl,!0)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},69845,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"refreshReducer",{enumerable:!0,get:function(){return m}});let r=e.r(87288),l=e.r(51191),a=e.r(22719),u=e.r(48919),o=e.r(54069),i=e.r(47442),s=e.r(1764),c=e.r(75530),f=e.r(54003),d=e.r(84356),p=e.r(13576),h=e.r(20896);function m(e,t){let{origin:n}=t,m={},g=e.canonicalUrl,y=e.tree;m.preserveCustomHistoryState=!1;let v=(0,c.createEmptyCacheNode)(),b=(0,d.hasInterceptionRouteInCurrentTree)(e.tree);v.lazyData=(0,r.fetchServerResponse)(new URL(g,n),{flightRouterState:[y[0],y[1],y[2],"refetch"],nextUrl:b?e.nextUrl:null});let S=Date.now();return v.lazyData.then(async n=>{if("string"==typeof n)return(0,o.handleExternalUrl)(e,m,n,e.pushRef.pendingPush);let{flightData:r,canonicalUrl:c,renderedSearch:d}=n;for(let n of(v.lazyData=null,r)){let{tree:r,seedData:i,head:w,isRootRender:E}=n;if(!E)return console.log("REFRESH FAILED"),e;let _=(0,a.applyRouterStatePatchToTree)([""],y,r,e.canonicalUrl);if(null===_)return(0,f.handleSegmentMismatch)(e,t,r);if((0,u.isNavigatingToNewRootLayout)(y,_))return(0,o.handleExternalUrl)(e,m,g,e.pushRef.pendingPush);if(m.canonicalUrl=(0,l.createHrefFromUrl)(c),null!==i){let t=i[0],n=i[2];v.rsc=t,v.prefetchRsc=null,v.loading=n,(0,s.fillLazyItemsTillLeafWithHead)(S,v,void 0,r,i,w),(0,h.revalidateEntireCache)(e.nextUrl,_)}await (0,p.refreshInactiveParallelSegments)({navigatedAt:S,state:e,updatedTree:_,updatedCache:v,includeNextUrl:b,canonicalUrl:m.canonicalUrl||e.canonicalUrl}),m.cache=v,m.patchedTree=_,m.renderedSearch=d,y=_}return(0,i.handleMutable)(e,m)},()=>e)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},86720,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"hmrRefreshReducer",{enumerable:!0,get:function(){return r}}),e.r(87288),e.r(51191),e.r(22719),e.r(48919),e.r(54069),e.r(47442),e.r(10827),e.r(75530),e.r(54003),e.r(84356);let r=function(e,t){return e};("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},27801,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"assignLocation",{enumerable:!0,get:function(){return l}});let r=e.r(5550);function l(e,t){if(e.startsWith(".")){let n=t.origin+t.pathname;return new URL((n.endsWith("/")?n:n+"/")+e)}return new URL((0,r.addBasePath)(e),t.href)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},39747,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={extractInfoFromServerReferenceId:function(){return a},omitUnusedArgs:function(){return u}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});function a(e){let t=parseInt(e.slice(0,2),16),n=t>>1&63,r=Array(6);for(let e=0;e<6;e++){let t=n>>5-e&1;r[e]=1===t}return{type:1==(t>>7&1)?"use-cache":"server-action",usedArgs:r,hasRestArgs:1==(1&t)}}function u(e,t){let n=Array(e.length);for(let r=0;r=6&&t.hasRestArgs)&&(n[r]=e[r]);return n}},45794,(e,t,n)=>{"use strict";let r;Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"serverActionReducer",{enumerable:!0,get:function(){return C}});let l=e.r(32120),a=e.r(92245),u=e.r(21768),o=e.r(92838),i=e.r(35326),s=e.r(27801),c=e.r(51191),f=e.r(54069),d=e.r(22719),p=e.r(48919),h=e.r(47442),m=e.r(1764),g=e.r(75530),y=e.r(84356),v=e.r(54003),b=e.r(13576),S=e.r(50590),w=e.r(24063),E=e.r(68391),_=e.r(87250),P=e.r(52817),k=e.r(39747),R=e.r(20896),T=i.createFromFetch;async function x(e,t,{actionId:n,actionArgs:c}){let f,d,p,h,m=(0,i.createTemporaryReferenceSet)(),g=(0,k.extractInfoFromServerReferenceId)(n),y="use-cache"===g.type?(0,k.omitUnusedArgs)(c,g):c,v=await (0,i.encodeReply)(y,{temporaryReferences:m}),b={Accept:u.RSC_CONTENT_TYPE_HEADER,[u.ACTION_HEADER]:n,[u.NEXT_ROUTER_STATE_TREE_HEADER]:(0,S.prepareFlightRouterStateForRequest)(e.tree)};t&&(b[u.NEXT_URL]=t);let w=await fetch(e.canonicalUrl,{method:"POST",headers:b,body:v});if("1"===w.headers.get(u.NEXT_ACTION_NOT_FOUND_HEADER))throw Object.defineProperty(new o.UnrecognizedActionError(`Server Action "${n}" was not found on the server. -Read more: https://nextjs.org/docs/messages/failed-to-find-server-action`),"__NEXT_ERROR_CODE",{value:"E715",enumerable:!1,configurable:!0});let _=w.headers.get("x-action-redirect"),[P,R]=_?.split(";")||[];switch(R){case"push":f=E.RedirectType.push;break;case"replace":f=E.RedirectType.replace;break;default:f=void 0}let x=!!w.headers.get(u.NEXT_IS_PRERENDER_HEADER);try{let e=JSON.parse(w.headers.get("x-action-revalidated")||"[[],0,0]");d={paths:e[0]||[],tag:!!e[1],cookie:e[2]}}catch(e){d=O}let C=P?(0,s.assignLocation)(P,new URL(e.canonicalUrl,window.location.href)):void 0,N=w.headers.get("content-type"),M=!!(N&&N.startsWith(u.RSC_CONTENT_TYPE_HEADER));if(!M&&!C)throw Object.defineProperty(Error(w.status>=400&&"text/plain"===N?await w.text():"An unexpected response was received from the server."),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});if(M){let e=await T(Promise.resolve(w),{callServer:l.callServer,findSourceMapURL:a.findSourceMapURL,temporaryReferences:m,debugChannel:r&&r(b)});p=C?void 0:e.a,h=(0,S.normalizeFlightData)(e.f)}else p=void 0,h=void 0;return{actionResult:p,actionFlightData:h,redirectLocation:C,redirectType:f,revalidatedParts:d,isPrerender:x}}let O={paths:[],tag:!1,cookie:!1};function C(e,t){let{resolve:n,reject:r}=t,l={},a=e.tree;l.preserveCustomHistoryState=!1;let u=(e.previousNextUrl||e.nextUrl)&&(0,y.hasInterceptionRouteInCurrentTree)(e.tree)?e.previousNextUrl||e.nextUrl:null,o=Date.now();return x(e,u,t).then(async({actionResult:i,actionFlightData:s,redirectLocation:y,redirectType:S,revalidatedParts:k})=>{let T;if(y&&(S===E.RedirectType.replace?(e.pushRef.pendingPush=!1,l.pendingPush=!1):(e.pushRef.pendingPush=!0,l.pendingPush=!0),l.canonicalUrl=T=(0,c.createHrefFromUrl)(y,!1)),!s)return(n(i),y)?(0,f.handleExternalUrl)(e,l,y.href,e.pushRef.pendingPush):e;if("string"==typeof s)return n(i),(0,f.handleExternalUrl)(e,l,s,e.pushRef.pendingPush);let x=k.paths.length>0||k.tag||k.cookie;for(let r of(x&&(t.didRevalidate=!0),s)){let{tree:s,seedData:c,head:h,isRootRender:y}=r;if(!y)return console.log("SERVER ACTION APPLY FAILED"),n(i),e;let S=(0,d.applyRouterStatePatchToTree)([""],a,s,T||e.canonicalUrl);if(null===S)return n(i),(0,v.handleSegmentMismatch)(e,t,s);if((0,p.isNavigatingToNewRootLayout)(a,S))return n(i),(0,f.handleExternalUrl)(e,l,T||e.canonicalUrl,e.pushRef.pendingPush);if(null!==c){let t=c[0],n=(0,g.createEmptyCacheNode)();n.rsc=t,n.prefetchRsc=null,n.loading=c[2],(0,m.fillLazyItemsTillLeafWithHead)(o,n,void 0,s,c,h),l.cache=n,(0,R.revalidateEntireCache)(e.nextUrl,S),x&&await (0,b.refreshInactiveParallelSegments)({navigatedAt:o,state:e,updatedTree:S,updatedCache:n,includeNextUrl:!!u,canonicalUrl:l.canonicalUrl||e.canonicalUrl})}l.patchedTree=S,a=S}if(y&&T){let e=(0,w.getRedirectError)((0,P.hasBasePath)(T)?(0,_.removeBasePath)(T):T,S||E.RedirectType.push);e.handled=!0,r(e)}else n(i);return(0,h.handleMutable)(e,l)},t=>(r(t),e))}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},4924,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"reducer",{enumerable:!0,get:function(){return c}});let r=e.r(88540),l=e.r(54069),a=e.r(91668),u=e.r(73790),o=e.r(69845),i=e.r(86720),s=e.r(45794),c="undefined"==typeof window?function(e,t){return e}:function(e,t){switch(t.type){case r.ACTION_NAVIGATE:return(0,l.navigateReducer)(e,t);case r.ACTION_SERVER_PATCH:return(0,a.serverPatchReducer)(e,t);case r.ACTION_RESTORE:return(0,u.restoreReducer)(e,t);case r.ACTION_REFRESH:return(0,o.refreshReducer)(e,t);case r.ACTION_HMR_REFRESH:return(0,i.hmrRefreshReducer)(e,t);case r.ACTION_SERVER_ACTION:return(0,s.serverActionReducer)(e,t);default:throw Object.defineProperty(Error("Unknown action"),"__NEXT_ERROR_CODE",{value:"E295",enumerable:!1,configurable:!0})}};("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},1411,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"prefetch",{enumerable:!0,get:function(){return o}});let r=e.r(57630),l=e.r(77048),a=e.r(77709),u=e.r(9396);function o(e,t,n,o,i){let s=(0,r.createPrefetchURL)(e);if(null===s)return;let c=(0,l.createCacheKey)(s.href,t);(0,a.schedulePrefetchTask)(c,n,o,u.PrefetchPriority.Default,i)}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},99781,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={createMutableActionQueue:function(){return v},dispatchNavigateAction:function(){return w},dispatchTraverseAction:function(){return E},getCurrentAppRouterState:function(){return b},publicAppRouterInstance:function(){return _}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(88540),u=e.r(4924),o=e.r(71645),i=e.r(64245),s=e.r(9396),c=e.r(1411),f=e.r(41538),d=e.r(5550),p=e.r(57630),h=e.r(91949);function m(e,t){null!==e.pending?(e.pending=e.pending.next,null!==e.pending&&g({actionQueue:e,action:e.pending,setState:t})):e.needsRefresh&&(e.needsRefresh=!1,e.dispatch({type:a.ACTION_REFRESH,origin:window.location.origin},t))}async function g({actionQueue:e,action:t,setState:n}){let r=e.state;e.pending=t;let l=t.payload,u=e.action(r,l);function o(r){if(t.discarded){t.payload.type===a.ACTION_SERVER_ACTION&&t.payload.didRevalidate&&(e.needsRefresh=!0),m(e,n);return}e.state=r,m(e,n),t.resolve(r)}(0,i.isThenable)(u)?u.then(o,r=>{m(e,n),t.reject(r)}):o(u)}let y=null;function v(e,t){let n={state:e,dispatch:(e,t)=>(function(e,t,n){let r={resolve:n,reject:()=>{}};if(t.type!==a.ACTION_RESTORE){let e=new Promise((e,t)=>{r={resolve:e,reject:t}});(0,o.startTransition)(()=>{n(e)})}let l={payload:t,next:null,resolve:r.resolve,reject:r.reject};null===e.pending?(e.last=l,g({actionQueue:e,action:l,setState:n})):t.type===a.ACTION_NAVIGATE||t.type===a.ACTION_RESTORE?(e.pending.discarded=!0,l.next=e.pending.next,g({actionQueue:e,action:l,setState:n})):(null!==e.last&&(e.last.next=l),e.last=l)})(n,e,t),action:async(e,t)=>(0,u.reducer)(e,t),pending:null,last:null,onRouterTransitionStart:null!==t&&"function"==typeof t.onRouterTransitionStart?t.onRouterTransitionStart:null};if("undefined"!=typeof window){if(null!==y)throw Object.defineProperty(Error("Internal Next.js Error: createMutableActionQueue was called more than once"),"__NEXT_ERROR_CODE",{value:"E624",enumerable:!1,configurable:!0});y=n}return n}function b(){return null!==y?y.state:null}function S(){return null!==y?y.onRouterTransitionStart:null}function w(e,t,n,r){let l=new URL((0,d.addBasePath)(e),location.href);(0,h.setLinkForCurrentNavigation)(r);let u=S();null!==u&&u(e,t),(0,f.dispatchAppRouterAction)({type:a.ACTION_NAVIGATE,url:l,isExternalUrl:(0,p.isExternalURL)(l),locationSearch:location.search,shouldScroll:n,navigateType:t})}function E(e,t){let n=S();null!==n&&n(e,"traverse"),(0,f.dispatchAppRouterAction)({type:a.ACTION_RESTORE,url:new URL(e),historyState:t})}let _={back:()=>window.history.back(),forward:()=>window.history.forward(),prefetch:(e,t)=>{let n,r=function(){if(null===y)throw Object.defineProperty(Error("Internal Next.js error: Router action dispatched before initialization."),"__NEXT_ERROR_CODE",{value:"E668",enumerable:!1,configurable:!0});return y}();switch(t?.kind??a.PrefetchKind.AUTO){case a.PrefetchKind.AUTO:n=s.FetchStrategy.PPR;break;case a.PrefetchKind.FULL:n=s.FetchStrategy.Full;break;case a.PrefetchKind.TEMPORARY:return;default:n=s.FetchStrategy.PPR}(0,c.prefetch)(e,r.state.nextUrl,r.state.tree,n,t?.onInvalidate??null)},replace:(e,t)=>{(0,o.startTransition)(()=>{w(e,"replace",t?.scroll??!0,null)})},push:(e,t)=>{(0,o.startTransition)(()=>{w(e,"push",t?.scroll??!0,null)})},refresh:()=>{(0,o.startTransition)(()=>{(0,f.dispatchAppRouterAction)({type:a.ACTION_REFRESH,origin:window.location.origin})})},hmrRefresh:()=>{throw Object.defineProperty(Error("hmrRefresh can only be used in development mode. Please use refresh instead."),"__NEXT_ERROR_CODE",{value:"E485",enumerable:!1,configurable:!0})}};"undefined"!=typeof window&&window.next&&(window.next.router=_),("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},65716,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"createInitialRouterState",{enumerable:!0,get:function(){return i}});let r=e.r(51191),l=e.r(1764),a=e.r(34727),u=e.r(13576),o=e.r(50590);function i({navigatedAt:e,initialFlightData:t,initialCanonicalUrlParts:n,initialRenderedSearch:i,initialParallelRoutes:s,location:c}){let f=n.join("/"),{tree:d,seedData:p,head:h}=(0,o.getFlightDataPartsFromPath)(t[0]),m={lazyData:null,rsc:p?.[0],prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:s,loading:p?.[2]??null,navigatedAt:e},g=c?(0,r.createHrefFromUrl)(c):f;return(0,u.addRefreshMarkerToActiveParallelSegments)(d,g),(null===s||0===s.size)&&(0,l.fillLazyItemsTillLeafWithHead)(e,m,void 0,d,p,h),{tree:d,cache:m,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:{apply:!1,onlyHashChange:!1,hashFragment:null,segmentPaths:[]},canonicalUrl:g,renderedSearch:i,nextUrl:((0,a.extractPathFromFlightRouterState)(d)||c?.pathname)??null,previousNextUrl:null,debugInfo:null}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},98569,(e,t,n)=>{"use strict";let r,l,a,u;Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"hydrate",{enumerable:!0,get:function(){return I}});let o=e.r(55682),i=e.r(43476);e.r(23911);let s=o._(e.r(88014)),c=o._(e.r(71645)),f=e.r(35326),d=e.r(42732),p=e.r(97238),h=e.r(51323),m=e.r(32120),g=e.r(92245),y=e.r(99781),v=o._(e.r(75530)),b=e.r(65716);e.r(8372);let S=e.r(14297),w=e.r(50590),E=f.createFromReadableStream,_=f.createFromFetch,P=document,k=new TextEncoder,R=!1,T=!1,x=null;function O(e){if(0===e[0])a=[];else if(1===e[0]){if(!a)throw Object.defineProperty(Error("Unexpected server data: missing bootstrap script."),"__NEXT_ERROR_CODE",{value:"E18",enumerable:!1,configurable:!0});u?u.enqueue(k.encode(e[1])):a.push(e[1])}else if(2===e[0])x=e[1];else if(3===e[0]){if(!a)throw Object.defineProperty(Error("Unexpected server data: missing bootstrap script."),"__NEXT_ERROR_CODE",{value:"E18",enumerable:!1,configurable:!0});let n=atob(e[1]),r=new Uint8Array(n.length);for(var t=0;t{e.enqueue("string"==typeof t?k.encode(t):t)}),R&&!T)&&(null===e.desiredSize||e.desiredSize<0?e.error(Object.defineProperty(Error("The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection."),"__NEXT_ERROR_CODE",{value:"E117",enumerable:!1,configurable:!0})):e.close(),T=!0,a=void 0),u=e}}),L=window.__NEXT_CLIENT_RESUME;function z({initialRSCPayload:e,actionQueue:t,webSocket:n,staticIndicatorState:r}){return(0,i.jsx)(v.default,{actionQueue:t,globalErrorState:e.G,webSocket:n,staticIndicatorState:r})}l=L?Promise.resolve(_(L,{callServer:m.callServer,findSourceMapURL:g.findSourceMapURL,debugChannel:r})).then(async e=>(0,w.createInitialRSCPayloadFromFallbackPrerender)(await L,e)):E(M,{callServer:m.callServer,findSourceMapURL:g.findSourceMapURL,debugChannel:r,startTime:0});let j=c.default.StrictMode;function F({children:e}){return e}let A={onDefaultTransitionIndicator:function(){return()=>{}},onRecoverableError:p.onRecoverableError,onCaughtError:h.onCaughtError,onUncaughtError:h.onUncaughtError};async function I(e,t){let n,r,a=await l;(0,S.setAppBuildId)(a.b);let u=Date.now(),o=(0,y.createMutableActionQueue)((0,b.createInitialRouterState)({navigatedAt:u,initialFlightData:a.f,initialCanonicalUrlParts:a.c,initialRenderedSearch:a.q,initialParallelRoutes:new Map,location:window.location}),e),f=(0,i.jsx)(j,{children:(0,i.jsx)(d.HeadManagerContext.Provider,{value:{appDir:!0},children:(0,i.jsx)(F,{children:(0,i.jsx)(z,{initialRSCPayload:a,actionQueue:o,webSocket:r,staticIndicatorState:n})})})});"__next_error__"===document.documentElement.id?s.default.createRoot(P,A).render(f):c.default.startTransition(()=>{s.default.hydrateRoot(P,f,{...A,formState:x})})}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},94553,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});let r=e.r(96517);e.r(97238),window.next.turbopack=!0,self.__webpack_hash__="";let l=e.r(5526);(0,r.appBootstrap)(t=>{let{hydrate:n}=e.r(98569);n(l,t)}),("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/a6dad97d9634a72d.js b/src/hyperview/server/static/_next/static/chunks/a6dad97d9634a72d.js deleted file mode 100644 index ab422b9..0000000 --- a/src/hyperview/server/static/_next/static/chunks/a6dad97d9634a72d.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var r,n,o=function(t){return t&&t.Math===Math&&t},i=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof t&&t)||o("object"==typeof t&&t)||function(){return this}()||Function("return this")(),a=function(t){try{return!!t()}catch(t){return!0}},u=!a(function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}),s=!a(function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}),c=Function.prototype.call,f=s?c.bind(c):function(){return c.apply(c,arguments)},l={}.propertyIsEnumerable,h=Object.getOwnPropertyDescriptor,p=h&&!l.call({1:2},1)?function(t){var e=h(this,t);return!!e&&e.enumerable}:l,v={f:p},d=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},g=Function.prototype,y=g.call,m=s&&g.bind.bind(y,y),b=s?m:function(t){return function(){return y.apply(t,arguments)}},w=b({}.toString),S=b("".slice),E=function(t){return S(w(t),8,-1)},O=Object,x=b("".split),R=a(function(){return!O("z").propertyIsEnumerable(0)})?function(t){return"String"===E(t)?x(t,""):O(t)}:O,P=function(t){return null==t},A=TypeError,j=function(t){if(P(t))throw new A("Can't call method on "+t);return t},k=function(t){return R(j(t))},I="object"==typeof document&&document.all,T=void 0===I&&void 0!==I?function(t){return"function"==typeof t||t===I}:function(t){return"function"==typeof t},M=function(t){return"object"==typeof t?null!==t:T(t)},L=function(t,e){return arguments.length<2?T(r=i[t])?r:void 0:i[t]&&i[t][e];var r},U=b({}.isPrototypeOf),N=i.navigator,C=N&&N.userAgent,_=C?String(C):"",F=i.process,B=i.Deno,D=F&&F.versions||B&&B.version,z=D&&D.v8;z&&(n=(r=z.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!n&&_&&(!(r=_.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=_.match(/Chrome\/(\d+)/))&&(n=+r[1]);var W=n,q=i.String,H=!!Object.getOwnPropertySymbols&&!a(function(){var t=Symbol("symbol detection");return!q(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&W&&W<41}),$=H&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,K=Object,G=$?function(t){return"symbol"==typeof t}:function(t){var e=L("Symbol");return T(e)&&U(e.prototype,K(t))},V=String,Y=function(t){try{return V(t)}catch(t){return"Object"}},X=TypeError,J=function(t){if(T(t))return t;throw new X(Y(t)+" is not a function")},Q=function(t,e){var r=t[e];return P(r)?void 0:J(r)},Z=TypeError,tt=Object.defineProperty,et=function(t,e){try{tt(i,t,{value:e,configurable:!0,writable:!0})}catch(r){i[t]=e}return e},rt=e(function(t){var e="__core-js_shared__",r=t.exports=i[e]||et(e,{});(r.versions||(r.versions=[])).push({version:"3.38.1",mode:"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE",source:"https://github.com/zloirock/core-js"})}),nt=function(t,e){return rt[t]||(rt[t]=e||{})},ot=Object,it=function(t){return ot(j(t))},at=b({}.hasOwnProperty),ut=Object.hasOwn||function(t,e){return at(it(t),e)},st=0,ct=Math.random(),ft=b(1..toString),lt=function(t){return"Symbol("+(void 0===t?"":t)+")_"+ft(++st+ct,36)},ht=i.Symbol,pt=nt("wks"),vt=$?ht.for||ht:ht&&ht.withoutSetter||lt,dt=function(t){return ut(pt,t)||(pt[t]=H&&ut(ht,t)?ht[t]:vt("Symbol."+t)),pt[t]},gt=TypeError,yt=dt("toPrimitive"),mt=function(t,e){if(!M(t)||G(t))return t;var r,n=Q(t,yt);if(n){if(void 0===e&&(e="default"),r=f(n,t,e),!M(r)||G(r))return r;throw new gt("Can't convert object to primitive value")}return void 0===e&&(e="number"),function(t,e){var r,n;if("string"===e&&T(r=t.toString)&&!M(n=f(r,t)))return n;if(T(r=t.valueOf)&&!M(n=f(r,t)))return n;if("string"!==e&&T(r=t.toString)&&!M(n=f(r,t)))return n;throw new Z("Can't convert object to primitive value")}(t,e)},bt=function(t){var e=mt(t,"string");return G(e)?e:e+""},wt=i.document,St=M(wt)&&M(wt.createElement),Et=function(t){return St?wt.createElement(t):{}},Ot=!u&&!a(function(){return 7!==Object.defineProperty(Et("div"),"a",{get:function(){return 7}}).a}),xt=Object.getOwnPropertyDescriptor,Rt={f:u?xt:function(t,e){if(t=k(t),e=bt(e),Ot)try{return xt(t,e)}catch(t){}if(ut(t,e))return d(!f(v.f,t,e),t[e])}},Pt=u&&a(function(){return 42!==Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype}),At=String,jt=TypeError,kt=function(t){if(M(t))return t;throw new jt(At(t)+" is not an object")},It=TypeError,Tt=Object.defineProperty,Mt=Object.getOwnPropertyDescriptor,Lt="enumerable",Ut="configurable",Nt="writable",Ct={f:u?Pt?function(t,e,r){if(kt(t),e=bt(e),kt(r),"function"==typeof t&&"prototype"===e&&"value"in r&&Nt in r&&!r[Nt]){var n=Mt(t,e);n&&n[Nt]&&(t[e]=r.value,r={configurable:Ut in r?r[Ut]:n[Ut],enumerable:Lt in r?r[Lt]:n[Lt],writable:!1})}return Tt(t,e,r)}:Tt:function(t,e,r){if(kt(t),e=bt(e),kt(r),Ot)try{return Tt(t,e,r)}catch(t){}if("get"in r||"set"in r)throw new It("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},_t=u?function(t,e,r){return Ct.f(t,e,d(1,r))}:function(t,e,r){return t[e]=r,t},Ft=Function.prototype,Bt=u&&Object.getOwnPropertyDescriptor,Dt=ut(Ft,"name"),zt={EXISTS:Dt,PROPER:Dt&&"something"===function(){}.name,CONFIGURABLE:Dt&&(!u||u&&Bt(Ft,"name").configurable)},Wt=b(Function.toString);T(rt.inspectSource)||(rt.inspectSource=function(t){return Wt(t)});var qt,Ht,$t,Kt=rt.inspectSource,Gt=i.WeakMap,Vt=T(Gt)&&/native code/.test(String(Gt)),Yt=nt("keys"),Xt=function(t){return Yt[t]||(Yt[t]=lt(t))},Jt={},Qt="Object already initialized",Zt=i.TypeError;if(Vt||rt.state){var te=rt.state||(rt.state=new(0,i.WeakMap));te.get=te.get,te.has=te.has,te.set=te.set,qt=function(t,e){if(te.has(t))throw new Zt(Qt);return e.facade=t,te.set(t,e),e},Ht=function(t){return te.get(t)||{}},$t=function(t){return te.has(t)}}else{var ee=Xt("state");Jt[ee]=!0,qt=function(t,e){if(ut(t,ee))throw new Zt(Qt);return e.facade=t,_t(t,ee,e),e},Ht=function(t){return ut(t,ee)?t[ee]:{}},$t=function(t){return ut(t,ee)}}var re,ne={set:qt,get:Ht,has:$t,enforce:function(t){return $t(t)?Ht(t):qt(t,{})},getterFor:function(t){return function(e){var r;if(!M(e)||(r=Ht(e)).type!==t)throw new Zt("Incompatible receiver, "+t+" required");return r}}},oe=e(function(t){var e=zt.CONFIGURABLE,r=ne.enforce,n=ne.get,o=String,i=Object.defineProperty,s=b("".slice),c=b("".replace),f=b([].join),l=u&&!a(function(){return 8!==i(function(){},"length",{value:8}).length}),h=String(String).split("String"),p=t.exports=function(t,n,a){"Symbol("===s(o(n),0,7)&&(n="["+c(o(n),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),a&&a.getter&&(n="get "+n),a&&a.setter&&(n="set "+n),(!ut(t,"name")||e&&t.name!==n)&&(u?i(t,"name",{value:n,configurable:!0}):t.name=n),l&&a&&ut(a,"arity")&&t.length!==a.arity&&i(t,"length",{value:a.arity});try{a&&ut(a,"constructor")&&a.constructor?u&&i(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var p=r(t);return ut(p,"source")||(p.source=f(h,"string"==typeof n?n:"")),t};Function.prototype.toString=p(function(){return T(this)&&n(this).source||Kt(this)},"toString")}),ie=function(t,e,r,n){n||(n={});var o=n.enumerable,i=void 0!==n.name?n.name:e;if(T(r)&&oe(r,i,n),n.global)o?t[e]=r:et(e,r);else{try{n.unsafe?t[e]&&(o=!0):delete t[e]}catch(t){}o?t[e]=r:Ct.f(t,e,{value:r,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return t},ae=Math.ceil,ue=Math.floor,se=Math.trunc||function(t){var e=+t;return(e>0?ue:ae)(e)},ce=function(t){var e=+t;return e!=e||0===e?0:se(e)},fe=Math.max,le=Math.min,he=function(t,e){var r=ce(t);return r<0?fe(r+e,0):le(r,e)},pe=Math.min,ve=function(t){var e=ce(t);return e>0?pe(e,9007199254740991):0},de=function(t){return ve(t.length)},ge=function(t){return function(e,r,n){var o=k(e),i=de(o);if(0===i)return!t&&-1;var a,u=he(n,i);if(t&&r!=r){for(;i>u;)if((a=o[u++])!=a)return!0}else for(;i>u;u++)if((t||u in o)&&o[u]===r)return t||u||0;return!t&&-1}},ye={includes:ge(!0),indexOf:ge(!1)},me=ye.indexOf,be=b([].push),we=function(t,e){var r,n=k(t),o=0,i=[];for(r in n)!ut(Jt,r)&&ut(n,r)&&be(i,r);for(;e.length>o;)ut(n,r=e[o++])&&(~me(i,r)||be(i,r));return i},Se=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Ee=Se.concat("length","prototype"),Oe={f:Object.getOwnPropertyNames||function(t){return we(t,Ee)}},xe={f:Object.getOwnPropertySymbols},Re=b([].concat),Pe=L("Reflect","ownKeys")||function(t){var e=Oe.f(kt(t)),r=xe.f;return r?Re(e,r(t)):e},Ae=function(t,e,r){for(var n=Pe(e),o=Ct.f,i=Rt.f,a=0;aa;)Ct.f(t,r=o[a++],n[r]);return t},Be={f:Fe},De=L("document","documentElement"),ze="prototype",We="script",qe=Xt("IE_PROTO"),He=function(){},$e=function(t){return"<"+We+">"+t+""},Ke=function(t){t.write($e("")),t.close();var e=t.parentWindow.Object;return t=null,e},Ge=function(){try{re=new ActiveXObject("htmlfile")}catch(t){}var t,e,r;Ge="undefined"!=typeof document?document.domain&&re?Ke(re):(e=Et("iframe"),r="java"+We+":",e.style.display="none",De.appendChild(e),e.src=String(r),(t=e.contentWindow.document).open(),t.write($e("document.F=Object")),t.close(),t.F):Ke(re);for(var n=Se.length;n--;)delete Ge[ze][Se[n]];return Ge()};Jt[qe]=!0;var Ve=Object.create||function(t,e){var r;return null!==t?(He[ze]=kt(t),r=new He,He[ze]=null,r[qe]=t):r=Ge(),void 0===e?r:Be.f(r,e)},Ye=Ct.f,Xe=dt("unscopables"),Je=Array.prototype;void 0===Je[Xe]&&Ye(Je,Xe,{configurable:!0,value:Ve(null)});var Qe=function(t){Je[Xe][t]=!0};Ce({target:"Array",proto:!0},{at:function(t){var e=it(this),r=de(e),n=ce(t),o=n>=0?n:r+n;return o<0||o>=r?void 0:e[o]}}),Qe("at");var Ze=function(t,e){return b(i[t].prototype[e])},tr=(Ze("Array","at"),TypeError),er=function(t,e){if(!delete t[e])throw new tr("Cannot delete property "+Y(e)+" of "+Y(t))},rr=Math.min,nr=[].copyWithin||function(t,e){var r=it(this),n=de(r),o=he(t,n),i=he(e,n),a=arguments.length>2?arguments[2]:void 0,u=rr((void 0===a?n:he(a,n))-i,n-o),s=1;for(i0;)i in r?r[o]=r[i]:er(r,o),o+=s,i+=s;return r};Ce({target:"Array",proto:!0},{copyWithin:nr}),Qe("copyWithin"),Ze("Array","copyWithin"),Ce({target:"Array",proto:!0},{fill:function(t){for(var e=it(this),r=de(e),n=arguments.length,o=he(n>1?arguments[1]:void 0,r),i=n>2?arguments[2]:void 0,a=void 0===i?r:he(i,r);a>o;)e[o++]=t;return e}}),Qe("fill"),Ze("Array","fill");var or=function(t){if("Function"===E(t))return b(t)},ir=or(or.bind),ar=function(t,e){return J(t),void 0===e?t:s?ir(t,e):function(){return t.apply(e,arguments)}},ur=Array.isArray||function(t){return"Array"===E(t)},sr={};sr[dt("toStringTag")]="z";var cr="[object z]"===String(sr),fr=dt("toStringTag"),lr=Object,hr="Arguments"===E(function(){return arguments}()),pr=cr?E:function(t){var e,r,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=lr(t),fr))?r:hr?E(e):"Object"===(n=E(e))&&T(e.callee)?"Arguments":n},vr=function(){},dr=L("Reflect","construct"),gr=/^\s*(?:class|function)\b/,yr=b(gr.exec),mr=!gr.test(vr),br=function(t){if(!T(t))return!1;try{return dr(vr,[],t),!0}catch(t){return!1}},wr=function(t){if(!T(t))return!1;switch(pr(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return mr||!!yr(gr,Kt(t))}catch(t){return!0}};wr.sham=!0;var Sr=!dr||a(function(){var t;return br(br.call)||!br(Object)||!br(function(){t=!0})||t})?wr:br,Er=dt("species"),Or=Array,xr=function(t,e){return new(function(t){var e;return ur(t)&&(Sr(e=t.constructor)&&(e===Or||ur(e.prototype))||M(e)&&null===(e=e[Er]))&&(e=void 0),void 0===e?Or:e}(t))(0===e?0:e)},Rr=b([].push),Pr=function(t){var e=1===t,r=2===t,n=3===t,o=4===t,i=6===t,a=7===t,u=5===t||i;return function(s,c,f,l){for(var h,p,v=it(s),d=R(v),g=de(d),y=ar(c,f),m=0,b=l||xr,w=e?b(s,g):r||a?b(s,0):void 0;g>m;m++)if((u||m in d)&&(p=y(h=d[m],m,v),t))if(e)w[m]=p;else if(p)switch(t){case 3:return!0;case 5:return h;case 6:return m;case 2:Rr(w,h)}else switch(t){case 4:return!1;case 7:Rr(w,h)}return i?-1:n||o?o:w}},Ar={forEach:Pr(0),map:Pr(1),filter:Pr(2),some:Pr(3),every:Pr(4),find:Pr(5),findIndex:Pr(6),filterReject:Pr(7)},jr=Ar.find,kr="find",Ir=!0;kr in[]&&Array(1)[kr](function(){Ir=!1}),Ce({target:"Array",proto:!0,forced:Ir},{find:function(t){return jr(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe(kr),Ze("Array","find");var Tr=Ar.findIndex,Mr="findIndex",Lr=!0;Mr in[]&&Array(1)[Mr](function(){Lr=!1}),Ce({target:"Array",proto:!0,forced:Lr},{findIndex:function(t){return Tr(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe(Mr),Ze("Array","findIndex");var Ur=TypeError,Nr=function(t){if(t>9007199254740991)throw Ur("Maximum allowed index exceeded");return t},Cr=function(t,e,r,n,o,i,a,u){for(var s,c,f=o,l=0,h=!!a&&ar(a,u);l0&&ur(s)?(c=de(s),f=Cr(t,e,s,c,f,i-1)-1):(Nr(f+1),t[f]=s),f++),l++;return f},_r=Cr;Ce({target:"Array",proto:!0},{flatMap:function(t){var e,r=it(this),n=de(r);return J(t),(e=xr(r,0)).length=_r(e,r,r,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}}),Qe("flatMap"),Ze("Array","flatMap"),Ce({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=it(this),r=de(e),n=xr(e,0);return n.length=_r(n,e,e,r,0,void 0===t?1:ce(t)),n}}),Qe("flat"),Ze("Array","flat");var Fr,Br,Dr,zr=String,Wr=function(t){if("Symbol"===pr(t))throw new TypeError("Cannot convert a Symbol value to a string");return zr(t)},qr=b("".charAt),Hr=b("".charCodeAt),$r=b("".slice),Kr=function(t){return function(e,r){var n,o,i=Wr(j(e)),a=ce(r),u=i.length;return a<0||a>=u?t?"":void 0:(n=Hr(i,a))<55296||n>56319||a+1===u||(o=Hr(i,a+1))<56320||o>57343?t?qr(i,a):n:t?$r(i,a,a+2):o-56320+(n-55296<<10)+65536}},Gr={codeAt:Kr(!1),charAt:Kr(!0)},Vr=!a(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),Yr=Xt("IE_PROTO"),Xr=Object,Jr=Xr.prototype,Qr=Vr?Xr.getPrototypeOf:function(t){var e=it(t);if(ut(e,Yr))return e[Yr];var r=e.constructor;return T(r)&&e instanceof r?r.prototype:e instanceof Xr?Jr:null},Zr=dt("iterator"),tn=!1;[].keys&&("next"in(Dr=[].keys())?(Br=Qr(Qr(Dr)))!==Object.prototype&&(Fr=Br):tn=!0);var en=!M(Fr)||a(function(){var t={};return Fr[Zr].call(t)!==t});en&&(Fr={}),T(Fr[Zr])||ie(Fr,Zr,function(){return this});var rn={IteratorPrototype:Fr,BUGGY_SAFARI_ITERATORS:tn},nn=Ct.f,on=dt("toStringTag"),an=function(t,e,r){t&&!r&&(t=t.prototype),t&&!ut(t,on)&&nn(t,on,{configurable:!0,value:e})},un={},sn=rn.IteratorPrototype,cn=function(){return this},fn=function(t,e,r,n){var o=e+" Iterator";return t.prototype=Ve(sn,{next:d(+!n,r)}),an(t,o,!1),un[o]=cn,t},ln=function(t,e,r){try{return b(J(Object.getOwnPropertyDescriptor(t,e)[r]))}catch(t){}},hn=String,pn=TypeError,vn=function(t){if(function(t){return M(t)||null===t}(t))return t;throw new pn("Can't set "+hn(t)+" as a prototype")},dn=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,r={};try{(t=ln(Object.prototype,"__proto__","set"))(r,[]),e=r instanceof Array}catch(t){}return function(r,n){return j(r),vn(n),M(r)?(e?t(r,n):r.__proto__=n,r):r}}():void 0),gn=zt.PROPER,yn=zt.CONFIGURABLE,mn=rn.IteratorPrototype,bn=rn.BUGGY_SAFARI_ITERATORS,wn=dt("iterator"),Sn="keys",En="values",On="entries",xn=function(){return this},Rn=function(t,e,r,n,o,i,a){fn(r,e,n);var u,s,c,l=function(t){if(t===o&&g)return g;if(!bn&&t&&t in v)return v[t];switch(t){case Sn:case En:case On:return function(){return new r(this,t)}}return function(){return new r(this)}},h=e+" Iterator",p=!1,v=t.prototype,d=v[wn]||v["@@iterator"]||o&&v[o],g=!bn&&d||l(o),y="Array"===e&&v.entries||d;if(y&&(u=Qr(y.call(new t)))!==Object.prototype&&u.next&&(Qr(u)!==mn&&(dn?dn(u,mn):T(u[wn])||ie(u,wn,xn)),an(u,h,!0)),gn&&o===En&&d&&d.name!==En&&(yn?_t(v,"name",En):(p=!0,g=function(){return f(d,this)})),o)if(s={values:l(En),keys:i?g:l(Sn),entries:l(On)},a)for(c in s)(bn||p||!(c in v))&&ie(v,c,s[c]);else Ce({target:e,proto:!0,forced:bn||p},s);return v[wn]!==g&&ie(v,wn,g,{name:o}),un[e]=g,s},Pn=function(t,e){return{value:t,done:e}},An=Gr.charAt,jn="String Iterator",kn=ne.set,In=ne.getterFor(jn);Rn(String,"String",function(t){kn(this,{type:jn,string:Wr(t),index:0})},function(){var t,e=In(this),r=e.string,n=e.index;return n>=r.length?Pn(void 0,!0):(t=An(r,n),e.index+=t.length,Pn(t,!1))});var Tn=function(t,e,r){var n,o;kt(t);try{if(!(n=Q(t,"return"))){if("throw"===e)throw r;return r}n=f(n,t)}catch(t){o=!0,n=t}if("throw"===e)throw r;if(o)throw n;return kt(n),r},Mn=function(t,e,r,n){try{return n?e(kt(r)[0],r[1]):e(r)}catch(e){Tn(t,"throw",e)}},Ln=dt("iterator"),Un=Array.prototype,Nn=function(t){return void 0!==t&&(un.Array===t||Un[Ln]===t)},Cn=function(t,e,r){u?Ct.f(t,e,d(0,r)):t[e]=r},_n=dt("iterator"),Fn=function(t){if(!P(t))return Q(t,_n)||Q(t,"@@iterator")||un[pr(t)]},Bn=TypeError,Dn=function(t,e){var r=arguments.length<2?Fn(t):e;if(J(r))return kt(f(r,t));throw new Bn(Y(t)+" is not iterable")},zn=Array,Wn=function(t){var e=it(t),r=Sr(this),n=arguments.length,o=n>1?arguments[1]:void 0,i=void 0!==o;i&&(o=ar(o,n>2?arguments[2]:void 0));var a,u,s,c,l,h,p=Fn(e),v=0;if(!p||this===zn&&Nn(p))for(a=de(e),u=r?new this(a):zn(a);a>v;v++)h=i?o(e[v],v):e[v],Cn(u,v,h);else for(u=r?new this:[],l=(c=Dn(e,p)).next;!(s=f(l,c)).done;v++)h=i?Mn(c,o,[s.value,v],!0):s.value,Cn(u,v,h);return u.length=v,u},qn=dt("iterator"),Hn=!1;try{var $n=0,Kn={next:function(){return{done:!!$n++}},return:function(){Hn=!0}};Kn[qn]=function(){return this},Array.from(Kn,function(){throw 2})}catch(t){}var Gn=function(t,e){try{if(!e&&!Hn)return!1}catch(t){return!1}var r=!1;try{var n={};n[qn]=function(){return{next:function(){return{done:r=!0}}}},t(n)}catch(t){}return r},Vn=!Gn(function(t){Array.from(t)});Ce({target:"Array",stat:!0,forced:Vn},{from:Wn});var Yn=i,Xn=ye.includes,Jn=a(function(){return!Array(1).includes()});Ce({target:"Array",proto:!0,forced:Jn},{includes:function(t){return Xn(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe("includes"),Ze("Array","includes");var Qn=Ct.f,Zn="Array Iterator",to=ne.set,eo=ne.getterFor(Zn),ro=Rn(Array,"Array",function(t,e){to(this,{type:Zn,target:k(t),index:0,kind:e})},function(){var t=eo(this),e=t.target,r=t.index++;if(!e||r>=e.length)return t.target=null,Pn(void 0,!0);switch(t.kind){case"keys":return Pn(r,!1);case"values":return Pn(e[r],!1)}return Pn([r,e[r]],!1)},"values"),no=un.Arguments=un.Array;if(Qe("keys"),Qe("values"),Qe("entries"),u&&"values"!==no.name)try{Qn(no,"name",{value:"values"})}catch(t){}cr||ie(Object.prototype,"toString",cr?{}.toString:function(){return"[object "+pr(this)+"]"},{unsafe:!0}),Ze("Array","values");var oo=Array,io=a(function(){function t(){}return!(oo.of.call(t)instanceof t)});Ce({target:"Array",stat:!0,forced:io},{of:function(){for(var t=0,e=arguments.length,r=new(Sr(this)?this:oo)(e);e>t;)Cn(r,t,arguments[t++]);return r.length=e,r}});var ao=dt("hasInstance"),uo=Function.prototype;ao in uo||Ct.f(uo,ao,{value:oe(function(t){if(!T(this)||!M(t))return!1;var e=this.prototype;return M(e)?U(e,t):t instanceof this},ao)}),dt("hasInstance");var so=function(t,e,r){return r.get&&oe(r.get,e,{getter:!0}),r.set&&oe(r.set,e,{setter:!0}),Ct.f(t,e,r)},co=zt.EXISTS,fo=Function.prototype,lo=b(fo.toString),ho=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,po=b(ho.exec);u&&!co&&so(fo,"name",{configurable:!0,get:function(){try{return po(ho,lo(this))[1]}catch(t){return""}}});var vo=b([].slice),go=Oe.f,yo="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],mo={f:function(t){return yo&&"Window"===E(t)?function(t){try{return go(t)}catch(t){return vo(yo)}}(t):go(k(t))}},bo=a(function(){if("function"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,"a",{value:8})}}),wo=Object.isExtensible,So=a(function(){wo(1)})||bo?function(t){return!!M(t)&&(!bo||"ArrayBuffer"!==E(t))&&(!wo||wo(t))}:wo,Eo=!a(function(){return Object.isExtensible(Object.preventExtensions({}))}),Oo=e(function(t){var e=Ct.f,r=!1,n=lt("meta"),o=0,i=function(t){e(t,n,{value:{objectID:"O"+o++,weakData:{}}})},a=t.exports={enable:function(){a.enable=function(){},r=!0;var t=Oe.f,e=b([].splice),o={};o[n]=1,t(o).length&&(Oe.f=function(r){for(var o=t(r),i=0,a=o.length;ii;i++)if((u=y(t[i]))&&U(Po,u))return u;return new Ro(!1)}n=Dn(t,o)}for(s=h?t.next:n.next;!(c=f(s,n)).done;){try{u=y(c.value)}catch(t){Tn(n,"throw",t)}if("object"==typeof u&&u&&U(Po,u))return u}return new Ro(!1)},jo=TypeError,ko=function(t,e){if(U(e,t))return t;throw new jo("Incorrect invocation")},Io=function(t,e,r){var n,o;return dn&&T(n=e.constructor)&&n!==r&&M(o=n.prototype)&&o!==r.prototype&&dn(t,o),t},To=function(t,e,r){var n=-1!==t.indexOf("Map"),o=-1!==t.indexOf("Weak"),u=n?"set":"add",s=i[t],c=s&&s.prototype,f=s,l={},h=function(t){var e=b(c[t]);ie(c,t,"add"===t?function(t){return e(this,0===t?0:t),this}:"delete"===t?function(t){return!(o&&!M(t))&&e(this,0===t?0:t)}:"get"===t?function(t){return o&&!M(t)?void 0:e(this,0===t?0:t)}:"has"===t?function(t){return!(o&&!M(t))&&e(this,0===t?0:t)}:function(t,r){return e(this,0===t?0:t,r),this})};if(Ue(t,!T(s)||!(o||c.forEach&&!a(function(){(new s).entries().next()}))))f=r.getConstructor(e,t,n,u),Oo.enable();else if(Ue(t,!0)){var p=new f,v=p[u](o?{}:-0,1)!==p,d=a(function(){p.has(1)}),g=Gn(function(t){new s(t)}),y=!o&&a(function(){for(var t=new s,e=5;e--;)t[u](e,e);return!t.has(-0)});g||((f=e(function(t,e){ko(t,c);var r=Io(new s,t,f);return P(e)||Ao(e,r[u],{that:r,AS_ENTRIES:n}),r})).prototype=c,c.constructor=f),(d||y)&&(h("delete"),h("has"),n&&h("get")),(y||v)&&h(u),o&&c.clear&&delete c.clear}return l[t]=f,Ce({global:!0,constructor:!0,forced:f!==s},l),an(f,t),o||r.setStrong(f,t,n),f},Mo=function(t,e,r){for(var n in e)ie(t,n,e[n],r);return t},Lo=dt("species"),Uo=function(t){var e=L(t);u&&e&&!e[Lo]&&so(e,Lo,{configurable:!0,get:function(){return this}})},No=Oo.fastKey,Co=ne.set,_o=ne.getterFor,Fo={getConstructor:function(t,e,r,n){var o=t(function(t,o){ko(t,i),Co(t,{type:e,index:Ve(null),first:null,last:null,size:0}),u||(t.size=0),P(o)||Ao(o,t[n],{that:t,AS_ENTRIES:r})}),i=o.prototype,a=_o(e),s=function(t,e,r){var n,o,i=a(t),s=c(t,e);return s?s.value=r:(i.last=s={index:o=No(e,!0),key:e,value:r,previous:n=i.last,next:null,removed:!1},i.first||(i.first=s),n&&(n.next=s),u?i.size++:t.size++,"F"!==o&&(i.index[o]=s)),t},c=function(t,e){var r,n=a(t),o=No(e);if("F"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key===e)return r};return Mo(i,{clear:function(){for(var t=a(this),e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=null),e=e.next;t.first=t.last=null,t.index=Ve(null),u?t.size=0:this.size=0},delete:function(t){var e=this,r=a(e),n=c(e,t);if(n){var o=n.next,i=n.previous;delete r.index[n.index],n.removed=!0,i&&(i.next=o),o&&(o.previous=i),r.first===n&&(r.first=o),r.last===n&&(r.last=i),u?r.size--:e.size--}return!!n},forEach:function(t){for(var e,r=a(this),n=ar(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:r.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!c(this,t)}}),Mo(i,r?{get:function(t){var e=c(this,t);return e&&e.value},set:function(t,e){return s(this,0===t?0:t,e)}}:{add:function(t){return s(this,t=0===t?0:t,t)}}),u&&so(i,"size",{configurable:!0,get:function(){return a(this).size}}),o},setStrong:function(t,e,r){var n=e+" Iterator",o=_o(e),i=_o(n);Rn(t,e,function(t,e){Co(this,{type:n,target:t,state:o(t),kind:e,last:null})},function(){for(var t=i(this),e=t.kind,r=t.last;r&&r.removed;)r=r.previous;return t.target&&(t.last=r=r?r.next:t.state.first)?Pn("keys"===e?r.key:"values"===e?r.value:[r.key,r.value],!1):(t.target=null,Pn(void 0,!0))},r?"entries":"values",!r,!0),Uo(e)}};To("Map",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Fo);var Bo=Map.prototype,Do={Map:Map,set:b(Bo.set),get:b(Bo.get),has:b(Bo.has),remove:b(Bo.delete),proto:Bo},zo=Do.Map,Wo=Do.has,qo=Do.get,Ho=Do.set,$o=b([].push),Ko=a(function(){return 1!==zo.groupBy("ab",function(t){return t}).get("a").length});Ce({target:"Map",stat:!0,forced:Ko},{groupBy:function(t,e){j(t),J(e);var r=new zo,n=0;return Ao(t,function(t){var o=e(t,n++);Wo(r,o)?$o(qo(r,o),t):Ho(r,o,[t])}),r}});var Go={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Vo=Et("span").classList,Yo=Vo&&Vo.constructor&&Vo.constructor.prototype,Xo=Yo===Object.prototype?void 0:Yo,Jo=dt("iterator"),Qo=ro.values,Zo=function(t,e){if(t){if(t[Jo]!==Qo)try{_t(t,Jo,Qo)}catch(e){t[Jo]=Qo}if(an(t,e,!0),Go[e])for(var r in ro)if(t[r]!==ro[r])try{_t(t,r,ro[r])}catch(e){t[r]=ro[r]}}};for(var ti in Go)Zo(i[ti]&&i[ti].prototype,ti);Zo(Xo,"DOMTokenList");var ei=function(t,e,r){return function(n){var o=it(n),i=arguments.length,a=i>1?arguments[1]:void 0,u=void 0!==a,s=u?ar(a,i>2?arguments[2]:void 0):void 0,c=new t,f=0;return Ao(o,function(t){var n=u?s(t,f++):t;r?e(c,kt(n)[0],n[1]):e(c,n)}),c}};Ce({target:"Map",stat:!0,forced:!0},{from:ei(Do.Map,Do.set,!0)});var ri=function(t,e,r){return function(){for(var n=new t,o=arguments.length,i=0;i1?arguments[1]:void 0);return!1!==di(e,function(t,n){if(!r(t,n,e))return!1},!0)}});var gi=Do.Map,yi=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{filter:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new gi;return di(e,function(t,o){r(t,o,e)&&yi(n,o,t)}),n}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{find:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=di(e,function(t,n){if(r(t,n,e))return{value:t}},!0);return n&&n.value}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{findKey:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=di(e,function(t,n){if(r(t,n,e))return{key:n}},!0);return n&&n.key}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{includes:function(t){return!0===di(oi(this),function(e){if((r=e)===(n=t)||r!=r&&n!=n)return!0;var r,n},!0)}});var mi=Do.Map;Ce({target:"Map",stat:!0,forced:!0},{keyBy:function(t,e){var r=new(T(this)?this:mi);J(e);var n=J(r.set);return Ao(t,function(t){f(n,r,e(t),t)}),r}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{keyOf:function(t){var e=di(oi(this),function(e,r){if(e===t)return{key:r}},!0);return e&&e.key}});var bi=Do.Map,wi=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{mapKeys:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new bi;return di(e,function(t,o){wi(n,r(t,o,e),t)}),n}});var Si=Do.Map,Ei=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{mapValues:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new Si;return di(e,function(t,o){Ei(n,o,r(t,o,e))}),n}});var Oi=Do.set;Ce({target:"Map",proto:!0,real:!0,arity:1,forced:!0},{merge:function(t){for(var e=oi(this),r=arguments.length,n=0;n1?arguments[1]:void 0);return!0===di(e,function(t,n){if(r(t,n,e))return!0},!0)}});var Ri=TypeError,Pi=Do.get,Ai=Do.has,ji=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{update:function(t,e){var r=oi(this),n=arguments.length;J(e);var o=Ai(r,t);if(!o&&n<3)throw new Ri("Updating absent value");var i=o?Pi(r,t):J(n>2?arguments[2]:void 0)(t,r);return ji(r,t,e(i,t,r)),r}});var ki=TypeError,Ii=function(t,e){var r,n=kt(this),o=J(n.get),i=J(n.has),a=J(n.set),u=arguments.length>2?arguments[2]:void 0;if(!T(e)&&!T(u))throw new ki("At least one callback required");return f(i,n,t)?(r=f(o,n,t),T(e)&&(r=e(r),f(a,n,t,r))):T(u)&&(r=u(),f(a,n,t,r)),r};Ce({target:"Map",proto:!0,real:!0,forced:!0},{upsert:Ii}),Ce({target:"Map",proto:!0,real:!0,name:"upsert",forced:!0},{updateOrInsert:Ii});var Ti=b(1..valueOf),Mi="\t\n\v\f\r                 \u2028\u2029\ufeff",Li=b("".replace),Ui=RegExp("^["+Mi+"]+"),Ni=RegExp("(^|[^"+Mi+"])["+Mi+"]+$"),Ci=function(t){return function(e){var r=Wr(j(e));return 1&t&&(r=Li(r,Ui,"")),2&t&&(r=Li(r,Ni,"$1")),r}},_i={start:Ci(1),end:Ci(2),trim:Ci(3)},Fi=Oe.f,Bi=Rt.f,Di=Ct.f,zi=_i.trim,Wi="Number",qi=i[Wi],Hi=qi.prototype,$i=i.TypeError,Ki=b("".slice),Gi=b("".charCodeAt),Vi=Ue(Wi,!qi(" 0o1")||!qi("0b1")||qi("+0x1")),Yi=function(t){var e,r=arguments.length<1?0:qi(function(t){var e=mt(t,"number");return"bigint"==typeof e?e:function(t){var e,r,n,o,i,a,u,s,c=mt(t,"number");if(G(c))throw new $i("Cannot convert a Symbol value to a number");if("string"==typeof c&&c.length>2)if(c=zi(c),43===(e=Gi(c,0))||45===e){if(88===(r=Gi(c,2))||120===r)return NaN}else if(48===e){switch(Gi(c,1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+c}for(a=(i=Ki(c,2)).length,u=0;uo)return NaN;return parseInt(i,n)}return+c}(e)}(t));return U(Hi,e=this)&&a(function(){Ti(e)})?Io(Object(r),this,Yi):r};Yi.prototype=Hi,Vi&&(Hi.constructor=Yi),Ce({global:!0,constructor:!0,wrap:!0,forced:Vi},{Number:Yi}),Vi&&function(t,e){for(var r,n=u?Fi(e):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),o=0;n.length>o;o++)ut(e,r=n[o])&&!ut(t,r)&&Di(t,r,Bi(e,r))}(Yn[Wi],qi),Ce({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{EPSILON:Math.pow(2,-52)});var Xi=i.isFinite;Ce({target:"Number",stat:!0},{isFinite:Number.isFinite||function(t){return"number"==typeof t&&Xi(t)}});var Ji=Math.floor,Qi=Number.isInteger||function(t){return!M(t)&&isFinite(t)&&Ji(t)===t};Ce({target:"Number",stat:!0},{isInteger:Qi}),Ce({target:"Number",stat:!0},{isNaN:function(t){return t!=t}});var Zi=Math.abs;Ce({target:"Number",stat:!0},{isSafeInteger:function(t){return Qi(t)&&Zi(t)<=9007199254740991}}),Ce({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991}),Ce({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MIN_SAFE_INTEGER:-9007199254740991});var ta=_i.trim,ea=b("".charAt),ra=i.parseFloat,na=i.Symbol,oa=na&&na.iterator,ia=1/ra(Mi+"-0")!=-Infinity||oa&&!a(function(){ra(Object(oa))})?function(t){var e=ta(Wr(t)),r=ra(e);return 0===r&&"-"===ea(e,0)?-0:r}:ra;Ce({target:"Number",stat:!0,forced:Number.parseFloat!==ia},{parseFloat:ia});var aa=_i.trim,ua=i.parseInt,sa=i.Symbol,ca=sa&&sa.iterator,fa=/^[+-]?0x/i,la=b(fa.exec),ha=8!==ua(Mi+"08")||22!==ua(Mi+"0x16")||ca&&!a(function(){ua(Object(ca))})?function(t,e){var r=aa(Wr(t));return ua(r,e>>>0||(la(fa,r)?16:10))}:ua;Ce({target:"Number",stat:!0,forced:Number.parseInt!==ha},{parseInt:ha});var pa=b(v.f),va=b([].push),da=u&&a(function(){var t=Object.create(null);return t[2]=2,!pa(t,2)}),ga=function(t){return function(e){for(var r,n=k(e),o=_e(n),i=da&&null===Qr(n),a=o.length,s=0,c=[];a>s;)r=o[s++],u&&!(i?r in n:pa(n,r))||va(c,t?[r,n[r]]:n[r]);return c}},ya={entries:ga(!0),values:ga(!1)},ma=ya.entries;Ce({target:"Object",stat:!0},{entries:function(t){return ma(t)}}),Ce({target:"Object",stat:!0,sham:!u},{getOwnPropertyDescriptors:function(t){for(var e,r,n=k(t),o=Rt.f,i=Pe(n),a={},u=0;i.length>u;)void 0!==(r=o(n,e=i[u++]))&&Cn(a,e,r);return a}});var ba=a(function(){_e(1)});Ce({target:"Object",stat:!0,forced:ba},{keys:function(t){return _e(it(t))}});var wa=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e};Ce({target:"Object",stat:!0},{is:wa});var Sa=ya.values;Ce({target:"Object",stat:!0},{values:function(t){return Sa(t)}}),Ce({target:"Object",stat:!0},{hasOwn:ut});var Ea=Function.prototype,Oa=Ea.apply,xa=Ea.call,Ra="object"==typeof Reflect&&Reflect.apply||(s?xa.bind(Oa):function(){return xa.apply(Oa,arguments)}),Pa=!a(function(){Reflect.apply(function(){})});Ce({target:"Reflect",stat:!0,forced:Pa},{apply:function(t,e,r){return Ra(J(t),e,kt(r))}});var Aa=Function,ja=b([].concat),ka=b([].join),Ia={},Ta=s?Aa.bind:function(t){var e=J(this),r=e.prototype,n=vo(arguments,1),o=function(){var r=ja(n,vo(arguments));return this instanceof o?function(t,e,r){if(!ut(Ia,e)){for(var n=[],o=0;ob)","g");return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")}),gs=Oe.f,ys=ne.enforce,ms=dt("match"),bs=i.RegExp,ws=bs.prototype,Ss=i.SyntaxError,Es=b(ws.exec),Os=b("".charAt),xs=b("".replace),Rs=b("".indexOf),Ps=b("".slice),As=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,js=/a/g,ks=/a/g,Is=new bs(js)!==js,Ts=cs.MISSED_STICKY,Ms=cs.UNSUPPORTED_Y,Ls=u&&(!Is||Ts||ps||ds||a(function(){return ks[ms]=!1,bs(js)!==js||bs(ks)===ks||"/a/i"!==String(bs(js,"i"))}));if(Ue("RegExp",Ls)){for(var Us=function(t,e){var r,n,o,i,a,u,s=U(ws,this),c=es(t),f=void 0===e,l=[],h=t;if(!s&&c&&f&&t.constructor===Us)return t;if((c||U(ws,t))&&(t=t.source,f&&(e=os(h))),t=void 0===t?"":Wr(t),e=void 0===e?"":Wr(e),h=t,ps&&"dotAll"in js&&(n=!!e&&Rs(e,"s")>-1)&&(e=xs(e,/s/g,"")),r=e,Ts&&"sticky"in js&&(o=!!e&&Rs(e,"y")>-1)&&Ms&&(e=xs(e,/y/g,"")),ds&&(i=function(t){for(var e,r=t.length,n=0,o="",i=[],a=Ve(null),u=!1,s=!1,c=0,f="";n<=r;n++){if("\\"===(e=Os(t,n)))e+=Os(t,++n);else if("]"===e)u=!1;else if(!u)switch(!0){case"["===e:u=!0;break;case"("===e:if(o+=e,"?:"===Ps(t,n+1,n+3))continue;Es(As,Ps(t,n+1))&&(n+=2,s=!0),c++;continue;case">"===e&&s:if(""===f||ut(a,f))throw new Ss("Invalid capture group name");a[f]=!0,i[i.length]=[f,c],s=!1,f="";continue}s?f+=e:o+=e}return[o,i]}(t),t=i[0],l=i[1]),a=Io(bs(t,e),s?this:ws,Us),(n||o||l.length)&&(u=ys(a),n&&(u.dotAll=!0,u.raw=Us(function(t){for(var e,r=t.length,n=0,o="",i=!1;n<=r;n++)"\\"!==(e=Os(t,n))?i||"."!==e?("["===e?i=!0:"]"===e&&(i=!1),o+=e):o+="[\\s\\S]":o+=e+Os(t,++n);return o}(t),r)),o&&(u.sticky=!0),l.length&&(u.groups=l)),t!==h)try{_t(a,"source",""===h?"(?:)":h)}catch(t){}return a},Ns=gs(bs),Cs=0;Ns.length>Cs;)ls(Us,bs,Ns[Cs++]);ws.constructor=Us,Us.prototype=ws,ie(i,"RegExp",Us,{constructor:!0})}Uo("RegExp");var _s=zt.PROPER,Fs="toString",Bs=RegExp.prototype,Ds=Bs[Fs];(a(function(){return"/a/b"!==Ds.call({source:"a",flags:"b"})})||_s&&Ds.name!==Fs)&&ie(Bs,Fs,function(){var t=kt(this);return"/"+Wr(t.source)+"/"+Wr(os(t))},{unsafe:!0});var zs=ne.get,Ws=RegExp.prototype,qs=TypeError;u&&ps&&so(Ws,"dotAll",{configurable:!0,get:function(){if(this!==Ws){if("RegExp"===E(this))return!!zs(this).dotAll;throw new qs("Incompatible receiver, RegExp required")}}});var Hs=ne.get,$s=nt("native-string-replace",String.prototype.replace),Ks=RegExp.prototype.exec,Gs=Ks,Vs=b("".charAt),Ys=b("".indexOf),Xs=b("".replace),Js=b("".slice),Qs=function(){var t=/a/,e=/b*/g;return f(Ks,t,"a"),f(Ks,e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),Zs=cs.BROKEN_CARET,tc=void 0!==/()??/.exec("")[1];(Qs||tc||Zs||ps||ds)&&(Gs=function(t){var e,r,n,o,i,a,u,s=this,c=Hs(s),l=Wr(t),h=c.raw;if(h)return h.lastIndex=s.lastIndex,e=f(Gs,h,l),s.lastIndex=h.lastIndex,e;var p=c.groups,v=Zs&&s.sticky,d=f(rs,s),g=s.source,y=0,m=l;if(v&&(d=Xs(d,"y",""),-1===Ys(d,"g")&&(d+="g"),m=Js(l,s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==Vs(l,s.lastIndex-1))&&(g="(?: "+g+")",m=" "+m,y++),r=new RegExp("^(?:"+g+")",d)),tc&&(r=new RegExp("^"+g+"$(?!\\s)",d)),Qs&&(n=s.lastIndex),o=f(Ks,v?r:s,m),v?o?(o.input=Js(o.input,y),o[0]=Js(o[0],y),o.index=s.lastIndex,s.lastIndex+=o[0].length):s.lastIndex=0:Qs&&o&&(s.lastIndex=s.global?o.index+o[0].length:n),tc&&o&&o.length>1&&f($s,o[0],r,function(){for(i=1;i]*>)/g,Oc=/\$([$&'`]|\d{1,2})/g,xc=function(t,e,r,n,o,i){var a=r+t.length,u=n.length,s=Oc;return void 0!==o&&(o=it(o),s=Ec),wc(i,s,function(i,s){var c;switch(bc(s,0)){case"$":return"$";case"&":return t;case"`":return Sc(e,0,r);case"'":return Sc(e,a);case"<":c=o[Sc(s,1,-1)];break;default:var f=+s;if(0===f)return i;if(f>u){var l=mc(f/10);return 0===l?i:l<=u?void 0===n[l-1]?bc(s,1):n[l-1]+bc(s,1):i}c=n[f-1]}return void 0===c?"":c})},Rc=dt("replace"),Pc=Math.max,Ac=Math.min,jc=b([].concat),kc=b([].push),Ic=b("".indexOf),Tc=b("".slice),Mc="$0"==="a".replace(/./,"$0"),Lc=!!/./[Rc]&&""===/./[Rc]("a","$0"),Uc=!a(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")});pc("replace",function(t,e,r){var n=Lc?"$":"$0";return[function(t,r){var n=j(this),o=P(t)?void 0:Q(t,Rc);return o?f(o,t,n,r):f(e,Wr(n),t,r)},function(t,o){var i=kt(this),a=Wr(t);if("string"==typeof o&&-1===Ic(o,n)&&-1===Ic(o,"$<")){var u=r(e,i,a,o);if(u.done)return u.value}var s=T(o);s||(o=Wr(o));var c,f=i.global;f&&(c=i.unicode,i.lastIndex=0);for(var l,h=[];null!==(l=yc(i,a))&&(kc(h,l),f);)""===Wr(l[0])&&(i.lastIndex=dc(a,ve(i.lastIndex),c));for(var p,v="",d=0,g=0;g=d&&(v+=Tc(a,d,b)+y,d=b+m.length)}return v+Tc(a,d)}]},!Uc||!Mc||Lc),pc("search",function(t,e,r){return[function(e){var r=j(this),n=P(e)?void 0:Q(e,t);return n?f(n,e,r):new RegExp(e)[t](Wr(r))},function(t){var n=kt(this),o=Wr(t),i=r(e,n,o);if(i.done)return i.value;var a=n.lastIndex;wa(a,0)||(n.lastIndex=0);var u=yc(n,o);return wa(n.lastIndex,a)||(n.lastIndex=a),null===u?-1:u.index}]});var Nc=dt("species"),Cc=function(t,e){var r,n=kt(t).constructor;return void 0===n||P(r=kt(n)[Nc])?e:La(r)},_c=cs.UNSUPPORTED_Y,Fc=Math.min,Bc=b([].push),Dc=b("".slice),zc=!a(function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2!==r.length||"a"!==r[0]||"b"!==r[1]}),Wc="c"==="abbc".split(/(b)*/)[1]||4!=="test".split(/(?:)/,-1).length||2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length;pc("split",function(t,e,r){var n="0".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:f(e,this,t,r)}:e;return[function(e,r){var o=j(this),i=P(e)?void 0:Q(e,t);return i?f(i,e,o,r):f(n,Wr(o),e,r)},function(t,o){var i=kt(this),a=Wr(t);if(!Wc){var u=r(n,i,a,o,n!==e);if(u.done)return u.value}var s=Cc(i,RegExp),c=i.unicode,f=new s(_c?"^(?:"+i.source+")":i,(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.unicode?"u":"")+(_c?"g":"y")),l=void 0===o?4294967295:o>>>0;if(0===l)return[];if(0===a.length)return null===yc(f,a)?[a]:[];for(var h=0,p=0,v=[];p0;(n>>>=1)&&(e+=e))1&n&&(r+=e);return r},Kc=b($c),Gc=b("".slice),Vc=Math.ceil,Yc=function(t){return function(e,r,n){var o,i,a=Wr(j(e)),u=ve(r),s=a.length,c=void 0===n?" ":Wr(n);return u<=s||""===c?a:((i=Kc(c,Vc((o=u-s)/c.length))).length>o&&(i=Gc(i,0,o)),t?a+i:i+a)}},Xc={start:Yc(!1),end:Yc(!0)},Jc=Xc.start,Qc=Array,Zc=RegExp.escape,tf=b("".charAt),ef=b("".charCodeAt),rf=b(1.1.toString),nf=b([].join),of=/^[0-9a-z]/i,af=/^[$()*+./?[\\\]^{|}]/,uf=RegExp("^[!\"#%&',\\-:;<=>@`~"+Mi+"]"),sf=b(of.exec),cf={"\t":"t","\n":"n","\v":"v","\f":"f","\r":"r"},ff=function(t){var e=rf(ef(t,0),16);return e.length<3?"\\x"+Jc(e,2,"0"):"\\u"+Jc(e,4,"0")},lf=!Zc||"\\x61b"!==Zc("ab");Ce({target:"RegExp",stat:!0,forced:lf},{escape:function(t){!function(t){if("string"==typeof t)return t;throw new qc("Argument is not a string")}(t);for(var e=t.length,r=Qc(e),n=0;n=56320||n+1>=e||56320!=(64512&ef(t,n+1))?r[n]=ff(o):(r[n]=o,r[++n]=tf(t,n))}}return nf(r,"")}}),To("Set",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Fo);var hf=Set.prototype,pf={Set:Set,add:b(hf.add),has:b(hf.has),remove:b(hf.delete),proto:hf},vf=pf.has,df=function(t){return vf(t),t},gf=pf.Set,yf=pf.proto,mf=b(yf.forEach),bf=b(yf.keys),wf=bf(new gf).next,Sf=function(t,e,r){return r?ci({iterator:bf(t),next:wf},e):mf(t,e)},Ef=pf.Set,Of=pf.add,xf=function(t){var e=new Ef;return Sf(t,function(t){Of(e,t)}),e},Rf=ln(pf.proto,"size","get")||function(t){return t.size},Pf="Invalid size",Af=RangeError,jf=TypeError,kf=Math.max,If=function(t,e){this.set=t,this.size=kf(e,0),this.has=J(t.has),this.keys=J(t.keys)};If.prototype={getIterator:function(){return{iterator:t=kt(f(this.keys,this.set)),next:t.next,done:!1};var t},includes:function(t){return f(this.has,this.set,t)}};var Tf=function(t){kt(t);var e=+t.size;if(e!=e)throw new jf(Pf);var r=ce(e);if(r<0)throw new Af(Pf);return new If(t,r)},Mf=pf.has,Lf=pf.remove,Uf=function(t){var e=df(this),r=Tf(t),n=xf(e);return Rf(e)<=r.size?Sf(e,function(t){r.includes(t)&&Lf(n,t)}):ci(r.getIterator(),function(t){Mf(e,t)&&Lf(n,t)}),n},Nf=function(t){return{size:t,has:function(){return!1},keys:function(){return{next:function(){return{done:!0}}}}}},Cf=function(t){var e=L("Set");try{(new e)[t](Nf(0));try{return(new e)[t](Nf(-1)),!1}catch(t){return!0}}catch(t){return!1}};Ce({target:"Set",proto:!0,real:!0,forced:!Cf("difference")},{difference:Uf});var _f=pf.Set,Ff=pf.add,Bf=pf.has,Df=function(t){var e=df(this),r=Tf(t),n=new _f;return Rf(e)>r.size?ci(r.getIterator(),function(t){Bf(e,t)&&Ff(n,t)}):Sf(e,function(t){r.includes(t)&&Ff(n,t)}),n},zf=!Cf("intersection")||a(function(){return"3,2"!==String(Array.from(new Set([1,2,3]).intersection(new Set([3,2]))))});Ce({target:"Set",proto:!0,real:!0,forced:zf},{intersection:Df});var Wf=pf.has,qf=function(t){var e=df(this),r=Tf(t);if(Rf(e)<=r.size)return!1!==Sf(e,function(t){if(r.includes(t))return!1},!0);var n=r.getIterator();return!1!==ci(n,function(t){if(Wf(e,t))return Tn(n,"normal",!1)})};Ce({target:"Set",proto:!0,real:!0,forced:!Cf("isDisjointFrom")},{isDisjointFrom:qf});var Hf=function(t){var e=df(this),r=Tf(t);return!(Rf(e)>r.size)&&!1!==Sf(e,function(t){if(!r.includes(t))return!1},!0)};Ce({target:"Set",proto:!0,real:!0,forced:!Cf("isSubsetOf")},{isSubsetOf:Hf});var $f=pf.has,Kf=function(t){var e=df(this),r=Tf(t);if(Rf(e)1?arguments[1]:void 0);return!1!==Sf(e,function(t){if(!r(t,t,e))return!1},!0)}});var el=dt("iterator"),rl=Object,nl=L("Set"),ol=function(t){return function(t){return M(t)&&"number"==typeof t.size&&T(t.has)&&T(t.keys)}(t)?t:function(t){if(P(t))return!1;var e=rl(t);return void 0!==e[el]||"@@iterator"in e||ut(un,pr(e))}(t)?new nl(t):t};Ce({target:"Set",proto:!0,real:!0,forced:!0},{difference:function(t){return f(Uf,this,ol(t))}});var il=pf.Set,al=pf.add;Ce({target:"Set",proto:!0,real:!0,forced:!0},{filter:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new il;return Sf(e,function(t){r(t,t,e)&&al(n,t)}),n}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{find:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=Sf(e,function(t){if(r(t,t,e))return{value:t}},!0);return n&&n.value}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{intersection:function(t){return f(Df,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{isDisjointFrom:function(t){return f(qf,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{isSubsetOf:function(t){return f(Hf,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{isSupersetOf:function(t){return f(Kf,this,ol(t))}});var ul=b([].join),sl=b([].push);Ce({target:"Set",proto:!0,real:!0,forced:!0},{join:function(t){var e=df(this),r=void 0===t?",":Wr(t),n=[];return Sf(e,function(t){sl(n,t)}),ul(n,r)}});var cl=pf.Set,fl=pf.add;Ce({target:"Set",proto:!0,real:!0,forced:!0},{map:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new cl;return Sf(e,function(t){fl(n,r(t,t,e))}),n}});var ll=TypeError;Ce({target:"Set",proto:!0,real:!0,forced:!0},{reduce:function(t){var e=df(this),r=arguments.length<2,n=r?void 0:arguments[1];if(J(t),Sf(e,function(o){r?(r=!1,n=o):n=t(n,o,o,e)}),r)throw new ll("Reduce of empty set with no initial value");return n}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{some:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0);return!0===Sf(e,function(t){if(r(t,t,e))return!0},!0)}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{symmetricDifference:function(t){return f(Xf,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{union:function(t){return f(Qf,this,ol(t))}});var hl=dt("species"),pl=dt("isConcatSpreadable"),vl=W>=51||!a(function(){var t=[];return t[pl]=!1,t.concat()[0]!==t}),dl=function(t){if(!M(t))return!1;var e=t[pl];return void 0!==e?!!e:ur(t)},gl=!(vl&&(W>=51||!a(function(){var t=[];return(t.constructor={})[hl]=function(){return{foo:1}},1!==t.concat(Boolean).foo})));Ce({target:"Array",proto:!0,arity:1,forced:gl},{concat:function(t){var e,r,n,o,i,a=it(this),u=xr(a,0),s=0;for(e=-1,n=arguments.length;e1?arguments[1]:void 0,n=e.length,o=void 0===r?n:ip(ve(r),n),i=Wr(t);return op(e,o-i.length,o)===i}}),Ze("String","endsWith");var sp=RangeError,cp=String.fromCharCode,fp=String.fromCodePoint,lp=b([].join);Ce({target:"String",stat:!0,arity:1,forced:!!fp&&1!==fp.length},{fromCodePoint:function(t){for(var e,r=[],n=arguments.length,o=0;n>o;){if(e=+arguments[o++],he(e,1114111)!==e)throw new sp(e+" is not a valid code point");r[o]=e<65536?cp(e):cp(55296+((e-=65536)>>10),e%1024+56320)}return lp(r,"")}});var hp=b("".indexOf);Ce({target:"String",proto:!0,forced:!rp("includes")},{includes:function(t){return!!~hp(Wr(j(this)),Wr(tp(t)),arguments.length>1?arguments[1]:void 0)}}),Ze("String","includes"),b(un.String);var pp=/Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(_),vp=Xc.start;Ce({target:"String",proto:!0,forced:pp},{padStart:function(t){return vp(this,t,arguments.length>1?arguments[1]:void 0)}}),Ze("String","padStart");var dp=Xc.end;Ce({target:"String",proto:!0,forced:pp},{padEnd:function(t){return dp(this,t,arguments.length>1?arguments[1]:void 0)}}),Ze("String","padEnd");var gp=b([].push),yp=b([].join);Ce({target:"String",stat:!0},{raw:function(t){var e=k(it(t).raw),r=de(e);if(!r)return"";for(var n=arguments.length,o=[],i=0;;){if(gp(o,Wr(e[i++])),i===r)return yp(o,"");i1?arguments[1]:void 0,e.length)),n=Wr(t);return bp(e,r,r+n.length)===n}}),Ze("String","startsWith");var Op=zt.PROPER,xp=function(t){return a(function(){return!!Mi[t]()||"​…᠎"!=="​…᠎"[t]()||Op&&Mi[t].name!==t})},Rp=_i.start,Pp=xp("trimStart")?function(){return Rp(this)}:"".trimStart;Ce({target:"String",proto:!0,name:"trimStart",forced:"".trimLeft!==Pp},{trimLeft:Pp}),Ce({target:"String",proto:!0,name:"trimStart",forced:"".trimStart!==Pp},{trimStart:Pp}),Ze("String","trimLeft");var Ap=_i.end,jp=xp("trimEnd")?function(){return Ap(this)}:"".trimEnd;Ce({target:"String",proto:!0,name:"trimEnd",forced:"".trimRight!==jp},{trimRight:jp}),Ce({target:"String",proto:!0,name:"trimEnd",forced:"".trimEnd!==jp},{trimEnd:jp}),Ze("String","trimRight");var kp=Object.getOwnPropertyDescriptor,Ip=function(t){if(!u)return i[t];var e=kp(i,t);return e&&e.value},Tp=dt("iterator"),Mp=!a(function(){var t=new URL("b?a=1&b=2&c=3","https://a"),e=t.searchParams,r=new URLSearchParams("a=1&a=2&b=3"),n="";return t.pathname="c%20d",e.forEach(function(t,r){e.delete("b"),n+=r+t}),r.delete("a",2),r.delete("b",void 0),!e.size&&!u||!e.sort||"https://a/c%20d?a=1&c=3"!==t.href||"3"!==e.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!e[Tp]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("https://тест").host||"#%D0%B1"!==new URL("https://a#б").hash||"a1c3"!==n||"x"!==new URL("https://x",void 0).host}),Lp=TypeError,Up=function(t,e){if(t0;)t[o]=t[--o];o!==i++&&(t[o]=n)}else for(var a=Np(r/2),u=Cp(vo(t,0,a),e),s=Cp(vo(t,a),e),c=u.length,f=s.length,l=0,h=0;l0&&0!=(t&r);r>>=1)e++;return e},pv=function(t){var e=null;switch(t.length){case 1:e=t[0];break;case 2:e=(31&t[0])<<6|63&t[1];break;case 3:e=(15&t[0])<<12|(63&t[1])<<6|63&t[2];break;case 4:e=(7&t[0])<<18|(63&t[1])<<12|(63&t[2])<<6|63&t[3]}return e>1114111?null:e},vv=function(t){for(var e=(t=nv(t,cv," ")).length,r="",n=0;ne){r+="%",n++;continue}var i=lv(t,n+1);if(i!=i){r+=o,n++;continue}n+=2;var a=hv(i);if(0===a)o=Jp(i);else{if(1===a||a>4){r+="�",n++;continue}for(var u=[i],s=1;se||"%"!==tv(t,n));){var c=lv(t,n+1);if(c!=c){n+=3;break}if(c>191||c<128)break;rv(u,c),n+=2,s++}if(u.length!==a){r+="�";continue}var f=pv(u);null===f?r+="�":o=Qp(f)}}r+=o,n++}return r},dv=/[!'()~]|%20/g,gv={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},yv=function(t){return gv[t]},mv=function(t){return nv(Xp(t),dv,yv)},bv=fn(function(t,e){zp(this,{type:Dp,target:Wp(t).entries,index:0,kind:e})},Bp,function(){var t=qp(this),e=t.target,r=t.index++;if(!e||r>=e.length)return t.target=null,Pn(void 0,!0);var n=e[r];switch(t.kind){case"keys":return Pn(n.key,!1);case"values":return Pn(n.value,!1)}return Pn([n.key,n.value],!1)},!0),wv=function(t){this.entries=[],this.url=null,void 0!==t&&(M(t)?this.parseObject(t):this.parseQuery("string"==typeof t?"?"===tv(t,0)?uv(t,1):t:Wr(t)))};wv.prototype={type:Bp,bindURL:function(t){this.url=t,this.update()},parseObject:function(t){var e,r,n,o,i,a,u,s=this.entries,c=Fn(t);if(c)for(r=(e=Dn(t,c)).next;!(n=f(r,e)).done;){if(o=Dn(kt(n.value)),(a=f(i=o.next,o)).done||(u=f(i,o)).done||!f(i,o).done)throw new Yp("Expected sequence with length 2");rv(s,{key:Wr(a.value),value:Wr(u.value)})}else for(var l in t)ut(t,l)&&rv(s,{key:l,value:Wr(t[l])})},parseQuery:function(t){if(t)for(var e,r,n=this.entries,o=av(t,"&"),i=0;i0?arguments[0]:void 0));u||(this.size=t.entries.length)},Ev=Sv.prototype;if(Mo(Ev,{append:function(t,e){var r=Wp(this);Up(arguments.length,2),rv(r.entries,{key:Wr(t),value:Wr(e)}),u||this.length++,r.updateURL()},delete:function(t){for(var e=Wp(this),r=Up(arguments.length,1),n=e.entries,o=Wr(t),i=r<2?void 0:arguments[1],a=void 0===i?i:Wr(i),s=0;se.key?1:-1}),t.updateURL()},forEach:function(t){for(var e,r=Wp(this).entries,n=ar(t,arguments.length>1?arguments[1]:void 0),o=0;o1?Rv(arguments[1]):{})}}),T($p)){var Pv=function(t){return ko(this,Gp),new $p(t,arguments.length>1?Rv(arguments[1]):{})};Gp.constructor=Pv,Pv.prototype=Gp,Ce({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Pv})}}var Av={URLSearchParams:Sv,getState:Wp},jv=URLSearchParams,kv=jv.prototype,Iv=b(kv.append),Tv=b(kv.delete),Mv=b(kv.forEach),Lv=b([].push),Uv=new jv("a=1&a=2&b=3");Uv.delete("a",1),Uv.delete("b",void 0),Uv+""!="a=2"&&ie(kv,"delete",function(t){var e=arguments.length,r=e<2?void 0:arguments[1];if(e&&void 0===r)return Tv(this,t);var n=[];Mv(this,function(t,e){Lv(n,{key:e,value:t})}),Up(e,1);for(var o,i=Wr(t),a=Wr(r),u=0,s=0,c=!1,f=n.length;uo;)for(var s,c=R(arguments[o++]),l=i?$v(_e(c),i(c)):_e(c),h=l.length,p=0;h>p;)s=l[p++],u&&!f(a,c,s)||(r[s]=c[s]);return r}:qv,Gv=2147483647,Vv=/[^\0-\u007E]/,Yv=/[.\u3002\uFF0E\uFF61]/g,Xv="Overflow: input needs wider integers to process",Jv=RangeError,Qv=b(Yv.exec),Zv=Math.floor,td=String.fromCharCode,ed=b("".charCodeAt),rd=b([].join),nd=b([].push),od=b("".replace),id=b("".split),ad=b("".toLowerCase),ud=function(t){return t+22+75*(t<26)},sd=function(t,e,r){var n=0;for(t=r?Zv(t/700):t>>1,t+=Zv(t/e);t>455;)t=Zv(t/35),n+=36;return Zv(n+36*t/(t+38))},cd=function(t){var e=[];t=function(t){for(var e=[],r=0,n=t.length;r=55296&&o<=56319&&r=i&&nZv((Gv-a)/l))throw new Jv(Xv);for(a+=(f-i)*l,i=f,r=0;rGv)throw new Jv(Xv);if(n===i){for(var h=a,p=36;;){var v=p<=u?1:p>=u+26?26:p-u;if(h?@[\\\]^|]/,qd=/[\0\t\n\r #/:<>?@[\\\]^|]/,Hd=/^[\u0000-\u0020]+/,$d=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,Kd=/[\t\n\r]/g,Gd=function(t){var e,r,n,o;if("number"==typeof t){for(e=[],r=0;r<4;r++)Td(e,t%256),t=md(t/256);return Ed(e,".")}if("object"==typeof t){for(e="",n=function(t){for(var e=null,r=1,n=null,o=0,i=0;i<8;i++)0!==t[i]?(o>r&&(e=n,r=o),n=null,o=0):(null===n&&(n=i),++o);return o>r?n:e}(t),r=0;r<8;r++)o&&0===t[r]||(o&&(o=!1),n===r?(e+=r?":":"::",o=!0):(e+=Od(t[r],16),r<7&&(e+=":")));return"["+e+"]"}return t},Vd={},Yd=Kv({},Vd,{" ":1,'"':1,"<":1,">":1,"`":1}),Xd=Kv({},Yd,{"#":1,"?":1,"{":1,"}":1}),Jd=Kv({},Xd,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Qd=function(t,e){var r=fd(t,0);return r>32&&r<127&&!ut(e,t)?t:encodeURIComponent(t)},Zd={ftp:21,file:null,http:80,https:443,ws:80,wss:443},tg=function(t,e){var r;return 2===t.length&&Sd(Nd,wd(t,0))&&(":"===(r=wd(t,1))||!e&&"|"===r)},eg=function(t){var e;return t.length>1&&tg(kd(t,0,2))&&(2===t.length||"/"===(e=wd(t,2))||"\\"===e||"?"===e||"#"===e)},rg=function(t){return"."===t||"%2e"===Id(t)},ng={},og={},ig={},ag={},ug={},sg={},cg={},fg={},lg={},hg={},pg={},vg={},dg={},gg={},yg={},mg={},bg={},wg={},Sg={},Eg={},Og={},xg=function(t,e,r){var n,o,i,a=Wr(t);if(e){if(o=this.parse(a))throw new gd(o);this.searchParams=null}else{if(void 0!==r&&(n=new xg(r,!0)),o=this.parse(a,null,n))throw new gd(o);(i=vd(new pd)).bindURL(this),this.searchParams=i}};xg.prototype={type:"URL",parse:function(t,e,r){var n,o,i,a,u,s=this,c=e||ng,f=0,l="",h=!1,p=!1,v=!1;for(t=Wr(t),e||(s.scheme="",s.username="",s.password="",s.host=null,s.port=null,s.path=[],s.query=null,s.fragment=null,s.cannotBeABaseURL=!1,t=Pd(t,Hd,""),t=Pd(t,$d,"$1")),t=Pd(t,Kd,""),n=Wn(t);f<=n.length;){switch(o=n[f],c){case ng:if(!o||!Sd(Nd,o)){if(e)return Md;c=ig;continue}l+=Id(o),c=og;break;case og:if(o&&(Sd(Cd,o)||"+"===o||"-"===o||"."===o))l+=Id(o);else{if(":"!==o){if(e)return Md;l="",c=ig,f=0;continue}if(e&&(s.isSpecial()!==ut(Zd,l)||"file"===l&&(s.includesCredentials()||null!==s.port)||"file"===s.scheme&&!s.host))return;if(s.scheme=l,e)return void(s.isSpecial()&&Zd[s.scheme]===s.port&&(s.port=null));l="","file"===s.scheme?c=gg:s.isSpecial()&&r&&r.scheme===s.scheme?c=ag:s.isSpecial()?c=fg:"/"===n[f+1]?(c=ug,f++):(s.cannotBeABaseURL=!0,Rd(s.path,""),c=Sg)}break;case ig:if(!r||r.cannotBeABaseURL&&"#"!==o)return Md;if(r.cannotBeABaseURL&&"#"===o){s.scheme=r.scheme,s.path=vo(r.path),s.query=r.query,s.fragment="",s.cannotBeABaseURL=!0,c=Og;break}c="file"===r.scheme?gg:sg;continue;case ag:if("/"!==o||"/"!==n[f+1]){c=sg;continue}c=lg,f++;break;case ug:if("/"===o){c=hg;break}c=wg;continue;case sg:if(s.scheme=r.scheme,o===Wv)s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query=r.query;else if("/"===o||"\\"===o&&s.isSpecial())c=cg;else if("?"===o)s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query="",c=Eg;else{if("#"!==o){s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.path.length--,c=wg;continue}s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query=r.query,s.fragment="",c=Og}break;case cg:if(!s.isSpecial()||"/"!==o&&"\\"!==o){if("/"!==o){s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,c=wg;continue}c=hg}else c=lg;break;case fg:if(c=lg,"/"!==o||"/"!==wd(l,f+1))continue;f++;break;case lg:if("/"!==o&&"\\"!==o){c=hg;continue}break;case hg:if("@"===o){h&&(l="%40"+l),h=!0,i=Wn(l);for(var d=0;d65535)return Ud;s.port=s.isSpecial()&&m===Zd[s.scheme]?null:m,l=""}if(e)return;c=bg;continue}return Ud}l+=o;break;case gg:if(s.scheme="file","/"===o||"\\"===o)c=yg;else{if(!r||"file"!==r.scheme){c=wg;continue}switch(o){case Wv:s.host=r.host,s.path=vo(r.path),s.query=r.query;break;case"?":s.host=r.host,s.path=vo(r.path),s.query="",c=Eg;break;case"#":s.host=r.host,s.path=vo(r.path),s.query=r.query,s.fragment="",c=Og;break;default:eg(Ed(vo(n,f),""))||(s.host=r.host,s.path=vo(r.path),s.shortenPath()),c=wg;continue}}break;case yg:if("/"===o||"\\"===o){c=mg;break}r&&"file"===r.scheme&&!eg(Ed(vo(n,f),""))&&(tg(r.path[0],!0)?Rd(s.path,r.path[0]):s.host=r.host),c=wg;continue;case mg:if(o===Wv||"/"===o||"\\"===o||"?"===o||"#"===o){if(!e&&tg(l))c=wg;else if(""===l){if(s.host="",e)return;c=bg}else{if(a=s.parseHost(l))return a;if("localhost"===s.host&&(s.host=""),e)return;l="",c=bg}continue}l+=o;break;case bg:if(s.isSpecial()){if(c=wg,"/"!==o&&"\\"!==o)continue}else if(e||"?"!==o)if(e||"#"!==o){if(o!==Wv&&(c=wg,"/"!==o))continue}else s.fragment="",c=Og;else s.query="",c=Eg;break;case wg:if(o===Wv||"/"===o||"\\"===o&&s.isSpecial()||!e&&("?"===o||"#"===o)){if(".."===(u=Id(u=l))||"%2e."===u||".%2e"===u||"%2e%2e"===u?(s.shortenPath(),"/"===o||"\\"===o&&s.isSpecial()||Rd(s.path,"")):rg(l)?"/"===o||"\\"===o&&s.isSpecial()||Rd(s.path,""):("file"===s.scheme&&!s.path.length&&tg(l)&&(s.host&&(s.host=""),l=wd(l,0)+":"),Rd(s.path,l)),l="","file"===s.scheme&&(o===Wv||"?"===o||"#"===o))for(;s.path.length>1&&""===s.path[0];)Ad(s.path);"?"===o?(s.query="",c=Eg):"#"===o&&(s.fragment="",c=Og)}else l+=Qd(o,Xd);break;case Sg:"?"===o?(s.query="",c=Eg):"#"===o?(s.fragment="",c=Og):o!==Wv&&(s.path[0]+=Qd(o,Vd));break;case Eg:e||"#"!==o?o!==Wv&&("'"===o&&s.isSpecial()?s.query+="%27":s.query+="#"===o?"%23":Qd(o,Vd)):(s.fragment="",c=Og);break;case Og:o!==Wv&&(s.fragment+=Qd(o,Yd))}f++}},parseHost:function(t){var e,r,n;if("["===wd(t,0)){if("]"!==wd(t,t.length-1))return Ld;if(e=function(t){var e,r,n,o,i,a,u,s=[0,0,0,0,0,0,0,0],c=0,f=null,l=0,h=function(){return wd(t,l)};if(":"===h()){if(":"!==wd(t,1))return;l+=2,f=++c}for(;h();){if(8===c)return;if(":"!==h()){for(e=r=0;r<4&&Sd(zd,h());)e=16*e+yd(h(),16),l++,r++;if("."===h()){if(0===r)return;if(l-=r,c>6)return;for(n=0;h();){if(o=null,n>0){if(!("."===h()&&n<4))return;l++}if(!Sd(_d,h()))return;for(;Sd(_d,h());){if(i=yd(h(),10),null===o)o=i;else{if(0===o)return;o=10*o+i}if(o>255)return;l++}s[c]=256*s[c]+o,2!=++n&&4!==n||c++}if(4!==n)return;break}if(":"===h()){if(l++,!h())return}else if(h())return;s[c++]=e}else{if(null!==f)return;l++,f=++c}}if(null!==f)for(a=c-f,c=7;0!==c&&a>0;)u=s[c],s[c--]=s[f+a-1],s[f+--a]=u;else if(8!==c)return;return s}(kd(t,1,-1)),!e)return Ld;this.host=e}else if(this.isSpecial()){if(t=function(t){var e,r,n=[],o=id(od(ad(t),Yv,"."),".");for(e=0;e4)return t;for(r=[],n=0;n1&&"0"===wd(o,0)&&(i=Sd(Fd,o)?16:8,o=kd(o,8===i?1:2)),""===o)a=0;else{if(!Sd(10===i?Dd:8===i?Bd:zd,o))return t;a=yd(o,i)}Rd(r,a)}for(n=0;n=bd(256,5-e))return null}else if(a>255)return null;for(u=xd(r),n=0;n1?arguments[1]:void 0,n=ld(e,new xg(t,!1,r));u||(e.href=n.serialize(),e.origin=n.getOrigin(),e.protocol=n.getProtocol(),e.username=n.getUsername(),e.password=n.getPassword(),e.host=n.getHost(),e.hostname=n.getHostname(),e.port=n.getPort(),e.pathname=n.getPathname(),e.search=n.getSearch(),e.searchParams=n.getSearchParams(),e.hash=n.getHash())},Pg=Rg.prototype,Ag=function(t,e){return{get:function(){return hd(this)[t]()},set:e&&function(t){return hd(this)[e](t)},configurable:!0,enumerable:!0}};if(u&&(so(Pg,"href",Ag("serialize","setHref")),so(Pg,"origin",Ag("getOrigin")),so(Pg,"protocol",Ag("getProtocol","setProtocol")),so(Pg,"username",Ag("getUsername","setUsername")),so(Pg,"password",Ag("getPassword","setPassword")),so(Pg,"host",Ag("getHost","setHost")),so(Pg,"hostname",Ag("getHostname","setHostname")),so(Pg,"port",Ag("getPort","setPort")),so(Pg,"pathname",Ag("getPathname","setPathname")),so(Pg,"search",Ag("getSearch","setSearch")),so(Pg,"searchParams",Ag("getSearchParams")),so(Pg,"hash",Ag("getHash","setHash"))),ie(Pg,"toJSON",function(){return hd(this).serialize()},{enumerable:!0}),ie(Pg,"toString",function(){return hd(this).serialize()},{enumerable:!0}),dd){var jg=dd.createObjectURL,kg=dd.revokeObjectURL;jg&&ie(Rg,"createObjectURL",ar(jg,dd)),kg&&ie(Rg,"revokeObjectURL",ar(kg,dd))}an(Rg,"URL"),Ce({global:!0,constructor:!0,forced:!Mp,sham:!u},{URL:Rg});var Ig=L("URL"),Tg=Mp&&a(function(){Ig.canParse()}),Mg=a(function(){return 1!==Ig.canParse.length});Ce({target:"URL",stat:!0,forced:!Tg||Mg},{canParse:function(t){var e=Up(arguments.length,1),r=Wr(t),n=e<2||void 0===arguments[1]?void 0:Wr(arguments[1]);try{return!!new Ig(r,n)}catch(t){return!1}}});var Lg=L("URL");Ce({target:"URL",stat:!0,forced:!Mp},{parse:function(t){var e=Up(arguments.length,1),r=Wr(t),n=e<2||void 0===arguments[1]?void 0:Wr(arguments[1]);try{return new Lg(r,n)}catch(t){return null}}}),Ce({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return f(URL.prototype.toString,this)}});var Ug=WeakMap.prototype,Ng={WeakMap:WeakMap,set:b(Ug.set),get:b(Ug.get),has:b(Ug.has),remove:b(Ug.delete)},Cg=Ng.has,_g=function(t){return Cg(t),t},Fg=Ng.get,Bg=Ng.has,Dg=Ng.set;Ce({target:"WeakMap",proto:!0,real:!0,forced:!0},{emplace:function(t,e){var r,n,o=_g(this);return Bg(o,t)?(r=Fg(o,t),"update"in e&&(r=e.update(r,t,o),Dg(o,t,r)),r):(n=e.insert(t,o),Dg(o,t,n),n)}}),Ce({target:"WeakMap",stat:!0,forced:!0},{from:ei(Ng.WeakMap,Ng.set,!0)}),Ce({target:"WeakMap",stat:!0,forced:!0},{of:ri(Ng.WeakMap,Ng.set,!0)});var zg=Ng.remove;Ce({target:"WeakMap",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=_g(this),r=!0,n=0,o=arguments.length;n2&&(n=r,M(o=arguments[2])&&"cause"in o&&_t(n,"cause",o.cause));var s=[];return Ao(t,ny,{that:s}),_t(r,"errors",s),r};dn?dn(oy,ry):Ae(oy,ry,{name:!0});var iy=oy.prototype=Ve(ry.prototype,{constructor:d(1,oy),message:d(1,""),name:d(1,"AggregateError")});Ce({global:!0,constructor:!0,arity:2},{AggregateError:oy});var ay,uy,sy,cy,fy=function(t){return _.slice(0,t.length)===t},ly=fy("Bun/")?"BUN":fy("Cloudflare-Workers")?"CLOUDFLARE":fy("Deno/")?"DENO":fy("Node.js/")?"NODE":i.Bun&&"string"==typeof Bun.version?"BUN":i.Deno&&"object"==typeof Deno.version?"DENO":"process"===E(i.process)?"NODE":i.window&&i.document?"BROWSER":"REST",hy="NODE"===ly,py=/(?:ipad|iphone|ipod).*applewebkit/i.test(_),vy=i.setImmediate,dy=i.clearImmediate,gy=i.process,yy=i.Dispatch,my=i.Function,by=i.MessageChannel,wy=i.String,Sy=0,Ey={},Oy="onreadystatechange";a(function(){ay=i.location});var xy=function(t){if(ut(Ey,t)){var e=Ey[t];delete Ey[t],e()}},Ry=function(t){return function(){xy(t)}},Py=function(t){xy(t.data)},Ay=function(t){i.postMessage(wy(t),ay.protocol+"//"+ay.host)};vy&&dy||(vy=function(t){Up(arguments.length,1);var e=T(t)?t:my(t),r=vo(arguments,1);return Ey[++Sy]=function(){Ra(e,void 0,r)},uy(Sy),Sy},dy=function(t){delete Ey[t]},hy?uy=function(t){gy.nextTick(Ry(t))}:yy&&yy.now?uy=function(t){yy.now(Ry(t))}:by&&!py?(cy=(sy=new by).port2,sy.port1.onmessage=Py,uy=ar(cy.postMessage,cy)):i.addEventListener&&T(i.postMessage)&&!i.importScripts&&ay&&"file:"!==ay.protocol&&!a(Ay)?(uy=Ay,i.addEventListener("message",Py,!1)):uy=Oy in Et("script")?function(t){De.appendChild(Et("script"))[Oy]=function(){De.removeChild(this),xy(t)}}:function(t){setTimeout(Ry(t),0)});var jy={set:vy,clear:dy},ky=function(){this.head=null,this.tail=null};ky.prototype={add:function(t){var e={item:t,next:null},r=this.tail;r?r.next=e:this.head=e,this.tail=e},get:function(){var t=this.head;if(t)return null===(this.head=t.next)&&(this.tail=null),t.item}};var Iy,Ty,My,Ly,Uy,Ny=ky,Cy=/ipad|iphone|ipod/i.test(_)&&"undefined"!=typeof Pebble,_y=/web0s(?!.*chrome)/i.test(_),Fy=jy.set,By=i.MutationObserver||i.WebKitMutationObserver,Dy=i.document,zy=i.process,Wy=i.Promise,qy=Ip("queueMicrotask");if(!qy){var Hy=new Ny,$y=function(){var t,e;for(hy&&(t=zy.domain)&&t.exit();e=Hy.get();)try{e()}catch(t){throw Hy.head&&Iy(),t}t&&t.enter()};py||hy||_y||!By||!Dy?!Cy&&Wy&&Wy.resolve?((Ly=Wy.resolve(void 0)).constructor=Wy,Uy=ar(Ly.then,Ly),Iy=function(){Uy($y)}):hy?Iy=function(){zy.nextTick($y)}:(Fy=ar(Fy,i),Iy=function(){Fy($y)}):(Ty=!0,My=Dy.createTextNode(""),new By($y).observe(My,{characterData:!0}),Iy=function(){My.data=Ty=!Ty}),qy=function(t){Hy.head||Iy(),Hy.add(t)}}var Ky,Gy,Vy,Yy=qy,Xy=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}},Jy=i.Promise,Qy=dt("species"),Zy=!1,tm=T(i.PromiseRejectionEvent),em=Ue("Promise",function(){var t=Kt(Jy),e=t!==String(Jy);if(!e&&66===W)return!0;if(!W||W<51||!/native code/.test(t)){var r=new Jy(function(t){t(1)}),n=function(t){t(function(){},function(){})};if((r.constructor={})[Qy]=n,!(Zy=r.then(function(){})instanceof n))return!0}return!(e||"BROWSER"!==ly&&"DENO"!==ly||tm)}),rm={CONSTRUCTOR:em,REJECTION_EVENT:tm,SUBCLASSING:Zy},nm=TypeError,om=function(t){var e,r;this.promise=new t(function(t,n){if(void 0!==e||void 0!==r)throw new nm("Bad Promise constructor");e=t,r=n}),this.resolve=J(e),this.reject=J(r)},im={f:function(t){return new om(t)}},am=jy.set,um="Promise",sm=rm.CONSTRUCTOR,cm=rm.REJECTION_EVENT,fm=rm.SUBCLASSING,lm=ne.getterFor(um),hm=ne.set,pm=Jy&&Jy.prototype,vm=Jy,dm=pm,gm=i.TypeError,ym=i.document,mm=i.process,bm=im.f,wm=bm,Sm=!!(ym&&ym.createEvent&&i.dispatchEvent),Em="unhandledrejection",Om=function(t){var e;return!(!M(t)||!T(e=t.then))&&e},xm=function(t,e){var r,n,o,i=e.value,a=1===e.state,u=a?t.ok:t.fail,s=t.resolve,c=t.reject,l=t.domain;try{u?(a||(2===e.rejection&&km(e),e.rejection=1),!0===u?r=i:(l&&l.enter(),r=u(i),l&&(l.exit(),o=!0)),r===t.promise?c(new gm("Promise-chain cycle")):(n=Om(r))?f(n,r,s,c):s(r)):c(i)}catch(t){l&&!o&&l.exit(),c(t)}},Rm=function(t,e){t.notified||(t.notified=!0,Yy(function(){for(var r,n=t.reactions;r=n.get();)xm(r,t);t.notified=!1,e&&!t.rejection&&Am(t)}))},Pm=function(t,e,r){var n,o;Sm?((n=ym.createEvent("Event")).promise=e,n.reason=r,n.initEvent(t,!1,!0),i.dispatchEvent(n)):n={promise:e,reason:r},!cm&&(o=i["on"+t])?o(n):t===Em&&function(t,e){try{1===arguments.length?console.error(t):console.error(t,e)}catch(t){}}("Unhandled promise rejection",r)},Am=function(t){f(am,i,function(){var e,r=t.facade,n=t.value;if(jm(t)&&(e=Xy(function(){hy?mm.emit("unhandledRejection",n,r):Pm(Em,r,n)}),t.rejection=hy||jm(t)?2:1,e.error))throw e.value})},jm=function(t){return 1!==t.rejection&&!t.parent},km=function(t){f(am,i,function(){var e=t.facade;hy?mm.emit("rejectionHandled",e):Pm("rejectionhandled",e,t.value)})},Im=function(t,e,r){return function(n){t(e,n,r)}},Tm=function(t,e,r){t.done||(t.done=!0,r&&(t=r),t.value=e,t.state=2,Rm(t,!0))},Mm=function(t,e,r){if(!t.done){t.done=!0,r&&(t=r);try{if(t.facade===e)throw new gm("Promise can't be resolved itself");var n=Om(e);n?Yy(function(){var r={done:!1};try{f(n,e,Im(Mm,r,t),Im(Tm,r,t))}catch(e){Tm(r,e,t)}}):(t.value=e,t.state=1,Rm(t,!1))}catch(e){Tm({done:!1},e,t)}}};if(sm&&(vm=function(t){ko(this,dm),J(t),f(Ky,this);var e=lm(this);try{t(Im(Mm,e),Im(Tm,e))}catch(t){Tm(e,t)}},(Ky=function(t){hm(this,{type:um,done:!1,notified:!1,parent:!1,reactions:new Ny,rejection:!1,state:0,value:null})}).prototype=ie(dm=vm.prototype,"then",function(t,e){var r=lm(this),n=bm(Cc(this,vm));return r.parent=!0,n.ok=!T(t)||t,n.fail=T(e)&&e,n.domain=hy?mm.domain:void 0,0===r.state?r.reactions.add(n):Yy(function(){xm(n,r)}),n.promise}),Gy=function(){var t=new Ky,e=lm(t);this.promise=t,this.resolve=Im(Mm,e),this.reject=Im(Tm,e)},im.f=bm=function(t){return t===vm||void 0===t?new Gy(t):wm(t)},T(Jy)&&pm!==Object.prototype)){Vy=pm.then,fm||ie(pm,"then",function(t,e){var r=this;return new vm(function(t,e){f(Vy,r,t,e)}).then(t,e)},{unsafe:!0});try{delete pm.constructor}catch(t){}dn&&dn(pm,dm)}Ce({global:!0,constructor:!0,wrap:!0,forced:sm},{Promise:vm}),an(vm,um,!1),Uo(um);var Lm=rm.CONSTRUCTOR||!Gn(function(t){Jy.all(t).then(void 0,function(){})});Ce({target:"Promise",stat:!0,forced:Lm},{all:function(t){var e=this,r=im.f(e),n=r.resolve,o=r.reject,i=Xy(function(){var r=J(e.resolve),i=[],a=0,u=1;Ao(t,function(t){var s=a++,c=!1;u++,f(r,e,t).then(function(t){c||(c=!0,i[s]=t,--u||n(i))},o)}),--u||n(i)});return i.error&&o(i.value),r.promise}});var Um=Jy&&Jy.prototype;if(Ce({target:"Promise",proto:!0,forced:rm.CONSTRUCTOR,real:!0},{catch:function(t){return this.then(void 0,t)}}),T(Jy)){var Nm=L("Promise").prototype.catch;Um.catch!==Nm&&ie(Um,"catch",Nm,{unsafe:!0})}Ce({target:"Promise",stat:!0,forced:Lm},{race:function(t){var e=this,r=im.f(e),n=r.reject,o=Xy(function(){var o=J(e.resolve);Ao(t,function(t){f(o,e,t).then(r.resolve,n)})});return o.error&&n(o.value),r.promise}}),Ce({target:"Promise",stat:!0,forced:rm.CONSTRUCTOR},{reject:function(t){var e=im.f(this);return(0,e.reject)(t),e.promise}});var Cm=function(t,e){if(kt(t),M(e)&&e.constructor===t)return e;var r=im.f(t);return(0,r.resolve)(e),r.promise};Ce({target:"Promise",stat:!0,forced:rm.CONSTRUCTOR},{resolve:function(t){return Cm(this,t)}}),Ce({target:"Promise",stat:!0,forced:Lm},{allSettled:function(t){var e=this,r=im.f(e),n=r.resolve,o=r.reject,i=Xy(function(){var r=J(e.resolve),o=[],i=0,a=1;Ao(t,function(t){var u=i++,s=!1;a++,f(r,e,t).then(function(t){s||(s=!0,o[u]={status:"fulfilled",value:t},--a||n(o))},function(t){s||(s=!0,o[u]={status:"rejected",reason:t},--a||n(o))})}),--a||n(o)});return i.error&&o(i.value),r.promise}});var _m="No one promise resolved";Ce({target:"Promise",stat:!0,forced:Lm},{any:function(t){var e=this,r=L("AggregateError"),n=im.f(e),o=n.resolve,i=n.reject,a=Xy(function(){var n=J(e.resolve),a=[],u=0,s=1,c=!1;Ao(t,function(t){var l=u++,h=!1;s++,f(n,e,t).then(function(t){h||c||(c=!0,o(t))},function(t){h||c||(h=!0,a[l]=t,--s||i(new r(a,_m)))})}),--s||i(new r(a,_m))});return a.error&&i(a.value),n.promise}}),Ce({target:"Promise",stat:!0},{withResolvers:function(){var t=im.f(this);return{promise:t.promise,resolve:t.resolve,reject:t.reject}}});var Fm=Jy&&Jy.prototype,Bm=!!Jy&&a(function(){Fm.finally.call({then:function(){}},function(){})});if(Ce({target:"Promise",proto:!0,real:!0,forced:Bm},{finally:function(t){var e=Cc(this,L("Promise")),r=T(t);return this.then(r?function(r){return Cm(e,t()).then(function(){return r})}:t,r?function(r){return Cm(e,t()).then(function(){throw r})}:t)}}),T(Jy)){var Dm=L("Promise").prototype.finally;Fm.finally!==Dm&&ie(Fm,"finally",Dm,{unsafe:!0})}var zm=i.Promise,Wm=!1,qm=!zm||!zm.try||Xy(function(){zm.try(function(t){Wm=8===t},8)}).error||!Wm;Ce({target:"Promise",stat:!0,forced:qm},{try:function(t){var e=arguments.length>1?vo(arguments,1):[],r=im.f(this),n=Xy(function(){return Ra(J(t),void 0,e)});return(n.error?r.reject:r.resolve)(n.value),r.promise}}),Ze("Promise","finally");var Hm="URLSearchParams"in self,$m="Symbol"in self&&"iterator"in Symbol,Km="FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(t){return!1}}(),Gm="FormData"in self,Vm="ArrayBuffer"in self;if(Vm)var Ym=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],Xm=ArrayBuffer.isView||function(t){return t&&Ym.indexOf(Object.prototype.toString.call(t))>-1};function Jm(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function Qm(t){return"string"!=typeof t&&(t=String(t)),t}function Zm(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return $m&&(e[Symbol.iterator]=function(){return e}),e}function tb(t){this.map={},t instanceof tb?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function eb(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function rb(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function nb(t){var e=new FileReader,r=rb(e);return e.readAsArrayBuffer(t),r}function ob(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function ib(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:Km&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:Gm&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:Hm&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():Vm&&Km&&(e=t)&&DataView.prototype.isPrototypeOf(e)?(this._bodyArrayBuffer=ob(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):Vm&&(ArrayBuffer.prototype.isPrototypeOf(t)||Xm(t))?this._bodyArrayBuffer=ob(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):Hm&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},Km&&(this.blob=function(){var t=eb(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?eb(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(nb)}),this.text=function(){var t=eb(this);if(t)return t;if(this._bodyBlob)return function(t){var e=new FileReader,r=rb(e);return e.readAsText(t),r}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?e:t}(e.method||this.method||"GET"),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&r)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(r)}function sb(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function cb(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new tb(e.headers),this.url=e.url||"",this._initBody(t)}ub.prototype.clone=function(){return new ub(this,{body:this._bodyInit})},ib.call(ub.prototype),ib.call(cb.prototype),cb.prototype.clone=function(){return new cb(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new tb(this.headers),url:this.url})},cb.error=function(){var t=new cb(null,{status:0,statusText:""});return t.type="error",t};var fb=[301,302,303,307,308];cb.redirect=function(t,e){if(-1===fb.indexOf(e))throw new RangeError("Invalid status code");return new cb(null,{status:e,headers:{location:t}})};var lb=self.DOMException;try{new lb}catch(t){(lb=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),lb.prototype.constructor=lb}function hb(t,e){return new Promise(function(r,n){var o=new ub(t,e);if(o.signal&&o.signal.aborted)return n(new lb("Aborted","AbortError"));var i=new XMLHttpRequest;function a(){i.abort()}i.onload=function(){var t,e,n={status:i.status,statusText:i.statusText,headers:(t=i.getAllResponseHeaders()||"",e=new tb,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();e.append(n,o)}}),e)};n.url="responseURL"in i?i.responseURL:n.headers.get("X-Request-URL"),r(new cb("response"in i?i.response:i.responseText,n))},i.onerror=function(){n(new TypeError("Network request failed"))},i.ontimeout=function(){n(new TypeError("Network request failed"))},i.onabort=function(){n(new lb("Aborted","AbortError"))},i.open(o.method,o.url,!0),"include"===o.credentials?i.withCredentials=!0:"omit"===o.credentials&&(i.withCredentials=!1),"responseType"in i&&Km&&(i.responseType="blob"),o.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),o.signal&&(o.signal.addEventListener("abort",a),i.onreadystatechange=function(){4===i.readyState&&o.signal.removeEventListener("abort",a)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})}hb.polyfill=!0,self.fetch||(self.fetch=hb,self.Headers=tb,self.Request=ub,self.Response=cb);var pb=Object.getOwnPropertySymbols,vb=Object.prototype.hasOwnProperty,db=Object.prototype.propertyIsEnumerable,gb=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(t){n[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r,n,o=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),i=1;i{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"InvariantError",{enumerable:!0,get:function(){return n}});class n extends Error{constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is a bug in Next.js.`,t),this.name="InvariantError"}}},55682,(e,t,r)=>{"use strict";r._=function(e){return e&&e.__esModule?e:{default:e}}},32061,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={BailoutToCSRError:function(){return a},isBailoutToCSRError:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="BAILOUT_TO_CLIENT_SIDE_RENDERING";class a extends Error{constructor(e){super(`Bail out to client-side rendering: ${e}`),this.reason=e,this.digest=u}}function i(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===u}},64893,(e,t,r)=>{"use strict";var n=e.r(74080),o={stream:!0},u=Object.prototype.hasOwnProperty;function a(t){var r=e.r(t);return"function"!=typeof r.then||"fulfilled"===r.status?null:(r.then(function(e){r.status="fulfilled",r.value=e},function(e){r.status="rejected",r.reason=e}),r)}var i=new WeakSet,l=new WeakSet;function s(){}function c(t){for(var r=t[1],n=[],o=0;of||35===f||114===f||120===f?(p=f,f=3,s++):(p=0,f=3);continue;case 2:44===(b=l[s++])?f=4:h=h<<4|(96l.length&&(b=-1)}var g=l.byteOffset+s;if(-1{"use strict";t.exports=e.r(64893)},35326,(e,t,r)=>{"use strict";t.exports=e.r(21413)},54394,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HTTPAccessErrorStatus:function(){return u},HTTP_ERROR_FALLBACK_ERROR_CODE:function(){return i},getAccessFallbackErrorTypeByStatus:function(){return c},getAccessFallbackHTTPStatus:function(){return s},isHTTPAccessFallbackError:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u={NOT_FOUND:404,FORBIDDEN:403,UNAUTHORIZED:401},a=new Set(Object.values(u)),i="NEXT_HTTP_ERROR_FALLBACK";function l(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let[t,r]=e.digest.split(";");return t===i&&a.has(Number(r))}function s(e){return Number(e.digest.split(";")[1])}function c(e){switch(e){case 401:return"unauthorized";case 403:return"forbidden";case 404:return"not-found";default:return}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76963,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"RedirectStatusCode",{enumerable:!0,get:function(){return o}});var n,o=((n={})[n.SeeOther=303]="SeeOther",n[n.TemporaryRedirect=307]="TemporaryRedirect",n[n.PermanentRedirect=308]="PermanentRedirect",n);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68391,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o={REDIRECT_ERROR_CODE:function(){return i},RedirectType:function(){return l},isRedirectError:function(){return s}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e.r(76963),i="NEXT_REDIRECT";var l=((n={}).push="push",n.replace="replace",n);function s(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let t=e.digest.split(";"),[r,n]=t,o=t.slice(2,-2).join(";"),u=Number(t.at(-2));return r===i&&("replace"===n||"push"===n)&&"string"==typeof o&&!isNaN(u)&&u in a.RedirectStatusCode}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},65713,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isNextRouterError",{enumerable:!0,get:function(){return u}});let n=e.r(54394),o=e.r(68391);function u(e){return(0,o.isRedirectError)(e)||(0,n.isHTTPAccessFallbackError)(e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},61994,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={NavigationPromisesContext:function(){return s},PathParamsContext:function(){return l},PathnameContext:function(){return i},SearchParamsContext:function(){return a},createDevToolsInstrumentedPromise:function(){return c}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(71645),a=(0,u.createContext)(null),i=(0,u.createContext)(null),l=(0,u.createContext)(null),s=(0,u.createContext)(null);function c(e,t){let r=Promise.resolve(t);return r.status="fulfilled",r.value=t,r.displayName=`${e} (SSR)`,r}},45955,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workUnitAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},21768,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ACTION_HEADER:function(){return a},FLIGHT_HEADERS:function(){return h},NEXT_ACTION_NOT_FOUND_HEADER:function(){return E},NEXT_DID_POSTPONE_HEADER:function(){return b},NEXT_HMR_REFRESH_HASH_COOKIE:function(){return f},NEXT_HMR_REFRESH_HEADER:function(){return c},NEXT_HTML_REQUEST_ID_HEADER:function(){return O},NEXT_IS_PRERENDER_HEADER:function(){return m},NEXT_REQUEST_ID_HEADER:function(){return R},NEXT_REWRITTEN_PATH_HEADER:function(){return g},NEXT_REWRITTEN_QUERY_HEADER:function(){return v},NEXT_ROUTER_PREFETCH_HEADER:function(){return l},NEXT_ROUTER_SEGMENT_PREFETCH_HEADER:function(){return s},NEXT_ROUTER_STALE_TIME_HEADER:function(){return y},NEXT_ROUTER_STATE_TREE_HEADER:function(){return i},NEXT_RSC_UNION_QUERY:function(){return _},NEXT_URL:function(){return d},RSC_CONTENT_TYPE_HEADER:function(){return p},RSC_HEADER:function(){return u}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="rsc",a="next-action",i="next-router-state-tree",l="next-router-prefetch",s="next-router-segment-prefetch",c="next-hmr-refresh",f="__next_hmr_refresh_hash__",d="next-url",p="text/x-component",h=[u,i,l,c,s],_="_rsc",y="x-nextjs-stale-time",b="x-nextjs-postponed",g="x-nextjs-rewritten-path",v="x-nextjs-rewritten-query",m="x-nextjs-prerender",E="x-nextjs-action-not-found",R="x-nextjs-request-id",O="x-nextjs-html-request-id";("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},62141,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getCacheSignal:function(){return y},getDraftModeProviderForCacheScope:function(){return _},getHmrRefreshHash:function(){return d},getPrerenderResumeDataCache:function(){return c},getRenderResumeDataCache:function(){return f},getRuntimeStagePromise:function(){return b},getServerComponentsHmrCache:function(){return h},isHmrRefresh:function(){return p},throwForMissingRequestStore:function(){return l},throwInvariantForMissingStore:function(){return s},workUnitAsyncStorage:function(){return u.workUnitAsyncStorageInstance}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(45955),a=e.r(21768),i=e.r(12718);function l(e){throw Object.defineProperty(Error(`\`${e}\` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context`),"__NEXT_ERROR_CODE",{value:"E251",enumerable:!1,configurable:!0})}function s(){throw Object.defineProperty(new i.InvariantError("Expected workUnitAsyncStorage to have a store."),"__NEXT_ERROR_CODE",{value:"E696",enumerable:!1,configurable:!0})}function c(e){switch(e.type){case"prerender":case"prerender-runtime":case"prerender-ppr":case"prerender-client":return e.prerenderResumeDataCache;case"request":if(e.prerenderResumeDataCache)return e.prerenderResumeDataCache;case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":return null;default:return e}}function f(e){switch(e.type){case"request":case"prerender":case"prerender-runtime":case"prerender-client":if(e.renderResumeDataCache)return e.renderResumeDataCache;case"prerender-ppr":return e.prerenderResumeDataCache??null;case"cache":case"private-cache":case"unstable-cache":case"prerender-legacy":return null;default:return e}}function d(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"prerender":case"prerender-runtime":return t.hmrRefreshHash;case"request":var r;return null==(r=t.cookies.get(a.NEXT_HMR_REFRESH_HASH_COOKIE))?void 0:r.value}}function p(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"request":return t.isHmrRefresh??!1}return!1}function h(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"request":return t.serverComponentsHmrCache}}function _(e,t){if(e.isDraftMode)switch(t.type){case"cache":case"private-cache":case"unstable-cache":case"prerender-runtime":case"request":return t.draftMode}}function y(e){switch(e.type){case"prerender":case"prerender-client":case"prerender-runtime":return e.cacheSignal;case"request":if(e.cacheSignal)return e.cacheSignal;case"prerender-ppr":case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":return null;default:return e}}function b(e){switch(e.type){case"prerender-runtime":case"private-cache":return e.runtimeStagePromise;case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"unstable-cache":return null;default:return e}}},90373,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useUntrackedPathname",{enumerable:!0,get:function(){return u}});let n=e.r(71645),o=e.r(61994);function u(){return!function(){if("undefined"==typeof window){let{workUnitAsyncStorage:t}=e.r(62141),r=t.getStore();if(!r)return!1;switch(r.type){case"prerender":case"prerender-client":case"prerender-ppr":let n=r.fallbackRouteParams;return!!n&&n.size>0}}return!1}()?(0,n.useContext)(o.PathnameContext):null}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},51191,(e,t,r)=>{"use strict";function n(e,t=!0){return e.pathname+e.search+(t?e.hash:"")}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createHrefFromUrl",{enumerable:!0,get:function(){return n}}),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},78377,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={handleHardNavError:function(){return a},useNavFailureHandler:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});e.r(71645);let u=e.r(51191);function a(e){return!!e&&"undefined"!=typeof window&&!!window.next.__pendingUrl&&(0,u.createHrefFromUrl)(new URL(window.location.href))!==(0,u.createHrefFromUrl)(window.next.__pendingUrl)&&(console.error("Error occurred during navigation, falling back to hard navigation",e),window.location.href=window.next.__pendingUrl.toString(),!0)}function i(){}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},26935,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTML_LIMITED_BOT_UA_RE",{enumerable:!0,get:function(){return n}});let n=/[\w-]+-Google|Google-[\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight/i},82604,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HTML_LIMITED_BOT_UA_RE:function(){return u.HTML_LIMITED_BOT_UA_RE},HTML_LIMITED_BOT_UA_RE_STRING:function(){return i},getBotType:function(){return c},isBot:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(26935),a=/Googlebot(?!-)|Googlebot$/i,i=u.HTML_LIMITED_BOT_UA_RE.source;function l(e){return u.HTML_LIMITED_BOT_UA_RE.test(e)}function s(e){return a.test(e)||l(e)}function c(e){return a.test(e)?"dom":l(e)?"html":void 0}},72383,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ErrorBoundary:function(){return h},ErrorBoundaryHandler:function(){return p}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(55682),a=e.r(43476),i=u._(e.r(71645)),l=e.r(90373),s=e.r(65713);e.r(78377);let c=e.r(12354),f=e.r(82604),d="undefined"!=typeof window&&(0,f.isBot)(window.navigator.userAgent);class p extends i.default.Component{constructor(e){super(e),this.reset=()=>{this.setState({error:null})},this.state={error:null,previousPathname:this.props.pathname}}static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw e;return{error:e}}static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!==t.previousPathname&&t.error?{error:null,previousPathname:e.pathname}:{error:t.error,previousPathname:e.pathname}}render(){return this.state.error&&!d?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.HandleISRError,{error:this.state.error}),this.props.errorStyles,this.props.errorScripts,(0,a.jsx)(this.props.errorComponent,{error:this.state.error,reset:this.reset})]}):this.props.children}}function h({errorComponent:e,errorStyles:t,errorScripts:r,children:n}){let o=(0,l.useUntrackedPathname)();return e?(0,a.jsx)(p,{pathname:o,errorComponent:e,errorStyles:t,errorScripts:r,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},88540,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o={ACTION_HMR_REFRESH:function(){return c},ACTION_NAVIGATE:function(){return i},ACTION_REFRESH:function(){return a},ACTION_RESTORE:function(){return l},ACTION_SERVER_ACTION:function(){return f},ACTION_SERVER_PATCH:function(){return s},PrefetchKind:function(){return d}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a="refresh",i="navigate",l="restore",s="server-patch",c="hmr-refresh",f="server-action";var d=((n={}).AUTO="auto",n.FULL="full",n.TEMPORARY="temporary",n);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},90809,(e,t,r)=>{"use strict";function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}r._=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=u?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(o,a,i):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}},64245,(e,t,r)=>{"use strict";function n(e){return null!==e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isThenable",{enumerable:!0,get:function(){return n}})},41538,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={dispatchAppRouterAction:function(){return l},useActionQueue:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(71645)),a=e.r(64245),i=null;function l(e){if(null===i)throw Object.defineProperty(Error("Internal Next.js error: Router action dispatched before initialization."),"__NEXT_ERROR_CODE",{value:"E668",enumerable:!1,configurable:!0});i(e)}function s(e){let[t,r]=u.default.useState(e.state);i=t=>e.dispatch(t,r);let n=(0,u.useMemo)(()=>t,[t]);return(0,a.isThenable)(n)?(0,u.use)(n):n}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},32120,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"callServer",{enumerable:!0,get:function(){return a}});let n=e.r(71645),o=e.r(88540),u=e.r(41538);async function a(e,t){return new Promise((r,a)=>{(0,n.startTransition)(()=>{(0,u.dispatchAppRouterAction)({type:o.ACTION_SERVER_ACTION,actionId:e,actionArgs:t,resolve:r,reject:a})})})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92245,(e,t,r)=>{"use strict";let n;Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"findSourceMapURL",{enumerable:!0,get:function(){return n}});("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},3372,(e,t,r)=>{"use strict";function n(e){return e.startsWith("/")?e:`/${e}`}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ensureLeadingSlash",{enumerable:!0,get:function(){return n}})},13258,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DEFAULT_SEGMENT_KEY:function(){return f},PAGE_SEGMENT_KEY:function(){return c},addSearchParamsIfPageSegment:function(){return l},computeSelectedLayoutSegment:function(){return s},getSegmentValue:function(){return u},getSelectedLayoutSegmentPath:function(){return function e(t,r,n=!0,o=[]){let a;if(n)a=t[1][r];else{let e=t[1];a=e.children??Object.values(e)[0]}if(!a)return o;let i=u(a[0]);return!i||i.startsWith(c)?o:(o.push(i),e(a,r,!1,o))}},isGroupSegment:function(){return a},isParallelRouteSegment:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function u(e){return Array.isArray(e)?e[1]:e}function a(e){return"("===e[0]&&e.endsWith(")")}function i(e){return e.startsWith("@")&&"@children"!==e}function l(e,t){if(e.includes(c)){let e=JSON.stringify(t);return"{}"!==e?c+"?"+e:c}return e}function s(e,t){if(!e||0===e.length)return null;let r="children"===t?e[0]:e[e.length-1];return r===f?null:r}let c="__PAGE__",f="__DEFAULT__"},74180,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={normalizeAppPath:function(){return i},normalizeRscURL:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(3372),a=e.r(13258);function i(e){return(0,u.ensureLeadingSlash)(e.split("/").reduce((e,t,r,n)=>!t||(0,a.isGroupSegment)(t)||"@"===t[0]||("page"===t||"route"===t)&&r===n.length-1?e:`${e}/${t}`,""))}function l(e){return e.replace(/\.rsc($|\?)/,"$1")}},91463,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={INTERCEPTION_ROUTE_MARKERS:function(){return a},extractInterceptionRouteInformation:function(){return l},isInterceptionRouteAppPath:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(74180),a=["(..)(..)","(.)","(..)","(...)"];function i(e){return void 0!==e.split("/").find(e=>a.find(t=>e.startsWith(t)))}function l(e){let t,r,n;for(let o of e.split("/"))if(r=a.find(e=>o.startsWith(e))){[t,n]=e.split(r,2);break}if(!t||!r||!n)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Must be in the format //(..|...|..)(..)/`),"__NEXT_ERROR_CODE",{value:"E269",enumerable:!1,configurable:!0});switch(t=(0,u.normalizeAppPath)(t),r){case"(.)":n="/"===t?`/${n}`:t+"/"+n;break;case"(..)":if("/"===t)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..) marker at the root level, use (.) instead.`),"__NEXT_ERROR_CODE",{value:"E207",enumerable:!1,configurable:!0});n=t.split("/").slice(0,-1).concat(n).join("/");break;case"(...)":n="/"+n;break;case"(..)(..)":let o=t.split("/");if(o.length<=2)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..)(..) marker at the root level or one level up.`),"__NEXT_ERROR_CODE",{value:"E486",enumerable:!1,configurable:!0});n=o.slice(0,-2).concat(n).join("/");break;default:throw Object.defineProperty(Error("Invariant: unexpected marker"),"__NEXT_ERROR_CODE",{value:"E112",enumerable:!1,configurable:!0})}return{interceptingRoute:t,interceptedRoute:n}}},56019,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"matchSegment",{enumerable:!0,get:function(){return n}});let n=(e,t)=>"string"==typeof e?"string"==typeof t&&e===t:"string"!=typeof t&&e[0]===t[0]&&e[1]===t[1];("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},67764,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HEAD_REQUEST_KEY:function(){return i},ROOT_SEGMENT_REQUEST_KEY:function(){return a},appendSegmentRequestKeyPart:function(){return s},convertSegmentPathToStaticExportFilename:function(){return d},createSegmentRequestKeyPart:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(13258),a="",i="/_head";function l(e){if("string"==typeof e)return e.startsWith(u.PAGE_SEGMENT_KEY)?u.PAGE_SEGMENT_KEY:"/_not-found"===e?"_not-found":f(e);let t=e[0];return"$"+e[2]+"$"+f(t)}function s(e,t,r){return e+"/"+("children"===t?r:`@${f(t)}/${r}`)}let c=/^[a-zA-Z0-9\-_@]+$/;function f(e){return c.test(e)?e:"!"+btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function d(e){return`__next${e.replace(/\//g,".")}.txt`}},33906,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={doesStaticSegmentAppearInURL:function(){return f},getCacheKeyForDynamicParam:function(){return d},getParamValueFromCacheKey:function(){return h},getRenderedPathname:function(){return s},getRenderedSearch:function(){return l},parseDynamicParamFromURLPart:function(){return c},urlSearchParamsToParsedUrlQuery:function(){return _},urlToUrlWithoutFlightMarker:function(){return p}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(13258),a=e.r(67764),i=e.r(21768);function l(e){let t=e.headers.get(i.NEXT_REWRITTEN_QUERY_HEADER);return null!==t?""===t?"":"?"+t:p(new URL(e.url)).search}function s(e){return e.headers.get(i.NEXT_REWRITTEN_PATH_HEADER)??p(new URL(e.url)).pathname}function c(e,t,r){switch(e){case"c":return rencodeURIComponent(e)):[];case"ci(..)(..)":case"ci(.)":case"ci(..)":case"ci(...)":{let n=e.length-2;return r0===t?encodeURIComponent(e.slice(n)):encodeURIComponent(e)):[]}case"oc":return rencodeURIComponent(e)):null;case"d":if(r>=t.length)return"";return encodeURIComponent(t[r]);case"di(..)(..)":case"di(.)":case"di(..)":case"di(...)":{let n=e.length-2;if(r>=t.length)return"";return encodeURIComponent(t[r].slice(n))}default:return""}}function f(e){return!(e===a.ROOT_SEGMENT_REQUEST_KEY||e.startsWith(u.PAGE_SEGMENT_KEY)||"("===e[0]&&e.endsWith(")"))&&e!==u.DEFAULT_SEGMENT_KEY&&"/_not-found"!==e}function d(e,t){return"string"==typeof e?(0,u.addSearchParamsIfPageSegment)(e,Object.fromEntries(new URLSearchParams(t))):null===e?"":e.join("/")}function p(e){let t=new URL(e);if(t.searchParams.delete(i.NEXT_RSC_UNION_QUERY),t.pathname.endsWith(".txt")){let{pathname:e}=t,r=e.endsWith("/index.txt")?10:4;t.pathname=e.slice(0,-r)}return t}function h(e,t){return"c"===t||"oc"===t?e.split("/"):e}function _(e){let t={};for(let[r,n]of e.entries())void 0===t[r]?t[r]=n:Array.isArray(t[r])?t[r].push(n):t[r]=[t[r],n];return t}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},50590,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createInitialRSCPayloadFromFallbackPrerender:function(){return s},getFlightDataPartsFromPath:function(){return l},getNextFlightSegmentPath:function(){return c},normalizeFlightData:function(){return f},prepareFlightRouterStateForRequest:function(){return d}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(13258),a=e.r(33906),i=e.r(51191);function l(e){let[t,r,n,o]=e.slice(-4),u=e.slice(0,-4);return{pathToSegment:u.slice(0,-1),segmentPath:u,segment:u[u.length-1]??"",tree:t,seedData:r,head:n,isHeadPartial:o,isRootRender:4===e.length}}function s(e,t){let r=(0,a.getRenderedPathname)(e),n=(0,a.getRenderedSearch)(e),o=(0,i.createHrefFromUrl)(new URL(location.href)),u=t.f[0],l=u[0];return{b:t.b,c:o.split("/"),q:n,i:t.i,f:[[function e(t,r,n,o){let u,i,l=t[0];if("string"==typeof l)u=l,i=(0,a.doesStaticSegmentAppearInURL)(l);else{let e=l[0],t=l[2],s=(0,a.parseDynamicParamFromURLPart)(t,n,o);u=[e,(0,a.getCacheKeyForDynamicParam)(s,r),t],i=!0}let s=i?o+1:o,c=t[1],f={};for(let t in c){let o=c[t];f[t]=e(o,r,n,s)}return[u,f,null,t[3],t[4]]}(l,n,r.split("/").filter(e=>""!==e),0),u[1],u[2],u[2]]],m:t.m,G:t.G,S:t.S}}function c(e){return e.slice(2)}function f(e){return"string"==typeof e?e:e.map(e=>l(e))}function d(e,t){return t?encodeURIComponent(JSON.stringify(e)):encodeURIComponent(JSON.stringify(function e(t){var r,n;let[o,a,i,l,s,c]=t,f="string"==typeof(r=o)&&r.startsWith(u.PAGE_SEGMENT_KEY+"?")?u.PAGE_SEGMENT_KEY:r,d={};for(let[t,r]of Object.entries(a))d[t]=e(r);let p=[f,d,null,(n=l)&&"refresh"!==n?l:null];return void 0!==s&&(p[4]=s),void 0!==c&&(p[5]=c),p}(e)))}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14297,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getAppBuildId:function(){return i},setAppBuildId:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="";function a(e){u=e}function i(){return u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},19921,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={djb2Hash:function(){return u},hexHash:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function u(e){let t=5381;for(let r=0;r>>0}function a(e){return u(e).toString(36).slice(0,5)}},86051,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"computeCacheBustingSearchParam",{enumerable:!0,get:function(){return o}});let n=e.r(19921);function o(e,t,r,o){return(void 0===e||"0"===e)&&void 0===t&&void 0===r&&void 0===o?"":(0,n.hexHash)([e||"0",t||"0",r||"0",o||"0"].join(","))}},88093,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={setCacheBustingSearchParam:function(){return i},setCacheBustingSearchParamWithHash:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(86051),a=e.r(21768),i=(e,t)=>{l(e,(0,u.computeCacheBustingSearchParam)(t[a.NEXT_ROUTER_PREFETCH_HEADER],t[a.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER],t[a.NEXT_ROUTER_STATE_TREE_HEADER],t[a.NEXT_URL]))},l=(e,t)=>{let r=e.search,n=(r.startsWith("?")?r.slice(1):r).split("&").filter(e=>e&&!e.startsWith(`${a.NEXT_RSC_UNION_QUERY}=`));t.length>0?n.push(`${a.NEXT_RSC_UNION_QUERY}=${t}`):n.push(`${a.NEXT_RSC_UNION_QUERY}`),e.search=n.length?`?${n.join("&")}`:""};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},87288,(e,t,r)=>{"use strict";let n;Object.defineProperty(r,"__esModule",{value:!0});var o={createFetch:function(){return m},createFromNextReadableStream:function(){return E},fetchServerResponse:function(){return v}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e.r(35326),i=e.r(21768),l=e.r(32120),s=e.r(92245),c=e.r(88540),f=e.r(50590),d=e.r(14297),p=e.r(88093),h=e.r(33906),_=a.createFromReadableStream,y=a.createFromFetch;function b(e){return(0,h.urlToUrlWithoutFlightMarker)(new URL(e,location.origin)).toString()}let g=!1;async function v(e,t){let{flightRouterState:r,nextUrl:n,prefetchKind:o}=t,u={[i.RSC_HEADER]:"1",[i.NEXT_ROUTER_STATE_TREE_HEADER]:(0,f.prepareFlightRouterStateForRequest)(r,t.isHmrRefresh)};o===c.PrefetchKind.AUTO&&(u[i.NEXT_ROUTER_PREFETCH_HEADER]="1"),n&&(u[i.NEXT_URL]=n);let a=e;try{let t=o?o===c.PrefetchKind.TEMPORARY?"high":"low":"auto";(e=new URL(e)).pathname.endsWith("/")?e.pathname+="index.txt":e.pathname+=".txt";let r=await m(e,u,t,!0),n=(0,h.urlToUrlWithoutFlightMarker)(new URL(r.url)),l=r.redirected?n:a,s=r.headers.get("content-type")||"",p=!!r.headers.get("vary")?.includes(i.NEXT_URL),_=!!r.headers.get(i.NEXT_DID_POSTPONE_HEADER),y=r.headers.get(i.NEXT_ROUTER_STALE_TIME_HEADER),g=null!==y?1e3*parseInt(y,10):-1,v=s.startsWith(i.RSC_CONTENT_TYPE_HEADER);if(v||(v=s.startsWith("text/plain")),!v||!r.ok||!r.body)return e.hash&&(n.hash=e.hash),b(n.toString());let R=r.flightResponse;if(null===R){let e,t=_?(e=r.body.getReader(),new ReadableStream({async pull(t){for(;;){let{done:r,value:n}=await e.read();if(!r){t.enqueue(n);continue}return}}})):r.body;R=E(t,u)}let O=await R;if((0,d.getAppBuildId)()!==O.b)return b(r.url);let S=(0,f.normalizeFlightData)(O.f);if("string"==typeof S)return b(S);return{flightData:S,canonicalUrl:l,renderedSearch:(0,h.getRenderedSearch)(r),couldBeIntercepted:p,prerendered:O.S,postponed:_,staleTime:g,debugInfo:R._debugInfo??null}}catch(e){return g||console.error(`Failed to fetch RSC payload for ${a}. Falling back to browser navigation.`,e),a.toString()}}async function m(e,t,r,o,u){var a,c;let f=new URL(e);(0,p.setCacheBustingSearchParam)(f,t);let d=fetch(f,{credentials:"same-origin",headers:t,priority:r||void 0,signal:u}),h=o?(a=d,c=t,y(a,{callServer:l.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(c)})):null,_=await d,b=_.redirected,g=new URL(_.url,f);return g.searchParams.delete(i.NEXT_RSC_UNION_QUERY),{url:g.href,redirected:b,ok:_.ok,headers:_.headers,body:_.body,status:_.status,flightResponse:h}}function E(e,t){return _(e,{callServer:l.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(t)})}"undefined"!=typeof window&&(window.addEventListener("pagehide",()=>{g=!0}),window.addEventListener("pageshow",()=>{g=!1})),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},70725,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRouterCacheKey",{enumerable:!0,get:function(){return o}});let n=e.r(13258);function o(e,t=!1){return Array.isArray(e)?`${e[0]}|${e[1]}|${e[2]}`:t&&e.startsWith(n.PAGE_SEGMENT_KEY)?n.PAGE_SEGMENT_KEY:e}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39470,(e,t,r)=>{"use strict";function n(){let e,t,r=new Promise((r,n)=>{e=r,t=n});return{resolve:e,reject:t,promise:r}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createPromiseWithResolvers",{enumerable:!0,get:function(){return n}})},8372,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={AppRouterContext:function(){return a},GlobalLayoutRouterContext:function(){return l},LayoutRouterContext:function(){return i},MissingSlotContext:function(){return c},TemplateContext:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(55682)._(e.r(71645)),a=u.default.createContext(null),i=u.default.createContext(null),l=u.default.createContext(null),s=u.default.createContext(null),c=u.default.createContext(new Set)},3680,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ReadonlyURLSearchParams",{enumerable:!0,get:function(){return o}});class n extends Error{constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams")}}class o extends URLSearchParams{append(){throw new n}delete(){throw new n}set(){throw new n}sort(){throw new n}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},13957,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ServerInsertedHTMLContext:function(){return a},useServerInsertedHTML:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(71645)),a=u.default.createContext(null);function i(e){let t=(0,u.useContext)(a);t&&t(e)}},92838,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={UnrecognizedActionError:function(){return u},unstable_isUnrecognizedActionError:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});class u extends Error{constructor(...e){super(...e),this.name="UnrecognizedActionError"}}function a(e){return!!(e&&"object"==typeof e&&e instanceof u)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},34457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"actionAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},62266,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"actionAsyncStorage",{enumerable:!0,get:function(){return n.actionAsyncStorageInstance}});let n=e.r(34457)},24063,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getRedirectError:function(){return l},getRedirectStatusCodeFromError:function(){return p},getRedirectTypeFromError:function(){return d},getURLFromRedirectError:function(){return f},permanentRedirect:function(){return c},redirect:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(76963),a=e.r(68391),i="undefined"==typeof window?e.r(62266).actionAsyncStorage:void 0;function l(e,t,r=u.RedirectStatusCode.TemporaryRedirect){let n=Object.defineProperty(Error(a.REDIRECT_ERROR_CODE),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return n.digest=`${a.REDIRECT_ERROR_CODE};${t};${e};${r};`,n}function s(e,t){throw l(e,t??=i?.getStore()?.isAction?a.RedirectType.push:a.RedirectType.replace,u.RedirectStatusCode.TemporaryRedirect)}function c(e,t=a.RedirectType.replace){throw l(e,t,u.RedirectStatusCode.PermanentRedirect)}function f(e){return(0,a.isRedirectError)(e)?e.digest.split(";").slice(2,-2).join(";"):null}function d(e){if(!(0,a.isRedirectError)(e))throw Object.defineProperty(Error("Not a redirect error"),"__NEXT_ERROR_CODE",{value:"E260",enumerable:!1,configurable:!0});return e.digest.split(";",2)[1]}function p(e){if(!(0,a.isRedirectError)(e))throw Object.defineProperty(Error("Not a redirect error"),"__NEXT_ERROR_CODE",{value:"E260",enumerable:!1,configurable:!0});return Number(e.digest.split(";").at(-2))}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"notFound",{enumerable:!0,get:function(){return u}});let n=e.r(54394),o=`${n.HTTP_ERROR_FALLBACK_ERROR_CODE};404`;function u(){let e=Object.defineProperty(Error(o),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});throw e.digest=o,e}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},79854,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`forbidden()` is experimental and only allowed to be enabled when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E488",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"forbidden",{enumerable:!0,get:function(){return n}}),e.r(54394).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22683,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`unauthorized()` is experimental and only allowed to be used when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E411",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unauthorized",{enumerable:!0,get:function(){return n}}),e.r(54394).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15507,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,o.isNextRouterError)(t)||(0,n.isBailoutToCSRError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(32061),o=e.r(65713);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},63138,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={isHangingPromiseRejectionError:function(){return u},makeDevtoolsIOAwarePromise:function(){return f},makeHangingPromise:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function u(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===a}let a="HANGING_PROMISE_REJECTION";class i extends Error{constructor(e,t){super(`During prerendering, ${t} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${t} to a different context by using \`setTimeout\`, \`after\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route "${e}".`),this.route=e,this.expression=t,this.digest=a}}let l=new WeakMap;function s(e,t,r){if(e.aborted)return Promise.reject(new i(t,r));{let n=new Promise((n,o)=>{let u=o.bind(null,new i(t,r)),a=l.get(e);if(a)a.push(u);else{let t=[u];l.set(e,t),e.addEventListener("abort",()=>{for(let e=0;e{setTimeout(()=>{t(e)},0)})}},67287,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isPostpone",{enumerable:!0,get:function(){return o}});let n=Symbol.for("react.postpone");function o(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}},76353,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DynamicServerError:function(){return a},isDynamicServerError:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="DYNAMIC_SERVER_USAGE";class a extends Error{constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,this.digest=u}}function i(e){return"object"==typeof e&&null!==e&&"digest"in e&&"string"==typeof e.digest&&e.digest===u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},43248,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={StaticGenBailoutError:function(){return a},isStaticGenBailoutError:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="NEXT_STATIC_GEN_BAILOUT";class a extends Error{constructor(...e){super(...e),this.code=u}}function i(e){return"object"==typeof e&&null!==e&&"code"in e&&e.code===u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},54839,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={METADATA_BOUNDARY_NAME:function(){return u},OUTLET_BOUNDARY_NAME:function(){return i},ROOT_LAYOUT_BOUNDARY_NAME:function(){return l},VIEWPORT_BOUNDARY_NAME:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="__next_metadata_boundary__",a="__next_viewport_boundary__",i="__next_outlet_boundary__",l="__next_root_layout_boundary__"},29419,(e,t,r)=>{"use strict";var n=e.i(47167);Object.defineProperty(r,"__esModule",{value:!0});var o={atLeastOneTask:function(){return l},scheduleImmediate:function(){return i},scheduleOnNextTick:function(){return a},waitAtLeastOneReactRenderTask:function(){return s}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e=>{Promise.resolve().then(()=>{n.default.nextTick(e)})},i=e=>{setImmediate(e)};function l(){return new Promise(e=>i(e))}function s(){return new Promise(e=>setImmediate(e))}},42852,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o={RenderStage:function(){return l},StagedRenderingController:function(){return s}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e.r(12718),i=e.r(39470);var l=((n={})[n.Static=1]="Static",n[n.Runtime=2]="Runtime",n[n.Dynamic=3]="Dynamic",n);class s{constructor(e=null){this.abortSignal=e,this.currentStage=1,this.runtimeStagePromise=(0,i.createPromiseWithResolvers)(),this.dynamicStagePromise=(0,i.createPromiseWithResolvers)(),e&&e.addEventListener("abort",()=>{let{reason:t}=e;this.currentStage<2&&(this.runtimeStagePromise.promise.catch(c),this.runtimeStagePromise.reject(t)),this.currentStage<3&&(this.dynamicStagePromise.promise.catch(c),this.dynamicStagePromise.reject(t))},{once:!0})}advanceStage(e){!(this.currentStage>=e)&&(this.currentStage=e,e>=2&&this.runtimeStagePromise.resolve(),e>=3&&this.dynamicStagePromise.resolve())}getStagePromise(e){switch(e){case 2:return this.runtimeStagePromise.promise;case 3:return this.dynamicStagePromise.promise;default:throw Object.defineProperty(new a.InvariantError(`Invalid render stage: ${e}`),"__NEXT_ERROR_CODE",{value:"E881",enumerable:!1,configurable:!0})}}waitForStage(e){return this.getStagePromise(e)}delayUntilStage(e,t,r){var n,o,u;let a,i=(n=this.getStagePromise(e),o=t,u=r,a=new Promise((e,t)=>{n.then(e.bind(null,u),t)}),void 0!==o&&(a.displayName=o),a);return this.abortSignal&&i.catch(c),i}}function c(){}},67673,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o,u={Postpone:function(){return A},PreludeState:function(){return J},abortAndThrowOnSynchronousRequestDataAccess:function(){return T},abortOnSynchronousPlatformIOAccess:function(){return j},accessedDynamicData:function(){return I},annotateDynamicAccess:function(){return B},consumeDynamicAccess:function(){return L},createDynamicTrackingState:function(){return v},createDynamicValidationState:function(){return m},createHangingInputAbortSignal:function(){return H},createRenderInBrowserAbortSignal:function(){return F},delayUntilRuntimeStage:function(){return ee},formatDynamicAPIAccesses:function(){return $},getFirstDynamicReason:function(){return E},isDynamicPostpone:function(){return N},isPrerenderInterruptedError:function(){return U},logDisallowedDynamicError:function(){return Q},markCurrentScopeAsDynamic:function(){return R},postponeWithTracking:function(){return M},throwIfDisallowedDynamic:function(){return Z},throwToInterruptStaticGeneration:function(){return O},trackAllowedDynamicAccess:function(){return V},trackDynamicDataInDynamicRender:function(){return S},trackSynchronousPlatformIOAccessInDev:function(){return w},useDynamicRouteParams:function(){return X},useDynamicSearchParams:function(){return W}};for(var a in u)Object.defineProperty(r,a,{enumerable:!0,get:u[a]});let i=(n=e.r(71645))&&n.__esModule?n:{default:n},l=e.r(76353),s=e.r(43248),c=e.r(62141),f=e.r(63599),d=e.r(63138),p=e.r(54839),h=e.r(29419),_=e.r(32061),y=e.r(12718),b=e.r(42852),g="function"==typeof i.default.unstable_postpone;function v(e){return{isDebugDynamicAccesses:e,dynamicAccesses:[],syncDynamicErrorWithStack:null}}function m(){return{hasSuspenseAboveBody:!1,hasDynamicMetadata:!1,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[]}}function E(e){var t;return null==(t=e.dynamicAccesses[0])?void 0:t.expression}function R(e,t,r){if(t)switch(t.type){case"cache":case"unstable-cache":case"private-cache":return}if(!e.forceDynamic&&!e.forceStatic){if(e.dynamicShouldError)throw Object.defineProperty(new s.StaticGenBailoutError(`Route ${e.route} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${r}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E553",enumerable:!1,configurable:!0});if(t)switch(t.type){case"prerender-ppr":return M(e.route,r,t.dynamicTracking);case"prerender-legacy":t.revalidate=0;let n=Object.defineProperty(new l.DynamicServerError(`Route ${e.route} couldn't be rendered statically because it used ${r}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E550",enumerable:!1,configurable:!0});throw e.dynamicUsageDescription=r,e.dynamicUsageStack=n.stack,n}}}function O(e,t,r){let n=Object.defineProperty(new l.DynamicServerError(`Route ${t.route} couldn't be rendered statically because it used \`${e}\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E558",enumerable:!1,configurable:!0});throw r.revalidate=0,t.dynamicUsageDescription=e,t.dynamicUsageStack=n.stack,n}function S(e){switch(e.type){case"cache":case"unstable-cache":case"private-cache":return}}function P(e,t,r){let n=k(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`);r.controller.abort(n);let o=r.dynamicTracking;o&&o.dynamicAccesses.push({stack:o.isDebugDynamicAccesses?Error().stack:void 0,expression:t})}function j(e,t,r,n){let o=n.dynamicTracking;P(e,t,n),o&&null===o.syncDynamicErrorWithStack&&(o.syncDynamicErrorWithStack=r)}function w(e){e.stagedRendering&&e.stagedRendering.advanceStage(b.RenderStage.Dynamic)}function T(e,t,r,n){if(!1===n.controller.signal.aborted){P(e,t,n);let o=n.dynamicTracking;o&&null===o.syncDynamicErrorWithStack&&(o.syncDynamicErrorWithStack=r)}throw k(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`)}function A({reason:e,route:t}){let r=c.workUnitAsyncStorage.getStore();M(t,e,r&&"prerender-ppr"===r.type?r.dynamicTracking:null)}function M(e,t,r){(function(){if(!g)throw Object.defineProperty(Error("Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E224",enumerable:!1,configurable:!0})})(),r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:t}),i.default.unstable_postpone(D(e,t))}function D(e,t){return`Route ${e} needs to bail out of prerendering at this point because it used ${t}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`}function N(e){return"object"==typeof e&&null!==e&&"string"==typeof e.message&&x(e.message)}function x(e){return e.includes("needs to bail out of prerendering at this point because it used")&&e.includes("Learn more: https://nextjs.org/docs/messages/ppr-caught-error")}if(!1===x(D("%%%","^^^")))throw Object.defineProperty(Error("Invariant: isDynamicPostpone misidentified a postpone reason. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E296",enumerable:!1,configurable:!0});let C="NEXT_PRERENDER_INTERRUPTED";function k(e){let t=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t.digest=C,t}function U(e){return"object"==typeof e&&null!==e&&e.digest===C&&"name"in e&&"message"in e&&e instanceof Error}function I(e){return e.length>0}function L(e,t){return e.dynamicAccesses.push(...t.dynamicAccesses),e.dynamicAccesses}function $(e){return e.filter(e=>"string"==typeof e.stack&&e.stack.length>0).map(({expression:e,stack:t})=>(t=t.split("\n").slice(4).filter(e=>!(e.includes("node_modules/next/")||e.includes(" ()")||e.includes(" (node:"))).join("\n"),`Dynamic API Usage Debug - ${e}: -${t}`))}function F(){let e=new AbortController;return e.abort(Object.defineProperty(new _.BailoutToCSRError("Render in Browser"),"__NEXT_ERROR_CODE",{value:"E721",enumerable:!1,configurable:!0})),e.signal}function H(e){switch(e.type){case"prerender":case"prerender-runtime":let t=new AbortController;if(e.cacheSignal)e.cacheSignal.inputReady().then(()=>{t.abort()});else{let r=(0,c.getRuntimeStagePromise)(e);r?r.then(()=>(0,h.scheduleOnNextTick)(()=>t.abort())):(0,h.scheduleOnNextTick)(()=>t.abort())}return t.signal;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":return}}function B(e,t){let r=t.dynamicTracking;r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:e})}function X(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t&&r)switch(r.type){case"prerender-client":case"prerender":{let n=r.fallbackRouteParams;n&&n.size>0&&i.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break}case"prerender-ppr":{let n=r.fallbackRouteParams;if(n&&n.size>0)return M(t.route,e,r.dynamicTracking);break}case"prerender-runtime":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called during a runtime prerender. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E771",enumerable:!1,configurable:!0});case"cache":case"private-cache":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0})}}function W(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t)switch(!r&&(0,c.throwForMissingRequestStore)(e),r.type){case"prerender-client":i.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break;case"prerender-legacy":case"prerender-ppr":if(t.forceStatic)return;throw Object.defineProperty(new _.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});case"prerender":case"prerender-runtime":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called from a Server Component. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E795",enumerable:!1,configurable:!0});case"cache":case"unstable-cache":case"private-cache":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0});case"request":return}}let G=/\n\s+at Suspense \(\)/,Y=RegExp(`\\n\\s+at Suspense \\(\\)(?:(?!\\n\\s+at (?:body|div|main|section|article|aside|header|footer|nav|form|p|span|h1|h2|h3|h4|h5|h6) \\(\\))[\\s\\S])*?\\n\\s+at ${p.ROOT_LAYOUT_BOUNDARY_NAME} \\([^\\n]*\\)`),q=RegExp(`\\n\\s+at ${p.METADATA_BOUNDARY_NAME}[\\n\\s]`),K=RegExp(`\\n\\s+at ${p.VIEWPORT_BOUNDARY_NAME}[\\n\\s]`),z=RegExp(`\\n\\s+at ${p.OUTLET_BOUNDARY_NAME}[\\n\\s]`);function V(e,t,r,n){if(!z.test(t)){if(q.test(t)){r.hasDynamicMetadata=!0;return}if(K.test(t)){r.hasDynamicViewport=!0;return}if(Y.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(G.test(t)){r.hasAllowedDynamic=!0;return}else{var o,u;let a;if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let i=(o=`Route "${e.route}": Uncached data was accessed outside of . This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,u=t,(a=Object.defineProperty(Error(o),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0})).stack=a.name+": "+o+u,a);return void r.dynamicErrors.push(i)}}}var J=((o={})[o.Full=0]="Full",o[o.Empty=1]="Empty",o[o.Errored=2]="Errored",o);function Q(e,t){console.error(t),e.dev||(e.hasReadableErrorStacks?console.error(`To get a more detailed stack trace and pinpoint the issue, start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error.`):console.error(`To get a more detailed stack trace and pinpoint the issue, try one of the following: - - Start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error. - - Rerun the production build with \`next build --debug-prerender\` to generate better stack traces.`))}function Z(e,t,r,n){if(n.syncDynamicErrorWithStack)throw Q(e,n.syncDynamicErrorWithStack),new s.StaticGenBailoutError;if(0!==t){if(r.hasSuspenseAboveBody)return;let n=r.dynamicErrors;if(n.length>0){for(let t=0;tt):t}},91414,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,a.isNextRouterError)(t)||(0,u.isBailoutToCSRError)(t)||(0,l.isDynamicServerError)(t)||(0,i.isDynamicPostpone)(t)||(0,o.isPostpone)(t)||(0,n.isHangingPromiseRejectionError)(t)||(0,i.isPrerenderInterruptedError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(63138),o=e.r(67287),u=e.r(32061),a=e.r(65713),i=e.r(67673),l=e.r(76353);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},90508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return n}});let n="undefined"==typeof window?e.r(91414).unstable_rethrow:e.r(15507).unstable_rethrow;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92805,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return u.ReadonlyURLSearchParams},RedirectType:function(){return i.RedirectType},forbidden:function(){return s.forbidden},notFound:function(){return l.notFound},permanentRedirect:function(){return a.permanentRedirect},redirect:function(){return a.redirect},unauthorized:function(){return c.unauthorized},unstable_isUnrecognizedActionError:function(){return d},unstable_rethrow:function(){return f.unstable_rethrow}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(3680),a=e.r(24063),i=e.r(68391),l=e.r(22783),s=e.r(79854),c=e.r(22683),f=e.r(90508);function d(){throw Object.defineProperty(Error("`unstable_isUnrecognizedActionError` can only be used on the client."),"__NEXT_ERROR_CODE",{value:"E776",enumerable:!1,configurable:!0})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76562,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return d.ReadonlyURLSearchParams},RedirectType:function(){return d.RedirectType},ServerInsertedHTMLContext:function(){return c.ServerInsertedHTMLContext},forbidden:function(){return d.forbidden},notFound:function(){return d.notFound},permanentRedirect:function(){return d.permanentRedirect},redirect:function(){return d.redirect},unauthorized:function(){return d.unauthorized},unstable_isUnrecognizedActionError:function(){return f.unstable_isUnrecognizedActionError},unstable_rethrow:function(){return d.unstable_rethrow},useParams:function(){return g},usePathname:function(){return y},useRouter:function(){return b},useSearchParams:function(){return _},useSelectedLayoutSegment:function(){return m},useSelectedLayoutSegments:function(){return v},useServerInsertedHTML:function(){return c.useServerInsertedHTML}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(71645)),a=e.r(8372),i=e.r(61994),l=e.r(13258),s=e.r(3680),c=e.r(13957),f=e.r(92838),d=e.r(92805),p="undefined"==typeof window?e.r(67673).useDynamicRouteParams:void 0,h="undefined"==typeof window?e.r(67673).useDynamicSearchParams:void 0;function _(){h?.("useSearchParams()");let e=(0,u.useContext)(i.SearchParamsContext);return(0,u.useMemo)(()=>e?new s.ReadonlyURLSearchParams(e):null,[e])}function y(){return p?.("usePathname()"),(0,u.useContext)(i.PathnameContext)}function b(){let e=(0,u.useContext)(a.AppRouterContext);if(null===e)throw Object.defineProperty(Error("invariant expected app router to be mounted"),"__NEXT_ERROR_CODE",{value:"E238",enumerable:!1,configurable:!0});return e}function g(){return p?.("useParams()"),(0,u.useContext)(i.PathParamsContext)}function v(e="children"){p?.("useSelectedLayoutSegments()");let t=(0,u.useContext)(a.LayoutRouterContext);return t?(0,l.getSelectedLayoutSegmentPath)(t.parentTree,e):null}function m(e="children"){p?.("useSelectedLayoutSegment()"),(0,u.useContext)(i.NavigationPromisesContext);let t=v(e);return(0,l.computeSelectedLayoutSegment)(t,e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},58442,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={RedirectBoundary:function(){return p},RedirectErrorBoundary:function(){return d}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809),a=e.r(43476),i=u._(e.r(71645)),l=e.r(76562),s=e.r(24063),c=e.r(68391);function f({redirect:e,reset:t,redirectType:r}){let n=(0,l.useRouter)();return(0,i.useEffect)(()=>{i.default.startTransition(()=>{r===c.RedirectType.push?n.push(e,{}):n.replace(e,{}),t()})},[e,r,t,n]),null}class d extends i.default.Component{constructor(e){super(e),this.state={redirect:null,redirectType:null}}static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=(0,s.getURLFromRedirectError)(e),r=(0,s.getRedirectTypeFromError)(e);return"handled"in e?{redirect:null,redirectType:null}:{redirect:t,redirectType:r}}throw e}render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&null!==t?(0,a.jsx)(f,{redirect:e,redirectType:t,reset:()=>this.setState({redirect:null})}):this.props.children}}function p({children:e}){let t=(0,l.useRouter)();return(0,a.jsx)(d,{router:t,children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},1244,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unresolvedThenable",{enumerable:!0,get:function(){return n}});let n={then:()=>{}};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97367,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={MetadataBoundary:function(){return i},OutletBoundary:function(){return s},RootLayoutBoundary:function(){return c},ViewportBoundary:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(54839),a={[u.METADATA_BOUNDARY_NAME]:function({children:e}){return e},[u.VIEWPORT_BOUNDARY_NAME]:function({children:e}){return e},[u.OUTLET_BOUNDARY_NAME]:function({children:e}){return e},[u.ROOT_LAYOUT_BOUNDARY_NAME]:function({children:e}){return e}},i=a[u.METADATA_BOUNDARY_NAME.slice(0)],l=a[u.VIEWPORT_BOUNDARY_NAME.slice(0)],s=a[u.OUTLET_BOUNDARY_NAME.slice(0)],c=a[u.ROOT_LAYOUT_BOUNDARY_NAME.slice(0)]},84356,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"hasInterceptionRouteInCurrentTree",{enumerable:!0,get:function(){return function e([t,r]){if(Array.isArray(t)&&("di(..)(..)"===t[2]||"ci(..)(..)"===t[2]||"di(.)"===t[2]||"ci(.)"===t[2]||"di(..)"===t[2]||"ci(..)"===t[2]||"di(...)"===t[2]||"ci(...)"===t[2])||"string"==typeof t&&(0,n.isInterceptionRouteAppPath)(t))return!0;if(r){for(let t in r)if(e(r[t]))return!0}return!1}}});let n=e.r(91463);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/c19ebe11de4d2730.js b/src/hyperview/server/static/_next/static/chunks/c19ebe11de4d2730.js deleted file mode 100644 index 4aa3b49..0000000 --- a/src/hyperview/server/static/_next/static/chunks/c19ebe11de4d2730.js +++ /dev/null @@ -1,4 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,12718,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"InvariantError",{enumerable:!0,get:function(){return n}});class n extends Error{constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is a bug in Next.js.`,t),this.name="InvariantError"}}},55682,(e,t,r)=>{"use strict";r._=function(e){return e&&e.__esModule?e:{default:e}}},32061,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={BailoutToCSRError:function(){return a},isBailoutToCSRError:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="BAILOUT_TO_CLIENT_SIDE_RENDERING";class a extends Error{constructor(e){super(`Bail out to client-side rendering: ${e}`),this.reason=e,this.digest=u}}function i(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===u}},64893,(e,t,r)=>{"use strict";var n=e.r(74080),o={stream:!0},u=Object.prototype.hasOwnProperty;function a(t){var r=e.r(t);return"function"!=typeof r.then||"fulfilled"===r.status?null:(r.then(function(e){r.status="fulfilled",r.value=e},function(e){r.status="rejected",r.reason=e}),r)}var i=new WeakSet,l=new WeakSet;function s(){}function c(t){for(var r=t[1],n=[],o=0;of||35===f||114===f||120===f?(p=f,f=3,s++):(p=0,f=3);continue;case 2:44===(b=l[s++])?f=4:h=h<<4|(96l.length&&(b=-1)}var g=l.byteOffset+s;if(-1{"use strict";t.exports=e.r(64893)},35326,(e,t,r)=>{"use strict";t.exports=e.r(21413)},54394,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HTTPAccessErrorStatus:function(){return u},HTTP_ERROR_FALLBACK_ERROR_CODE:function(){return i},getAccessFallbackErrorTypeByStatus:function(){return c},getAccessFallbackHTTPStatus:function(){return s},isHTTPAccessFallbackError:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u={NOT_FOUND:404,FORBIDDEN:403,UNAUTHORIZED:401},a=new Set(Object.values(u)),i="NEXT_HTTP_ERROR_FALLBACK";function l(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let[t,r]=e.digest.split(";");return t===i&&a.has(Number(r))}function s(e){return Number(e.digest.split(";")[1])}function c(e){switch(e){case 401:return"unauthorized";case 403:return"forbidden";case 404:return"not-found";default:return}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76963,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"RedirectStatusCode",{enumerable:!0,get:function(){return o}});var n,o=((n={})[n.SeeOther=303]="SeeOther",n[n.TemporaryRedirect=307]="TemporaryRedirect",n[n.PermanentRedirect=308]="PermanentRedirect",n);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68391,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o={REDIRECT_ERROR_CODE:function(){return i},RedirectType:function(){return l},isRedirectError:function(){return s}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e.r(76963),i="NEXT_REDIRECT";var l=((n={}).push="push",n.replace="replace",n);function s(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let t=e.digest.split(";"),[r,n]=t,o=t.slice(2,-2).join(";"),u=Number(t.at(-2));return r===i&&("replace"===n||"push"===n)&&"string"==typeof o&&!isNaN(u)&&u in a.RedirectStatusCode}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},65713,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isNextRouterError",{enumerable:!0,get:function(){return u}});let n=e.r(54394),o=e.r(68391);function u(e){return(0,o.isRedirectError)(e)||(0,n.isHTTPAccessFallbackError)(e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},61994,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={NavigationPromisesContext:function(){return s},PathParamsContext:function(){return l},PathnameContext:function(){return i},SearchParamsContext:function(){return a},createDevToolsInstrumentedPromise:function(){return c}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(71645),a=(0,u.createContext)(null),i=(0,u.createContext)(null),l=(0,u.createContext)(null),s=(0,u.createContext)(null);function c(e,t){let r=Promise.resolve(t);return r.status="fulfilled",r.value=t,r.displayName=`${e} (SSR)`,r}},45955,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workUnitAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},21768,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ACTION_HEADER:function(){return a},FLIGHT_HEADERS:function(){return h},NEXT_ACTION_NOT_FOUND_HEADER:function(){return E},NEXT_DID_POSTPONE_HEADER:function(){return b},NEXT_HMR_REFRESH_HASH_COOKIE:function(){return f},NEXT_HMR_REFRESH_HEADER:function(){return c},NEXT_HTML_REQUEST_ID_HEADER:function(){return O},NEXT_IS_PRERENDER_HEADER:function(){return m},NEXT_REQUEST_ID_HEADER:function(){return R},NEXT_REWRITTEN_PATH_HEADER:function(){return g},NEXT_REWRITTEN_QUERY_HEADER:function(){return v},NEXT_ROUTER_PREFETCH_HEADER:function(){return l},NEXT_ROUTER_SEGMENT_PREFETCH_HEADER:function(){return s},NEXT_ROUTER_STALE_TIME_HEADER:function(){return y},NEXT_ROUTER_STATE_TREE_HEADER:function(){return i},NEXT_RSC_UNION_QUERY:function(){return _},NEXT_URL:function(){return d},RSC_CONTENT_TYPE_HEADER:function(){return p},RSC_HEADER:function(){return u}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="rsc",a="next-action",i="next-router-state-tree",l="next-router-prefetch",s="next-router-segment-prefetch",c="next-hmr-refresh",f="__next_hmr_refresh_hash__",d="next-url",p="text/x-component",h=[u,i,l,c,s],_="_rsc",y="x-nextjs-stale-time",b="x-nextjs-postponed",g="x-nextjs-rewritten-path",v="x-nextjs-rewritten-query",m="x-nextjs-prerender",E="x-nextjs-action-not-found",R="x-nextjs-request-id",O="x-nextjs-html-request-id";("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},62141,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getCacheSignal:function(){return y},getDraftModeProviderForCacheScope:function(){return _},getHmrRefreshHash:function(){return d},getPrerenderResumeDataCache:function(){return c},getRenderResumeDataCache:function(){return f},getRuntimeStagePromise:function(){return b},getServerComponentsHmrCache:function(){return h},isHmrRefresh:function(){return p},throwForMissingRequestStore:function(){return l},throwInvariantForMissingStore:function(){return s},workUnitAsyncStorage:function(){return u.workUnitAsyncStorageInstance}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(45955),a=e.r(21768),i=e.r(12718);function l(e){throw Object.defineProperty(Error(`\`${e}\` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context`),"__NEXT_ERROR_CODE",{value:"E251",enumerable:!1,configurable:!0})}function s(){throw Object.defineProperty(new i.InvariantError("Expected workUnitAsyncStorage to have a store."),"__NEXT_ERROR_CODE",{value:"E696",enumerable:!1,configurable:!0})}function c(e){switch(e.type){case"prerender":case"prerender-runtime":case"prerender-ppr":case"prerender-client":return e.prerenderResumeDataCache;case"request":if(e.prerenderResumeDataCache)return e.prerenderResumeDataCache;case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":return null;default:return e}}function f(e){switch(e.type){case"request":case"prerender":case"prerender-runtime":case"prerender-client":if(e.renderResumeDataCache)return e.renderResumeDataCache;case"prerender-ppr":return e.prerenderResumeDataCache??null;case"cache":case"private-cache":case"unstable-cache":case"prerender-legacy":return null;default:return e}}function d(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"prerender":case"prerender-runtime":return t.hmrRefreshHash;case"request":var r;return null==(r=t.cookies.get(a.NEXT_HMR_REFRESH_HASH_COOKIE))?void 0:r.value}}function p(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"request":return t.isHmrRefresh??!1}return!1}function h(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"request":return t.serverComponentsHmrCache}}function _(e,t){if(e.isDraftMode)switch(t.type){case"cache":case"private-cache":case"unstable-cache":case"prerender-runtime":case"request":return t.draftMode}}function y(e){switch(e.type){case"prerender":case"prerender-client":case"prerender-runtime":return e.cacheSignal;case"request":if(e.cacheSignal)return e.cacheSignal;case"prerender-ppr":case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":return null;default:return e}}function b(e){switch(e.type){case"prerender-runtime":case"private-cache":return e.runtimeStagePromise;case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"unstable-cache":return null;default:return e}}},90373,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useUntrackedPathname",{enumerable:!0,get:function(){return u}});let n=e.r(71645),o=e.r(61994);function u(){return!function(){if("undefined"==typeof window){let{workUnitAsyncStorage:t}=e.r(62141),r=t.getStore();if(!r)return!1;switch(r.type){case"prerender":case"prerender-client":case"prerender-ppr":let n=r.fallbackRouteParams;return!!n&&n.size>0}}return!1}()?(0,n.useContext)(o.PathnameContext):null}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},51191,(e,t,r)=>{"use strict";function n(e,t=!0){return e.pathname+e.search+(t?e.hash:"")}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createHrefFromUrl",{enumerable:!0,get:function(){return n}}),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},78377,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={handleHardNavError:function(){return a},useNavFailureHandler:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});e.r(71645);let u=e.r(51191);function a(e){return!!e&&"undefined"!=typeof window&&!!window.next.__pendingUrl&&(0,u.createHrefFromUrl)(new URL(window.location.href))!==(0,u.createHrefFromUrl)(window.next.__pendingUrl)&&(console.error("Error occurred during navigation, falling back to hard navigation",e),window.location.href=window.next.__pendingUrl.toString(),!0)}function i(){}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},26935,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTML_LIMITED_BOT_UA_RE",{enumerable:!0,get:function(){return n}});let n=/[\w-]+-Google|Google-[\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight/i},82604,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HTML_LIMITED_BOT_UA_RE:function(){return u.HTML_LIMITED_BOT_UA_RE},HTML_LIMITED_BOT_UA_RE_STRING:function(){return i},getBotType:function(){return c},isBot:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(26935),a=/Googlebot(?!-)|Googlebot$/i,i=u.HTML_LIMITED_BOT_UA_RE.source;function l(e){return u.HTML_LIMITED_BOT_UA_RE.test(e)}function s(e){return a.test(e)||l(e)}function c(e){return a.test(e)?"dom":l(e)?"html":void 0}},72383,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ErrorBoundary:function(){return h},ErrorBoundaryHandler:function(){return p}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(55682),a=e.r(43476),i=u._(e.r(71645)),l=e.r(90373),s=e.r(65713);e.r(78377);let c=e.r(12354),f=e.r(82604),d="undefined"!=typeof window&&(0,f.isBot)(window.navigator.userAgent);class p extends i.default.Component{constructor(e){super(e),this.reset=()=>{this.setState({error:null})},this.state={error:null,previousPathname:this.props.pathname}}static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw e;return{error:e}}static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!==t.previousPathname&&t.error?{error:null,previousPathname:e.pathname}:{error:t.error,previousPathname:e.pathname}}render(){return this.state.error&&!d?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.HandleISRError,{error:this.state.error}),this.props.errorStyles,this.props.errorScripts,(0,a.jsx)(this.props.errorComponent,{error:this.state.error,reset:this.reset})]}):this.props.children}}function h({errorComponent:e,errorStyles:t,errorScripts:r,children:n}){let o=(0,l.useUntrackedPathname)();return e?(0,a.jsx)(p,{pathname:o,errorComponent:e,errorStyles:t,errorScripts:r,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},88540,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o={ACTION_HMR_REFRESH:function(){return c},ACTION_NAVIGATE:function(){return i},ACTION_REFRESH:function(){return a},ACTION_RESTORE:function(){return l},ACTION_SERVER_ACTION:function(){return f},ACTION_SERVER_PATCH:function(){return s},PrefetchKind:function(){return d}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a="refresh",i="navigate",l="restore",s="server-patch",c="hmr-refresh",f="server-action";var d=((n={}).AUTO="auto",n.FULL="full",n.TEMPORARY="temporary",n);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},90809,(e,t,r)=>{"use strict";function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}r._=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=u?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(o,a,i):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}},64245,(e,t,r)=>{"use strict";function n(e){return null!==e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isThenable",{enumerable:!0,get:function(){return n}})},41538,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={dispatchAppRouterAction:function(){return l},useActionQueue:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(71645)),a=e.r(64245),i=null;function l(e){if(null===i)throw Object.defineProperty(Error("Internal Next.js error: Router action dispatched before initialization."),"__NEXT_ERROR_CODE",{value:"E668",enumerable:!1,configurable:!0});i(e)}function s(e){let[t,r]=u.default.useState(e.state);i=t=>e.dispatch(t,r);let n=(0,u.useMemo)(()=>t,[t]);return(0,a.isThenable)(n)?(0,u.use)(n):n}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},32120,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"callServer",{enumerable:!0,get:function(){return a}});let n=e.r(71645),o=e.r(88540),u=e.r(41538);async function a(e,t){return new Promise((r,a)=>{(0,n.startTransition)(()=>{(0,u.dispatchAppRouterAction)({type:o.ACTION_SERVER_ACTION,actionId:e,actionArgs:t,resolve:r,reject:a})})})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92245,(e,t,r)=>{"use strict";let n;Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"findSourceMapURL",{enumerable:!0,get:function(){return n}});("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},3372,(e,t,r)=>{"use strict";function n(e){return e.startsWith("/")?e:`/${e}`}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ensureLeadingSlash",{enumerable:!0,get:function(){return n}})},13258,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DEFAULT_SEGMENT_KEY:function(){return f},PAGE_SEGMENT_KEY:function(){return c},addSearchParamsIfPageSegment:function(){return l},computeSelectedLayoutSegment:function(){return s},getSegmentValue:function(){return u},getSelectedLayoutSegmentPath:function(){return function e(t,r,n=!0,o=[]){let a;if(n)a=t[1][r];else{let e=t[1];a=e.children??Object.values(e)[0]}if(!a)return o;let i=u(a[0]);return!i||i.startsWith(c)?o:(o.push(i),e(a,r,!1,o))}},isGroupSegment:function(){return a},isParallelRouteSegment:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function u(e){return Array.isArray(e)?e[1]:e}function a(e){return"("===e[0]&&e.endsWith(")")}function i(e){return e.startsWith("@")&&"@children"!==e}function l(e,t){if(e.includes(c)){let e=JSON.stringify(t);return"{}"!==e?c+"?"+e:c}return e}function s(e,t){if(!e||0===e.length)return null;let r="children"===t?e[0]:e[e.length-1];return r===f?null:r}let c="__PAGE__",f="__DEFAULT__"},74180,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={normalizeAppPath:function(){return i},normalizeRscURL:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(3372),a=e.r(13258);function i(e){return(0,u.ensureLeadingSlash)(e.split("/").reduce((e,t,r,n)=>!t||(0,a.isGroupSegment)(t)||"@"===t[0]||("page"===t||"route"===t)&&r===n.length-1?e:`${e}/${t}`,""))}function l(e){return e.replace(/\.rsc($|\?)/,"$1")}},91463,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={INTERCEPTION_ROUTE_MARKERS:function(){return a},extractInterceptionRouteInformation:function(){return l},isInterceptionRouteAppPath:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(74180),a=["(..)(..)","(.)","(..)","(...)"];function i(e){return void 0!==e.split("/").find(e=>a.find(t=>e.startsWith(t)))}function l(e){let t,r,n;for(let o of e.split("/"))if(r=a.find(e=>o.startsWith(e))){[t,n]=e.split(r,2);break}if(!t||!r||!n)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Must be in the format //(..|...|..)(..)/`),"__NEXT_ERROR_CODE",{value:"E269",enumerable:!1,configurable:!0});switch(t=(0,u.normalizeAppPath)(t),r){case"(.)":n="/"===t?`/${n}`:t+"/"+n;break;case"(..)":if("/"===t)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..) marker at the root level, use (.) instead.`),"__NEXT_ERROR_CODE",{value:"E207",enumerable:!1,configurable:!0});n=t.split("/").slice(0,-1).concat(n).join("/");break;case"(...)":n="/"+n;break;case"(..)(..)":let o=t.split("/");if(o.length<=2)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..)(..) marker at the root level or one level up.`),"__NEXT_ERROR_CODE",{value:"E486",enumerable:!1,configurable:!0});n=o.slice(0,-2).concat(n).join("/");break;default:throw Object.defineProperty(Error("Invariant: unexpected marker"),"__NEXT_ERROR_CODE",{value:"E112",enumerable:!1,configurable:!0})}return{interceptingRoute:t,interceptedRoute:n}}},56019,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"matchSegment",{enumerable:!0,get:function(){return n}});let n=(e,t)=>"string"==typeof e?"string"==typeof t&&e===t:"string"!=typeof t&&e[0]===t[0]&&e[1]===t[1];("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},67764,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HEAD_REQUEST_KEY:function(){return i},ROOT_SEGMENT_REQUEST_KEY:function(){return a},appendSegmentRequestKeyPart:function(){return s},convertSegmentPathToStaticExportFilename:function(){return d},createSegmentRequestKeyPart:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(13258),a="",i="/_head";function l(e){if("string"==typeof e)return e.startsWith(u.PAGE_SEGMENT_KEY)?u.PAGE_SEGMENT_KEY:"/_not-found"===e?"_not-found":f(e);let t=e[0];return"$"+e[2]+"$"+f(t)}function s(e,t,r){return e+"/"+("children"===t?r:`@${f(t)}/${r}`)}let c=/^[a-zA-Z0-9\-_@]+$/;function f(e){return c.test(e)?e:"!"+btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function d(e){return`__next${e.replace(/\//g,".")}.txt`}},33906,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={doesStaticSegmentAppearInURL:function(){return f},getCacheKeyForDynamicParam:function(){return d},getParamValueFromCacheKey:function(){return h},getRenderedPathname:function(){return s},getRenderedSearch:function(){return l},parseDynamicParamFromURLPart:function(){return c},urlSearchParamsToParsedUrlQuery:function(){return _},urlToUrlWithoutFlightMarker:function(){return p}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(13258),a=e.r(67764),i=e.r(21768);function l(e){let t=e.headers.get(i.NEXT_REWRITTEN_QUERY_HEADER);return null!==t?""===t?"":"?"+t:p(new URL(e.url)).search}function s(e){return e.headers.get(i.NEXT_REWRITTEN_PATH_HEADER)??p(new URL(e.url)).pathname}function c(e,t,r){switch(e){case"c":return rencodeURIComponent(e)):[];case"ci(..)(..)":case"ci(.)":case"ci(..)":case"ci(...)":{let n=e.length-2;return r0===t?encodeURIComponent(e.slice(n)):encodeURIComponent(e)):[]}case"oc":return rencodeURIComponent(e)):null;case"d":if(r>=t.length)return"";return encodeURIComponent(t[r]);case"di(..)(..)":case"di(.)":case"di(..)":case"di(...)":{let n=e.length-2;if(r>=t.length)return"";return encodeURIComponent(t[r].slice(n))}default:return""}}function f(e){return!(e===a.ROOT_SEGMENT_REQUEST_KEY||e.startsWith(u.PAGE_SEGMENT_KEY)||"("===e[0]&&e.endsWith(")"))&&e!==u.DEFAULT_SEGMENT_KEY&&"/_not-found"!==e}function d(e,t){return"string"==typeof e?(0,u.addSearchParamsIfPageSegment)(e,Object.fromEntries(new URLSearchParams(t))):null===e?"":e.join("/")}function p(e){let t=new URL(e);if(t.searchParams.delete(i.NEXT_RSC_UNION_QUERY),t.pathname.endsWith(".txt")){let{pathname:e}=t,r=e.endsWith("/index.txt")?10:4;t.pathname=e.slice(0,-r)}return t}function h(e,t){return"c"===t||"oc"===t?e.split("/"):e}function _(e){let t={};for(let[r,n]of e.entries())void 0===t[r]?t[r]=n:Array.isArray(t[r])?t[r].push(n):t[r]=[t[r],n];return t}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},50590,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createInitialRSCPayloadFromFallbackPrerender:function(){return s},getFlightDataPartsFromPath:function(){return l},getNextFlightSegmentPath:function(){return c},normalizeFlightData:function(){return f},prepareFlightRouterStateForRequest:function(){return d}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(13258),a=e.r(33906),i=e.r(51191);function l(e){let[t,r,n,o]=e.slice(-4),u=e.slice(0,-4);return{pathToSegment:u.slice(0,-1),segmentPath:u,segment:u[u.length-1]??"",tree:t,seedData:r,head:n,isHeadPartial:o,isRootRender:4===e.length}}function s(e,t){let r=(0,a.getRenderedPathname)(e),n=(0,a.getRenderedSearch)(e),o=(0,i.createHrefFromUrl)(new URL(location.href)),u=t.f[0],l=u[0];return{b:t.b,c:o.split("/"),q:n,i:t.i,f:[[function e(t,r,n,o){let u,i,l=t[0];if("string"==typeof l)u=l,i=(0,a.doesStaticSegmentAppearInURL)(l);else{let e=l[0],t=l[2],s=(0,a.parseDynamicParamFromURLPart)(t,n,o);u=[e,(0,a.getCacheKeyForDynamicParam)(s,r),t],i=!0}let s=i?o+1:o,c=t[1],f={};for(let t in c){let o=c[t];f[t]=e(o,r,n,s)}return[u,f,null,t[3],t[4]]}(l,n,r.split("/").filter(e=>""!==e),0),u[1],u[2],u[2]]],m:t.m,G:t.G,S:t.S}}function c(e){return e.slice(2)}function f(e){return"string"==typeof e?e:e.map(e=>l(e))}function d(e,t){return t?encodeURIComponent(JSON.stringify(e)):encodeURIComponent(JSON.stringify(function e(t){var r,n;let[o,a,i,l,s,c]=t,f="string"==typeof(r=o)&&r.startsWith(u.PAGE_SEGMENT_KEY+"?")?u.PAGE_SEGMENT_KEY:r,d={};for(let[t,r]of Object.entries(a))d[t]=e(r);let p=[f,d,null,(n=l)&&"refresh"!==n?l:null];return void 0!==s&&(p[4]=s),void 0!==c&&(p[5]=c),p}(e)))}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14297,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getAppBuildId:function(){return i},setAppBuildId:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="";function a(e){u=e}function i(){return u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},19921,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={djb2Hash:function(){return u},hexHash:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function u(e){let t=5381;for(let r=0;r>>0}function a(e){return u(e).toString(36).slice(0,5)}},86051,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"computeCacheBustingSearchParam",{enumerable:!0,get:function(){return o}});let n=e.r(19921);function o(e,t,r,o){return(void 0===e||"0"===e)&&void 0===t&&void 0===r&&void 0===o?"":(0,n.hexHash)([e||"0",t||"0",r||"0",o||"0"].join(","))}},71482,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={setCacheBustingSearchParam:function(){return i},setCacheBustingSearchParamWithHash:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(86051),a=e.r(21768),i=(e,t)=>{l(e,(0,u.computeCacheBustingSearchParam)(t[a.NEXT_ROUTER_PREFETCH_HEADER],t[a.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER],t[a.NEXT_ROUTER_STATE_TREE_HEADER],t[a.NEXT_URL]))},l=(e,t)=>{let r=e.search,n=(r.startsWith("?")?r.slice(1):r).split("&").filter(e=>e&&!e.startsWith(`${a.NEXT_RSC_UNION_QUERY}=`));t.length>0?n.push(`${a.NEXT_RSC_UNION_QUERY}=${t}`):n.push(`${a.NEXT_RSC_UNION_QUERY}`),e.search=n.length?`?${n.join("&")}`:""};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},87288,(e,t,r)=>{"use strict";let n;Object.defineProperty(r,"__esModule",{value:!0});var o={createFetch:function(){return m},createFromNextReadableStream:function(){return E},fetchServerResponse:function(){return v}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e.r(35326),i=e.r(21768),l=e.r(32120),s=e.r(92245),c=e.r(88540),f=e.r(50590),d=e.r(14297),p=e.r(71482),h=e.r(33906),_=a.createFromReadableStream,y=a.createFromFetch;function b(e){return(0,h.urlToUrlWithoutFlightMarker)(new URL(e,location.origin)).toString()}let g=!1;async function v(e,t){let{flightRouterState:r,nextUrl:n,prefetchKind:o}=t,u={[i.RSC_HEADER]:"1",[i.NEXT_ROUTER_STATE_TREE_HEADER]:(0,f.prepareFlightRouterStateForRequest)(r,t.isHmrRefresh)};o===c.PrefetchKind.AUTO&&(u[i.NEXT_ROUTER_PREFETCH_HEADER]="1"),n&&(u[i.NEXT_URL]=n);let a=e;try{let t=o?o===c.PrefetchKind.TEMPORARY?"high":"low":"auto";(e=new URL(e)).pathname.endsWith("/")?e.pathname+="index.txt":e.pathname+=".txt";let r=await m(e,u,t,!0),n=(0,h.urlToUrlWithoutFlightMarker)(new URL(r.url)),l=r.redirected?n:a,s=r.headers.get("content-type")||"",p=!!r.headers.get("vary")?.includes(i.NEXT_URL),_=!!r.headers.get(i.NEXT_DID_POSTPONE_HEADER),y=r.headers.get(i.NEXT_ROUTER_STALE_TIME_HEADER),g=null!==y?1e3*parseInt(y,10):-1,v=s.startsWith(i.RSC_CONTENT_TYPE_HEADER);if(v||(v=s.startsWith("text/plain")),!v||!r.ok||!r.body)return e.hash&&(n.hash=e.hash),b(n.toString());let R=r.flightResponse;if(null===R){let e,t=_?(e=r.body.getReader(),new ReadableStream({async pull(t){for(;;){let{done:r,value:n}=await e.read();if(!r){t.enqueue(n);continue}return}}})):r.body;R=E(t,u)}let O=await R;if((0,d.getAppBuildId)()!==O.b)return b(r.url);let S=(0,f.normalizeFlightData)(O.f);if("string"==typeof S)return b(S);return{flightData:S,canonicalUrl:l,renderedSearch:(0,h.getRenderedSearch)(r),couldBeIntercepted:p,prerendered:O.S,postponed:_,staleTime:g,debugInfo:R._debugInfo??null}}catch(e){return g||console.error(`Failed to fetch RSC payload for ${a}. Falling back to browser navigation.`,e),a.toString()}}async function m(e,t,r,o,u){var a,c;let f=new URL(e);(0,p.setCacheBustingSearchParam)(f,t);let d=fetch(f,{credentials:"same-origin",headers:t,priority:r||void 0,signal:u}),h=o?(a=d,c=t,y(a,{callServer:l.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(c)})):null,_=await d,b=_.redirected,g=new URL(_.url,f);return g.searchParams.delete(i.NEXT_RSC_UNION_QUERY),{url:g.href,redirected:b,ok:_.ok,headers:_.headers,body:_.body,status:_.status,flightResponse:h}}function E(e,t){return _(e,{callServer:l.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(t)})}"undefined"!=typeof window&&(window.addEventListener("pagehide",()=>{g=!0}),window.addEventListener("pageshow",()=>{g=!1})),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},70725,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRouterCacheKey",{enumerable:!0,get:function(){return o}});let n=e.r(13258);function o(e,t=!1){return Array.isArray(e)?`${e[0]}|${e[1]}|${e[2]}`:t&&e.startsWith(n.PAGE_SEGMENT_KEY)?n.PAGE_SEGMENT_KEY:e}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39470,(e,t,r)=>{"use strict";function n(){let e,t,r=new Promise((r,n)=>{e=r,t=n});return{resolve:e,reject:t,promise:r}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createPromiseWithResolvers",{enumerable:!0,get:function(){return n}})},8372,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={AppRouterContext:function(){return a},GlobalLayoutRouterContext:function(){return l},LayoutRouterContext:function(){return i},MissingSlotContext:function(){return c},TemplateContext:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(55682)._(e.r(71645)),a=u.default.createContext(null),i=u.default.createContext(null),l=u.default.createContext(null),s=u.default.createContext(null),c=u.default.createContext(new Set)},3680,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ReadonlyURLSearchParams",{enumerable:!0,get:function(){return o}});class n extends Error{constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams")}}class o extends URLSearchParams{append(){throw new n}delete(){throw new n}set(){throw new n}sort(){throw new n}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},13957,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ServerInsertedHTMLContext:function(){return a},useServerInsertedHTML:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(71645)),a=u.default.createContext(null);function i(e){let t=(0,u.useContext)(a);t&&t(e)}},92838,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={UnrecognizedActionError:function(){return u},unstable_isUnrecognizedActionError:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});class u extends Error{constructor(...e){super(...e),this.name="UnrecognizedActionError"}}function a(e){return!!(e&&"object"==typeof e&&e instanceof u)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},34457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"actionAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},62266,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"actionAsyncStorage",{enumerable:!0,get:function(){return n.actionAsyncStorageInstance}});let n=e.r(34457)},24063,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getRedirectError:function(){return l},getRedirectStatusCodeFromError:function(){return p},getRedirectTypeFromError:function(){return d},getURLFromRedirectError:function(){return f},permanentRedirect:function(){return c},redirect:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(76963),a=e.r(68391),i="undefined"==typeof window?e.r(62266).actionAsyncStorage:void 0;function l(e,t,r=u.RedirectStatusCode.TemporaryRedirect){let n=Object.defineProperty(Error(a.REDIRECT_ERROR_CODE),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return n.digest=`${a.REDIRECT_ERROR_CODE};${t};${e};${r};`,n}function s(e,t){throw l(e,t??=i?.getStore()?.isAction?a.RedirectType.push:a.RedirectType.replace,u.RedirectStatusCode.TemporaryRedirect)}function c(e,t=a.RedirectType.replace){throw l(e,t,u.RedirectStatusCode.PermanentRedirect)}function f(e){return(0,a.isRedirectError)(e)?e.digest.split(";").slice(2,-2).join(";"):null}function d(e){if(!(0,a.isRedirectError)(e))throw Object.defineProperty(Error("Not a redirect error"),"__NEXT_ERROR_CODE",{value:"E260",enumerable:!1,configurable:!0});return e.digest.split(";",2)[1]}function p(e){if(!(0,a.isRedirectError)(e))throw Object.defineProperty(Error("Not a redirect error"),"__NEXT_ERROR_CODE",{value:"E260",enumerable:!1,configurable:!0});return Number(e.digest.split(";").at(-2))}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"notFound",{enumerable:!0,get:function(){return u}});let n=e.r(54394),o=`${n.HTTP_ERROR_FALLBACK_ERROR_CODE};404`;function u(){let e=Object.defineProperty(Error(o),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});throw e.digest=o,e}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},79854,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`forbidden()` is experimental and only allowed to be enabled when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E488",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"forbidden",{enumerable:!0,get:function(){return n}}),e.r(54394).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22683,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`unauthorized()` is experimental and only allowed to be used when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E411",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unauthorized",{enumerable:!0,get:function(){return n}}),e.r(54394).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15507,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,o.isNextRouterError)(t)||(0,n.isBailoutToCSRError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(32061),o=e.r(65713);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},63138,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={isHangingPromiseRejectionError:function(){return u},makeDevtoolsIOAwarePromise:function(){return f},makeHangingPromise:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function u(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===a}let a="HANGING_PROMISE_REJECTION";class i extends Error{constructor(e,t){super(`During prerendering, ${t} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${t} to a different context by using \`setTimeout\`, \`after\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route "${e}".`),this.route=e,this.expression=t,this.digest=a}}let l=new WeakMap;function s(e,t,r){if(e.aborted)return Promise.reject(new i(t,r));{let n=new Promise((n,o)=>{let u=o.bind(null,new i(t,r)),a=l.get(e);if(a)a.push(u);else{let t=[u];l.set(e,t),e.addEventListener("abort",()=>{for(let e=0;e{setTimeout(()=>{t(e)},0)})}},67287,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isPostpone",{enumerable:!0,get:function(){return o}});let n=Symbol.for("react.postpone");function o(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}},76353,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DynamicServerError:function(){return a},isDynamicServerError:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="DYNAMIC_SERVER_USAGE";class a extends Error{constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,this.digest=u}}function i(e){return"object"==typeof e&&null!==e&&"digest"in e&&"string"==typeof e.digest&&e.digest===u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},43248,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={StaticGenBailoutError:function(){return a},isStaticGenBailoutError:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="NEXT_STATIC_GEN_BAILOUT";class a extends Error{constructor(...e){super(...e),this.code=u}}function i(e){return"object"==typeof e&&null!==e&&"code"in e&&e.code===u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},54839,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={METADATA_BOUNDARY_NAME:function(){return u},OUTLET_BOUNDARY_NAME:function(){return i},ROOT_LAYOUT_BOUNDARY_NAME:function(){return l},VIEWPORT_BOUNDARY_NAME:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u="__next_metadata_boundary__",a="__next_viewport_boundary__",i="__next_outlet_boundary__",l="__next_root_layout_boundary__"},29419,(e,t,r)=>{"use strict";var n=e.i(47167);Object.defineProperty(r,"__esModule",{value:!0});var o={atLeastOneTask:function(){return l},scheduleImmediate:function(){return i},scheduleOnNextTick:function(){return a},waitAtLeastOneReactRenderTask:function(){return s}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e=>{Promise.resolve().then(()=>{n.default.nextTick(e)})},i=e=>{setImmediate(e)};function l(){return new Promise(e=>i(e))}function s(){return new Promise(e=>setImmediate(e))}},42852,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o={RenderStage:function(){return l},StagedRenderingController:function(){return s}};for(var u in o)Object.defineProperty(r,u,{enumerable:!0,get:o[u]});let a=e.r(12718),i=e.r(39470);var l=((n={})[n.Static=1]="Static",n[n.Runtime=2]="Runtime",n[n.Dynamic=3]="Dynamic",n);class s{constructor(e=null){this.abortSignal=e,this.currentStage=1,this.runtimeStagePromise=(0,i.createPromiseWithResolvers)(),this.dynamicStagePromise=(0,i.createPromiseWithResolvers)(),e&&e.addEventListener("abort",()=>{let{reason:t}=e;this.currentStage<2&&(this.runtimeStagePromise.promise.catch(c),this.runtimeStagePromise.reject(t)),this.currentStage<3&&(this.dynamicStagePromise.promise.catch(c),this.dynamicStagePromise.reject(t))},{once:!0})}advanceStage(e){!(this.currentStage>=e)&&(this.currentStage=e,e>=2&&this.runtimeStagePromise.resolve(),e>=3&&this.dynamicStagePromise.resolve())}getStagePromise(e){switch(e){case 2:return this.runtimeStagePromise.promise;case 3:return this.dynamicStagePromise.promise;default:throw Object.defineProperty(new a.InvariantError(`Invalid render stage: ${e}`),"__NEXT_ERROR_CODE",{value:"E881",enumerable:!1,configurable:!0})}}waitForStage(e){return this.getStagePromise(e)}delayUntilStage(e,t,r){var n,o,u;let a,i=(n=this.getStagePromise(e),o=t,u=r,a=new Promise((e,t)=>{n.then(e.bind(null,u),t)}),void 0!==o&&(a.displayName=o),a);return this.abortSignal&&i.catch(c),i}}function c(){}},67673,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,o,u={Postpone:function(){return A},PreludeState:function(){return J},abortAndThrowOnSynchronousRequestDataAccess:function(){return T},abortOnSynchronousPlatformIOAccess:function(){return j},accessedDynamicData:function(){return I},annotateDynamicAccess:function(){return B},consumeDynamicAccess:function(){return L},createDynamicTrackingState:function(){return v},createDynamicValidationState:function(){return m},createHangingInputAbortSignal:function(){return H},createRenderInBrowserAbortSignal:function(){return F},delayUntilRuntimeStage:function(){return ee},formatDynamicAPIAccesses:function(){return $},getFirstDynamicReason:function(){return E},isDynamicPostpone:function(){return N},isPrerenderInterruptedError:function(){return U},logDisallowedDynamicError:function(){return Q},markCurrentScopeAsDynamic:function(){return R},postponeWithTracking:function(){return M},throwIfDisallowedDynamic:function(){return Z},throwToInterruptStaticGeneration:function(){return O},trackAllowedDynamicAccess:function(){return V},trackDynamicDataInDynamicRender:function(){return S},trackSynchronousPlatformIOAccessInDev:function(){return w},useDynamicRouteParams:function(){return X},useDynamicSearchParams:function(){return W}};for(var a in u)Object.defineProperty(r,a,{enumerable:!0,get:u[a]});let i=(n=e.r(71645))&&n.__esModule?n:{default:n},l=e.r(76353),s=e.r(43248),c=e.r(62141),f=e.r(63599),d=e.r(63138),p=e.r(54839),h=e.r(29419),_=e.r(32061),y=e.r(12718),b=e.r(42852),g="function"==typeof i.default.unstable_postpone;function v(e){return{isDebugDynamicAccesses:e,dynamicAccesses:[],syncDynamicErrorWithStack:null}}function m(){return{hasSuspenseAboveBody:!1,hasDynamicMetadata:!1,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[]}}function E(e){var t;return null==(t=e.dynamicAccesses[0])?void 0:t.expression}function R(e,t,r){if(t)switch(t.type){case"cache":case"unstable-cache":case"private-cache":return}if(!e.forceDynamic&&!e.forceStatic){if(e.dynamicShouldError)throw Object.defineProperty(new s.StaticGenBailoutError(`Route ${e.route} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${r}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E553",enumerable:!1,configurable:!0});if(t)switch(t.type){case"prerender-ppr":return M(e.route,r,t.dynamicTracking);case"prerender-legacy":t.revalidate=0;let n=Object.defineProperty(new l.DynamicServerError(`Route ${e.route} couldn't be rendered statically because it used ${r}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E550",enumerable:!1,configurable:!0});throw e.dynamicUsageDescription=r,e.dynamicUsageStack=n.stack,n}}}function O(e,t,r){let n=Object.defineProperty(new l.DynamicServerError(`Route ${t.route} couldn't be rendered statically because it used \`${e}\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E558",enumerable:!1,configurable:!0});throw r.revalidate=0,t.dynamicUsageDescription=e,t.dynamicUsageStack=n.stack,n}function S(e){switch(e.type){case"cache":case"unstable-cache":case"private-cache":return}}function P(e,t,r){let n=k(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`);r.controller.abort(n);let o=r.dynamicTracking;o&&o.dynamicAccesses.push({stack:o.isDebugDynamicAccesses?Error().stack:void 0,expression:t})}function j(e,t,r,n){let o=n.dynamicTracking;P(e,t,n),o&&null===o.syncDynamicErrorWithStack&&(o.syncDynamicErrorWithStack=r)}function w(e){e.stagedRendering&&e.stagedRendering.advanceStage(b.RenderStage.Dynamic)}function T(e,t,r,n){if(!1===n.controller.signal.aborted){P(e,t,n);let o=n.dynamicTracking;o&&null===o.syncDynamicErrorWithStack&&(o.syncDynamicErrorWithStack=r)}throw k(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`)}function A({reason:e,route:t}){let r=c.workUnitAsyncStorage.getStore();M(t,e,r&&"prerender-ppr"===r.type?r.dynamicTracking:null)}function M(e,t,r){(function(){if(!g)throw Object.defineProperty(Error("Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E224",enumerable:!1,configurable:!0})})(),r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:t}),i.default.unstable_postpone(D(e,t))}function D(e,t){return`Route ${e} needs to bail out of prerendering at this point because it used ${t}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`}function N(e){return"object"==typeof e&&null!==e&&"string"==typeof e.message&&x(e.message)}function x(e){return e.includes("needs to bail out of prerendering at this point because it used")&&e.includes("Learn more: https://nextjs.org/docs/messages/ppr-caught-error")}if(!1===x(D("%%%","^^^")))throw Object.defineProperty(Error("Invariant: isDynamicPostpone misidentified a postpone reason. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E296",enumerable:!1,configurable:!0});let C="NEXT_PRERENDER_INTERRUPTED";function k(e){let t=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t.digest=C,t}function U(e){return"object"==typeof e&&null!==e&&e.digest===C&&"name"in e&&"message"in e&&e instanceof Error}function I(e){return e.length>0}function L(e,t){return e.dynamicAccesses.push(...t.dynamicAccesses),e.dynamicAccesses}function $(e){return e.filter(e=>"string"==typeof e.stack&&e.stack.length>0).map(({expression:e,stack:t})=>(t=t.split("\n").slice(4).filter(e=>!(e.includes("node_modules/next/")||e.includes(" ()")||e.includes(" (node:"))).join("\n"),`Dynamic API Usage Debug - ${e}: -${t}`))}function F(){let e=new AbortController;return e.abort(Object.defineProperty(new _.BailoutToCSRError("Render in Browser"),"__NEXT_ERROR_CODE",{value:"E721",enumerable:!1,configurable:!0})),e.signal}function H(e){switch(e.type){case"prerender":case"prerender-runtime":let t=new AbortController;if(e.cacheSignal)e.cacheSignal.inputReady().then(()=>{t.abort()});else{let r=(0,c.getRuntimeStagePromise)(e);r?r.then(()=>(0,h.scheduleOnNextTick)(()=>t.abort())):(0,h.scheduleOnNextTick)(()=>t.abort())}return t.signal;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":return}}function B(e,t){let r=t.dynamicTracking;r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:e})}function X(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t&&r)switch(r.type){case"prerender-client":case"prerender":{let n=r.fallbackRouteParams;n&&n.size>0&&i.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break}case"prerender-ppr":{let n=r.fallbackRouteParams;if(n&&n.size>0)return M(t.route,e,r.dynamicTracking);break}case"prerender-runtime":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called during a runtime prerender. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E771",enumerable:!1,configurable:!0});case"cache":case"private-cache":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0})}}function W(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t)switch(!r&&(0,c.throwForMissingRequestStore)(e),r.type){case"prerender-client":i.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break;case"prerender-legacy":case"prerender-ppr":if(t.forceStatic)return;throw Object.defineProperty(new _.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});case"prerender":case"prerender-runtime":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called from a Server Component. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E795",enumerable:!1,configurable:!0});case"cache":case"unstable-cache":case"private-cache":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0});case"request":return}}let G=/\n\s+at Suspense \(\)/,Y=RegExp(`\\n\\s+at Suspense \\(\\)(?:(?!\\n\\s+at (?:body|div|main|section|article|aside|header|footer|nav|form|p|span|h1|h2|h3|h4|h5|h6) \\(\\))[\\s\\S])*?\\n\\s+at ${p.ROOT_LAYOUT_BOUNDARY_NAME} \\([^\\n]*\\)`),q=RegExp(`\\n\\s+at ${p.METADATA_BOUNDARY_NAME}[\\n\\s]`),K=RegExp(`\\n\\s+at ${p.VIEWPORT_BOUNDARY_NAME}[\\n\\s]`),z=RegExp(`\\n\\s+at ${p.OUTLET_BOUNDARY_NAME}[\\n\\s]`);function V(e,t,r,n){if(!z.test(t)){if(q.test(t)){r.hasDynamicMetadata=!0;return}if(K.test(t)){r.hasDynamicViewport=!0;return}if(Y.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(G.test(t)){r.hasAllowedDynamic=!0;return}else{var o,u;let a;if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let i=(o=`Route "${e.route}": Uncached data was accessed outside of . This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,u=t,(a=Object.defineProperty(Error(o),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0})).stack=a.name+": "+o+u,a);return void r.dynamicErrors.push(i)}}}var J=((o={})[o.Full=0]="Full",o[o.Empty=1]="Empty",o[o.Errored=2]="Errored",o);function Q(e,t){console.error(t),e.dev||(e.hasReadableErrorStacks?console.error(`To get a more detailed stack trace and pinpoint the issue, start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error.`):console.error(`To get a more detailed stack trace and pinpoint the issue, try one of the following: - - Start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error. - - Rerun the production build with \`next build --debug-prerender\` to generate better stack traces.`))}function Z(e,t,r,n){if(n.syncDynamicErrorWithStack)throw Q(e,n.syncDynamicErrorWithStack),new s.StaticGenBailoutError;if(0!==t){if(r.hasSuspenseAboveBody)return;let n=r.dynamicErrors;if(n.length>0){for(let t=0;tt):t}},91414,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,a.isNextRouterError)(t)||(0,u.isBailoutToCSRError)(t)||(0,l.isDynamicServerError)(t)||(0,i.isDynamicPostpone)(t)||(0,o.isPostpone)(t)||(0,n.isHangingPromiseRejectionError)(t)||(0,i.isPrerenderInterruptedError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(63138),o=e.r(67287),u=e.r(32061),a=e.r(65713),i=e.r(67673),l=e.r(76353);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},90508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return n}});let n="undefined"==typeof window?e.r(91414).unstable_rethrow:e.r(15507).unstable_rethrow;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92805,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return u.ReadonlyURLSearchParams},RedirectType:function(){return i.RedirectType},forbidden:function(){return s.forbidden},notFound:function(){return l.notFound},permanentRedirect:function(){return a.permanentRedirect},redirect:function(){return a.redirect},unauthorized:function(){return c.unauthorized},unstable_isUnrecognizedActionError:function(){return d},unstable_rethrow:function(){return f.unstable_rethrow}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(3680),a=e.r(24063),i=e.r(68391),l=e.r(22783),s=e.r(79854),c=e.r(22683),f=e.r(90508);function d(){throw Object.defineProperty(Error("`unstable_isUnrecognizedActionError` can only be used on the client."),"__NEXT_ERROR_CODE",{value:"E776",enumerable:!1,configurable:!0})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76562,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return d.ReadonlyURLSearchParams},RedirectType:function(){return d.RedirectType},ServerInsertedHTMLContext:function(){return c.ServerInsertedHTMLContext},forbidden:function(){return d.forbidden},notFound:function(){return d.notFound},permanentRedirect:function(){return d.permanentRedirect},redirect:function(){return d.redirect},unauthorized:function(){return d.unauthorized},unstable_isUnrecognizedActionError:function(){return f.unstable_isUnrecognizedActionError},unstable_rethrow:function(){return d.unstable_rethrow},useParams:function(){return g},usePathname:function(){return y},useRouter:function(){return b},useSearchParams:function(){return _},useSelectedLayoutSegment:function(){return m},useSelectedLayoutSegments:function(){return v},useServerInsertedHTML:function(){return c.useServerInsertedHTML}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(71645)),a=e.r(8372),i=e.r(61994),l=e.r(13258),s=e.r(3680),c=e.r(13957),f=e.r(92838),d=e.r(92805),p="undefined"==typeof window?e.r(67673).useDynamicRouteParams:void 0,h="undefined"==typeof window?e.r(67673).useDynamicSearchParams:void 0;function _(){h?.("useSearchParams()");let e=(0,u.useContext)(i.SearchParamsContext);return(0,u.useMemo)(()=>e?new s.ReadonlyURLSearchParams(e):null,[e])}function y(){return p?.("usePathname()"),(0,u.useContext)(i.PathnameContext)}function b(){let e=(0,u.useContext)(a.AppRouterContext);if(null===e)throw Object.defineProperty(Error("invariant expected app router to be mounted"),"__NEXT_ERROR_CODE",{value:"E238",enumerable:!1,configurable:!0});return e}function g(){return p?.("useParams()"),(0,u.useContext)(i.PathParamsContext)}function v(e="children"){p?.("useSelectedLayoutSegments()");let t=(0,u.useContext)(a.LayoutRouterContext);return t?(0,l.getSelectedLayoutSegmentPath)(t.parentTree,e):null}function m(e="children"){p?.("useSelectedLayoutSegment()"),(0,u.useContext)(i.NavigationPromisesContext);let t=v(e);return(0,l.computeSelectedLayoutSegment)(t,e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},58442,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={RedirectBoundary:function(){return p},RedirectErrorBoundary:function(){return d}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809),a=e.r(43476),i=u._(e.r(71645)),l=e.r(76562),s=e.r(24063),c=e.r(68391);function f({redirect:e,reset:t,redirectType:r}){let n=(0,l.useRouter)();return(0,i.useEffect)(()=>{i.default.startTransition(()=>{r===c.RedirectType.push?n.push(e,{}):n.replace(e,{}),t()})},[e,r,t,n]),null}class d extends i.default.Component{constructor(e){super(e),this.state={redirect:null,redirectType:null}}static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=(0,s.getURLFromRedirectError)(e),r=(0,s.getRedirectTypeFromError)(e);return"handled"in e?{redirect:null,redirectType:null}:{redirect:t,redirectType:r}}throw e}render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&null!==t?(0,a.jsx)(f,{redirect:e,redirectType:t,reset:()=>this.setState({redirect:null})}):this.props.children}}function p({children:e}){let t=(0,l.useRouter)();return(0,a.jsx)(d,{router:t,children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},1244,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unresolvedThenable",{enumerable:!0,get:function(){return n}});let n={then:()=>{}};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97367,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={MetadataBoundary:function(){return i},OutletBoundary:function(){return s},RootLayoutBoundary:function(){return c},ViewportBoundary:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(54839),a={[u.METADATA_BOUNDARY_NAME]:function({children:e}){return e},[u.VIEWPORT_BOUNDARY_NAME]:function({children:e}){return e},[u.OUTLET_BOUNDARY_NAME]:function({children:e}){return e},[u.ROOT_LAYOUT_BOUNDARY_NAME]:function({children:e}){return e}},i=a[u.METADATA_BOUNDARY_NAME.slice(0)],l=a[u.VIEWPORT_BOUNDARY_NAME.slice(0)],s=a[u.OUTLET_BOUNDARY_NAME.slice(0)],c=a[u.ROOT_LAYOUT_BOUNDARY_NAME.slice(0)]},84356,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"hasInterceptionRouteInCurrentTree",{enumerable:!0,get:function(){return function e([t,r]){if(Array.isArray(t)&&("di(..)(..)"===t[2]||"ci(..)(..)"===t[2]||"di(.)"===t[2]||"ci(.)"===t[2]||"di(..)"===t[2]||"ci(..)"===t[2]||"di(...)"===t[2]||"ci(...)"===t[2])||"string"==typeof t&&(0,n.isInterceptionRouteAppPath)(t))return!0;if(r){for(let t in r)if(e(r[t]))return!0}return!1}}});let n=e.r(91463);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)}]); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/turbopack-11ec5967a08af43c.js b/src/hyperview/server/static/_next/static/chunks/turbopack-11ec5967a08af43c.js deleted file mode 100644 index 0a3c163..0000000 --- a/src/hyperview/server/static/_next/static/chunks/turbopack-11ec5967a08af43c.js +++ /dev/null @@ -1,3 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/5f8e11d2476d2135.js","static/chunks/9367d18603aececf.js","static/chunks/c19ebe11de4d2730.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=new WeakMap;function n(e,t){this.m=e,this.e=t}let o=n.prototype,l=Object.prototype.hasOwnProperty,i="undefined"!=typeof Symbol&&Symbol.toStringTag;function s(e,t,r){l.call(e,t)||Object.defineProperty(e,t,r)}function u(e,t){let r=e[t];return r||(r=a(t),e[t]=r),r}function a(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function c(e,t){s(e,"__esModule",{value:!0}),i&&s(e,i,{value:"Module"});let r=0;for(;rObject.getPrototypeOf(e):e=>e.__proto__,p=[null,f({}),f([]),f(f)];function h(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!p.includes(t);t=f(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),c(t,n),t}function d(e){let t=N(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=h(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function m(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}o.i=d,o.A=function(e){return this.r(e)(d.bind(this))},o.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},o.r=function(e){return N(e,this.m).exports},o.f=function(e){function t(t){if(l.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(l.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let b=Symbol("turbopack queues"),y=Symbol("turbopack exports"),O=Symbol("turbopack error");function g(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}o.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:i,promise:s}=m(),u=Object.assign(s,{[y]:r.exports,[b]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),a={get:()=>u,set(e){e!==u&&(u[y]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(b in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[y]:{},[b]:e=>e(t)};return e.then(e=>{r[y]=e,g(t)},e=>{r[O]=e,g(t)}),r}}return{[y]:e,[b]:()=>{}}}),r=()=>t.map(e=>{if(e[O])throw e[O];return e[y]}),{promise:l,resolve:i}=m(),s=Object.assign(()=>i(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[b](u)),s.queueCount?l:r()},function(e){e?i(u[O]=e):l(u[y]),g(n)}),n&&-1===n.status&&(n.status=0)};let w=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function j(e,t){throw Error(`Invariant: ${t(e)}`)}w.prototype=URL.prototype,o.U=w,o.z=function(e){throw Error("dynamic usage of require is not supported")},o.g=globalThis;let R=n.prototype;var C,U=((C=U||{})[C.Runtime=0]="Runtime",C[C.Parent=1]="Parent",C[C.Update=2]="Update",C);let k=new Map;o.M=k;let v=new Map,_=new Map;async function P(e,t,r){let n;if("string"==typeof r)return A(e,t,S(r));let o=r.included||[],l=o.map(e=>!!k.has(e)||v.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);let i=r.moduleChunks||[],s=i.map(e=>_.get(e)).filter(e=>e);if(s.length>0){if(s.length===i.length)return void await Promise.all(s);let r=new Set;for(let e of i)_.has(e)||r.add(e);for(let n of r){let r=A(e,t,S(n));_.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=A(e,t,S(r.path)),i))_.has(o)||_.set(o,n)}for(let e of o)v.has(e)||v.set(e,n);await n}R.l=function(e){return P(1,this.m.id,e)};let $=Promise.resolve(void 0),T=new WeakMap;function A(t,r,n){let o=e.loadChunkCached(t,n),l=T.get(o);if(void 0===l){let e=T.set.bind(T,o,$);l=o.then(e).catch(e=>{let o;switch(t){case 0:o=`as a runtime dependency of chunk ${r}`;break;case 1:o=`from module ${r}`;break;case 2:o="from an HMR update";break;default:j(t,e=>`Unknown source type: ${e}`)}throw Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0)}),T.set(o,l)}return l}function S(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}`}R.L=function(e){return A(1,this.m.id,e)},R.R=function(e){let t=this.r(e);return t?.default??t},R.P=function(e){return`/ROOT/${e??""}`},R.b=function(e){let t=new Blob([`self.TURBOPACK_WORKER_LOCATION = ${JSON.stringify(location.origin)}; -self.TURBOPACK_NEXT_CHUNK_URLS = ${JSON.stringify(e.reverse().map(S),null,2)}; -importScripts(...self.TURBOPACK_NEXT_CHUNK_URLS.map(c => self.TURBOPACK_WORKER_LOCATION + c).reverse());`],{type:"text/javascript"});return URL.createObjectURL(t)};let E=/\.js(?:\?[^#]*)?(?:#.*)?$/,K=/\.css(?:\?[^#]*)?(?:#.*)?$/;function x(e){return K.test(e)}o.w=function(t,r,n){return e.loadWebAssembly(1,this.m.id,t,r,n)},o.u=function(t,r){return e.loadWebAssemblyModule(1,this.m.id,t,r)};let M={};o.c=M;let N=(e,t)=>{let r=M[e];if(r){if(r.error)throw r.error;return r}return L(e,U.Parent,t.id)};function L(e,t,r){let o=k.get(e);if("function"!=typeof o)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:j(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let l=a(e),i=l.exports;M[e]=l;let s=new n(l,i);try{o(s,l,i)}catch(e){throw l.error=e,e}return l.namespaceObject&&l.exports!==l.namespaceObject&&h(l.exports,l.namespaceObject),l}function q(r){let n,o=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(("undefined"!=typeof TURBOPACK_NEXT_CHUNK_URLS?TURBOPACK_NEXT_CHUNK_URLS.pop():e.getAttribute("src")).replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(r[0]);return 2===r.length?n=r[1]:(n=void 0,!function(e,t,r,n){let o=1;for(;o{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},B.set(e,t)}return t}e={async registerChunk(e,t){if(W(S(e)).resolve(),null!=t){for(let e of t.otherChunks)W(S("string"==typeof e?e:e.path));if(await Promise.all(t.otherChunks.map(t=>P(0,e,t))),t.runtimeModuleIds.length>0)for(let r of t.runtimeModuleIds)!function(e,t){let r=M[t];if(r){if(r.error)throw r.error;return}L(t,U.Runtime,e)}(e,r)}},loadChunkCached:(e,t)=>(function(e,t){let r=W(t);if(r.loadingStarted)return r.promise;if(e===U.Runtime)return r.loadingStarted=!0,x(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(x(t));else if(E.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(TURBOPACK_WORKER_LOCATION+t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(x(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)r.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(E.test(t)){let n=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${e}"],script[src^="${e}?"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener("error",()=>{r.reject()});else{let e=document.createElement("script");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let l=fetch(S(r)),{instance:i}=await WebAssembly.instantiateStreaming(l,o);return i.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(S(r));return await WebAssembly.compileStreaming(o)}};let I=globalThis.TURBOPACK;globalThis.TURBOPACK={push:q},I.forEach(q)})(); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/chunks/turbopack-f85f95889fd14d61.js b/src/hyperview/server/static/_next/static/chunks/turbopack-f85f95889fd14d61.js deleted file mode 100644 index f22e5e5..0000000 --- a/src/hyperview/server/static/_next/static/chunks/turbopack-f85f95889fd14d61.js +++ /dev/null @@ -1,3 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/5f8e11d2476d2135.js","static/chunks/9367d18603aececf.js","static/chunks/a7dc7061f42f51e9.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=new WeakMap;function n(e,t){this.m=e,this.e=t}let o=n.prototype,l=Object.prototype.hasOwnProperty,i="undefined"!=typeof Symbol&&Symbol.toStringTag;function s(e,t,r){l.call(e,t)||Object.defineProperty(e,t,r)}function u(e,t){let r=e[t];return r||(r=a(t),e[t]=r),r}function a(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function c(e,t){s(e,"__esModule",{value:!0}),i&&s(e,i,{value:"Module"});let r=0;for(;rObject.getPrototypeOf(e):e=>e.__proto__,p=[null,f({}),f([]),f(f)];function h(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!p.includes(t);t=f(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),c(t,n),t}function d(e){let t=N(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=h(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function m(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}o.i=d,o.A=function(e){return this.r(e)(d.bind(this))},o.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},o.r=function(e){return N(e,this.m).exports},o.f=function(e){function t(t){if(l.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(l.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let b=Symbol("turbopack queues"),y=Symbol("turbopack exports"),O=Symbol("turbopack error");function g(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}o.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:i,promise:s}=m(),u=Object.assign(s,{[y]:r.exports,[b]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),a={get:()=>u,set(e){e!==u&&(u[y]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(b in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[y]:{},[b]:e=>e(t)};return e.then(e=>{r[y]=e,g(t)},e=>{r[O]=e,g(t)}),r}}return{[y]:e,[b]:()=>{}}}),r=()=>t.map(e=>{if(e[O])throw e[O];return e[y]}),{promise:l,resolve:i}=m(),s=Object.assign(()=>i(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[b](u)),s.queueCount?l:r()},function(e){e?i(u[O]=e):l(u[y]),g(n)}),n&&-1===n.status&&(n.status=0)};let w=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function j(e,t){throw Error(`Invariant: ${t(e)}`)}w.prototype=URL.prototype,o.U=w,o.z=function(e){throw Error("dynamic usage of require is not supported")},o.g=globalThis;let R=n.prototype;var C,U=((C=U||{})[C.Runtime=0]="Runtime",C[C.Parent=1]="Parent",C[C.Update=2]="Update",C);let k=new Map;o.M=k;let v=new Map,_=new Map;async function P(e,t,r){let n;if("string"==typeof r)return A(e,t,S(r));let o=r.included||[],l=o.map(e=>!!k.has(e)||v.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);let i=r.moduleChunks||[],s=i.map(e=>_.get(e)).filter(e=>e);if(s.length>0){if(s.length===i.length)return void await Promise.all(s);let r=new Set;for(let e of i)_.has(e)||r.add(e);for(let n of r){let r=A(e,t,S(n));_.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=A(e,t,S(r.path)),i))_.has(o)||_.set(o,n)}for(let e of o)v.has(e)||v.set(e,n);await n}R.l=function(e){return P(1,this.m.id,e)};let $=Promise.resolve(void 0),T=new WeakMap;function A(t,r,n){let o=e.loadChunkCached(t,n),l=T.get(o);if(void 0===l){let e=T.set.bind(T,o,$);l=o.then(e).catch(e=>{let o;switch(t){case 0:o=`as a runtime dependency of chunk ${r}`;break;case 1:o=`from module ${r}`;break;case 2:o="from an HMR update";break;default:j(t,e=>`Unknown source type: ${e}`)}throw Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0)}),T.set(o,l)}return l}function S(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}`}R.L=function(e){return A(1,this.m.id,e)},R.R=function(e){let t=this.r(e);return t?.default??t},R.P=function(e){return`/ROOT/${e??""}`},R.b=function(e){let t=new Blob([`self.TURBOPACK_WORKER_LOCATION = ${JSON.stringify(location.origin)}; -self.TURBOPACK_NEXT_CHUNK_URLS = ${JSON.stringify(e.reverse().map(S),null,2)}; -importScripts(...self.TURBOPACK_NEXT_CHUNK_URLS.map(c => self.TURBOPACK_WORKER_LOCATION + c).reverse());`],{type:"text/javascript"});return URL.createObjectURL(t)};let E=/\.js(?:\?[^#]*)?(?:#.*)?$/,K=/\.css(?:\?[^#]*)?(?:#.*)?$/;function x(e){return K.test(e)}o.w=function(t,r,n){return e.loadWebAssembly(1,this.m.id,t,r,n)},o.u=function(t,r){return e.loadWebAssemblyModule(1,this.m.id,t,r)};let M={};o.c=M;let N=(e,t)=>{let r=M[e];if(r){if(r.error)throw r.error;return r}return L(e,U.Parent,t.id)};function L(e,t,r){let o=k.get(e);if("function"!=typeof o)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:j(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let l=a(e),i=l.exports;M[e]=l;let s=new n(l,i);try{o(s,l,i)}catch(e){throw l.error=e,e}return l.namespaceObject&&l.exports!==l.namespaceObject&&h(l.exports,l.namespaceObject),l}function q(r){let n,o=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(("undefined"!=typeof TURBOPACK_NEXT_CHUNK_URLS?TURBOPACK_NEXT_CHUNK_URLS.pop():e.getAttribute("src")).replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(r[0]);return 2===r.length?n=r[1]:(n=void 0,!function(e,t,r,n){let o=1;for(;o{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},B.set(e,t)}return t}e={async registerChunk(e,t){if(W(S(e)).resolve(),null!=t){for(let e of t.otherChunks)W(S("string"==typeof e?e:e.path));if(await Promise.all(t.otherChunks.map(t=>P(0,e,t))),t.runtimeModuleIds.length>0)for(let r of t.runtimeModuleIds)!function(e,t){let r=M[t];if(r){if(r.error)throw r.error;return}L(t,U.Runtime,e)}(e,r)}},loadChunkCached:(e,t)=>(function(e,t){let r=W(t);if(r.loadingStarted)return r.promise;if(e===U.Runtime)return r.loadingStarted=!0,x(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(x(t));else if(E.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(TURBOPACK_WORKER_LOCATION+t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(x(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)r.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(E.test(t)){let n=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${e}"],script[src^="${e}?"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener("error",()=>{r.reject()});else{let e=document.createElement("script");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let l=fetch(S(r)),{instance:i}=await WebAssembly.instantiateStreaming(l,o);return i.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(S(r));return await WebAssembly.compileStreaming(o)}};let I=globalThis.TURBOPACK;globalThis.TURBOPACK={push:q},I.forEach(q)})(); \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_buildManifest.js b/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_buildManifest.js deleted file mode 100644 index 1af6a5b..0000000 --- a/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_buildManifest.js +++ /dev/null @@ -1,15 +0,0 @@ -self.__BUILD_MANIFEST = { - "__rewrites": { - "afterFiles": [ - { - "source": "/api/:path*" - } - ], - "beforeFiles": [], - "fallback": [] - }, - "sortedPages": [ - "/_app", - "/_error" - ] -};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_clientMiddlewareManifest.json b/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_clientMiddlewareManifest.json deleted file mode 100644 index 0637a08..0000000 --- a/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_clientMiddlewareManifest.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_ssgManifest.js b/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_ssgManifest.js deleted file mode 100644 index 5b3ff59..0000000 --- a/src/hyperview/server/static/_next/static/lAwT6e3uaMqLUXxndbn_f/_ssgManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/src/hyperview/server/static/_not-found/__next._full.txt b/src/hyperview/server/static/_not-found/__next._full.txt deleted file mode 100644 index 310dcfd..0000000 --- a/src/hyperview/server/static/_not-found/__next._full.txt +++ /dev/null @@ -1,13 +0,0 @@ -1:"$Sreact.fragment" -2:I[39756,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -3:I[37457,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -4:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"] -5:"$Sreact.suspense" -7:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"] -9:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"] -b:I[68027,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"P":null,"b":"lAwT6e3uaMqLUXxndbn_f","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/19d0d66700a996ca.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/42879de7b8087bc9.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L7",null,{"children":"$@8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@a"}]}]}],null]}],false]],"m":"$undefined","G":["$b","$undefined"],"S":true} -8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -a:[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]] -6:null diff --git a/src/hyperview/server/static/_not-found/__next._head.txt b/src/hyperview/server/static/_not-found/__next._head.txt deleted file mode 100644 index 86b1312..0000000 --- a/src/hyperview/server/static/_not-found/__next._head.txt +++ /dev/null @@ -1,7 +0,0 @@ -1:"$Sreact.fragment" -2:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"] -4:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"] -5:"$Sreact.suspense" -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":"$@3"}],["$","div",null,{"hidden":true,"children":["$","$L4",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@6"}]}]}],null]}],"loading":null,"isPartial":false} -3:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -6:[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]] diff --git a/src/hyperview/server/static/_not-found/__next._index.txt b/src/hyperview/server/static/_not-found/__next._index.txt deleted file mode 100644 index b7c718a..0000000 --- a/src/hyperview/server/static/_not-found/__next._index.txt +++ /dev/null @@ -1,5 +0,0 @@ -1:"$Sreact.fragment" -2:I[39756,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -3:I[37457,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/19d0d66700a996ca.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/42879de7b8087bc9.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]]}],"loading":null,"isPartial":false} diff --git a/src/hyperview/server/static/_not-found/__next._not-found.__PAGE__.txt b/src/hyperview/server/static/_not-found/__next._not-found.__PAGE__.txt deleted file mode 100644 index 23f2df6..0000000 --- a/src/hyperview/server/static/_not-found/__next._not-found.__PAGE__.txt +++ /dev/null @@ -1,5 +0,0 @@ -1:"$Sreact.fragment" -2:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"] -3:"$Sreact.suspense" -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"loading":null,"isPartial":false} -4:null diff --git a/src/hyperview/server/static/_not-found/__next._not-found.txt b/src/hyperview/server/static/_not-found/__next._not-found.txt deleted file mode 100644 index 0795cef..0000000 --- a/src/hyperview/server/static/_not-found/__next._not-found.txt +++ /dev/null @@ -1,4 +0,0 @@ -1:"$Sreact.fragment" -2:I[39756,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -3:I[37457,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false} diff --git a/src/hyperview/server/static/_not-found/__next._tree.txt b/src/hyperview/server/static/_not-found/__next._tree.txt deleted file mode 100644 index 61b47aa..0000000 --- a/src/hyperview/server/static/_not-found/__next._tree.txt +++ /dev/null @@ -1,2 +0,0 @@ -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"buildId":"lAwT6e3uaMqLUXxndbn_f","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"/_not-found","paramType":null,"paramKey":"/_not-found","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":true},"staleTime":300} diff --git a/src/hyperview/server/static/_not-found/index.html b/src/hyperview/server/static/_not-found/index.html deleted file mode 100644 index 27fc3dd..0000000 --- a/src/hyperview/server/static/_not-found/index.html +++ /dev/null @@ -1 +0,0 @@ -404: This page could not be found.HyperView

404

This page could not be found.

\ No newline at end of file diff --git a/src/hyperview/server/static/_not-found/index.txt b/src/hyperview/server/static/_not-found/index.txt deleted file mode 100644 index 310dcfd..0000000 --- a/src/hyperview/server/static/_not-found/index.txt +++ /dev/null @@ -1,13 +0,0 @@ -1:"$Sreact.fragment" -2:I[39756,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -3:I[37457,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -4:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"] -5:"$Sreact.suspense" -7:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"] -9:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"] -b:I[68027,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"P":null,"b":"lAwT6e3uaMqLUXxndbn_f","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/19d0d66700a996ca.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/42879de7b8087bc9.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L7",null,{"children":"$@8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@a"}]}]}],null]}],false]],"m":"$undefined","G":["$b","$undefined"],"S":true} -8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -a:[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]] -6:null diff --git a/src/hyperview/server/static/index.html b/src/hyperview/server/static/index.html deleted file mode 100644 index a0eec5e..0000000 --- a/src/hyperview/server/static/index.html +++ /dev/null @@ -1 +0,0 @@ -HyperView

HyperView

Samples0 items
Embeddings
Loading...
Loading embeddings...
Shift+drag to lasso select • Scroll to zoom • Drag to pan
\ No newline at end of file diff --git a/src/hyperview/server/static/index.txt b/src/hyperview/server/static/index.txt deleted file mode 100644 index f4d4f19..0000000 --- a/src/hyperview/server/static/index.txt +++ /dev/null @@ -1,17 +0,0 @@ -1:"$Sreact.fragment" -2:I[39756,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -3:I[37457,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -4:I[47257,["/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"] -5:I[52683,["/_next/static/chunks/640b68f22e2796e6.js","/_next/static/chunks/71c75872eed19356.js"],"default"] -8:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"] -9:"$Sreact.suspense" -b:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"] -d:I[97367,["/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"] -f:I[68027,["/_next/static/chunks/42879de7b8087bc9.js"],"default"] -:HL["/_next/static/chunks/19d0d66700a996ca.css","style"] -0:{"P":null,"b":"lAwT6e3uaMqLUXxndbn_f","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/19d0d66700a996ca.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/640b68f22e2796e6.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/71c75872eed19356.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$@c"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$@e"}]}]}],null]}],false]],"m":"$undefined","G":["$f",[]],"S":true} -6:{} -7:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" -c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -e:[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]] -a:null diff --git a/src/hyperview/storage/__init__.py b/src/hyperview/storage/__init__.py new file mode 100644 index 0000000..690bb7d --- /dev/null +++ b/src/hyperview/storage/__init__.py @@ -0,0 +1,19 @@ +"""Storage backends for HyperView.""" + +from hyperview.storage.backend import StorageBackend +from hyperview.storage.config import ( + StorageConfig, + get_default_datasets_dir, + get_default_media_dir, +) +from hyperview.storage.lancedb_backend import LanceDBBackend +from hyperview.storage.memory_backend import MemoryBackend + +__all__ = [ + "StorageBackend", + "StorageConfig", + "get_default_datasets_dir", + "get_default_media_dir", + "LanceDBBackend", + "MemoryBackend", +] diff --git a/src/hyperview/storage/backend.py b/src/hyperview/storage/backend.py new file mode 100644 index 0000000..04cb05e --- /dev/null +++ b/src/hyperview/storage/backend.py @@ -0,0 +1,196 @@ +"""Abstract storage backend interface for HyperView.""" + +from abc import ABC, abstractmethod +from collections.abc import Callable, Iterator +from typing import Any + +import numpy as np + +from hyperview.core.sample import Sample + + +class StorageBackend(ABC): + """Abstract base class for storage backends.""" + + @abstractmethod + def add_sample(self, sample: Sample) -> None: + """Add a single sample (idempotent upsert).""" + + @abstractmethod + def add_samples_batch(self, samples: list[Sample]) -> None: + """Add multiple samples (idempotent upsert).""" + + @abstractmethod + def get_sample(self, sample_id: str) -> Sample | None: + """Retrieve a sample by ID.""" + + @abstractmethod + def get_samples_paginated( + self, + offset: int = 0, + limit: int = 100, + label: str | None = None, + ) -> tuple[list[Sample], int]: + """Get paginated samples. Returns (samples, total_count).""" + + @abstractmethod + def get_all_samples(self) -> list[Sample]: + """Get all samples.""" + + @abstractmethod + def update_sample(self, sample: Sample) -> None: + """Update an existing sample.""" + + @abstractmethod + def update_samples_batch(self, samples: list[Sample]) -> None: + """Batch update samples.""" + + @abstractmethod + def delete_sample(self, sample_id: str) -> bool: + """Delete a sample by ID.""" + + @abstractmethod + def __len__(self) -> int: + """Return total number of samples.""" + + @abstractmethod + def __iter__(self) -> Iterator[Sample]: + """Iterate over all samples.""" + + @abstractmethod + def __contains__(self, sample_id: str) -> bool: + """Check if sample exists.""" + + @abstractmethod + def get_unique_labels(self) -> list[str]: + """Get all unique labels.""" + + @abstractmethod + def get_existing_ids(self, sample_ids: list[str]) -> set[str]: + """Return set of sample_ids that already exist in storage.""" + + @abstractmethod + def get_samples_by_ids(self, sample_ids: list[str]) -> list[Sample]: + """Retrieve multiple samples by ID.""" + + @abstractmethod + def get_labels_by_ids(self, sample_ids: list[str]) -> dict[str, str | None]: + """Get labels for sample IDs. Missing IDs not included in result.""" + + @abstractmethod + def filter(self, predicate: Callable[[Sample], bool]) -> list[Sample]: + """Filter samples based on a predicate function.""" + + @abstractmethod + def list_spaces(self) -> list[Any]: + """List all embedding spaces.""" + + @abstractmethod + def get_space(self, space_key: str) -> Any | None: + """Get info for a specific embedding space.""" + + @abstractmethod + def ensure_space( + self, + model_id: str, + dim: int, + config: dict | None = None, + space_key: str | None = None, + ) -> Any: + """Ensure an embedding space exists, creating if needed. + + Args: + model_id: Model identifier for this space. + dim: Vector dimension. + config: Optional config dict for SpaceInfo.config_json. + space_key: Optional explicit space key. If None, derived from model_id. + """ + + @abstractmethod + def delete_space(self, space_key: str) -> bool: + """Delete an embedding space and its embeddings.""" + + @abstractmethod + def add_embeddings(self, space_key: str, ids: list[str], vectors: np.ndarray) -> None: + """Add embeddings to a space.""" + + @abstractmethod + def get_embeddings(self, space_key: str, ids: list[str] | None = None) -> tuple[list[str], np.ndarray]: + """Get embeddings from a space. Returns (ids, vectors).""" + + @abstractmethod + def get_embedded_ids(self, space_key: str) -> set[str]: + """Get sample IDs that have embeddings in a space.""" + + @abstractmethod + def get_missing_embedding_ids(self, space_key: str) -> list[str]: + """Get sample IDs without embeddings in a space.""" + + @abstractmethod + def list_layouts(self) -> list[Any]: + """List all layouts.""" + + @abstractmethod + def get_layout(self, layout_key: str) -> Any | None: + """Get layout info.""" + + @abstractmethod + def ensure_layout( + self, + layout_key: str, + space_key: str, + method: str, + geometry: str, + params: dict | None = None, + ) -> Any: + """Ensure a layout exists.""" + + @abstractmethod + def delete_layout(self, layout_key: str) -> bool: + """Delete a layout.""" + + @abstractmethod + def add_layout_coords(self, layout_key: str, ids: list[str], coords: np.ndarray) -> None: + """Add layout coordinates (N x 2).""" + + @abstractmethod + def get_layout_coords( + self, + layout_key: str, + ids: list[str] | None = None, + ) -> tuple[list[str], np.ndarray]: + """Get layout coordinates. Returns (ids, coords).""" + + @abstractmethod + def get_lasso_candidates_aabb( + self, + *, + layout_key: str, + x_min: float, + x_max: float, + y_min: float, + y_max: float, + ) -> tuple[list[str], np.ndarray]: + """Return candidate (id, xy) rows within an axis-aligned bounding box.""" + + @abstractmethod + def find_similar( + self, + sample_id: str, + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + """Find k nearest neighbors.""" + + @abstractmethod + def find_similar_by_vector( + self, + vector: list[float] | np.ndarray, + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + """Find k nearest neighbors to a query vector.""" + + @abstractmethod + def close(self) -> None: + """Close the storage connection.""" diff --git a/src/hyperview/storage/config.py b/src/hyperview/storage/config.py new file mode 100644 index 0000000..47ad1e5 --- /dev/null +++ b/src/hyperview/storage/config.py @@ -0,0 +1,71 @@ +"""Storage configuration for HyperView.""" + +import os +from dataclasses import dataclass, field +from pathlib import Path + + +def get_default_datasets_dir() -> Path: + """Get the default datasets directory. + + Uses HYPERVIEW_DATASETS_DIR env var if set, otherwise ~/.hyperview/datasets/ + Each dataset gets its own subdirectory with isolated LanceDB tables. + """ + env_dir = os.environ.get("HYPERVIEW_DATASETS_DIR") + if env_dir: + return Path(env_dir) + return Path.home() / ".hyperview" / "datasets" + + +def get_default_media_dir() -> Path: + """Get the default media directory for downloaded images. + + Uses HYPERVIEW_MEDIA_DIR env var if set, otherwise ~/.hyperview/media/ + Similar to FiftyOne's ~/fiftyone/huggingface/hub/ pattern. + """ + env_dir = os.environ.get("HYPERVIEW_MEDIA_DIR") + if env_dir: + return Path(env_dir) + return Path.home() / ".hyperview" / "media" + + +@dataclass +class StorageConfig: + """Configuration for storage backend.""" + + datasets_dir: Path = field(default_factory=get_default_datasets_dir) + media_dir: Path = field(default_factory=get_default_media_dir) + + @classmethod + def default(cls) -> "StorageConfig": + """Create a default configuration.""" + return cls( + datasets_dir=get_default_datasets_dir(), + media_dir=get_default_media_dir(), + ) + + def ensure_dir_exists(self) -> None: + """Ensure the datasets directory exists.""" + self.datasets_dir.mkdir(parents=True, exist_ok=True) + + def ensure_media_dir_exists(self) -> None: + """Ensure the media directory exists.""" + self.media_dir.mkdir(parents=True, exist_ok=True) + + def get_huggingface_media_dir(self, dataset_name: str, split: str) -> Path: + """Get the directory for storing HuggingFace dataset media. + + Creates: ~/.hyperview/media/huggingface/{dataset_name}/{split}/ + + Args: + dataset_name: Name of the HuggingFace dataset (e.g., "cifar100") + split: Dataset split (e.g., "train", "test") + + Returns: + Path to the media directory for this dataset/split. + """ + # Sanitize dataset name for filesystem (replace / with _) + safe_name = dataset_name.replace("/", "_") + media_path = self.media_dir / "huggingface" / safe_name / split + media_path.mkdir(parents=True, exist_ok=True) + return media_path diff --git a/src/hyperview/storage/lancedb_backend.py b/src/hyperview/storage/lancedb_backend.py new file mode 100644 index 0000000..7001489 --- /dev/null +++ b/src/hyperview/storage/lancedb_backend.py @@ -0,0 +1,432 @@ +"""LanceDB storage backend for HyperView.""" + +import time +from collections.abc import Callable, Iterator + +import lancedb +import numpy as np +import pyarrow as pa + +from hyperview.core.sample import Sample +from hyperview.storage.backend import StorageBackend +from hyperview.storage.config import StorageConfig +from hyperview.storage.schema import ( + LayoutInfo, + SpaceInfo, + create_embeddings_schema, + create_layouts_registry_schema, + create_layouts_schema, + create_sample_schema, + create_spaces_schema, + dict_to_sample, + make_space_key, + sample_to_dict, +) + + +def _sql_escape(value: str) -> str: + """Escape single quotes for SQL WHERE clauses.""" + return value.replace("'", "''") + + +class LanceDBBackend(StorageBackend): + """LanceDB-based storage backend for HyperView datasets.""" + + def __init__(self, dataset_name: str, config: StorageConfig | None = None): + self.dataset_name = dataset_name + self.config = config or StorageConfig.default() + self._dataset_dir = self.config.datasets_dir / dataset_name + self._dataset_dir.mkdir(parents=True, exist_ok=True) + self._db = lancedb.connect(str(self._dataset_dir)) + + self._samples_table = self._get_or_create_samples_table() + self._spaces_table = self._get_or_create_spaces_table() + + def _table_names(self) -> set[str]: + """Return the set of table names in this LanceDB database.""" + res = self._db.list_tables() + return set(res.tables) + + def _get_or_create_samples_table(self) -> lancedb.table.Table | None: + if "samples" in self._table_names(): + return self._db.open_table("samples") + return None + + def _ensure_samples_table(self, data: list[dict]) -> lancedb.table.Table: + if self._samples_table is None: + schema = create_sample_schema() + arrow_table = pa.Table.from_pylist(data, schema=schema) + self._samples_table = self._db.create_table("samples", data=arrow_table) + return self._samples_table + + def _get_or_create_spaces_table(self) -> lancedb.table.Table: + if "spaces" in self._table_names(): + return self._db.open_table("spaces") + return self._db.create_table("spaces", schema=create_spaces_schema()) + + def add_sample(self, sample: Sample) -> None: + data = [sample_to_dict(sample)] + if self._samples_table is None: + self._ensure_samples_table(data) + else: + arrow = pa.Table.from_pylist(data, schema=self._samples_table.schema) + self._samples_table.merge_insert("id").when_matched_update_all().when_not_matched_insert_all().execute(arrow) + + def add_samples_batch(self, samples: list[Sample]) -> None: + if not samples: + return + data = [sample_to_dict(s) for s in samples] + if self._samples_table is None: + self._ensure_samples_table(data) + else: + arrow = pa.Table.from_pylist(data, schema=self._samples_table.schema) + self._samples_table.merge_insert("id").when_matched_update_all().when_not_matched_insert_all().execute(arrow) + + def get_sample(self, sample_id: str) -> Sample | None: + if self._samples_table is None: + return None + results = self._samples_table.search().where(f"id = '{_sql_escape(sample_id)}'").limit(1).to_list() + return dict_to_sample(results[0]) if results else None + + def get_samples_paginated( + self, + offset: int = 0, + limit: int = 100, + label: str | None = None, + ) -> tuple[list[Sample], int]: + if self._samples_table is None: + return [], 0 + + import pyarrow.compute as pc + + if label: + arrow_table = self._samples_table.search().select(["label"]).to_arrow() + mask = pc.fill_null(pc.equal(arrow_table.column("label"), pa.scalar(label)), False) + total = pc.sum(pc.cast(mask, pa.int64())).as_py() + results = self._samples_table.search().where(f"label = '{_sql_escape(label)}'").offset(offset).limit(limit).to_list() + else: + total = self._samples_table.count_rows() + results = self._samples_table.search().offset(offset).limit(limit).to_list() + + return [dict_to_sample(row) for row in results], total + + def get_all_samples(self) -> list[Sample]: + if self._samples_table is None: + return [] + return [dict_to_sample(row) for row in self._samples_table.to_arrow().to_pylist()] + + def update_sample(self, sample: Sample) -> None: + self.add_sample(sample) + + def update_samples_batch(self, samples: list[Sample]) -> None: + self.add_samples_batch(samples) + + def delete_sample(self, sample_id: str) -> bool: + if self._samples_table is None: + return False + self._samples_table.delete(f"id = '{_sql_escape(sample_id)}'") + return True + + def __len__(self) -> int: + return self._samples_table.count_rows() if self._samples_table else 0 + + def __iter__(self) -> Iterator[Sample]: + if self._samples_table is None: + return iter([]) + for batch in self._samples_table.to_arrow().to_batches(max_chunksize=1000): + batch_dict = batch.to_pydict() + for i in range(batch.num_rows): + yield dict_to_sample({k: batch_dict[k][i] for k in batch_dict}) + + def __contains__(self, sample_id: str) -> bool: + if self._samples_table is None: + return False + return len(self._samples_table.search().where(f"id = '{_sql_escape(sample_id)}'").limit(1).to_list()) > 0 + + def get_unique_labels(self) -> list[str]: + if self._samples_table is None: + return [] + import pyarrow.compute as pc + labels = pc.unique(self._samples_table.search().select(["label"]).to_arrow().column("label")).to_pylist() + return sorted([l for l in labels if l is not None]) + + def get_existing_ids(self, sample_ids: list[str]) -> set[str]: + if self._samples_table is None or not sample_ids: + return set() + existing: set[str] = set() + for i in range(0, len(sample_ids), 1000): + chunk = sample_ids[i : i + 1000] + id_list = "', '".join(_sql_escape(sid) for sid in chunk) + results = self._samples_table.search().where(f"id IN ('{id_list}')").select(["id"]).to_list() + existing.update(r["id"] for r in results) + return existing + + def get_samples_by_ids(self, sample_ids: list[str]) -> list[Sample]: + if self._samples_table is None or not sample_ids: + return [] + rows_by_id: dict[str, dict] = {} + for i in range(0, len(sample_ids), 1000): + chunk = sample_ids[i : i + 1000] + id_list = "', '".join(_sql_escape(sid) for sid in chunk) + for r in self._samples_table.search().where(f"id IN ('{id_list}')").to_list(): + rows_by_id[r["id"]] = r + return [dict_to_sample(rows_by_id[sid]) for sid in sample_ids if sid in rows_by_id] + + def get_labels_by_ids(self, sample_ids: list[str]) -> dict[str, str | None]: + if self._samples_table is None or not sample_ids: + return {} + labels: dict[str, str | None] = {} + for i in range(0, len(sample_ids), 1000): + chunk = sample_ids[i : i + 1000] + id_list = "', '".join(_sql_escape(sid) for sid in chunk) + for r in self._samples_table.search().select(["id", "label"]).where(f"id IN ('{id_list}')").to_list(): + labels[r["id"]] = r.get("label") + return labels + + def filter(self, predicate: Callable[[Sample], bool]) -> list[Sample]: + return [s for s in self if predicate(s)] + + def list_spaces(self) -> list[SpaceInfo]: + return [SpaceInfo.from_dict(r) for r in self._spaces_table.to_arrow().to_pylist()] + + def get_space(self, space_key: str) -> SpaceInfo | None: + results = self._spaces_table.search().where(f"space_key = '{_sql_escape(space_key)}'").limit(1).to_list() + return SpaceInfo.from_dict(results[0]) if results else None + + def ensure_space( + self, + model_id: str, + dim: int, + config: dict | None = None, + space_key: str | None = None, + ) -> SpaceInfo: + if space_key is None: + space_key = make_space_key(model_id) + existing = self.get_space(space_key) + if existing is not None: + if existing.dim != dim: + raise ValueError(f"Space '{space_key}' exists with dim={existing.dim}, requested dim={dim}") + return existing + + now = int(time.time()) + space_info = SpaceInfo( + space_key=space_key, model_id=model_id, dim=dim, count=0, + created_at=now, updated_at=now, config=config, + ) + self._spaces_table.add(pa.Table.from_pylist([space_info.to_dict()], schema=create_spaces_schema())) + self._db.create_table(f"embeddings__{space_key}", schema=create_embeddings_schema(dim)) + return space_info + + def delete_space(self, space_key: str) -> bool: + self._spaces_table.delete(f"space_key = '{_sql_escape(space_key)}'") + emb_table = f"embeddings__{space_key}" + if emb_table in self._table_names(): + self._db.drop_table(emb_table) + return True + + def add_embeddings(self, space_key: str, ids: list[str], vectors: np.ndarray) -> None: + if len(ids) != len(vectors) or len(ids) == 0: + return + space = self.get_space(space_key) + if space is None: + raise ValueError(f"Space not found: {space_key}") + + emb_table_name = f"embeddings__{space_key}" + if emb_table_name not in self._table_names(): + self._db.create_table(emb_table_name, schema=create_embeddings_schema(space.dim)) + + emb_table = self._db.open_table(emb_table_name) + data = [{"id": id_, "vector": vec.astype(np.float32).tolist()} for id_, vec in zip(ids, vectors)] + emb_table.merge_insert("id").when_matched_update_all().when_not_matched_insert_all().execute( + pa.Table.from_pylist(data, schema=create_embeddings_schema(space.dim)) + ) + + # Update space count + self._spaces_table.update(where=f"space_key = '{_sql_escape(space_key)}'", values={ + "count": emb_table.count_rows(), "updated_at": int(time.time()) + }) + + def get_embeddings(self, space_key: str, ids: list[str] | None = None) -> tuple[list[str], np.ndarray]: + space = self.get_space(space_key) + if space is None: + raise ValueError(f"Space not found: {space_key}") + + emb_table_name = f"embeddings__{space_key}" + if emb_table_name not in self._table_names(): + return [], np.empty((0, space.dim), dtype=np.float32) + + emb_table = self._db.open_table(emb_table_name) + if ids is not None: + id_list = "', '".join(_sql_escape(sid) for sid in ids) + rows = emb_table.search().where(f"id IN ('{id_list}')").to_list() + else: + rows = emb_table.to_arrow().to_pylist() + + if not rows: + return [], np.empty((0, space.dim), dtype=np.float32) + return [r["id"] for r in rows], np.array([r["vector"] for r in rows], dtype=np.float32) + + def get_embedded_ids(self, space_key: str) -> set[str]: + emb_table_name = f"embeddings__{space_key}" + if emb_table_name not in self._table_names(): + return set() + return {r["id"] for r in self._db.open_table(emb_table_name).search().select(["id"]).to_list()} + + def get_missing_embedding_ids(self, space_key: str) -> list[str]: + if self._samples_table is None: + return [] + all_ids = {r["id"] for r in self._samples_table.search().select(["id"]).to_list()} + return list(all_ids - self.get_embedded_ids(space_key)) + + def _get_layouts_registry_table(self) -> lancedb.table.Table | None: + return self._db.open_table("layouts_registry") if "layouts_registry" in self._table_names() else None + + def _ensure_layouts_registry_table(self) -> lancedb.table.Table: + if "layouts_registry" not in self._table_names(): + self._db.create_table("layouts_registry", schema=create_layouts_registry_schema()) + return self._db.open_table("layouts_registry") + + def list_layouts(self) -> list[LayoutInfo]: + table = self._get_layouts_registry_table() + return [LayoutInfo.from_dict(row) for row in table.search().to_list()] if table else [] + + def get_layout(self, layout_key: str) -> LayoutInfo | None: + table = self._get_layouts_registry_table() + if table is None: + return None + rows = table.search().where(f"layout_key = '{_sql_escape(layout_key)}'").limit(1).to_list() + return LayoutInfo.from_dict(rows[0]) if rows else None + + def ensure_layout( + self, + layout_key: str, + space_key: str, + method: str, + geometry: str, + params: dict | None = None, + ) -> LayoutInfo: + existing = self.get_layout(layout_key) + if existing is not None: + return existing + + layout_info = LayoutInfo( + layout_key=layout_key, space_key=space_key, method=method, geometry=geometry, + count=0, created_at=int(time.time()), params=params, + ) + registry_table = self._ensure_layouts_registry_table() + registry_table.add(pa.Table.from_pylist([layout_info.to_dict()], schema=create_layouts_registry_schema())) + + table_name = f"layouts__{layout_key}" + if table_name not in self._table_names(): + self._db.create_table(table_name, schema=create_layouts_schema()) + return layout_info + + def delete_layout(self, layout_key: str) -> bool: + table_name = f"layouts__{layout_key}" + if table_name in self._table_names(): + self._db.drop_table(table_name) + registry = self._get_layouts_registry_table() + if registry: + registry.delete(f"layout_key = '{_sql_escape(layout_key)}'") + return True + + def add_layout_coords(self, layout_key: str, ids: list[str], coords: np.ndarray) -> None: + if len(ids) != len(coords) or len(ids) == 0: + return + if self.get_layout(layout_key) is None: + raise ValueError(f"Layout '{layout_key}' not registered") + + table_name = f"layouts__{layout_key}" + if table_name not in self._table_names(): + self._db.create_table(table_name, schema=create_layouts_schema()) + + table = self._db.open_table(table_name) + data = [{"id": id_, "x": float(c[0]), "y": float(c[1])} for id_, c in zip(ids, coords)] + table.merge_insert("id").when_matched_update_all().when_not_matched_insert_all().execute( + pa.Table.from_pylist(data, schema=create_layouts_schema()) + ) + + # Update count + registry = self._get_layouts_registry_table() + if registry: + registry.update(where=f"layout_key = '{_sql_escape(layout_key)}'", values={"count": table.count_rows()}) + + def get_layout_coords(self, layout_key: str, ids: list[str] | None = None) -> tuple[list[str], np.ndarray]: + table_name = f"layouts__{layout_key}" + if table_name not in self._table_names(): + return [], np.empty((0, 2), dtype=np.float32) + + table = self._db.open_table(table_name) + if ids is not None: + id_list = "', '".join(_sql_escape(sid) for sid in ids) + rows = table.search().where(f"id IN ('{id_list}')").to_list() + else: + rows = table.to_arrow().to_pylist() + + if not rows: + return [], np.empty((0, 2), dtype=np.float32) + return [r["id"] for r in rows], np.array([[r["x"], r["y"]] for r in rows], dtype=np.float32) + + def get_lasso_candidates_aabb( + self, + *, + layout_key: str, + x_min: float, + x_max: float, + y_min: float, + y_max: float, + ) -> tuple[list[str], np.ndarray]: + table_name = f"layouts__{layout_key}" + if table_name not in self._table_names(): + return [], np.empty((0, 2), dtype=np.float32) + + rows = self._db.open_table(table_name).search().where( + f"x >= {x_min} AND x <= {x_max} AND y >= {y_min} AND y <= {y_max}" + ).to_list() + + if not rows: + return [], np.empty((0, 2), dtype=np.float32) + return [r["id"] for r in rows], np.array([[r["x"], r["y"]] for r in rows], dtype=np.float32) + + def find_similar(self, sample_id: str, k: int = 10, space_key: str | None = None) -> list[tuple[Sample, float]]: + if space_key is None: + spaces = self.list_spaces() + if not spaces: + raise ValueError("No embedding spaces available") + space_key = spaces[0].space_key + + ids, vecs = self.get_embeddings(space_key, [sample_id]) + if not ids: + raise ValueError(f"Sample {sample_id} has no embedding in space {space_key}") + + results = self.find_similar_by_vector(vecs[0], k + 1, space_key) + return [(s, d) for s, d in results if s.id != sample_id][:k] + + def find_similar_by_vector( + self, + vector: list[float] | np.ndarray, + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + import math + + if space_key is None: + spaces = self.list_spaces() + if not spaces: + raise ValueError("No embedding spaces available") + space_key = spaces[0].space_key + + emb_table_name = f"embeddings__{space_key}" + if emb_table_name not in self._table_names(): + return [] + + results = self._db.open_table(emb_table_name).search(vector, vector_column_name="vector").metric("cosine").limit(k).to_list() + samples_by_id = {s.id: s for s in self.get_samples_by_ids([r["id"] for r in results])} + + return [ + (samples_by_id[r["id"]], 0.0 if math.isnan(d := r.get("_distance", 0.0)) else float(d)) + for r in results if r["id"] in samples_by_id + ] + + def close(self) -> None: + return diff --git a/src/hyperview/storage/memory_backend.py b/src/hyperview/storage/memory_backend.py new file mode 100644 index 0000000..7189e08 --- /dev/null +++ b/src/hyperview/storage/memory_backend.py @@ -0,0 +1,279 @@ +"""In-memory storage backend for testing and development.""" + +import time +from collections.abc import Callable, Iterator + +import numpy as np + +from hyperview.core.sample import Sample +from hyperview.storage.backend import StorageBackend +from hyperview.storage.schema import LayoutInfo, SpaceInfo, make_space_key + + +class MemoryBackend(StorageBackend): + """In-memory storage backend for testing and development.""" + + def __init__(self, dataset_name: str): + self.dataset_name = dataset_name + self._samples: dict[str, Sample] = {} + self._spaces: dict[str, SpaceInfo] = {} + self._embeddings: dict[str, dict[str, np.ndarray]] = {} + self._layout_registry: dict[str, LayoutInfo] = {} + self._layouts: dict[str, dict[str, tuple[float, float]]] = {} + + def add_sample(self, sample: Sample) -> None: + self._samples[sample.id] = sample + + def add_samples_batch(self, samples: list[Sample]) -> None: + for sample in samples: + self._samples[sample.id] = sample + + def get_sample(self, sample_id: str) -> Sample | None: + return self._samples.get(sample_id) + + def get_samples_paginated( + self, + offset: int = 0, + limit: int = 100, + label: str | None = None, + ) -> tuple[list[Sample], int]: + samples = list(self._samples.values()) + if label: + samples = [s for s in samples if s.label == label] + total = len(samples) + return samples[offset : offset + limit], total + + def get_all_samples(self) -> list[Sample]: + return list(self._samples.values()) + + def update_sample(self, sample: Sample) -> None: + self._samples[sample.id] = sample + + def update_samples_batch(self, samples: list[Sample]) -> None: + for sample in samples: + self._samples[sample.id] = sample + + def delete_sample(self, sample_id: str) -> bool: + if sample_id in self._samples: + del self._samples[sample_id] + return True + return False + + def __len__(self) -> int: + return len(self._samples) + + def __iter__(self) -> Iterator[Sample]: + return iter(self._samples.values()) + + def __contains__(self, sample_id: str) -> bool: + return sample_id in self._samples + + def get_unique_labels(self) -> list[str]: + return sorted({s.label for s in self._samples.values() if s.label}) + + def get_existing_ids(self, sample_ids: list[str]) -> set[str]: + return {sid for sid in sample_ids if sid in self._samples} + + def get_samples_by_ids(self, sample_ids: list[str]) -> list[Sample]: + return [s for sid in sample_ids if (s := self._samples.get(sid)) is not None] + + def get_labels_by_ids(self, sample_ids: list[str]) -> dict[str, str | None]: + return {sid: s.label for sid in sample_ids if (s := self._samples.get(sid)) is not None} + + def filter(self, predicate: Callable[[Sample], bool]) -> list[Sample]: + return [s for s in self._samples.values() if predicate(s)] + + def list_spaces(self) -> list[SpaceInfo]: + return list(self._spaces.values()) + + def get_space(self, space_key: str) -> SpaceInfo | None: + return self._spaces.get(space_key) + + def ensure_space( + self, + model_id: str, + dim: int, + config: dict | None = None, + space_key: str | None = None, + ) -> SpaceInfo: + if space_key is None: + space_key = make_space_key(model_id) + if space_key in self._spaces: + existing = self._spaces[space_key] + if existing.dim != dim: + raise ValueError(f"Space '{space_key}' exists with dim={existing.dim}, requested dim={dim}") + return existing + + now = int(time.time()) + space_info = SpaceInfo( + space_key=space_key, + model_id=model_id, + dim=dim, + count=0, + created_at=now, + updated_at=now, + config=config, + ) + self._spaces[space_key] = space_info + self._embeddings[space_key] = {} + return space_info + + def delete_space(self, space_key: str) -> bool: + if space_key in self._spaces: + del self._spaces[space_key] + self._embeddings.pop(space_key, None) + return True + return False + + def add_embeddings(self, space_key: str, ids: list[str], vectors: np.ndarray) -> None: + if len(ids) != len(vectors) or len(ids) == 0: + return + if space_key not in self._spaces: + raise ValueError(f"Space not found: {space_key}") + + space = self._spaces[space_key] + emb_store = self._embeddings.setdefault(space_key, {}) + for id_, vec in zip(ids, vectors): + emb_store[id_] = vec.astype(np.float32) + space.count = len(emb_store) + space.updated_at = int(time.time()) + + def get_embeddings(self, space_key: str, ids: list[str] | None = None) -> tuple[list[str], np.ndarray]: + if space_key not in self._spaces: + raise ValueError(f"Space not found: {space_key}") + + space = self._spaces[space_key] + emb_store = self._embeddings.get(space_key, {}) + + if ids is not None: + out_ids = [id_ for id_ in ids if id_ in emb_store] + else: + out_ids = list(emb_store.keys()) + + if not out_ids: + return [], np.empty((0, space.dim), dtype=np.float32) + return out_ids, np.array([emb_store[id_] for id_ in out_ids], dtype=np.float32) + + def get_embedded_ids(self, space_key: str) -> set[str]: + return set(self._embeddings.get(space_key, {}).keys()) + + def get_missing_embedding_ids(self, space_key: str) -> list[str]: + embedded = self.get_embedded_ids(space_key) + return [id_ for id_ in self._samples.keys() if id_ not in embedded] + + def list_layouts(self) -> list[LayoutInfo]: + return list(self._layout_registry.values()) + + def get_layout(self, layout_key: str) -> LayoutInfo | None: + return self._layout_registry.get(layout_key) + + def ensure_layout( + self, + layout_key: str, + space_key: str, + method: str, + geometry: str, + params: dict | None = None, + ) -> LayoutInfo: + if layout_key in self._layout_registry: + return self._layout_registry[layout_key] + + layout_info = LayoutInfo( + layout_key=layout_key, + space_key=space_key, + method=method, + geometry=geometry, + count=0, + created_at=int(time.time()), + params=params, + ) + self._layout_registry[layout_key] = layout_info + self._layouts[layout_key] = {} + return layout_info + + def delete_layout(self, layout_key: str) -> bool: + deleted = layout_key in self._layouts or layout_key in self._layout_registry + self._layouts.pop(layout_key, None) + self._layout_registry.pop(layout_key, None) + return deleted + + def add_layout_coords(self, layout_key: str, ids: list[str], coords: np.ndarray) -> None: + if len(ids) != len(coords): + raise ValueError("ids and coords must have same length") + if layout_key not in self._layout_registry: + raise ValueError(f"Layout '{layout_key}' not registered") + + layout_store = self._layouts.setdefault(layout_key, {}) + for id_, coord in zip(ids, coords): + layout_store[id_] = (float(coord[0]), float(coord[1])) + self._layout_registry[layout_key].count = len(layout_store) + + def get_layout_coords(self, layout_key: str, ids: list[str] | None = None) -> tuple[list[str], np.ndarray]: + layout_store = self._layouts.get(layout_key, {}) + out_ids = [id_ for id_ in ids if id_ in layout_store] if ids is not None else list(layout_store.keys()) + if not out_ids: + return [], np.empty((0, 2), dtype=np.float32) + return out_ids, np.array([layout_store[id_] for id_ in out_ids], dtype=np.float32) + + def get_lasso_candidates_aabb( + self, + *, + layout_key: str, + x_min: float, + x_max: float, + y_min: float, + y_max: float, + ) -> tuple[list[str], np.ndarray]: + layout_store = self._layouts.get(layout_key, {}) + ids, coords = [], [] + for id_, (x, y) in layout_store.items(): + if x_min <= x <= x_max and y_min <= y <= y_max: + ids.append(id_) + coords.append([x, y]) + return ids, np.array(coords, dtype=np.float32) if coords else np.empty((0, 2), dtype=np.float32) + + def find_similar(self, sample_id: str, k: int = 10, space_key: str | None = None) -> list[tuple[Sample, float]]: + if space_key is None: + if not self._spaces: + raise ValueError("No embedding spaces available") + space_key = next(iter(self._spaces)) + + emb_store = self._embeddings.get(space_key, {}) + if sample_id not in emb_store: + raise ValueError(f"Sample {sample_id} has no embedding in space {space_key}") + + results = self.find_similar_by_vector(emb_store[sample_id], k + 1, space_key) + return [(s, d) for s, d in results if s.id != sample_id][:k] + + def find_similar_by_vector( + self, + vector: list[float] | np.ndarray, + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + if space_key is None: + if not self._spaces: + raise ValueError("No embedding spaces available") + space_key = next(iter(self._spaces)) + + emb_store = self._embeddings.get(space_key, {}) + query = np.array(vector, dtype=np.float32) + norm_query = np.linalg.norm(query) + + distances: list[tuple[Sample, float]] = [] + for id_, vec in emb_store.items(): + sample = self._samples.get(id_) + if sample is None: + continue + norm_vec = np.linalg.norm(vec) + if norm_query == 0 or norm_vec == 0: + distance = 1.0 + else: + distance = 1 - np.dot(query, vec) / (norm_query * norm_vec) + distances.append((sample, float(distance))) + + distances.sort(key=lambda x: x[1]) + return distances[:k] + + def close(self) -> None: + pass diff --git a/src/hyperview/storage/schema.py b/src/hyperview/storage/schema.py new file mode 100644 index 0000000..1f1a14d --- /dev/null +++ b/src/hyperview/storage/schema.py @@ -0,0 +1,283 @@ +"""LanceDB schema definitions for HyperView. + +Storage architecture: +- samples: Core sample metadata (no embeddings) +- metadata: Key-value pairs for dataset config +- spaces: Registry of embedding spaces +- embeddings__: One table per embedding space (id + vector) +- layouts__: One table per layout (id + x + y) +""" + +import json +import re +from dataclasses import dataclass +from typing import Any + +import pyarrow as pa + +from hyperview.core.sample import Sample + + +def create_sample_schema() -> pa.Schema: + """Create the PyArrow schema for samples. + + Samples are pure metadata - embeddings and layouts are stored separately. + """ + return pa.schema( + [ + pa.field("id", pa.utf8(), nullable=False), + pa.field("filepath", pa.utf8(), nullable=False), + pa.field("label", pa.utf8(), nullable=True), + pa.field("metadata_json", pa.utf8(), nullable=True), + pa.field("thumbnail_base64", pa.utf8(), nullable=True), + ] + ) + + +def create_metadata_schema() -> pa.Schema: + """Create the PyArrow schema for dataset metadata (key-value store).""" + return pa.schema( + [ + pa.field("key", pa.utf8(), nullable=False), + pa.field("value", pa.utf8(), nullable=True), + ] + ) + + +def create_spaces_schema() -> pa.Schema: + """Create the PyArrow schema for the spaces registry. + + Each row represents an embedding space (one per model). + """ + return pa.schema( + [ + pa.field("space_key", pa.utf8(), nullable=False), + pa.field("model_id", pa.utf8(), nullable=False), + pa.field("dim", pa.int32(), nullable=False), + pa.field("count", pa.int64(), nullable=False), + pa.field("created_at", pa.int64(), nullable=False), + pa.field("updated_at", pa.int64(), nullable=False), + pa.field("config_json", pa.utf8(), nullable=True), + ] + ) + + +def create_embeddings_schema(dim: int) -> pa.Schema: + """Create the PyArrow schema for an embeddings table. + + Args: + dim: Vector dimension for this embedding space. + """ + return pa.schema( + [ + pa.field("id", pa.utf8(), nullable=False), + pa.field("vector", pa.list_(pa.float32(), dim), nullable=False), + ] + ) + + +def create_layouts_schema() -> pa.Schema: + """Create the PyArrow schema for a layouts table. + + Layouts store 2D coordinates for visualization. + """ + return pa.schema( + [ + pa.field("id", pa.utf8(), nullable=False), + pa.field("x", pa.float32(), nullable=False), + pa.field("y", pa.float32(), nullable=False), + ] + ) + + +@dataclass +class SpaceInfo: + """Metadata for an embedding space.""" + + space_key: str + model_id: str + dim: int + count: int + created_at: int + updated_at: int + config: dict[str, Any] | None = None + + @property + def provider(self) -> str: + return (self.config or {}).get("provider", "unknown") + + @property + def geometry(self) -> str: + return (self.config or {}).get("geometry", "euclidean") + + def to_dict(self) -> dict[str, Any]: + return { + "space_key": self.space_key, + "model_id": self.model_id, + "dim": self.dim, + "count": self.count, + "created_at": self.created_at, + "updated_at": self.updated_at, + "config_json": json.dumps(self.config) if self.config else None, + } + + def to_api_dict(self) -> dict[str, Any]: + return { + "space_key": self.space_key, + "model_id": self.model_id, + "dim": self.dim, + "count": self.count, + "provider": self.provider, + "geometry": self.geometry, + "config": self.config, + } + + @classmethod + def from_dict(cls, row: dict[str, Any]) -> "SpaceInfo": + config_json = row.get("config_json") + config = json.loads(config_json) if config_json else None + return cls( + space_key=row["space_key"], + model_id=row["model_id"], + dim=row["dim"], + count=row["count"], + created_at=row["created_at"], + updated_at=row["updated_at"], + config=config, + ) + + +def create_layouts_registry_schema() -> pa.Schema: + """Create the PyArrow schema for the layouts registry. + + Each row represents a layout (2D projection of an embedding space). + """ + return pa.schema( + [ + pa.field("layout_key", pa.utf8(), nullable=False), + pa.field("space_key", pa.utf8(), nullable=False), + pa.field("method", pa.utf8(), nullable=False), + pa.field("geometry", pa.utf8(), nullable=False), + pa.field("count", pa.int64(), nullable=False), + pa.field("created_at", pa.int64(), nullable=False), + pa.field("params_json", pa.utf8(), nullable=True), + ] + ) + + +@dataclass +class LayoutInfo: + """Metadata for a layout (2D projection).""" + + layout_key: str + space_key: str + method: str + geometry: str + count: int + created_at: int + params: dict[str, Any] | None = None + + def to_dict(self) -> dict[str, Any]: + return { + "layout_key": self.layout_key, + "space_key": self.space_key, + "method": self.method, + "geometry": self.geometry, + "count": self.count, + "created_at": self.created_at, + "params_json": json.dumps(self.params) if self.params else None, + } + + def to_api_dict(self) -> dict[str, Any]: + return { + "layout_key": self.layout_key, + "space_key": self.space_key, + "method": self.method, + "geometry": self.geometry, + "count": self.count, + "params": self.params, + } + + @classmethod + def from_dict(cls, row: dict[str, Any]) -> "LayoutInfo": + params_json = row.get("params_json") + params = json.loads(params_json) if params_json else None + return cls( + layout_key=row["layout_key"], + space_key=row["space_key"], + method=row["method"], + geometry=row["geometry"], + count=row["count"], + created_at=row["created_at"], + params=params, + ) + + +def slugify_model_id(model_id: str) -> str: + """Convert a model ID to a safe table name component. + + Examples: + "openai/clip-vit-base-patch32" -> "openai_clip-vit-base-patch32" + "sentence-transformers/all-MiniLM-L6-v2" -> "sentence-transformers_all-MiniLM-L6-v2" + """ + # Replace / with _ + slug = model_id.replace("/", "_") + # Replace any other unsafe characters with _ + slug = re.sub(r"[^a-zA-Z0-9_\-]", "_", slug) + # Collapse multiple underscores + slug = re.sub(r"_+", "_", slug) + return slug.strip("_") + + +def make_space_key(model_id: str) -> str: + """Generate a space_key from a model_id. + + For simplicity, this is just the slugified model_id. + """ + return slugify_model_id(model_id) + + +def make_layout_key( + space_key: str, + method: str = "umap", + geometry: str = "euclidean", + params: dict | None = None, +) -> str: + """Generate a layout_key from space, method, geometry, and params. + + The params are hashed to ensure different parameter sets get different keys. + """ + base = f"{space_key}__{geometry}_{method}" + if params: + # Create a stable hash of params + import hashlib + params_str = "_".join(f"{k}={v}" for k, v in sorted(params.items())) + params_hash = hashlib.md5(params_str.encode()).hexdigest()[:8] + return f"{base}_{params_hash}" + return base + + +def sample_to_dict(sample: Sample) -> dict[str, Any]: + """Convert a Sample to a dictionary for LanceDB insertion.""" + return { + "id": sample.id, + "filepath": sample.filepath, + "label": sample.label, + "metadata_json": json.dumps(sample.metadata) if sample.metadata else None, + "thumbnail_base64": sample.thumbnail_base64, + } + + +def dict_to_sample(row: dict[str, Any]) -> Sample: + """Convert a LanceDB row to a Sample object.""" + metadata_json = row.get("metadata_json") + metadata = json.loads(metadata_json) if metadata_json else {} + + return Sample( + id=row["id"], + filepath=row["filepath"], + label=row.get("label"), + metadata=metadata, + thumbnail_base64=row.get("thumbnail_base64"), + ) + diff --git a/uv.lock b/uv.lock deleted file mode 100644 index eb32ab4..0000000 --- a/uv.lock +++ /dev/null @@ -1,3134 +0,0 @@ -version = 1 -requires-python = ">=3.10" -resolution-markers = [ - "python_full_version == '3.11.*'", - "python_full_version >= '3.12'", - "python_full_version < '3.11'", -] - -[[package]] -name = "aiofiles" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668 }, -] - -[[package]] -name = "aiohappyeyeballs" -version = "2.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, -] - -[[package]] -name = "aiohttp" -version = "3.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/3b83ebba6b3207a7135e5fcaba49706f8a4b6008153b4e30540c982fae26/aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca", size = 7837994 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/34/939730e66b716b76046dedfe0842995842fa906ccc4964bba414ff69e429/aiohttp-3.13.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2372b15a5f62ed37789a6b383ff7344fc5b9f243999b0cd9b629d8bc5f5b4155", size = 736471 }, - { url = "https://files.pythonhosted.org/packages/fd/cf/dcbdf2df7f6ca72b0bb4c0b4509701f2d8942cf54e29ca197389c214c07f/aiohttp-3.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7f8659a48995edee7229522984bd1009c1213929c769c2daa80b40fe49a180c", size = 493985 }, - { url = "https://files.pythonhosted.org/packages/9d/87/71c8867e0a1d0882dcbc94af767784c3cb381c1c4db0943ab4aae4fed65e/aiohttp-3.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:939ced4a7add92296b0ad38892ce62b98c619288a081170695c6babe4f50e636", size = 489274 }, - { url = "https://files.pythonhosted.org/packages/38/0f/46c24e8dae237295eaadd113edd56dee96ef6462adf19b88592d44891dc5/aiohttp-3.13.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6315fb6977f1d0dd41a107c527fee2ed5ab0550b7d885bc15fee20ccb17891da", size = 1668171 }, - { url = "https://files.pythonhosted.org/packages/eb/c6/4cdfb4440d0e28483681a48f69841fa5e39366347d66ef808cbdadddb20e/aiohttp-3.13.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6e7352512f763f760baaed2637055c49134fd1d35b37c2dedfac35bfe5cf8725", size = 1636036 }, - { url = "https://files.pythonhosted.org/packages/84/37/8708cf678628216fb678ab327a4e1711c576d6673998f4f43e86e9ae90dd/aiohttp-3.13.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e09a0a06348a2dd73e7213353c90d709502d9786219f69b731f6caa0efeb46f5", size = 1727975 }, - { url = "https://files.pythonhosted.org/packages/e6/2e/3ebfe12fdcb9b5f66e8a0a42dffcd7636844c8a018f261efb2419f68220b/aiohttp-3.13.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a09a6d073fb5789456545bdee2474d14395792faa0527887f2f4ec1a486a59d3", size = 1815823 }, - { url = "https://files.pythonhosted.org/packages/a1/4f/ca2ef819488cbb41844c6cf92ca6dd15b9441e6207c58e5ae0e0fc8d70ad/aiohttp-3.13.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b59d13c443f8e049d9e94099c7e412e34610f1f49be0f230ec656a10692a5802", size = 1669374 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/1fe2e1179a0d91ce09c99069684aab619bf2ccde9b20bd6ca44f8837203e/aiohttp-3.13.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:20db2d67985d71ca033443a1ba2001c4b5693fe09b0e29f6d9358a99d4d62a8a", size = 1555315 }, - { url = "https://files.pythonhosted.org/packages/5a/2b/f3781899b81c45d7cbc7140cddb8a3481c195e7cbff8e36374759d2ab5a5/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:960c2fc686ba27b535f9fd2b52d87ecd7e4fd1cf877f6a5cba8afb5b4a8bd204", size = 1639140 }, - { url = "https://files.pythonhosted.org/packages/72/27/c37e85cd3ece6f6c772e549bd5a253d0c122557b25855fb274224811e4f2/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6c00dbcf5f0d88796151e264a8eab23de2997c9303dd7c0bf622e23b24d3ce22", size = 1645496 }, - { url = "https://files.pythonhosted.org/packages/66/20/3af1ab663151bd3780b123e907761cdb86ec2c4e44b2d9b195ebc91fbe37/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fed38a5edb7945f4d1bcabe2fcd05db4f6ec7e0e82560088b754f7e08d93772d", size = 1697625 }, - { url = "https://files.pythonhosted.org/packages/95/eb/ae5cab15efa365e13d56b31b0d085a62600298bf398a7986f8388f73b598/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b395bbca716c38bef3c764f187860e88c724b342c26275bc03e906142fc5964f", size = 1542025 }, - { url = "https://files.pythonhosted.org/packages/e9/2d/1683e8d67ec72d911397fe4e575688d2a9b8f6a6e03c8fdc9f3fd3d4c03f/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:204ffff2426c25dfda401ba08da85f9c59525cdc42bda26660463dd1cbcfec6f", size = 1714918 }, - { url = "https://files.pythonhosted.org/packages/99/a2/ffe8e0e1c57c5e542d47ffa1fcf95ef2b3ea573bf7c4d2ee877252431efc/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05c4dd3c48fb5f15db31f57eb35374cb0c09afdde532e7fb70a75aede0ed30f6", size = 1656113 }, - { url = "https://files.pythonhosted.org/packages/0d/42/d511aff5c3a2b06c09d7d214f508a4ad8ac7799817f7c3d23e7336b5e896/aiohttp-3.13.2-cp310-cp310-win32.whl", hash = "sha256:e574a7d61cf10351d734bcddabbe15ede0eaa8a02070d85446875dc11189a251", size = 432290 }, - { url = "https://files.pythonhosted.org/packages/8b/ea/1c2eb7098b5bad4532994f2b7a8228d27674035c9b3234fe02c37469ef14/aiohttp-3.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:364f55663085d658b8462a1c3f17b2b84a5c2e1ba858e1b79bff7b2e24ad1514", size = 455075 }, - { url = "https://files.pythonhosted.org/packages/35/74/b321e7d7ca762638cdf8cdeceb39755d9c745aff7a64c8789be96ddf6e96/aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0", size = 743409 }, - { url = "https://files.pythonhosted.org/packages/99/3d/91524b905ec473beaf35158d17f82ef5a38033e5809fe8742e3657cdbb97/aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb", size = 497006 }, - { url = "https://files.pythonhosted.org/packages/eb/d3/7f68bc02a67716fe80f063e19adbd80a642e30682ce74071269e17d2dba1/aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9", size = 493195 }, - { url = "https://files.pythonhosted.org/packages/98/31/913f774a4708775433b7375c4f867d58ba58ead833af96c8af3621a0d243/aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613", size = 1747759 }, - { url = "https://files.pythonhosted.org/packages/e8/63/04efe156f4326f31c7c4a97144f82132c3bb21859b7bb84748d452ccc17c/aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead", size = 1704456 }, - { url = "https://files.pythonhosted.org/packages/8e/02/4e16154d8e0a9cf4ae76f692941fd52543bbb148f02f098ca73cab9b1c1b/aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780", size = 1807572 }, - { url = "https://files.pythonhosted.org/packages/34/58/b0583defb38689e7f06798f0285b1ffb3a6fb371f38363ce5fd772112724/aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a", size = 1895954 }, - { url = "https://files.pythonhosted.org/packages/6b/f3/083907ee3437425b4e376aa58b2c915eb1a33703ec0dc30040f7ae3368c6/aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592", size = 1747092 }, - { url = "https://files.pythonhosted.org/packages/ac/61/98a47319b4e425cc134e05e5f3fc512bf9a04bf65aafd9fdcda5d57ec693/aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab", size = 1606815 }, - { url = "https://files.pythonhosted.org/packages/97/4b/e78b854d82f66bb974189135d31fce265dee0f5344f64dd0d345158a5973/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30", size = 1723789 }, - { url = "https://files.pythonhosted.org/packages/ed/fc/9d2ccc794fc9b9acd1379d625c3a8c64a45508b5091c546dea273a41929e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40", size = 1718104 }, - { url = "https://files.pythonhosted.org/packages/66/65/34564b8765ea5c7d79d23c9113135d1dd3609173da13084830f1507d56cf/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948", size = 1785584 }, - { url = "https://files.pythonhosted.org/packages/30/be/f6a7a426e02fc82781afd62016417b3948e2207426d90a0e478790d1c8a4/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf", size = 1595126 }, - { url = "https://files.pythonhosted.org/packages/e5/c7/8e22d5d28f94f67d2af496f14a83b3c155d915d1fe53d94b66d425ec5b42/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782", size = 1800665 }, - { url = "https://files.pythonhosted.org/packages/d1/11/91133c8b68b1da9fc16555706aa7276fdf781ae2bb0876c838dd86b8116e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8", size = 1739532 }, - { url = "https://files.pythonhosted.org/packages/17/6b/3747644d26a998774b21a616016620293ddefa4d63af6286f389aedac844/aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec", size = 431876 }, - { url = "https://files.pythonhosted.org/packages/c3/63/688462108c1a00eb9f05765331c107f95ae86f6b197b865d29e930b7e462/aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c", size = 456205 }, - { url = "https://files.pythonhosted.org/packages/29/9b/01f00e9856d0a73260e86dd8ed0c2234a466c5c1712ce1c281548df39777/aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b", size = 737623 }, - { url = "https://files.pythonhosted.org/packages/5a/1b/4be39c445e2b2bd0aab4ba736deb649fabf14f6757f405f0c9685019b9e9/aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc", size = 492664 }, - { url = "https://files.pythonhosted.org/packages/28/66/d35dcfea8050e131cdd731dff36434390479b4045a8d0b9d7111b0a968f1/aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7", size = 491808 }, - { url = "https://files.pythonhosted.org/packages/00/29/8e4609b93e10a853b65f8291e64985de66d4f5848c5637cddc70e98f01f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb", size = 1738863 }, - { url = "https://files.pythonhosted.org/packages/9d/fa/4ebdf4adcc0def75ced1a0d2d227577cd7b1b85beb7edad85fcc87693c75/aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3", size = 1700586 }, - { url = "https://files.pythonhosted.org/packages/da/04/73f5f02ff348a3558763ff6abe99c223381b0bace05cd4530a0258e52597/aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f", size = 1768625 }, - { url = "https://files.pythonhosted.org/packages/f8/49/a825b79ffec124317265ca7d2344a86bcffeb960743487cb11988ffb3494/aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6", size = 1867281 }, - { url = "https://files.pythonhosted.org/packages/b9/48/adf56e05f81eac31edcfae45c90928f4ad50ef2e3ea72cb8376162a368f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e", size = 1752431 }, - { url = "https://files.pythonhosted.org/packages/30/ab/593855356eead019a74e862f21523db09c27f12fd24af72dbc3555b9bfd9/aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7", size = 1562846 }, - { url = "https://files.pythonhosted.org/packages/39/0f/9f3d32271aa8dc35036e9668e31870a9d3b9542dd6b3e2c8a30931cb27ae/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d", size = 1699606 }, - { url = "https://files.pythonhosted.org/packages/2c/3c/52d2658c5699b6ef7692a3f7128b2d2d4d9775f2a68093f74bca06cf01e1/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b", size = 1720663 }, - { url = "https://files.pythonhosted.org/packages/9b/d4/8f8f3ff1fb7fb9e3f04fcad4e89d8a1cd8fc7d05de67e3de5b15b33008ff/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8", size = 1737939 }, - { url = "https://files.pythonhosted.org/packages/03/d3/ddd348f8a27a634daae39a1b8e291ff19c77867af438af844bf8b7e3231b/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16", size = 1555132 }, - { url = "https://files.pythonhosted.org/packages/39/b8/46790692dc46218406f94374903ba47552f2f9f90dad554eed61bfb7b64c/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169", size = 1764802 }, - { url = "https://files.pythonhosted.org/packages/ba/e4/19ce547b58ab2a385e5f0b8aa3db38674785085abcf79b6e0edd1632b12f/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248", size = 1719512 }, - { url = "https://files.pythonhosted.org/packages/70/30/6355a737fed29dcb6dfdd48682d5790cb5eab050f7b4e01f49b121d3acad/aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e", size = 426690 }, - { url = "https://files.pythonhosted.org/packages/0a/0d/b10ac09069973d112de6ef980c1f6bb31cb7dcd0bc363acbdad58f927873/aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45", size = 453465 }, - { url = "https://files.pythonhosted.org/packages/bf/78/7e90ca79e5aa39f9694dcfd74f4720782d3c6828113bb1f3197f7e7c4a56/aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be", size = 732139 }, - { url = "https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742", size = 490082 }, - { url = "https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293", size = 489035 }, - { url = "https://files.pythonhosted.org/packages/d2/04/db5279e38471b7ac801d7d36a57d1230feeee130bbe2a74f72731b23c2b1/aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811", size = 1720387 }, - { url = "https://files.pythonhosted.org/packages/31/07/8ea4326bd7dae2bd59828f69d7fdc6e04523caa55e4a70f4a8725a7e4ed2/aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a", size = 1688314 }, - { url = "https://files.pythonhosted.org/packages/48/ab/3d98007b5b87ffd519d065225438cc3b668b2f245572a8cb53da5dd2b1bc/aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4", size = 1756317 }, - { url = "https://files.pythonhosted.org/packages/97/3d/801ca172b3d857fafb7b50c7c03f91b72b867a13abca982ed6b3081774ef/aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a", size = 1858539 }, - { url = "https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e", size = 1739597 }, - { url = "https://files.pythonhosted.org/packages/c4/52/7bd3c6693da58ba16e657eb904a5b6decfc48ecd06e9ac098591653b1566/aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb", size = 1555006 }, - { url = "https://files.pythonhosted.org/packages/48/30/9586667acec5993b6f41d2ebcf96e97a1255a85f62f3c653110a5de4d346/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded", size = 1683220 }, - { url = "https://files.pythonhosted.org/packages/71/01/3afe4c96854cfd7b30d78333852e8e851dceaec1c40fd00fec90c6402dd2/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b", size = 1712570 }, - { url = "https://files.pythonhosted.org/packages/11/2c/22799d8e720f4697a9e66fd9c02479e40a49de3de2f0bbe7f9f78a987808/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8", size = 1733407 }, - { url = "https://files.pythonhosted.org/packages/34/cb/90f15dd029f07cebbd91f8238a8b363978b530cd128488085b5703683594/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04", size = 1550093 }, - { url = "https://files.pythonhosted.org/packages/69/46/12dce9be9d3303ecbf4d30ad45a7683dc63d90733c2d9fe512be6716cd40/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476", size = 1758084 }, - { url = "https://files.pythonhosted.org/packages/f9/c8/0932b558da0c302ffd639fc6362a313b98fdf235dc417bc2493da8394df7/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23", size = 1716987 }, - { url = "https://files.pythonhosted.org/packages/5d/8b/f5bd1a75003daed099baec373aed678f2e9b34f2ad40d85baa1368556396/aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254", size = 425859 }, - { url = "https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a", size = 452192 }, - { url = "https://files.pythonhosted.org/packages/9b/36/e2abae1bd815f01c957cbf7be817b3043304e1c87bad526292a0410fdcf9/aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b", size = 735234 }, - { url = "https://files.pythonhosted.org/packages/ca/e3/1ee62dde9b335e4ed41db6bba02613295a0d5b41f74a783c142745a12763/aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61", size = 490733 }, - { url = "https://files.pythonhosted.org/packages/1a/aa/7a451b1d6a04e8d15a362af3e9b897de71d86feac3babf8894545d08d537/aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4", size = 491303 }, - { url = "https://files.pythonhosted.org/packages/57/1e/209958dbb9b01174870f6a7538cd1f3f28274fdbc88a750c238e2c456295/aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b", size = 1717965 }, - { url = "https://files.pythonhosted.org/packages/08/aa/6a01848d6432f241416bc4866cae8dc03f05a5a884d2311280f6a09c73d6/aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694", size = 1667221 }, - { url = "https://files.pythonhosted.org/packages/87/4f/36c1992432d31bbc789fa0b93c768d2e9047ec8c7177e5cd84ea85155f36/aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906", size = 1757178 }, - { url = "https://files.pythonhosted.org/packages/ac/b4/8e940dfb03b7e0f68a82b88fd182b9be0a65cb3f35612fe38c038c3112cf/aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9", size = 1838001 }, - { url = "https://files.pythonhosted.org/packages/d7/ef/39f3448795499c440ab66084a9db7d20ca7662e94305f175a80f5b7e0072/aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011", size = 1716325 }, - { url = "https://files.pythonhosted.org/packages/d7/51/b311500ffc860b181c05d91c59a1313bdd05c82960fdd4035a15740d431e/aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6", size = 1547978 }, - { url = "https://files.pythonhosted.org/packages/31/64/b9d733296ef79815226dab8c586ff9e3df41c6aff2e16c06697b2d2e6775/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213", size = 1682042 }, - { url = "https://files.pythonhosted.org/packages/3f/30/43d3e0f9d6473a6db7d472104c4eff4417b1e9df01774cb930338806d36b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49", size = 1680085 }, - { url = "https://files.pythonhosted.org/packages/16/51/c709f352c911b1864cfd1087577760ced64b3e5bee2aa88b8c0c8e2e4972/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae", size = 1728238 }, - { url = "https://files.pythonhosted.org/packages/19/e2/19bd4c547092b773caeb48ff5ae4b1ae86756a0ee76c16727fcfd281404b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa", size = 1544395 }, - { url = "https://files.pythonhosted.org/packages/cf/87/860f2803b27dfc5ed7be532832a3498e4919da61299b4a1f8eb89b8ff44d/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4", size = 1742965 }, - { url = "https://files.pythonhosted.org/packages/67/7f/db2fc7618925e8c7a601094d5cbe539f732df4fb570740be88ed9e40e99a/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a", size = 1697585 }, - { url = "https://files.pythonhosted.org/packages/0c/07/9127916cb09bb38284db5036036042b7b2c514c8ebaeee79da550c43a6d6/aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940", size = 431621 }, - { url = "https://files.pythonhosted.org/packages/fb/41/554a8a380df6d3a2bba8a7726429a23f4ac62aaf38de43bb6d6cde7b4d4d/aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4", size = 457627 }, - { url = "https://files.pythonhosted.org/packages/c7/8e/3824ef98c039d3951cb65b9205a96dd2b20f22241ee17d89c5701557c826/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673", size = 767360 }, - { url = "https://files.pythonhosted.org/packages/a4/0f/6a03e3fc7595421274fa34122c973bde2d89344f8a881b728fa8c774e4f1/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd", size = 504616 }, - { url = "https://files.pythonhosted.org/packages/c6/aa/ed341b670f1bc8a6f2c6a718353d13b9546e2cef3544f573c6a1ff0da711/aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3", size = 509131 }, - { url = "https://files.pythonhosted.org/packages/7f/f0/c68dac234189dae5c4bbccc0f96ce0cc16b76632cfc3a08fff180045cfa4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf", size = 1864168 }, - { url = "https://files.pythonhosted.org/packages/8f/65/75a9a76db8364b5d0e52a0c20eabc5d52297385d9af9c35335b924fafdee/aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e", size = 1719200 }, - { url = "https://files.pythonhosted.org/packages/f5/55/8df2ed78d7f41d232f6bd3ff866b6f617026551aa1d07e2f03458f964575/aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5", size = 1843497 }, - { url = "https://files.pythonhosted.org/packages/e9/e0/94d7215e405c5a02ccb6a35c7a3a6cfff242f457a00196496935f700cde5/aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad", size = 1935703 }, - { url = "https://files.pythonhosted.org/packages/0b/78/1eeb63c3f9b2d1015a4c02788fb543141aad0a03ae3f7a7b669b2483f8d4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e", size = 1792738 }, - { url = "https://files.pythonhosted.org/packages/41/75/aaf1eea4c188e51538c04cc568040e3082db263a57086ea74a7d38c39e42/aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61", size = 1624061 }, - { url = "https://files.pythonhosted.org/packages/9b/c2/3b6034de81fbcc43de8aeb209073a2286dfb50b86e927b4efd81cf848197/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661", size = 1789201 }, - { url = "https://files.pythonhosted.org/packages/c9/38/c15dcf6d4d890217dae79d7213988f4e5fe6183d43893a9cf2fe9e84ca8d/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98", size = 1776868 }, - { url = "https://files.pythonhosted.org/packages/04/75/f74fd178ac81adf4f283a74847807ade5150e48feda6aef024403716c30c/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693", size = 1790660 }, - { url = "https://files.pythonhosted.org/packages/e7/80/7368bd0d06b16b3aba358c16b919e9c46cf11587dc572091031b0e9e3ef0/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a", size = 1617548 }, - { url = "https://files.pythonhosted.org/packages/7d/4b/a6212790c50483cb3212e507378fbe26b5086d73941e1ec4b56a30439688/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be", size = 1817240 }, - { url = "https://files.pythonhosted.org/packages/ff/f7/ba5f0ba4ea8d8f3c32850912944532b933acbf0f3a75546b89269b9b7dde/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c", size = 1762334 }, - { url = "https://files.pythonhosted.org/packages/7e/83/1a5a1856574588b1cad63609ea9ad75b32a8353ac995d830bf5da9357364/aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734", size = 464685 }, - { url = "https://files.pythonhosted.org/packages/9f/4d/d22668674122c08f4d56972297c51a624e64b3ed1efaa40187607a7cb66e/aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f", size = 498093 }, -] - -[[package]] -name = "aiosignal" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490 }, -] - -[[package]] -name = "annotated-doc" -version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303 }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anyio" -version = "4.12.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "idna" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0", size = 228266 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb", size = 113362 }, -] - -[[package]] -name = "async-timeout" -version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233 }, -] - -[[package]] -name = "attrs" -version = "25.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615 }, -] - -[[package]] -name = "backports-asyncio-runner" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313 }, -] - -[[package]] -name = "certifi" -version = "2025.11.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709 }, - { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814 }, - { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467 }, - { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280 }, - { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454 }, - { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609 }, - { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849 }, - { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586 }, - { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290 }, - { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663 }, - { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964 }, - { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064 }, - { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015 }, - { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792 }, - { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198 }, - { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262 }, - { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988 }, - { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324 }, - { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742 }, - { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863 }, - { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837 }, - { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550 }, - { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162 }, - { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019 }, - { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310 }, - { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022 }, - { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383 }, - { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098 }, - { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991 }, - { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456 }, - { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978 }, - { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969 }, - { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425 }, - { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162 }, - { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558 }, - { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497 }, - { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240 }, - { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471 }, - { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864 }, - { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647 }, - { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110 }, - { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839 }, - { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667 }, - { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535 }, - { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816 }, - { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694 }, - { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131 }, - { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390 }, - { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091 }, - { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936 }, - { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180 }, - { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346 }, - { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874 }, - { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076 }, - { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601 }, - { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376 }, - { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825 }, - { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583 }, - { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366 }, - { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300 }, - { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465 }, - { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404 }, - { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092 }, - { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408 }, - { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746 }, - { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889 }, - { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641 }, - { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779 }, - { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035 }, - { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542 }, - { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524 }, - { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395 }, - { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680 }, - { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045 }, - { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687 }, - { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014 }, - { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044 }, - { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940 }, - { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104 }, - { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743 }, - { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402 }, -] - -[[package]] -name = "click" -version = "8.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "coloredlogs" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "humanfriendly" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018 }, -] - -[[package]] -name = "datasets" -version = "4.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dill" }, - { name = "filelock" }, - { name = "fsspec", extra = ["http"] }, - { name = "httpx" }, - { name = "huggingface-hub" }, - { name = "multiprocess" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging" }, - { name = "pandas" }, - { name = "pyarrow" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tqdm" }, - { name = "xxhash" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/93/bf/0dae295d6d1ba0b1a200a9dd216838464b5bbd05da01407cb1330b377445/datasets-4.4.1.tar.gz", hash = "sha256:80322699aa8c0bbbdb7caa87906da689c3c2e29523cff698775c67f28fdab1fc", size = 585341 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5e/6f8d874366788ad5d549e9ba258037d974dda6e004843be1bda794571701/datasets-4.4.1-py3-none-any.whl", hash = "sha256:c1163de5211e42546079ab355cc0250c7e6db16eb209ac5ac6252f801f596c44", size = 511591 }, -] - -[[package]] -name = "dill" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668 }, -] - -[[package]] -name = "embed-anything" -version = "0.6.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "onnxruntime" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cc/a5/438ee439f219ef3c29476ddb050836770c3e4d0c22cef24ff434b207e3dd/embed_anything-0.6.6.tar.gz", hash = "sha256:43eaa6e3f0a173f343da22dfafb770fee31708958d79e7968a90d027d18721e3", size = 998508 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/5b/99c10bce60235029152cf0a2a75b3280cfdcbbdc80acfd8958a93239abe5/embed_anything-0.6.6-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:30b297e5f57f9eb7ffbbf31e536c162e65fa1ccb48a70e0e2167accd3a6d7794", size = 19271030 }, - { url = "https://files.pythonhosted.org/packages/79/79/bb9ac8f26f227e1f2a6322fa257d7d5a40bbcf0baaf5c960307889895a57/embed_anything-0.6.6-cp310-cp310-win_amd64.whl", hash = "sha256:82e26e54c991278c177b786e0597063a37b669479c2f843cbadd2e26ed5868ae", size = 17902211 }, - { url = "https://files.pythonhosted.org/packages/49/ba/17cdc42c88888a9a8921f75c6ceb080eeb88a46a645febc2a5a5de526abc/embed_anything-0.6.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2c0b10ad5c60718763c077929b7d1c8990e13c4cb246ac36a4d3dfcda994dde6", size = 18803384 }, - { url = "https://files.pythonhosted.org/packages/6a/ed/8bab81c1803d41ba581bb1a594b6e6238499636a5e3431332aafbfb8b1db/embed_anything-0.6.6-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:6d48f3aae3164e6d5629685e4e0cceb8a093b9232f07ca9e50302bfb7f3a4f9d", size = 19269285 }, - { url = "https://files.pythonhosted.org/packages/ef/c7/e233a63ee2579a42e34e8b5da78003b9d009357895de6a52ab3594255eda/embed_anything-0.6.6-cp311-cp311-win_amd64.whl", hash = "sha256:ddba04b7a423304e0427688a48d1eb9f0767458377f4f80200c78abe5038bca4", size = 17903392 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/bfd094ed8ac3b5b8bb1cc8d1bf30edb665d7a7f6c63504d35351d71c5732/embed_anything-0.6.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:81d5a5955fd7a67701a9ab310a723a8359bc9b83538712f96d0e4cd41541b553", size = 18787028 }, - { url = "https://files.pythonhosted.org/packages/7c/0f/77468c9da656c362df4f8dd1820d5216a041761da92061e6b53d219d7399/embed_anything-0.6.6-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:07fa624eeb91ef9064d068a1740cc6ab516693359bbccd72d89f26c8efff57ed", size = 19270732 }, - { url = "https://files.pythonhosted.org/packages/2d/4a/b6f7e746353b33ff397ba1a1f229098c65e17c93397172b9238adad8abce/embed_anything-0.6.6-cp312-cp312-win_amd64.whl", hash = "sha256:cbbd2b013dfb39768e1212d9e96adf7fbef710a4f2718c569117491b825df776", size = 17892426 }, - { url = "https://files.pythonhosted.org/packages/c0/cc/6835559ff76b63a6ec2e28318dc7987db615597693c6ad47ef7a5a041d33/embed_anything-0.6.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9d37d25b4b20cc4016ca0fcb2f5c2bd972fac10739acdea89a0e679ede30142b", size = 18786285 }, - { url = "https://files.pythonhosted.org/packages/de/92/dad5f1b424cbe806cb142c6a51cd0ec49207e14e35d599b89963b17b827f/embed_anything-0.6.6-cp313-cp313-win_amd64.whl", hash = "sha256:1c2bf239a372f874d4cafff7d43ef25a5bd0f92f9f1330ba5fd3b4f47e1c3a4d", size = 17892278 }, - { url = "https://files.pythonhosted.org/packages/fa/84/b9d7e88ff4e071e2ff8e7bfd54fc8fe24c7bdc0422ccf9c9e7e669d0ce9e/embed_anything-0.6.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:723e15577b09dc5ad8f4c9b40020c4177b7f227ae898c19158ed8e7ba819444b", size = 18789269 }, - { url = "https://files.pythonhosted.org/packages/d2/57/ecd259227d6510ac020713e38760273c06ada996c820681b7fcf2430f73c/embed_anything-0.6.6-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:dc7062dc3ca88014bf5d7e24fb8de0287ff83a9cf339cc5ece1f2ff9a568187b", size = 19268786 }, - { url = "https://files.pythonhosted.org/packages/d5/95/164e7b08658b1b31d536db665ad6dff5e8e85e70f0d1e9e254f8ad4097fd/embed_anything-0.6.6-cp314-cp314-win_amd64.whl", hash = "sha256:37f2df9ded7c2549f5b0112d9a7b27e701dcb219b07b9b8ba053f18e99d4bee7", size = 17893594 }, -] - -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740 }, -] - -[[package]] -name = "fastapi" -version = "0.123.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-doc" }, - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2c/01/c3fb48c0135d89586a03c3e2c5bc04540dda52079a1af5cac4a63598efb9/fastapi-0.123.9.tar.gz", hash = "sha256:ab33d672d8e1cc6e0b49777eb73c32ccf20761011f5ca16755889ab406fd1de0", size = 355616 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/15/a785e992a27620e022d0bc61b6c897ec14cff07c5ab7ff9f27651a21570b/fastapi-0.123.9-py3-none-any.whl", hash = "sha256:f54c69f23db14bd3dbcdfaf3fdce0483ca5f499512380c8e379a70cda30aa920", size = 111776 }, -] - -[[package]] -name = "filelock" -version = "3.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054 }, -] - -[[package]] -name = "flatbuffers" -version = "25.9.23" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/1f/3ee70b0a55137442038f2a33469cc5fddd7e0ad2abf83d7497c18a2b6923/flatbuffers-25.9.23.tar.gz", hash = "sha256:676f9fa62750bb50cf531b42a0a2a118ad8f7f797a511eda12881c016f093b12", size = 22067 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/1b/00a78aa2e8fbd63f9af08c9c19e6deb3d5d66b4dda677a0f61654680ee89/flatbuffers-25.9.23-py2.py3-none-any.whl", hash = "sha256:255538574d6cb6d0a79a17ec8bc0d30985913b87513a01cce8bcdb6b4c44d0e2", size = 30869 }, -] - -[[package]] -name = "frozenlist" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230 }, - { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621 }, - { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889 }, - { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464 }, - { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649 }, - { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188 }, - { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748 }, - { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351 }, - { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767 }, - { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887 }, - { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785 }, - { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312 }, - { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650 }, - { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659 }, - { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837 }, - { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989 }, - { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912 }, - { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046 }, - { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119 }, - { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067 }, - { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160 }, - { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544 }, - { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797 }, - { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923 }, - { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886 }, - { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731 }, - { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544 }, - { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806 }, - { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382 }, - { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647 }, - { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064 }, - { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937 }, - { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782 }, - { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594 }, - { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448 }, - { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411 }, - { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014 }, - { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909 }, - { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049 }, - { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485 }, - { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619 }, - { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320 }, - { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820 }, - { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518 }, - { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096 }, - { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985 }, - { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591 }, - { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102 }, - { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717 }, - { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651 }, - { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417 }, - { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391 }, - { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048 }, - { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549 }, - { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833 }, - { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363 }, - { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314 }, - { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365 }, - { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763 }, - { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110 }, - { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717 }, - { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628 }, - { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882 }, - { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676 }, - { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235 }, - { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742 }, - { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725 }, - { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506 }, - { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161 }, - { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676 }, - { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638 }, - { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067 }, - { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101 }, - { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901 }, - { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395 }, - { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659 }, - { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492 }, - { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034 }, - { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749 }, - { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127 }, - { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698 }, - { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749 }, - { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298 }, - { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015 }, - { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038 }, - { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130 }, - { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845 }, - { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131 }, - { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542 }, - { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308 }, - { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210 }, - { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972 }, - { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536 }, - { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330 }, - { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627 }, - { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238 }, - { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738 }, - { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739 }, - { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186 }, - { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196 }, - { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830 }, - { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289 }, - { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318 }, - { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814 }, - { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762 }, - { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470 }, - { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042 }, - { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148 }, - { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676 }, - { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451 }, - { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507 }, - { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409 }, -] - -[[package]] -name = "fsspec" -version = "2025.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59", size = 309285 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d", size = 200966 }, -] - -[package.optional-dependencies] -http = [ - { name = "aiohttp" }, -] - -[[package]] -name = "geoopt" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "torch" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/0f/f8d4afc40ffd1d2e8a4386bad152176cdc726b077c9bd5d65621b122559d/geoopt-0.5.1-py3-none-any.whl", hash = "sha256:d6ee06e943e7e882ba785db09a6d705d34b8bf5408d4d546b3a8ac2e4ff3496d", size = 90072 }, -] - -[[package]] -name = "h11" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, -] - -[[package]] -name = "hf-xet" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/6e/0f11bacf08a67f7fb5ee09740f2ca54163863b07b70d579356e9222ce5d8/hf_xet-1.2.0.tar.gz", hash = "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f", size = 506020 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/a5/85ef910a0aa034a2abcfadc360ab5ac6f6bc4e9112349bd40ca97551cff0/hf_xet-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:ceeefcd1b7aed4956ae8499e2199607765fbd1c60510752003b6cc0b8413b649", size = 2861870 }, - { url = "https://files.pythonhosted.org/packages/ea/40/e2e0a7eb9a51fe8828ba2d47fe22a7e74914ea8a0db68a18c3aa7449c767/hf_xet-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813", size = 2717584 }, - { url = "https://files.pythonhosted.org/packages/a5/7d/daf7f8bc4594fdd59a8a596f9e3886133fdc68e675292218a5e4c1b7e834/hf_xet-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc", size = 3315004 }, - { url = "https://files.pythonhosted.org/packages/b1/ba/45ea2f605fbf6d81c8b21e4d970b168b18a53515923010c312c06cd83164/hf_xet-1.2.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd3a6027d59cfb60177c12d6424e31f4b5ff13d8e3a1247b3a584bf8977e6df5", size = 3222636 }, - { url = "https://files.pythonhosted.org/packages/4a/1d/04513e3cab8f29ab8c109d309ddd21a2705afab9d52f2ba1151e0c14f086/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6de1fc44f58f6dd937956c8d304d8c2dea264c80680bcfa61ca4a15e7b76780f", size = 3408448 }, - { url = "https://files.pythonhosted.org/packages/f0/7c/60a2756d7feec7387db3a1176c632357632fbe7849fce576c5559d4520c7/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832", size = 3503401 }, - { url = "https://files.pythonhosted.org/packages/4e/64/48fffbd67fb418ab07451e4ce641a70de1c40c10a13e25325e24858ebe5a/hf_xet-1.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:293a7a3787e5c95d7be1857358a9130694a9c6021de3f27fa233f37267174382", size = 2900866 }, - { url = "https://files.pythonhosted.org/packages/e2/51/f7e2caae42f80af886db414d4e9885fac959330509089f97cccb339c6b87/hf_xet-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:10bfab528b968c70e062607f663e21e34e2bba349e8038db546646875495179e", size = 2861861 }, - { url = "https://files.pythonhosted.org/packages/6e/1d/a641a88b69994f9371bd347f1dd35e5d1e2e2460a2e350c8d5165fc62005/hf_xet-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a212e842647b02eb6a911187dc878e79c4aa0aa397e88dd3b26761676e8c1f8", size = 2717699 }, - { url = "https://files.pythonhosted.org/packages/df/e0/e5e9bba7d15f0318955f7ec3f4af13f92e773fbb368c0b8008a5acbcb12f/hf_xet-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e06daccb3a7d4c065f34fc26c14c74f4653069bb2b194e7f18f17cbe9939c0", size = 3314885 }, - { url = "https://files.pythonhosted.org/packages/21/90/b7fe5ff6f2b7b8cbdf1bd56145f863c90a5807d9758a549bf3d916aa4dec/hf_xet-1.2.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:29c8fc913a529ec0a91867ce3d119ac1aac966e098cf49501800c870328cc090", size = 3221550 }, - { url = "https://files.pythonhosted.org/packages/6f/cb/73f276f0a7ce46cc6a6ec7d6c7d61cbfe5f2e107123d9bbd0193c355f106/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e159cbfcfbb29f920db2c09ed8b660eb894640d284f102ada929b6e3dc410a", size = 3408010 }, - { url = "https://files.pythonhosted.org/packages/b8/1e/d642a12caa78171f4be64f7cd9c40e3ca5279d055d0873188a58c0f5fbb9/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c91d5ae931510107f148874e9e2de8a16052b6f1b3ca3c1b12f15ccb491390f", size = 3503264 }, - { url = "https://files.pythonhosted.org/packages/17/b5/33764714923fa1ff922770f7ed18c2daae034d21ae6e10dbf4347c854154/hf_xet-1.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:210d577732b519ac6ede149d2f2f34049d44e8622bf14eb3d63bbcd2d4b332dc", size = 2901071 }, - { url = "https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848", size = 2866099 }, - { url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4", size = 2722178 }, - { url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd", size = 3320214 }, - { url = "https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c", size = 3229054 }, - { url = "https://files.pythonhosted.org/packages/0b/dd/7ac658d54b9fb7999a0ccb07ad863b413cbaf5cf172f48ebcd9497ec7263/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737", size = 3413812 }, - { url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865", size = 3508920 }, - { url = "https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69", size = 2905735 }, -] - -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, -] - -[[package]] -name = "httptools" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/e5/c07e0bcf4ec8db8164e9f6738c048b2e66aabf30e7506f440c4cc6953f60/httptools-0.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:11d01b0ff1fe02c4c32d60af61a4d613b74fad069e47e06e9067758c01e9ac78", size = 204531 }, - { url = "https://files.pythonhosted.org/packages/7e/4f/35e3a63f863a659f92ffd92bef131f3e81cf849af26e6435b49bd9f6f751/httptools-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d86c1e5afdc479a6fdabf570be0d3eb791df0ae727e8dbc0259ed1249998d4", size = 109408 }, - { url = "https://files.pythonhosted.org/packages/f5/71/b0a9193641d9e2471ac541d3b1b869538a5fb6419d52fd2669fa9c79e4b8/httptools-0.7.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8c751014e13d88d2be5f5f14fc8b89612fcfa92a9cc480f2bc1598357a23a05", size = 440889 }, - { url = "https://files.pythonhosted.org/packages/eb/d9/2e34811397b76718750fea44658cb0205b84566e895192115252e008b152/httptools-0.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:654968cb6b6c77e37b832a9be3d3ecabb243bbe7a0b8f65fbc5b6b04c8fcabed", size = 440460 }, - { url = "https://files.pythonhosted.org/packages/01/3f/a04626ebeacc489866bb4d82362c0657b2262bef381d68310134be7f40bb/httptools-0.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b580968316348b474b020edf3988eecd5d6eec4634ee6561e72ae3a2a0e00a8a", size = 425267 }, - { url = "https://files.pythonhosted.org/packages/a5/99/adcd4f66614db627b587627c8ad6f4c55f18881549bab10ecf180562e7b9/httptools-0.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d496e2f5245319da9d764296e86c5bb6fcf0cf7a8806d3d000717a889c8c0b7b", size = 424429 }, - { url = "https://files.pythonhosted.org/packages/d5/72/ec8fc904a8fd30ba022dfa85f3bbc64c3c7cd75b669e24242c0658e22f3c/httptools-0.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cbf8317bfccf0fed3b5680c559d3459cccf1abe9039bfa159e62e391c7270568", size = 86173 }, - { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521 }, - { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375 }, - { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621 }, - { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954 }, - { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175 }, - { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310 }, - { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875 }, - { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280 }, - { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004 }, - { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655 }, - { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440 }, - { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186 }, - { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192 }, - { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694 }, - { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889 }, - { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180 }, - { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596 }, - { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268 }, - { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517 }, - { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337 }, - { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743 }, - { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619 }, - { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714 }, - { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909 }, - { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831 }, - { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631 }, - { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910 }, - { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "huggingface-hub" -version = "1.1.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, - { name = "httpx" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "shellingham" }, - { name = "tqdm" }, - { name = "typer-slim" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6f/fa/a1a94c55637f2b7cfeb05263ac3881aa87c82df92d8b4b31c909079f4419/huggingface_hub-1.1.7.tar.gz", hash = "sha256:3c84b6283caca928595f08fd42e9a572f17ec3501dec508c3f2939d94bfbd9d2", size = 607537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/4f/82e5ab009089a2c48472bf4248391fe4091cf0b9c3e951dbb8afe3b23d76/huggingface_hub-1.1.7-py3-none-any.whl", hash = "sha256:f3efa4779f4890e44c957bbbb0f197e6028887ad09f0cf95a21659fa7753605d", size = 516239 }, -] - -[[package]] -name = "humanfriendly" -version = "10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyreadline3", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794 }, -] - -[[package]] -name = "hyperview" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "aiofiles" }, - { name = "datasets" }, - { name = "embed-anything" }, - { name = "fastapi" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "pillow" }, - { name = "pydantic" }, - { name = "umap-learn" }, - { name = "uvicorn", extra = ["standard"] }, -] - -[package.optional-dependencies] -dev = [ - { name = "httpx" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "ruff" }, -] -hyperbolic = [ - { name = "geoopt" }, - { name = "torch" }, -] - -[package.metadata] -requires-dist = [ - { name = "aiofiles", specifier = ">=24.0.0" }, - { name = "datasets", specifier = ">=3.0.0" }, - { name = "embed-anything", specifier = ">=0.3.0" }, - { name = "fastapi", specifier = ">=0.115.0" }, - { name = "geoopt", marker = "extra == 'hyperbolic'", specifier = ">=0.5.1" }, - { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.27.0" }, - { name = "numpy", specifier = ">=1.26.0" }, - { name = "pillow", specifier = ">=10.0.0" }, - { name = "pydantic", specifier = ">=2.0.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, - { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24.0" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.7.0" }, - { name = "torch", marker = "extra == 'hyperbolic'", specifier = ">=2.0.0" }, - { name = "umap-learn", specifier = ">=0.5.6" }, - { name = "uvicorn", extras = ["standard"], specifier = ">=0.32.0" }, -] - -[[package]] -name = "idna" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008 }, -] - -[[package]] -name = "iniconfig" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484 }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, -] - -[[package]] -name = "joblib" -version = "1.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396 }, -] - -[[package]] -name = "llvmlite" -version = "0.45.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/8d/5baf1cef7f9c084fb35a8afbde88074f0d6a727bc63ef764fe0e7543ba40/llvmlite-0.45.1.tar.gz", hash = "sha256:09430bb9d0bb58fc45a45a57c7eae912850bedc095cd0810a57de109c69e1c32", size = 185600 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/6d/585c84ddd9d2a539a3c3487792b3cf3f988e28ec4fa281bf8b0e055e1166/llvmlite-0.45.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:1b1af0c910af0978aa55fa4f60bbb3e9f39b41e97c2a6d94d199897be62ba07a", size = 43043523 }, - { url = "https://files.pythonhosted.org/packages/ae/34/992bd12d3ff245e0801bcf6013961daa8c19c9b9c2e61cb4b8bce94566f9/llvmlite-0.45.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02a164db2d79088bbd6e0d9633b4fe4021d6379d7e4ac7cc85ed5f44b06a30c5", size = 37253122 }, - { url = "https://files.pythonhosted.org/packages/a6/7b/6d7585998a5991fa74dc925aae57913ba8c7c2efff909de9d34cc1cd3c27/llvmlite-0.45.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f2d47f34e4029e6df3395de34cc1c66440a8d72712993a6e6168db228686711b", size = 56288210 }, - { url = "https://files.pythonhosted.org/packages/b5/e2/a4abea058633bfc82eb08fd69ce242c118fdb9b0abad1fdcbe0bc6aedab5/llvmlite-0.45.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7319e5f9f90720578a7f56fbc805bdfb4bc071b507c7611f170d631c3c0f1e0", size = 55140958 }, - { url = "https://files.pythonhosted.org/packages/74/c0/233468e96ed287b953239c3b24b1d69df47c6ba9262bfdca98eda7e83a04/llvmlite-0.45.1-cp310-cp310-win_amd64.whl", hash = "sha256:4edb62e685867799e336723cb9787ec6598d51d0b1ed9af0f38e692aa757e898", size = 38132232 }, - { url = "https://files.pythonhosted.org/packages/04/ad/9bdc87b2eb34642c1cfe6bcb4f5db64c21f91f26b010f263e7467e7536a3/llvmlite-0.45.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:60f92868d5d3af30b4239b50e1717cb4e4e54f6ac1c361a27903b318d0f07f42", size = 43043526 }, - { url = "https://files.pythonhosted.org/packages/a5/ea/c25c6382f452a943b4082da5e8c1665ce29a62884e2ec80608533e8e82d5/llvmlite-0.45.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98baab513e19beb210f1ef39066288784839a44cd504e24fff5d17f1b3cf0860", size = 37253118 }, - { url = "https://files.pythonhosted.org/packages/fe/af/85fc237de98b181dbbe8647324331238d6c52a3554327ccdc83ced28efba/llvmlite-0.45.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3adc2355694d6a6fbcc024d59bb756677e7de506037c878022d7b877e7613a36", size = 56288209 }, - { url = "https://files.pythonhosted.org/packages/0a/df/3daf95302ff49beff4230065e3178cd40e71294968e8d55baf4a9e560814/llvmlite-0.45.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f3377a6db40f563058c9515dedcc8a3e562d8693a106a28f2ddccf2c8fcf6ca", size = 55140958 }, - { url = "https://files.pythonhosted.org/packages/a4/56/4c0d503fe03bac820ecdeb14590cf9a248e120f483bcd5c009f2534f23f0/llvmlite-0.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9c272682d91e0d57f2a76c6d9ebdfccc603a01828cdbe3d15273bdca0c3363a", size = 38132232 }, - { url = "https://files.pythonhosted.org/packages/e2/7c/82cbd5c656e8991bcc110c69d05913be2229302a92acb96109e166ae31fb/llvmlite-0.45.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:28e763aba92fe9c72296911e040231d486447c01d4f90027c8e893d89d49b20e", size = 43043524 }, - { url = "https://files.pythonhosted.org/packages/9d/bc/5314005bb2c7ee9f33102c6456c18cc81745d7055155d1218f1624463774/llvmlite-0.45.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1a53f4b74ee9fd30cb3d27d904dadece67a7575198bd80e687ee76474620735f", size = 37253123 }, - { url = "https://files.pythonhosted.org/packages/96/76/0f7154952f037cb320b83e1c952ec4a19d5d689cf7d27cb8a26887d7bbc1/llvmlite-0.45.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b3796b1b1e1c14dcae34285d2f4ea488402fbd2c400ccf7137603ca3800864f", size = 56288211 }, - { url = "https://files.pythonhosted.org/packages/00/b1/0b581942be2683ceb6862d558979e87387e14ad65a1e4db0e7dd671fa315/llvmlite-0.45.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:779e2f2ceefef0f4368548685f0b4adde34e5f4b457e90391f570a10b348d433", size = 55140958 }, - { url = "https://files.pythonhosted.org/packages/33/94/9ba4ebcf4d541a325fd8098ddc073b663af75cc8b065b6059848f7d4dce7/llvmlite-0.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e6c9949baf25d9aa9cd7cf0f6d011b9ca660dd17f5ba2b23bdbdb77cc86b116", size = 38132231 }, - { url = "https://files.pythonhosted.org/packages/1d/e2/c185bb7e88514d5025f93c6c4092f6120c6cea8fe938974ec9860fb03bbb/llvmlite-0.45.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:d9ea9e6f17569a4253515cc01dade70aba536476e3d750b2e18d81d7e670eb15", size = 43043524 }, - { url = "https://files.pythonhosted.org/packages/09/b8/b5437b9ecb2064e89ccf67dccae0d02cd38911705112dd0dcbfa9cd9a9de/llvmlite-0.45.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:c9f3cadee1630ce4ac18ea38adebf2a4f57a89bd2740ce83746876797f6e0bfb", size = 37253121 }, - { url = "https://files.pythonhosted.org/packages/f7/97/ad1a907c0173a90dd4df7228f24a3ec61058bc1a9ff8a0caec20a0cc622e/llvmlite-0.45.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:57c48bf2e1083eedbc9406fb83c4e6483017879714916fe8be8a72a9672c995a", size = 56288210 }, - { url = "https://files.pythonhosted.org/packages/32/d8/c99c8ac7a326e9735401ead3116f7685a7ec652691aeb2615aa732b1fc4a/llvmlite-0.45.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3aa3dfceda4219ae39cf18806c60eeb518c1680ff834b8b311bd784160b9ce40", size = 55140957 }, - { url = "https://files.pythonhosted.org/packages/09/56/ed35668130e32dbfad2eb37356793b0a95f23494ab5be7d9bf5cb75850ee/llvmlite-0.45.1-cp313-cp313-win_amd64.whl", hash = "sha256:080e6f8d0778a8239cd47686d402cb66eb165e421efa9391366a9b7e5810a38b", size = 38132232 }, -] - -[[package]] -name = "markupsafe" -version = "3.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631 }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057 }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050 }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681 }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705 }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524 }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282 }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745 }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571 }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056 }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932 }, - { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631 }, - { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058 }, - { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287 }, - { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940 }, - { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887 }, - { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692 }, - { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471 }, - { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923 }, - { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572 }, - { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077 }, - { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876 }, - { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615 }, - { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020 }, - { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332 }, - { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947 }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962 }, - { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760 }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529 }, - { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015 }, - { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540 }, - { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105 }, - { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906 }, - { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622 }, - { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029 }, - { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374 }, - { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980 }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990 }, - { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784 }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588 }, - { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041 }, - { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543 }, - { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113 }, - { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911 }, - { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658 }, - { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066 }, - { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639 }, - { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569 }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284 }, - { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801 }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769 }, - { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642 }, - { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612 }, - { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200 }, - { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973 }, - { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619 }, - { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029 }, - { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408 }, - { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005 }, - { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048 }, - { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821 }, - { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606 }, - { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043 }, - { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747 }, - { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341 }, - { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073 }, - { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661 }, - { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069 }, - { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670 }, - { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598 }, - { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261 }, - { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835 }, - { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733 }, - { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672 }, - { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819 }, - { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426 }, - { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146 }, -] - -[[package]] -name = "mpmath" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, -] - -[[package]] -name = "multidict" -version = "6.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/63/7bdd4adc330abcca54c85728db2327130e49e52e8c3ce685cec44e0f2e9f/multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349", size = 77153 }, - { url = "https://files.pythonhosted.org/packages/3f/bb/b6c35ff175ed1a3142222b78455ee31be71a8396ed3ab5280fbe3ebe4e85/multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e", size = 44993 }, - { url = "https://files.pythonhosted.org/packages/e0/1f/064c77877c5fa6df6d346e68075c0f6998547afe952d6471b4c5f6a7345d/multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3", size = 44607 }, - { url = "https://files.pythonhosted.org/packages/04/7a/bf6aa92065dd47f287690000b3d7d332edfccb2277634cadf6a810463c6a/multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046", size = 241847 }, - { url = "https://files.pythonhosted.org/packages/94/39/297a8de920f76eda343e4ce05f3b489f0ab3f9504f2576dfb37b7c08ca08/multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32", size = 242616 }, - { url = "https://files.pythonhosted.org/packages/39/3a/d0eee2898cfd9d654aea6cb8c4addc2f9756e9a7e09391cfe55541f917f7/multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73", size = 222333 }, - { url = "https://files.pythonhosted.org/packages/05/48/3b328851193c7a4240815b71eea165b49248867bbb6153a0aee227a0bb47/multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc", size = 253239 }, - { url = "https://files.pythonhosted.org/packages/b1/ca/0706a98c8d126a89245413225ca4a3fefc8435014de309cf8b30acb68841/multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62", size = 251618 }, - { url = "https://files.pythonhosted.org/packages/5e/4f/9c7992f245554d8b173f6f0a048ad24b3e645d883f096857ec2c0822b8bd/multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84", size = 241655 }, - { url = "https://files.pythonhosted.org/packages/31/79/26a85991ae67efd1c0b1fc2e0c275b8a6aceeb155a68861f63f87a798f16/multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0", size = 239245 }, - { url = "https://files.pythonhosted.org/packages/14/1e/75fa96394478930b79d0302eaf9a6c69f34005a1a5251ac8b9c336486ec9/multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e", size = 233523 }, - { url = "https://files.pythonhosted.org/packages/b2/5e/085544cb9f9c4ad2b5d97467c15f856df8d9bac410cffd5c43991a5d878b/multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4", size = 243129 }, - { url = "https://files.pythonhosted.org/packages/b9/c3/e9d9e2f20c9474e7a8fcef28f863c5cbd29bb5adce6b70cebe8bdad0039d/multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648", size = 248999 }, - { url = "https://files.pythonhosted.org/packages/b5/3f/df171b6efa3239ae33b97b887e42671cd1d94d460614bfb2c30ffdab3b95/multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111", size = 243711 }, - { url = "https://files.pythonhosted.org/packages/3c/2f/9b5564888c4e14b9af64c54acf149263721a283aaf4aa0ae89b091d5d8c1/multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36", size = 237504 }, - { url = "https://files.pythonhosted.org/packages/6c/3a/0bd6ca0f7d96d790542d591c8c3354c1e1b6bfd2024d4d92dc3d87485ec7/multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85", size = 41422 }, - { url = "https://files.pythonhosted.org/packages/00/35/f6a637ea2c75f0d3b7c7d41b1189189acff0d9deeb8b8f35536bb30f5e33/multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7", size = 46050 }, - { url = "https://files.pythonhosted.org/packages/e7/b8/f7bf8329b39893d02d9d95cf610c75885d12fc0f402b1c894e1c8e01c916/multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0", size = 43153 }, - { url = "https://files.pythonhosted.org/packages/34/9e/5c727587644d67b2ed479041e4b1c58e30afc011e3d45d25bbe35781217c/multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc", size = 76604 }, - { url = "https://files.pythonhosted.org/packages/17/e4/67b5c27bd17c085a5ea8f1ec05b8a3e5cba0ca734bfcad5560fb129e70ca/multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721", size = 44715 }, - { url = "https://files.pythonhosted.org/packages/4d/e1/866a5d77be6ea435711bef2a4291eed11032679b6b28b56b4776ab06ba3e/multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6", size = 44332 }, - { url = "https://files.pythonhosted.org/packages/31/61/0c2d50241ada71ff61a79518db85ada85fdabfcf395d5968dae1cbda04e5/multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c", size = 245212 }, - { url = "https://files.pythonhosted.org/packages/ac/e0/919666a4e4b57fff1b57f279be1c9316e6cdc5de8a8b525d76f6598fefc7/multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7", size = 246671 }, - { url = "https://files.pythonhosted.org/packages/a1/cc/d027d9c5a520f3321b65adea289b965e7bcbd2c34402663f482648c716ce/multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7", size = 225491 }, - { url = "https://files.pythonhosted.org/packages/75/c4/bbd633980ce6155a28ff04e6a6492dd3335858394d7bb752d8b108708558/multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9", size = 257322 }, - { url = "https://files.pythonhosted.org/packages/4c/6d/d622322d344f1f053eae47e033b0b3f965af01212de21b10bcf91be991fb/multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8", size = 254694 }, - { url = "https://files.pythonhosted.org/packages/a8/9f/78f8761c2705d4c6d7516faed63c0ebdac569f6db1bef95e0d5218fdc146/multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd", size = 246715 }, - { url = "https://files.pythonhosted.org/packages/78/59/950818e04f91b9c2b95aab3d923d9eabd01689d0dcd889563988e9ea0fd8/multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb", size = 243189 }, - { url = "https://files.pythonhosted.org/packages/7a/3d/77c79e1934cad2ee74991840f8a0110966d9599b3af95964c0cd79bb905b/multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6", size = 237845 }, - { url = "https://files.pythonhosted.org/packages/63/1b/834ce32a0a97a3b70f86437f685f880136677ac00d8bce0027e9fd9c2db7/multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2", size = 246374 }, - { url = "https://files.pythonhosted.org/packages/23/ef/43d1c3ba205b5dec93dc97f3fba179dfa47910fc73aaaea4f7ceb41cec2a/multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff", size = 253345 }, - { url = "https://files.pythonhosted.org/packages/6b/03/eaf95bcc2d19ead522001f6a650ef32811aa9e3624ff0ad37c445c7a588c/multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b", size = 246940 }, - { url = "https://files.pythonhosted.org/packages/e8/df/ec8a5fd66ea6cd6f525b1fcbb23511b033c3e9bc42b81384834ffa484a62/multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34", size = 242229 }, - { url = "https://files.pythonhosted.org/packages/8a/a2/59b405d59fd39ec86d1142630e9049243015a5f5291ba49cadf3c090c541/multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff", size = 41308 }, - { url = "https://files.pythonhosted.org/packages/32/0f/13228f26f8b882c34da36efa776c3b7348455ec383bab4a66390e42963ae/multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81", size = 46037 }, - { url = "https://files.pythonhosted.org/packages/84/1f/68588e31b000535a3207fd3c909ebeec4fb36b52c442107499c18a896a2a/multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912", size = 43023 }, - { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877 }, - { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467 }, - { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834 }, - { url = "https://files.pythonhosted.org/packages/7f/f5/013798161ca665e4a422afbc5e2d9e4070142a9ff8905e482139cd09e4d0/multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7", size = 250545 }, - { url = "https://files.pythonhosted.org/packages/71/2f/91dbac13e0ba94669ea5119ba267c9a832f0cb65419aca75549fcf09a3dc/multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e", size = 258305 }, - { url = "https://files.pythonhosted.org/packages/ef/b0/754038b26f6e04488b48ac621f779c341338d78503fb45403755af2df477/multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546", size = 242363 }, - { url = "https://files.pythonhosted.org/packages/87/15/9da40b9336a7c9fa606c4cf2ed80a649dffeb42b905d4f63a1d7eb17d746/multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4", size = 268375 }, - { url = "https://files.pythonhosted.org/packages/82/72/c53fcade0cc94dfaad583105fd92b3a783af2091eddcb41a6d5a52474000/multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1", size = 269346 }, - { url = "https://files.pythonhosted.org/packages/0d/e2/9baffdae21a76f77ef8447f1a05a96ec4bc0a24dae08767abc0a2fe680b8/multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d", size = 256107 }, - { url = "https://files.pythonhosted.org/packages/3c/06/3f06f611087dc60d65ef775f1fb5aca7c6d61c6db4990e7cda0cef9b1651/multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304", size = 253592 }, - { url = "https://files.pythonhosted.org/packages/20/24/54e804ec7945b6023b340c412ce9c3f81e91b3bf5fa5ce65558740141bee/multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12", size = 251024 }, - { url = "https://files.pythonhosted.org/packages/14/48/011cba467ea0b17ceb938315d219391d3e421dfd35928e5dbdc3f4ae76ef/multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62", size = 251484 }, - { url = "https://files.pythonhosted.org/packages/0d/2f/919258b43bb35b99fa127435cfb2d91798eb3a943396631ef43e3720dcf4/multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0", size = 263579 }, - { url = "https://files.pythonhosted.org/packages/31/22/a0e884d86b5242b5a74cf08e876bdf299e413016b66e55511f7a804a366e/multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a", size = 259654 }, - { url = "https://files.pythonhosted.org/packages/b2/e5/17e10e1b5c5f5a40f2fcbb45953c9b215f8a4098003915e46a93f5fcaa8f/multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8", size = 251511 }, - { url = "https://files.pythonhosted.org/packages/e3/9a/201bb1e17e7af53139597069c375e7b0dcbd47594604f65c2d5359508566/multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4", size = 41895 }, - { url = "https://files.pythonhosted.org/packages/46/e2/348cd32faad84eaf1d20cce80e2bb0ef8d312c55bca1f7fa9865e7770aaf/multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b", size = 46073 }, - { url = "https://files.pythonhosted.org/packages/25/ec/aad2613c1910dce907480e0c3aa306905830f25df2e54ccc9dea450cb5aa/multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec", size = 43226 }, - { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135 }, - { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117 }, - { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472 }, - { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342 }, - { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082 }, - { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704 }, - { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355 }, - { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259 }, - { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903 }, - { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365 }, - { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062 }, - { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683 }, - { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254 }, - { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967 }, - { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085 }, - { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713 }, - { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915 }, - { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077 }, - { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114 }, - { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442 }, - { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885 }, - { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588 }, - { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966 }, - { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618 }, - { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539 }, - { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345 }, - { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934 }, - { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243 }, - { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878 }, - { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452 }, - { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312 }, - { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935 }, - { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385 }, - { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777 }, - { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104 }, - { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503 }, - { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128 }, - { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410 }, - { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205 }, - { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084 }, - { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667 }, - { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590 }, - { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112 }, - { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194 }, - { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510 }, - { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395 }, - { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520 }, - { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479 }, - { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903 }, - { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333 }, - { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411 }, - { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940 }, - { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087 }, - { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368 }, - { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326 }, - { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065 }, - { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475 }, - { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324 }, - { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877 }, - { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824 }, - { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558 }, - { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339 }, - { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895 }, - { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862 }, - { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376 }, - { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272 }, - { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774 }, - { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731 }, - { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193 }, - { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023 }, - { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507 }, - { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804 }, - { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317 }, -] - -[[package]] -name = "multiprocess" -version = "0.70.18" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dill" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/fd/2ae3826f5be24c6ed87266bc4e59c46ea5b059a103f3d7e7eb76a52aeecb/multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d", size = 1798503 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f8/7f9a8f08bf98cea1dfaa181e05cc8bbcb59cecf044b5a9ac3cce39f9c449/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df", size = 135083 }, - { url = "https://files.pythonhosted.org/packages/e5/03/b7b10dbfc17b2b3ce07d4d30b3ba8367d0ed32d6d46cd166e298f161dd46/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:06b19433de0d02afe5869aec8931dd5c01d99074664f806c73896b0d9e527213", size = 135128 }, - { url = "https://files.pythonhosted.org/packages/c1/a3/5f8d3b9690ea5580bee5868ab7d7e2cfca74b7e826b28192b40aa3881cdc/multiprocess-0.70.18-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6fa1366f994373aaf2d4738b0f56e707caeaa05486e97a7f71ee0853823180c2", size = 135132 }, - { url = "https://files.pythonhosted.org/packages/55/4d/9af0d1279c84618bcd35bf5fd7e371657358c7b0a523e54a9cffb87461f8/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6", size = 144695 }, - { url = "https://files.pythonhosted.org/packages/17/bf/87323e79dd0562474fad3373c21c66bc6c3c9963b68eb2a209deb4c8575e/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3", size = 144742 }, - { url = "https://files.pythonhosted.org/packages/dd/74/cb8c831e58dc6d5cf450b17c7db87f14294a1df52eb391da948b5e0a0b94/multiprocess-0.70.18-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797", size = 144745 }, - { url = "https://files.pythonhosted.org/packages/ba/d8/0cba6cf51a1a31f20471fbc823a716170c73012ddc4fb85d706630ed6e8f/multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea", size = 134948 }, - { url = "https://files.pythonhosted.org/packages/4b/88/9039f2fed1012ef584751d4ceff9ab4a51e5ae264898f0b7cbf44340a859/multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d", size = 144462 }, - { url = "https://files.pythonhosted.org/packages/bf/b6/5f922792be93b82ec6b5f270bbb1ef031fd0622847070bbcf9da816502cc/multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2", size = 150287 }, - { url = "https://files.pythonhosted.org/packages/ee/25/7d7e78e750bc1aecfaf0efbf826c69a791d2eeaf29cf20cba93ff4cced78/multiprocess-0.70.18-py313-none-any.whl", hash = "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334", size = 151917 }, - { url = "https://files.pythonhosted.org/packages/3b/c3/ca84c19bd14cdfc21c388fdcebf08b86a7a470ebc9f5c3c084fc2dbc50f7/multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b", size = 132636 }, - { url = "https://files.pythonhosted.org/packages/6c/28/dd72947e59a6a8c856448a5e74da6201cb5502ddff644fbc790e4bd40b9a/multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8", size = 133478 }, -] - -[[package]] -name = "networkx" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, -] - -[[package]] -name = "networkx" -version = "3.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*'", - "python_full_version >= '3.12'", -] -sdist = { url = "https://files.pythonhosted.org/packages/e8/fc/7b6fd4d22c8c4dc5704430140d8b3f520531d4fe7328b8f8d03f5a7950e8/networkx-3.6.tar.gz", hash = "sha256:285276002ad1f7f7da0f7b42f004bcba70d381e936559166363707fdad3d72ad", size = 2511464 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/c7/d64168da60332c17d24c0d2f08bdf3987e8d1ae9d84b5bbd0eec2eb26a55/networkx-3.6-py3-none-any.whl", hash = "sha256:cdb395b105806062473d3be36458d8f1459a4e4b98e236a66c3a48996e07684f", size = 2063713 }, -] - -[[package]] -name = "numba" -version = "0.62.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "llvmlite" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/20/33dbdbfe60e5fd8e3dbfde299d106279a33d9f8308346022316781368591/numba-0.62.1.tar.gz", hash = "sha256:7b774242aa890e34c21200a1fc62e5b5757d5286267e71103257f4e2af0d5161", size = 2749817 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/27/a5a9a58f267ec3b72f609789b2a8eefd6156bd7117e41cc9b7cf5de30490/numba-0.62.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a323df9d36a0da1ca9c592a6baaddd0176d9f417ef49a65bb81951dce69d941a", size = 2684281 }, - { url = "https://files.pythonhosted.org/packages/3a/9d/ffc091c0bfd7b80f66df3887a7061b6af80c8c2649902444026ee1454391/numba-0.62.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1e1f4781d3f9f7c23f16eb04e76ca10b5a3516e959634bd226fc48d5d8e7a0a", size = 2687311 }, - { url = "https://files.pythonhosted.org/packages/a1/13/9a27bcd0baeea236116070c7df458414336f25e9dd5a872b066cf36b74bf/numba-0.62.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:14432af305ea68627a084cd702124fd5d0c1f5b8a413b05f4e14757202d1cf6c", size = 3734548 }, - { url = "https://files.pythonhosted.org/packages/a7/00/17a1ac4a60253c784ce59549375e047da98330b82de7df6ac7f4ecc90902/numba-0.62.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f180922adf159ae36c2fe79fb94ffaa74cf5cb3688cb72dba0a904b91e978507", size = 3441277 }, - { url = "https://files.pythonhosted.org/packages/86/94/20ae0ff78612c4697eaf942a639db01dd4e2d90f634ac41fa3e015c961fc/numba-0.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:f41834909d411b4b8d1c68f745144136f21416547009c1e860cc2098754b4ca7", size = 2745647 }, - { url = "https://files.pythonhosted.org/packages/dd/5f/8b3491dd849474f55e33c16ef55678ace1455c490555337899c35826836c/numba-0.62.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:f43e24b057714e480fe44bc6031de499e7cf8150c63eb461192caa6cc8530bc8", size = 2684279 }, - { url = "https://files.pythonhosted.org/packages/bf/18/71969149bfeb65a629e652b752b80167fe8a6a6f6e084f1f2060801f7f31/numba-0.62.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:57cbddc53b9ee02830b828a8428757f5c218831ccc96490a314ef569d8342b7b", size = 2687330 }, - { url = "https://files.pythonhosted.org/packages/0e/7d/403be3fecae33088027bc8a95dc80a2fda1e3beff3e0e5fc4374ada3afbe/numba-0.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:604059730c637c7885386521bb1b0ddcbc91fd56131a6dcc54163d6f1804c872", size = 3739727 }, - { url = "https://files.pythonhosted.org/packages/e0/c3/3d910d08b659a6d4c62ab3cd8cd93c4d8b7709f55afa0d79a87413027ff6/numba-0.62.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6c540880170bee817011757dc9049dba5a29db0c09b4d2349295991fe3ee55f", size = 3445490 }, - { url = "https://files.pythonhosted.org/packages/5b/82/9d425c2f20d9f0a37f7cb955945a553a00fa06a2b025856c3550227c5543/numba-0.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:03de6d691d6b6e2b76660ba0f38f37b81ece8b2cc524a62f2a0cfae2bfb6f9da", size = 2745550 }, - { url = "https://files.pythonhosted.org/packages/5e/fa/30fa6873e9f821c0ae755915a3ca444e6ff8d6a7b6860b669a3d33377ac7/numba-0.62.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:1b743b32f8fa5fff22e19c2e906db2f0a340782caf024477b97801b918cf0494", size = 2685346 }, - { url = "https://files.pythonhosted.org/packages/a9/d5/504ce8dc46e0dba2790c77e6b878ee65b60fe3e7d6d0006483ef6fde5a97/numba-0.62.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90fa21b0142bcf08ad8e32a97d25d0b84b1e921bc9423f8dda07d3652860eef6", size = 2688139 }, - { url = "https://files.pythonhosted.org/packages/50/5f/6a802741176c93f2ebe97ad90751894c7b0c922b52ba99a4395e79492205/numba-0.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6ef84d0ac19f1bf80431347b6f4ce3c39b7ec13f48f233a48c01e2ec06ecbc59", size = 3796453 }, - { url = "https://files.pythonhosted.org/packages/7e/df/efd21527d25150c4544eccc9d0b7260a5dec4b7e98b5a581990e05a133c0/numba-0.62.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9315cc5e441300e0ca07c828a627d92a6802bcbf27c5487f31ae73783c58da53", size = 3496451 }, - { url = "https://files.pythonhosted.org/packages/80/44/79bfdab12a02796bf4f1841630355c82b5a69933b1d50eb15c7fa37dabe8/numba-0.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:44e3aa6228039992f058f5ebfcfd372c83798e9464297bdad8cc79febcf7891e", size = 2745552 }, - { url = "https://files.pythonhosted.org/packages/22/76/501ea2c07c089ef1386868f33dff2978f43f51b854e34397b20fc55e0a58/numba-0.62.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:b72489ba8411cc9fdcaa2458d8f7677751e94f0109eeb53e5becfdc818c64afb", size = 2685766 }, - { url = "https://files.pythonhosted.org/packages/80/68/444986ed95350c0611d5c7b46828411c222ce41a0c76707c36425d27ce29/numba-0.62.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:44a1412095534a26fb5da2717bc755b57da5f3053965128fe3dc286652cc6a92", size = 2688741 }, - { url = "https://files.pythonhosted.org/packages/78/7e/bf2e3634993d57f95305c7cee4c9c6cb3c9c78404ee7b49569a0dfecfe33/numba-0.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8c9460b9e936c5bd2f0570e20a0a5909ee6e8b694fd958b210e3bde3a6dba2d7", size = 3804576 }, - { url = "https://files.pythonhosted.org/packages/e8/b6/8a1723fff71f63bbb1354bdc60a1513a068acc0f5322f58da6f022d20247/numba-0.62.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:728f91a874192df22d74e3fd42c12900b7ce7190b1aad3574c6c61b08313e4c5", size = 3503367 }, - { url = "https://files.pythonhosted.org/packages/9c/ec/9d414e7a80d6d1dc4af0e07c6bfe293ce0b04ea4d0ed6c45dad9bd6e72eb/numba-0.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:bbf3f88b461514287df66bc8d0307e949b09f2b6f67da92265094e8fa1282dd8", size = 2745529 }, -] - -[[package]] -name = "numpy" -version = "2.2.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245 }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048 }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542 }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301 }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320 }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050 }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034 }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185 }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149 }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620 }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391 }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754 }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476 }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666 }, -] - -[[package]] -name = "numpy" -version = "2.3.5" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*'", - "python_full_version >= '3.12'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641 }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324 }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872 }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148 }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282 }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903 }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672 }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896 }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608 }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442 }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555 }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873 }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838 }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378 }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559 }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702 }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086 }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985 }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976 }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274 }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922 }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667 }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251 }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652 }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172 }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990 }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902 }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430 }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551 }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275 }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637 }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090 }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710 }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292 }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897 }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391 }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275 }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855 }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359 }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374 }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587 }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940 }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341 }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507 }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706 }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507 }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049 }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603 }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696 }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350 }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190 }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749 }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432 }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388 }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651 }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503 }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612 }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042 }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502 }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962 }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054 }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613 }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147 }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806 }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760 }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459 }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689 }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053 }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635 }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770 }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768 }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263 }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213 }, -] - -[[package]] -name = "nvidia-cublas-cu12" -version = "12.8.4.1" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/99/db44d685f0e257ff0e213ade1964fc459b4a690a73293220e98feb3307cf/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0", size = 590537124 }, - { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921 }, -] - -[[package]] -name = "nvidia-cuda-cupti-cu12" -version = "12.8.90" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/1f/b3bd73445e5cb342727fd24fe1f7b748f690b460acadc27ea22f904502c8/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4412396548808ddfed3f17a467b104ba7751e6b58678a4b840675c56d21cf7ed", size = 9533318 }, - { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621 }, -] - -[[package]] -name = "nvidia-cuda-nvrtc-cu12" -version = "12.8.93" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029 }, - { url = "https://files.pythonhosted.org/packages/eb/d1/e50d0acaab360482034b84b6e27ee83c6738f7d32182b987f9c7a4e32962/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8", size = 43106076 }, -] - -[[package]] -name = "nvidia-cuda-runtime-cu12" -version = "12.8.90" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/75/f865a3b236e4647605ea34cc450900854ba123834a5f1598e160b9530c3a/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d", size = 965265 }, - { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765 }, -] - -[[package]] -name = "nvidia-cudnn-cu12" -version = "9.10.2.21" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cublas-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/41/e79269ce215c857c935fd86bcfe91a451a584dfc27f1e068f568b9ad1ab7/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8", size = 705026878 }, - { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467 }, -] - -[[package]] -name = "nvidia-cufft-cu12" -version = "11.3.3.83" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/bc/7771846d3a0272026c416fbb7e5f4c1f146d6d80704534d0b187dd6f4800/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a", size = 193109211 }, - { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695 }, -] - -[[package]] -name = "nvidia-cufile-cu12" -version = "1.13.1.3" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834 }, - { url = "https://files.pythonhosted.org/packages/1e/f5/5607710447a6fe9fd9b3283956fceeee8a06cda1d2f56ce31371f595db2a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:4beb6d4cce47c1a0f1013d72e02b0994730359e17801d395bdcbf20cfb3bb00a", size = 1120705 }, -] - -[[package]] -name = "nvidia-curand-cu12" -version = "10.3.9.90" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/5e/92aa15eca622a388b80fbf8375d4760738df6285b1e92c43d37390a33a9a/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd", size = 63625754 }, - { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976 }, -] - -[[package]] -name = "nvidia-cusolver-cu12" -version = "11.7.3.90" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/32/f7cd6ce8a7690544d084ea21c26e910a97e077c9b7f07bf5de623ee19981/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0", size = 267229841 }, - { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905 }, -] - -[[package]] -name = "nvidia-cusparse-cu12" -version = "12.5.8.93" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/f7/cd777c4109681367721b00a106f491e0d0d15cfa1fd59672ce580ce42a97/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc", size = 288117129 }, - { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466 }, -] - -[[package]] -name = "nvidia-cusparselt-cu12" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/b9/598f6ff36faaece4b3c50d26f50e38661499ff34346f00e057760b35cc9d/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8878dce784d0fac90131b6817b607e803c36e629ba34dc5b433471382196b6a5", size = 283835557 }, - { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691 }, -] - -[[package]] -name = "nvidia-nccl-cu12" -version = "2.27.5" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/1c/857979db0ef194ca5e21478a0612bcdbbe59458d7694361882279947b349/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:31432ad4d1fb1004eb0c56203dc9bc2178a1ba69d1d9e02d64a6938ab5e40e7a", size = 322400625 }, - { url = "https://files.pythonhosted.org/packages/6e/89/f7a07dc961b60645dbbf42e80f2bc85ade7feb9a491b11a1e973aa00071f/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457", size = 322348229 }, -] - -[[package]] -name = "nvidia-nvjitlink-cu12" -version = "12.8.93" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836 }, - { url = "https://files.pythonhosted.org/packages/2a/a2/8cee5da30d13430e87bf99bb33455d2724d0a4a9cb5d7926d80ccb96d008/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7", size = 38386204 }, -] - -[[package]] -name = "nvidia-nvshmem-cu12" -version = "3.3.20" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/9d/3dd98852568fb845ec1f7902c90a22b240fe1cbabda411ccedf2fd737b7b/nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b0b960da3842212758e4fa4696b94f129090b30e5122fea3c5345916545cff0", size = 124484616 }, - { url = "https://files.pythonhosted.org/packages/3b/6c/99acb2f9eb85c29fc6f3a7ac4dccfd992e22666dd08a642b303311326a97/nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d00f26d3f9b2e3c3065be895e3059d6479ea5c638a3f38c9fec49b1b9dd7c1e5", size = 124657145 }, -] - -[[package]] -name = "nvidia-nvtx-cu12" -version = "12.8.90" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/c0/1b303feea90d296f6176f32a2a70b5ef230f9bdeb3a72bddb0dc922dc137/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7ad891da111ebafbf7e015d34879f7112832fc239ff0d7d776b6cb685274615", size = 91161 }, - { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954 }, -] - -[[package]] -name = "onnxruntime" -version = "1.22.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "coloredlogs" }, - { name = "flatbuffers" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging" }, - { name = "protobuf" }, - { name = "sympy" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/3c/c99b21646a782b89c33cffd96fdee02a81bc43f0cb651de84d58ec11e30e/onnxruntime-1.22.0-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:85d8826cc8054e4d6bf07f779dc742a363c39094015bdad6a08b3c18cfe0ba8c", size = 34273493 }, - { url = "https://files.pythonhosted.org/packages/54/ab/fd9a3b5285008c060618be92e475337fcfbf8689787953d37273f7b52ab0/onnxruntime-1.22.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:468c9502a12f6f49ec335c2febd22fdceecc1e4cc96dfc27e419ba237dff5aff", size = 14445346 }, - { url = "https://files.pythonhosted.org/packages/1f/ca/a5625644bc079e04e3076a5ac1fb954d1e90309b8eb987a4f800732ffee6/onnxruntime-1.22.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:681fe356d853630a898ee05f01ddb95728c9a168c9460e8361d0a240c9b7cb97", size = 16392959 }, - { url = "https://files.pythonhosted.org/packages/6d/6b/8267490476e8d4dd1883632c7e46a4634384c7ff1c35ae44edc8ab0bb7a9/onnxruntime-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:20bca6495d06925631e201f2b257cc37086752e8fe7b6c83a67c6509f4759bc9", size = 12689974 }, - { url = "https://files.pythonhosted.org/packages/7a/08/c008711d1b92ff1272f4fea0fbee57723171f161d42e5c680625535280af/onnxruntime-1.22.0-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:8d6725c5b9a681d8fe72f2960c191a96c256367887d076b08466f52b4e0991df", size = 34282151 }, - { url = "https://files.pythonhosted.org/packages/3e/8b/22989f6b59bc4ad1324f07a945c80b9ab825f0a581ad7a6064b93716d9b7/onnxruntime-1.22.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fef17d665a917866d1f68f09edc98223b9a27e6cb167dec69da4c66484ad12fd", size = 14446302 }, - { url = "https://files.pythonhosted.org/packages/7a/d5/aa83d084d05bc8f6cf8b74b499c77431ffd6b7075c761ec48ec0c161a47f/onnxruntime-1.22.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b978aa63a9a22095479c38371a9b359d4c15173cbb164eaad5f2cd27d666aa65", size = 16393496 }, - { url = "https://files.pythonhosted.org/packages/89/a5/1c6c10322201566015183b52ef011dfa932f5dd1b278de8d75c3b948411d/onnxruntime-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:03d3ef7fb11adf154149d6e767e21057e0e577b947dd3f66190b212528e1db31", size = 12691517 }, - { url = "https://files.pythonhosted.org/packages/4d/de/9162872c6e502e9ac8c99a98a8738b2fab408123d11de55022ac4f92562a/onnxruntime-1.22.0-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:f3c0380f53c1e72a41b3f4d6af2ccc01df2c17844072233442c3a7e74851ab97", size = 34298046 }, - { url = "https://files.pythonhosted.org/packages/03/79/36f910cd9fc96b444b0e728bba14607016079786adf032dae61f7c63b4aa/onnxruntime-1.22.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8601128eaef79b636152aea76ae6981b7c9fc81a618f584c15d78d42b310f1c", size = 14443220 }, - { url = "https://files.pythonhosted.org/packages/8c/60/16d219b8868cc8e8e51a68519873bdb9f5f24af080b62e917a13fff9989b/onnxruntime-1.22.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6964a975731afc19dc3418fad8d4e08c48920144ff590149429a5ebe0d15fb3c", size = 16406377 }, - { url = "https://files.pythonhosted.org/packages/36/b4/3f1c71ce1d3d21078a6a74c5483bfa2b07e41a8d2b8fb1e9993e6a26d8d3/onnxruntime-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0d534a43d1264d1273c2d4f00a5a588fa98d21117a3345b7104fa0bbcaadb9a", size = 12692233 }, - { url = "https://files.pythonhosted.org/packages/a9/65/5cb5018d5b0b7cba820d2c4a1d1b02d40df538d49138ba36a509457e4df6/onnxruntime-1.22.0-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:fe7c051236aae16d8e2e9ffbfc1e115a0cc2450e873a9c4cb75c0cc96c1dae07", size = 34298715 }, - { url = "https://files.pythonhosted.org/packages/e1/89/1dfe1b368831d1256b90b95cb8d11da8ab769febd5c8833ec85ec1f79d21/onnxruntime-1.22.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a6bbed10bc5e770c04d422893d3045b81acbbadc9fb759a2cd1ca00993da919", size = 14443266 }, - { url = "https://files.pythonhosted.org/packages/1e/70/342514ade3a33ad9dd505dcee96ff1f0e7be6d0e6e9c911fe0f1505abf42/onnxruntime-1.22.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe45ee3e756300fccfd8d61b91129a121d3d80e9d38e01f03ff1295badc32b8", size = 16406707 }, - { url = "https://files.pythonhosted.org/packages/3e/89/2f64e250945fa87140fb917ba377d6d0e9122e029c8512f389a9b7f953f4/onnxruntime-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:5a31d84ef82b4b05d794a4ce8ba37b0d9deb768fd580e36e17b39e0b4840253b", size = 12691777 }, - { url = "https://files.pythonhosted.org/packages/9f/48/d61d5f1ed098161edd88c56cbac49207d7b7b149e613d2cd7e33176c63b3/onnxruntime-1.22.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a2ac5bd9205d831541db4e508e586e764a74f14efdd3f89af7fd20e1bf4a1ed", size = 14454003 }, - { url = "https://files.pythonhosted.org/packages/c3/16/873b955beda7bada5b0d798d3a601b2ff210e44ad5169f6d405b93892103/onnxruntime-1.22.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64845709f9e8a2809e8e009bc4c8f73b788cee9c6619b7d9930344eae4c9cd36", size = 16427482 }, -] - -[[package]] -name = "packaging" -version = "25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, -] - -[[package]] -name = "pandas" -version = "2.3.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763 }, - { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217 }, - { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791 }, - { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373 }, - { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444 }, - { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459 }, - { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086 }, - { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790 }, - { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831 }, - { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267 }, - { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281 }, - { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453 }, - { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361 }, - { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702 }, - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846 }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618 }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212 }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693 }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002 }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971 }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722 }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671 }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807 }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872 }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371 }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333 }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120 }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991 }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227 }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056 }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189 }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912 }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160 }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233 }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635 }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079 }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049 }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638 }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834 }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925 }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071 }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504 }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702 }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535 }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582 }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963 }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175 }, -] - -[[package]] -name = "pillow" -version = "12.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809 }, - { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1", size = 4650606 }, - { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363", size = 6221023 }, - { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca", size = 8024937 }, - { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e", size = 6334139 }, - { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782", size = 7026074 }, - { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10", size = 6448852 }, - { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa", size = 7117058 }, - { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275", size = 6295431 }, - { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d", size = 7000412 }, - { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7", size = 2435903 }, - { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798 }, - { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589 }, - { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472 }, - { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887 }, - { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964 }, - { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756 }, - { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075 }, - { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955 }, - { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440 }, - { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256 }, - { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025 }, - { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377 }, - { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343 }, - { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981 }, - { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399 }, - { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740 }, - { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201 }, - { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334 }, - { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162 }, - { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769 }, - { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107 }, - { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012 }, - { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493 }, - { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461 }, - { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912 }, - { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132 }, - { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099 }, - { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808 }, - { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804 }, - { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553 }, - { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729 }, - { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789 }, - { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917 }, - { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391 }, - { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477 }, - { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918 }, - { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406 }, - { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218 }, - { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564 }, - { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260 }, - { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248 }, - { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043 }, - { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915 }, - { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998 }, - { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201 }, - { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165 }, - { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834 }, - { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531 }, - { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554 }, - { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812 }, - { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689 }, - { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186 }, - { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308 }, - { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222 }, - { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657 }, - { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482 }, - { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416 }, - { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584 }, - { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621 }, - { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916 }, - { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836 }, - { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092 }, - { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158 }, - { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882 }, - { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001 }, - { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146 }, - { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344 }, - { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864 }, - { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911 }, - { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045 }, - { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282 }, - { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630 }, - { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068 }, - { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994 }, - { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639 }, - { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839 }, - { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505 }, - { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654 }, - { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850 }, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, -] - -[[package]] -name = "propcache" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534 }, - { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526 }, - { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263 }, - { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012 }, - { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491 }, - { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319 }, - { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856 }, - { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241 }, - { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552 }, - { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113 }, - { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778 }, - { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047 }, - { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093 }, - { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638 }, - { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229 }, - { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208 }, - { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777 }, - { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647 }, - { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929 }, - { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778 }, - { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144 }, - { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030 }, - { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252 }, - { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064 }, - { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429 }, - { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727 }, - { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097 }, - { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084 }, - { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637 }, - { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064 }, - { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061 }, - { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037 }, - { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324 }, - { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505 }, - { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242 }, - { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474 }, - { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575 }, - { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736 }, - { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019 }, - { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376 }, - { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988 }, - { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615 }, - { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066 }, - { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655 }, - { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789 }, - { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750 }, - { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780 }, - { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308 }, - { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182 }, - { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215 }, - { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112 }, - { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442 }, - { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398 }, - { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920 }, - { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748 }, - { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877 }, - { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437 }, - { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586 }, - { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790 }, - { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158 }, - { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451 }, - { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374 }, - { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396 }, - { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950 }, - { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856 }, - { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420 }, - { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254 }, - { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205 }, - { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873 }, - { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739 }, - { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514 }, - { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781 }, - { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396 }, - { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897 }, - { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789 }, - { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152 }, - { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869 }, - { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596 }, - { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981 }, - { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490 }, - { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371 }, - { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424 }, - { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566 }, - { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130 }, - { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625 }, - { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209 }, - { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797 }, - { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140 }, - { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257 }, - { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097 }, - { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455 }, - { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372 }, - { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411 }, - { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712 }, - { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557 }, - { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015 }, - { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880 }, - { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938 }, - { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641 }, - { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510 }, - { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161 }, - { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393 }, - { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546 }, - { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259 }, - { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428 }, - { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305 }, -] - -[[package]] -name = "protobuf" -version = "6.33.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/03/a1440979a3f74f16cab3b75b0da1a1a7f922d56a8ddea96092391998edc0/protobuf-6.33.1.tar.gz", hash = "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b", size = 443432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/f1/446a9bbd2c60772ca36556bac8bfde40eceb28d9cc7838755bc41e001d8f/protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b", size = 425593 }, - { url = "https://files.pythonhosted.org/packages/a6/79/8780a378c650e3df849b73de8b13cf5412f521ca2ff9b78a45c247029440/protobuf-6.33.1-cp310-abi3-win_amd64.whl", hash = "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed", size = 436883 }, - { url = "https://files.pythonhosted.org/packages/cd/93/26213ff72b103ae55bb0d73e7fb91ea570ef407c3ab4fd2f1f27cac16044/protobuf-6.33.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490", size = 427522 }, - { url = "https://files.pythonhosted.org/packages/c2/32/df4a35247923393aa6b887c3b3244a8c941c32a25681775f96e2b418f90e/protobuf-6.33.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178", size = 324445 }, - { url = "https://files.pythonhosted.org/packages/8e/d0/d796e419e2ec93d2f3fa44888861c3f88f722cde02b7c3488fcc6a166820/protobuf-6.33.1-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53", size = 339161 }, - { url = "https://files.pythonhosted.org/packages/1d/2a/3c5f05a4af06649547027d288747f68525755de692a26a7720dced3652c0/protobuf-6.33.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1", size = 323171 }, - { url = "https://files.pythonhosted.org/packages/08/b4/46310463b4f6ceef310f8348786f3cff181cea671578e3d9743ba61a459e/protobuf-6.33.1-py3-none-any.whl", hash = "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa", size = 170477 }, -] - -[[package]] -name = "pyarrow" -version = "22.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/53/04a7fdc63e6056116c9ddc8b43bc28c12cdd181b85cbeadb79278475f3ae/pyarrow-22.0.0.tar.gz", hash = "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9", size = 1151151 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/9b/cb3f7e0a345353def531ca879053e9ef6b9f38ed91aebcf68b09ba54dec0/pyarrow-22.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:77718810bd3066158db1e95a63c160ad7ce08c6b0710bc656055033e39cdad88", size = 34223968 }, - { url = "https://files.pythonhosted.org/packages/6c/41/3184b8192a120306270c5307f105b70320fdaa592c99843c5ef78aaefdcf/pyarrow-22.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:44d2d26cda26d18f7af7db71453b7b783788322d756e81730acb98f24eb90ace", size = 35942085 }, - { url = "https://files.pythonhosted.org/packages/d9/3d/a1eab2f6f08001f9fb714b8ed5cfb045e2fe3e3e3c0c221f2c9ed1e6d67d/pyarrow-22.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b9d71701ce97c95480fecb0039ec5bb889e75f110da72005743451339262f4ce", size = 44964613 }, - { url = "https://files.pythonhosted.org/packages/46/46/a1d9c24baf21cfd9ce994ac820a24608decf2710521b29223d4334985127/pyarrow-22.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:710624ab925dc2b05a6229d47f6f0dac1c1155e6ed559be7109f684eba048a48", size = 47627059 }, - { url = "https://files.pythonhosted.org/packages/3a/4c/f711acb13075c1391fd54bc17e078587672c575f8de2a6e62509af026dcf/pyarrow-22.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340", size = 47947043 }, - { url = "https://files.pythonhosted.org/packages/4e/70/1f3180dd7c2eab35c2aca2b29ace6c519f827dcd4cfeb8e0dca41612cf7a/pyarrow-22.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd0d42297ace400d8febe55f13fdf46e86754842b860c978dfec16f081e5c653", size = 50206505 }, - { url = "https://files.pythonhosted.org/packages/80/07/fea6578112c8c60ffde55883a571e4c4c6bc7049f119d6b09333b5cc6f73/pyarrow-22.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:00626d9dc0f5ef3a75fe63fd68b9c7c8302d2b5bbc7f74ecaedba83447a24f84", size = 28101641 }, - { url = "https://files.pythonhosted.org/packages/2e/b7/18f611a8cdc43417f9394a3ccd3eace2f32183c08b9eddc3d17681819f37/pyarrow-22.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:3e294c5eadfb93d78b0763e859a0c16d4051fc1c5231ae8956d61cb0b5666f5a", size = 34272022 }, - { url = "https://files.pythonhosted.org/packages/26/5c/f259e2526c67eb4b9e511741b19870a02363a47a35edbebc55c3178db22d/pyarrow-22.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:69763ab2445f632d90b504a815a2a033f74332997052b721002298ed6de40f2e", size = 35995834 }, - { url = "https://files.pythonhosted.org/packages/50/8d/281f0f9b9376d4b7f146913b26fac0aa2829cd1ee7e997f53a27411bbb92/pyarrow-22.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:b41f37cabfe2463232684de44bad753d6be08a7a072f6a83447eeaf0e4d2a215", size = 45030348 }, - { url = "https://files.pythonhosted.org/packages/f5/e5/53c0a1c428f0976bf22f513d79c73000926cb00b9c138d8e02daf2102e18/pyarrow-22.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:35ad0f0378c9359b3f297299c3309778bb03b8612f987399a0333a560b43862d", size = 47699480 }, - { url = "https://files.pythonhosted.org/packages/95/e1/9dbe4c465c3365959d183e6345d0a8d1dc5b02ca3f8db4760b3bc834cf25/pyarrow-22.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8382ad21458075c2e66a82a29d650f963ce51c7708c7c0ff313a8c206c4fd5e8", size = 48011148 }, - { url = "https://files.pythonhosted.org/packages/c5/b4/7caf5d21930061444c3cf4fa7535c82faf5263e22ce43af7c2759ceb5b8b/pyarrow-22.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016", size = 50276964 }, - { url = "https://files.pythonhosted.org/packages/ae/f3/cec89bd99fa3abf826f14d4e53d3d11340ce6f6af4d14bdcd54cd83b6576/pyarrow-22.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ec5d40dd494882704fb876c16fa7261a69791e784ae34e6b5992e977bd2e238c", size = 28106517 }, - { url = "https://files.pythonhosted.org/packages/af/63/ba23862d69652f85b615ca14ad14f3bcfc5bf1b99ef3f0cd04ff93fdad5a/pyarrow-22.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d", size = 34211578 }, - { url = "https://files.pythonhosted.org/packages/b1/d0/f9ad86fe809efd2bcc8be32032fa72e8b0d112b01ae56a053006376c5930/pyarrow-22.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8", size = 35989906 }, - { url = "https://files.pythonhosted.org/packages/b4/a8/f910afcb14630e64d673f15904ec27dd31f1e009b77033c365c84e8c1e1d/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5", size = 45021677 }, - { url = "https://files.pythonhosted.org/packages/13/95/aec81f781c75cd10554dc17a25849c720d54feafb6f7847690478dcf5ef8/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe", size = 47726315 }, - { url = "https://files.pythonhosted.org/packages/bb/d4/74ac9f7a54cfde12ee42734ea25d5a3c9a45db78f9def949307a92720d37/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e", size = 47990906 }, - { url = "https://files.pythonhosted.org/packages/2e/71/fedf2499bf7a95062eafc989ace56572f3343432570e1c54e6599d5b88da/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9", size = 50306783 }, - { url = "https://files.pythonhosted.org/packages/68/ed/b202abd5a5b78f519722f3d29063dda03c114711093c1995a33b8e2e0f4b/pyarrow-22.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d", size = 27972883 }, - { url = "https://files.pythonhosted.org/packages/a6/d6/d0fac16a2963002fc22c8fa75180a838737203d558f0ed3b564c4a54eef5/pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a", size = 34204629 }, - { url = "https://files.pythonhosted.org/packages/c6/9c/1d6357347fbae062ad3f17082f9ebc29cc733321e892c0d2085f42a2212b/pyarrow-22.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901", size = 35985783 }, - { url = "https://files.pythonhosted.org/packages/ff/c0/782344c2ce58afbea010150df07e3a2f5fdad299cd631697ae7bd3bac6e3/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691", size = 45020999 }, - { url = "https://files.pythonhosted.org/packages/1b/8b/5362443737a5307a7b67c1017c42cd104213189b4970bf607e05faf9c525/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a", size = 47724601 }, - { url = "https://files.pythonhosted.org/packages/69/4d/76e567a4fc2e190ee6072967cb4672b7d9249ac59ae65af2d7e3047afa3b/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6", size = 48001050 }, - { url = "https://files.pythonhosted.org/packages/01/5e/5653f0535d2a1aef8223cee9d92944cb6bccfee5cf1cd3f462d7cb022790/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941", size = 50307877 }, - { url = "https://files.pythonhosted.org/packages/2d/f8/1d0bd75bf9328a3b826e24a16e5517cd7f9fbf8d34a3184a4566ef5a7f29/pyarrow-22.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145", size = 27977099 }, - { url = "https://files.pythonhosted.org/packages/90/81/db56870c997805bf2b0f6eeeb2d68458bf4654652dccdcf1bf7a42d80903/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1", size = 34336685 }, - { url = "https://files.pythonhosted.org/packages/1c/98/0727947f199aba8a120f47dfc229eeb05df15bcd7a6f1b669e9f882afc58/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f", size = 36032158 }, - { url = "https://files.pythonhosted.org/packages/96/b4/9babdef9c01720a0785945c7cf550e4acd0ebcd7bdd2e6f0aa7981fa85e2/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d", size = 44892060 }, - { url = "https://files.pythonhosted.org/packages/f8/ca/2f8804edd6279f78a37062d813de3f16f29183874447ef6d1aadbb4efa0f/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f", size = 47504395 }, - { url = "https://files.pythonhosted.org/packages/b9/f0/77aa5198fd3943682b2e4faaf179a674f0edea0d55d326d83cb2277d9363/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746", size = 48066216 }, - { url = "https://files.pythonhosted.org/packages/79/87/a1937b6e78b2aff18b706d738c9e46ade5bfcf11b294e39c87706a0089ac/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95", size = 50288552 }, - { url = "https://files.pythonhosted.org/packages/60/ae/b5a5811e11f25788ccfdaa8f26b6791c9807119dffcf80514505527c384c/pyarrow-22.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc", size = 28262504 }, - { url = "https://files.pythonhosted.org/packages/bd/b0/0fa4d28a8edb42b0a7144edd20befd04173ac79819547216f8a9f36f9e50/pyarrow-22.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d", size = 34224062 }, - { url = "https://files.pythonhosted.org/packages/0f/a8/7a719076b3c1be0acef56a07220c586f25cd24de0e3f3102b438d18ae5df/pyarrow-22.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9", size = 35990057 }, - { url = "https://files.pythonhosted.org/packages/89/3c/359ed54c93b47fb6fe30ed16cdf50e3f0e8b9ccfb11b86218c3619ae50a8/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7", size = 45068002 }, - { url = "https://files.pythonhosted.org/packages/55/fc/4945896cc8638536ee787a3bd6ce7cec8ec9acf452d78ec39ab328efa0a1/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde", size = 47737765 }, - { url = "https://files.pythonhosted.org/packages/cd/5e/7cb7edeb2abfaa1f79b5d5eb89432356155c8426f75d3753cbcb9592c0fd/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc", size = 48048139 }, - { url = "https://files.pythonhosted.org/packages/88/c6/546baa7c48185f5e9d6e59277c4b19f30f48c94d9dd938c2a80d4d6b067c/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0", size = 50314244 }, - { url = "https://files.pythonhosted.org/packages/3c/79/755ff2d145aafec8d347bf18f95e4e81c00127f06d080135dfc86aea417c/pyarrow-22.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730", size = 28757501 }, - { url = "https://files.pythonhosted.org/packages/0e/d2/237d75ac28ced3147912954e3c1a174df43a95f4f88e467809118a8165e0/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2", size = 34355506 }, - { url = "https://files.pythonhosted.org/packages/1e/2c/733dfffe6d3069740f98e57ff81007809067d68626c5faef293434d11bd6/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70", size = 36047312 }, - { url = "https://files.pythonhosted.org/packages/7c/2b/29d6e3782dc1f299727462c1543af357a0f2c1d3c160ce199950d9ca51eb/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754", size = 45081609 }, - { url = "https://files.pythonhosted.org/packages/8d/42/aa9355ecc05997915af1b7b947a7f66c02dcaa927f3203b87871c114ba10/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91", size = 47703663 }, - { url = "https://files.pythonhosted.org/packages/ee/62/45abedde480168e83a1de005b7b7043fd553321c1e8c5a9a114425f64842/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c", size = 48066543 }, - { url = "https://files.pythonhosted.org/packages/84/e9/7878940a5b072e4f3bf998770acafeae13b267f9893af5f6d4ab3904b67e/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80", size = 50288838 }, - { url = "https://files.pythonhosted.org/packages/7b/03/f335d6c52b4a4761bcc83499789a1e2e16d9d201a58c327a9b5cc9a41bd9/pyarrow-22.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae", size = 29185594 }, -] - -[[package]] -name = "pydantic" -version = "2.12.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580 }, -] - -[[package]] -name = "pydantic-core" -version = "2.41.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298 }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475 }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815 }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567 }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442 }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956 }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253 }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050 }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178 }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833 }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156 }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378 }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622 }, - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873 }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826 }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869 }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890 }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740 }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021 }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378 }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761 }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303 }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355 }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875 }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549 }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305 }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902 }, - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990 }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003 }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200 }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578 }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504 }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816 }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366 }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698 }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603 }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591 }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068 }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908 }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145 }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179 }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403 }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206 }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307 }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258 }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917 }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186 }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164 }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146 }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788 }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133 }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852 }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679 }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766 }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005 }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622 }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725 }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040 }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691 }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897 }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302 }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877 }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680 }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960 }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102 }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039 }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126 }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489 }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288 }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255 }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760 }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092 }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385 }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832 }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585 }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078 }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914 }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560 }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244 }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955 }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906 }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607 }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769 }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441 }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291 }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632 }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905 }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495 }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388 }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879 }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017 }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351 }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363 }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615 }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369 }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218 }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951 }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428 }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009 }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980 }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865 }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256 }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762 }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141 }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317 }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992 }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302 }, -] - -[[package]] -name = "pygments" -version = "2.19.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, -] - -[[package]] -name = "pynndescent" -version = "0.5.13" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "llvmlite" }, - { name = "numba" }, - { name = "scikit-learn" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7e/58/560a4db5eb3794d922fe55804b10326534ded3d971e1933c1eef91193f5e/pynndescent-0.5.13.tar.gz", hash = "sha256:d74254c0ee0a1eeec84597d5fe89fedcf778593eeabe32c2f97412934a9800fb", size = 2975955 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/53/d23a97e0a2c690d40b165d1062e2c4ccc796be458a1ce59f6ba030434663/pynndescent-0.5.13-py3-none-any.whl", hash = "sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949", size = 56850 }, -] - -[[package]] -name = "pyreadline3" -version = "3.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178 }, -] - -[[package]] -name = "pytest" -version = "9.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad", size = 373668 }, -] - -[[package]] -name = "pytest-asyncio" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" }, - { name = "pytest" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075 }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, -] - -[[package]] -name = "python-dotenv" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230 }, -] - -[[package]] -name = "pytz" -version = "2025.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227 }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019 }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646 }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793 }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293 }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872 }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828 }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415 }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561 }, - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826 }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577 }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556 }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114 }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638 }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463 }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986 }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543 }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763 }, - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063 }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973 }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116 }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011 }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870 }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089 }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181 }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658 }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003 }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344 }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669 }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252 }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081 }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159 }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626 }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613 }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115 }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427 }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090 }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246 }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814 }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809 }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454 }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355 }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175 }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228 }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194 }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429 }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912 }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108 }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641 }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901 }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132 }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261 }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272 }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062 }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341 }, -] - -[[package]] -name = "requests" -version = "2.32.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 }, -] - -[[package]] -name = "ruff" -version = "0.14.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/d9/f7a0c4b3a2bf2556cd5d99b05372c29980249ef71e8e32669ba77428c82c/ruff-0.14.8.tar.gz", hash = "sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed", size = 5765385 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/b8/9537b52010134b1d2b72870cc3f92d5fb759394094741b09ceccae183fbe/ruff-0.14.8-py3-none-linux_armv6l.whl", hash = "sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb", size = 13441540 }, - { url = "https://files.pythonhosted.org/packages/24/00/99031684efb025829713682012b6dd37279b1f695ed1b01725f85fd94b38/ruff-0.14.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9", size = 13669384 }, - { url = "https://files.pythonhosted.org/packages/72/64/3eb5949169fc19c50c04f28ece2c189d3b6edd57e5b533649dae6ca484fe/ruff-0.14.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f", size = 12806917 }, - { url = "https://files.pythonhosted.org/packages/c4/08/5250babb0b1b11910f470370ec0cbc67470231f7cdc033cee57d4976f941/ruff-0.14.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b", size = 13256112 }, - { url = "https://files.pythonhosted.org/packages/78/4c/6c588e97a8e8c2d4b522c31a579e1df2b4d003eddfbe23d1f262b1a431ff/ruff-0.14.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52", size = 13227559 }, - { url = "https://files.pythonhosted.org/packages/23/ce/5f78cea13eda8eceac71b5f6fa6e9223df9b87bb2c1891c166d1f0dce9f1/ruff-0.14.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c", size = 13896379 }, - { url = "https://files.pythonhosted.org/packages/cf/79/13de4517c4dadce9218a20035b21212a4c180e009507731f0d3b3f5df85a/ruff-0.14.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344", size = 15372786 }, - { url = "https://files.pythonhosted.org/packages/00/06/33df72b3bb42be8a1c3815fd4fae83fa2945fc725a25d87ba3e42d1cc108/ruff-0.14.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b", size = 14990029 }, - { url = "https://files.pythonhosted.org/packages/64/61/0f34927bd90925880394de0e081ce1afab66d7b3525336f5771dcf0cb46c/ruff-0.14.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a", size = 14407037 }, - { url = "https://files.pythonhosted.org/packages/96/bc/058fe0aefc0fbf0d19614cb6d1a3e2c048f7dc77ca64957f33b12cfdc5ef/ruff-0.14.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2", size = 14102390 }, - { url = "https://files.pythonhosted.org/packages/af/a4/e4f77b02b804546f4c17e8b37a524c27012dd6ff05855d2243b49a7d3cb9/ruff-0.14.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a", size = 14230793 }, - { url = "https://files.pythonhosted.org/packages/3f/52/bb8c02373f79552e8d087cedaffad76b8892033d2876c2498a2582f09dcf/ruff-0.14.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b", size = 13160039 }, - { url = "https://files.pythonhosted.org/packages/1f/ad/b69d6962e477842e25c0b11622548df746290cc6d76f9e0f4ed7456c2c31/ruff-0.14.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf", size = 13205158 }, - { url = "https://files.pythonhosted.org/packages/06/63/54f23da1315c0b3dfc1bc03fbc34e10378918a20c0b0f086418734e57e74/ruff-0.14.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6", size = 13469550 }, - { url = "https://files.pythonhosted.org/packages/70/7d/a4d7b1961e4903bc37fffb7ddcfaa7beb250f67d97cfd1ee1d5cddb1ec90/ruff-0.14.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e", size = 14211332 }, - { url = "https://files.pythonhosted.org/packages/5d/93/2a5063341fa17054e5c86582136e9895db773e3c2ffb770dde50a09f35f0/ruff-0.14.8-py3-none-win32.whl", hash = "sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7", size = 13151890 }, - { url = "https://files.pythonhosted.org/packages/02/1c/65c61a0859c0add13a3e1cbb6024b42de587456a43006ca2d4fd3d1618fe/ruff-0.14.8-py3-none-win_amd64.whl", hash = "sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097", size = 14537826 }, - { url = "https://files.pythonhosted.org/packages/6d/63/8b41cea3afd7f58eb64ac9251668ee0073789a3bc9ac6f816c8c6fef986d/ruff-0.14.8-py3-none-win_arm64.whl", hash = "sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99", size = 13634522 }, -] - -[[package]] -name = "scikit-learn" -version = "1.7.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "threadpoolctl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/3e/daed796fd69cce768b8788401cc464ea90b306fb196ae1ffed0b98182859/scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f", size = 9336221 }, - { url = "https://files.pythonhosted.org/packages/1c/ce/af9d99533b24c55ff4e18d9b7b4d9919bbc6cd8f22fe7a7be01519a347d5/scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c", size = 8653834 }, - { url = "https://files.pythonhosted.org/packages/58/0e/8c2a03d518fb6bd0b6b0d4b114c63d5f1db01ff0f9925d8eb10960d01c01/scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8", size = 9660938 }, - { url = "https://files.pythonhosted.org/packages/2b/75/4311605069b5d220e7cf5adabb38535bd96f0079313cdbb04b291479b22a/scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18", size = 9477818 }, - { url = "https://files.pythonhosted.org/packages/7f/9b/87961813c34adbca21a6b3f6b2bea344c43b30217a6d24cc437c6147f3e8/scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5", size = 8886969 }, - { url = "https://files.pythonhosted.org/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", size = 9331967 }, - { url = "https://files.pythonhosted.org/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", size = 8648645 }, - { url = "https://files.pythonhosted.org/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", size = 9715424 }, - { url = "https://files.pythonhosted.org/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", size = 9509234 }, - { url = "https://files.pythonhosted.org/packages/9f/71/34ddbd21f1da67c7a768146968b4d0220ee6831e4bcbad3e03dd3eae88b6/scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1", size = 8894244 }, - { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818 }, - { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997 }, - { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381 }, - { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296 }, - { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256 }, - { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382 }, - { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042 }, - { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180 }, - { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660 }, - { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057 }, - { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731 }, - { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852 }, - { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094 }, - { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436 }, - { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749 }, - { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906 }, - { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836 }, - { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236 }, - { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593 }, - { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007 }, -] - -[[package]] -name = "scipy" -version = "1.15.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511 }, - { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151 }, - { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732 }, - { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617 }, - { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964 }, - { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749 }, - { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383 }, - { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201 }, - { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255 }, - { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035 }, - { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499 }, - { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602 }, - { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415 }, - { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622 }, - { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796 }, - { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684 }, - { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504 }, - { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735 }, - { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284 }, - { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958 }, - { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454 }, - { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199 }, - { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455 }, - { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140 }, - { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549 }, - { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184 }, - { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256 }, - { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540 }, - { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115 }, - { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884 }, - { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018 }, - { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716 }, - { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342 }, - { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869 }, - { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851 }, - { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011 }, - { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407 }, - { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030 }, - { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709 }, - { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045 }, - { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062 }, - { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132 }, - { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503 }, - { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097 }, -] - -[[package]] -name = "scipy" -version = "1.16.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*'", - "python_full_version >= '3.12'", -] -dependencies = [ - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881 }, - { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012 }, - { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935 }, - { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466 }, - { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618 }, - { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798 }, - { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154 }, - { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540 }, - { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107 }, - { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272 }, - { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043 }, - { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986 }, - { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814 }, - { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795 }, - { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476 }, - { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692 }, - { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345 }, - { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975 }, - { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926 }, - { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014 }, - { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856 }, - { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306 }, - { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371 }, - { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877 }, - { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103 }, - { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297 }, - { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756 }, - { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566 }, - { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877 }, - { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366 }, - { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931 }, - { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081 }, - { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244 }, - { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753 }, - { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912 }, - { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371 }, - { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477 }, - { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678 }, - { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178 }, - { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246 }, - { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469 }, - { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043 }, - { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952 }, - { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512 }, - { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639 }, - { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729 }, - { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251 }, - { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681 }, - { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423 }, - { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027 }, - { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379 }, - { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052 }, - { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183 }, - { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174 }, - { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852 }, - { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595 }, - { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269 }, - { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779 }, - { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128 }, - { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127 }, -] - -[[package]] -name = "setuptools" -version = "80.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, -] - -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "starlette" -version = "0.50.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033 }, -] - -[[package]] -name = "sympy" -version = "1.14.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mpmath" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353 }, -] - -[[package]] -name = "threadpoolctl" -version = "3.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638 }, -] - -[[package]] -name = "tomli" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236 }, - { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084 }, - { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832 }, - { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052 }, - { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555 }, - { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128 }, - { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445 }, - { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165 }, - { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891 }, - { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796 }, - { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121 }, - { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070 }, - { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859 }, - { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296 }, - { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124 }, - { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698 }, - { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819 }, - { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766 }, - { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771 }, - { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586 }, - { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792 }, - { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909 }, - { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946 }, - { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705 }, - { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244 }, - { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637 }, - { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925 }, - { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045 }, - { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835 }, - { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109 }, - { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930 }, - { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964 }, - { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065 }, - { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088 }, - { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193 }, - { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488 }, - { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669 }, - { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709 }, - { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563 }, - { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756 }, - { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408 }, -] - -[[package]] -name = "torch" -version = "2.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "jinja2" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvshmem-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "setuptools", marker = "python_full_version >= '3.12'" }, - { name = "sympy" }, - { name = "triton", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "typing-extensions" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/56/9577683b23072075ed2e40d725c52c2019d71a972fab8e083763da8e707e/torch-2.9.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:1cc208435f6c379f9b8fdfd5ceb5be1e3b72a6bdf1cb46c0d2812aa73472db9e", size = 104207681 }, - { url = "https://files.pythonhosted.org/packages/38/45/be5a74f221df8f4b609b78ff79dc789b0cc9017624544ac4dd1c03973150/torch-2.9.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:9fd35c68b3679378c11f5eb73220fdcb4e6f4592295277fbb657d31fd053237c", size = 899794036 }, - { url = "https://files.pythonhosted.org/packages/67/95/a581e8a382596b69385a44bab2733f1273d45c842f5d4a504c0edc3133b6/torch-2.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:2af70e3be4a13becba4655d6cc07dcfec7ae844db6ac38d6c1dafeb245d17d65", size = 110969861 }, - { url = "https://files.pythonhosted.org/packages/ad/51/1756dc128d2bf6ea4e0a915cb89ea5e730315ff33d60c1ff56fd626ba3eb/torch-2.9.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:a83b0e84cc375e3318a808d032510dde99d696a85fe9473fc8575612b63ae951", size = 74452222 }, - { url = "https://files.pythonhosted.org/packages/15/db/c064112ac0089af3d2f7a2b5bfbabf4aa407a78b74f87889e524b91c5402/torch-2.9.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:62b3fd888277946918cba4478cf849303da5359f0fb4e3bfb86b0533ba2eaf8d", size = 104220430 }, - { url = "https://files.pythonhosted.org/packages/56/be/76eaa36c9cd032d3b01b001e2c5a05943df75f26211f68fae79e62f87734/torch-2.9.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d033ff0ac3f5400df862a51bdde9bad83561f3739ea0046e68f5401ebfa67c1b", size = 899821446 }, - { url = "https://files.pythonhosted.org/packages/47/cc/7a2949e38dfe3244c4df21f0e1c27bce8aedd6c604a587dd44fc21017cb4/torch-2.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:0d06b30a9207b7c3516a9e0102114024755a07045f0c1d2f2a56b1819ac06bcb", size = 110973074 }, - { url = "https://files.pythonhosted.org/packages/1e/ce/7d251155a783fb2c1bb6837b2b7023c622a2070a0a72726ca1df47e7ea34/torch-2.9.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:52347912d868653e1528b47cafaf79b285b98be3f4f35d5955389b1b95224475", size = 74463887 }, - { url = "https://files.pythonhosted.org/packages/0f/27/07c645c7673e73e53ded71705045d6cb5bae94c4b021b03aa8d03eee90ab/torch-2.9.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:da5f6f4d7f4940a173e5572791af238cb0b9e21b1aab592bd8b26da4c99f1cd6", size = 104126592 }, - { url = "https://files.pythonhosted.org/packages/19/17/e377a460603132b00760511299fceba4102bd95db1a0ee788da21298ccff/torch-2.9.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:27331cd902fb4322252657f3902adf1c4f6acad9dcad81d8df3ae14c7c4f07c4", size = 899742281 }, - { url = "https://files.pythonhosted.org/packages/b1/1a/64f5769025db846a82567fa5b7d21dba4558a7234ee631712ee4771c436c/torch-2.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:81a285002d7b8cfd3fdf1b98aa8df138d41f1a8334fd9ea37511517cedf43083", size = 110940568 }, - { url = "https://files.pythonhosted.org/packages/6e/ab/07739fd776618e5882661d04c43f5b5586323e2f6a2d7d84aac20d8f20bd/torch-2.9.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:c0d25d1d8e531b8343bea0ed811d5d528958f1dcbd37e7245bc686273177ad7e", size = 74479191 }, - { url = "https://files.pythonhosted.org/packages/20/60/8fc5e828d050bddfab469b3fe78e5ab9a7e53dda9c3bdc6a43d17ce99e63/torch-2.9.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c29455d2b910b98738131990394da3e50eea8291dfeb4b12de71ecf1fdeb21cb", size = 104135743 }, - { url = "https://files.pythonhosted.org/packages/f2/b7/6d3f80e6918213babddb2a37b46dbb14c15b14c5f473e347869a51f40e1f/torch-2.9.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:524de44cd13931208ba2c4bde9ec7741fd4ae6bfd06409a604fc32f6520c2bc9", size = 899749493 }, - { url = "https://files.pythonhosted.org/packages/a6/47/c7843d69d6de8938c1cbb1eba426b1d48ddf375f101473d3e31a5fc52b74/torch-2.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:545844cc16b3f91e08ce3b40e9c2d77012dd33a48d505aed34b7740ed627a1b2", size = 110944162 }, - { url = "https://files.pythonhosted.org/packages/28/0e/2a37247957e72c12151b33a01e4df651d9d155dd74d8cfcbfad15a79b44a/torch-2.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5be4bf7496f1e3ffb1dd44b672adb1ac3f081f204c5ca81eba6442f5f634df8e", size = 74830751 }, - { url = "https://files.pythonhosted.org/packages/4b/f7/7a18745edcd7b9ca2381aa03353647bca8aace91683c4975f19ac233809d/torch-2.9.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:30a3e170a84894f3652434b56d59a64a2c11366b0ed5776fab33c2439396bf9a", size = 104142929 }, - { url = "https://files.pythonhosted.org/packages/f4/dd/f1c0d879f2863ef209e18823a988dc7a1bf40470750e3ebe927efdb9407f/torch-2.9.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:8301a7b431e51764629208d0edaa4f9e4c33e6df0f2f90b90e261d623df6a4e2", size = 899748978 }, - { url = "https://files.pythonhosted.org/packages/1f/9f/6986b83a53b4d043e36f3f898b798ab51f7f20fdf1a9b01a2720f445043d/torch-2.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2e1c42c0ae92bf803a4b2409fdfed85e30f9027a66887f5e7dcdbc014c7531db", size = 111176995 }, - { url = "https://files.pythonhosted.org/packages/40/60/71c698b466dd01e65d0e9514b5405faae200c52a76901baf6906856f17e4/torch-2.9.1-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:2c14b3da5df416cf9cb5efab83aa3056f5b8cd8620b8fde81b4987ecab730587", size = 74480347 }, - { url = "https://files.pythonhosted.org/packages/48/50/c4b5112546d0d13cc9eaa1c732b823d676a9f49ae8b6f97772f795874a03/torch-2.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1edee27a7c9897f4e0b7c14cfc2f3008c571921134522d5b9b5ec4ebbc69041a", size = 74433245 }, - { url = "https://files.pythonhosted.org/packages/81/c9/2628f408f0518b3bae49c95f5af3728b6ab498c8624ab1e03a43dd53d650/torch-2.9.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:19d144d6b3e29921f1fc70503e9f2fc572cde6a5115c0c0de2f7ca8b1483e8b6", size = 104134804 }, - { url = "https://files.pythonhosted.org/packages/28/fc/5bc91d6d831ae41bf6e9e6da6468f25330522e92347c9156eb3f1cb95956/torch-2.9.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:c432d04376f6d9767a9852ea0def7b47a7bbc8e7af3b16ac9cf9ce02b12851c9", size = 899747132 }, - { url = "https://files.pythonhosted.org/packages/63/5d/e8d4e009e52b6b2cf1684bde2a6be157b96fb873732542fb2a9a99e85a83/torch-2.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:d187566a2cdc726fc80138c3cdb260970fab1c27e99f85452721f7759bbd554d", size = 110934845 }, - { url = "https://files.pythonhosted.org/packages/bd/b2/2d15a52516b2ea3f414643b8de68fa4cb220d3877ac8b1028c83dc8ca1c4/torch-2.9.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cb10896a1f7fedaddbccc2017ce6ca9ecaaf990f0973bdfcf405439750118d2c", size = 74823558 }, - { url = "https://files.pythonhosted.org/packages/86/5c/5b2e5d84f5b9850cd1e71af07524d8cbb74cba19379800f1f9f7c997fc70/torch-2.9.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0a2bd769944991c74acf0c4ef23603b9c777fdf7637f115605a4b2d8023110c7", size = 104145788 }, - { url = "https://files.pythonhosted.org/packages/a9/8c/3da60787bcf70add986c4ad485993026ac0ca74f2fc21410bc4eb1bb7695/torch-2.9.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:07c8a9660bc9414c39cac530ac83b1fb1b679d7155824144a40a54f4a47bfa73", size = 899735500 }, - { url = "https://files.pythonhosted.org/packages/db/2b/f7818f6ec88758dfd21da46b6cd46af9d1b3433e53ddbb19ad1e0da17f9b/torch-2.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c88d3299ddeb2b35dcc31753305612db485ab6f1823e37fb29451c8b2732b87e", size = 111163659 }, -] - -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, -] - -[[package]] -name = "triton" -version = "3.5.1" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/2e/f95e673222afa2c7f0c687d8913e98fcf2589ef0b1405de76894e37fe18f/triton-3.5.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f63e34dcb32d7bd3a1d0195f60f30d2aee8b08a69a0424189b71017e23dfc3d2", size = 159821655 }, - { url = "https://files.pythonhosted.org/packages/fd/6e/676ab5019b4dde8b9b7bab71245102fc02778ef3df48218b298686b9ffd6/triton-3.5.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fc53d849f879911ea13f4a877243afc513187bc7ee92d1f2c0f1ba3169e3c94", size = 170320692 }, - { url = "https://files.pythonhosted.org/packages/dc/dc/6ce44d055f2fc2403c4ec6b3cfd3a9b25f57b7d95efadccdea91497f8e81/triton-3.5.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da47169e30a779bade679ce78df4810fca6d78a955843d2ddb11f226adc517dc", size = 159928005 }, - { url = "https://files.pythonhosted.org/packages/b0/72/ec90c3519eaf168f22cb1757ad412f3a2add4782ad3a92861c9ad135d886/triton-3.5.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61413522a48add32302353fdbaaf92daaaab06f6b5e3229940d21b5207f47579", size = 170425802 }, - { url = "https://files.pythonhosted.org/packages/db/53/2bcc46879910991f09c063eea07627baef2bc62fe725302ba8f46a2c1ae5/triton-3.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:275a045b6ed670dd1bd005c3e6c2d61846c74c66f4512d6f33cc027b11de8fd4", size = 159940689 }, - { url = "https://files.pythonhosted.org/packages/f2/50/9a8358d3ef58162c0a415d173cfb45b67de60176e1024f71fbc4d24c0b6d/triton-3.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d2c6b915a03888ab931a9fd3e55ba36785e1fe70cbea0b40c6ef93b20fc85232", size = 170470207 }, - { url = "https://files.pythonhosted.org/packages/f1/ba/805684a992ee32d486b7948d36aed2f5e3c643fc63883bf8bdca1c3f3980/triton-3.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56765ffe12c554cd560698398b8a268db1f616c120007bfd8829d27139abd24a", size = 159955460 }, - { url = "https://files.pythonhosted.org/packages/27/46/8c3bbb5b0a19313f50edcaa363b599e5a1a5ac9683ead82b9b80fe497c8d/triton-3.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3f4346b6ebbd4fad18773f5ba839114f4826037c9f2f34e0148894cd5dd3dba", size = 170470410 }, - { url = "https://files.pythonhosted.org/packages/84/1e/7df59baef41931e21159371c481c31a517ff4c2517343b62503d0cd2be99/triton-3.5.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02c770856f5e407d24d28ddc66e33cf026e6f4d360dcb8b2fabe6ea1fc758621", size = 160072799 }, - { url = "https://files.pythonhosted.org/packages/37/92/e97fcc6b2c27cdb87ce5ee063d77f8f26f19f06916aa680464c8104ef0f6/triton-3.5.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0b4d2c70127fca6a23e247f9348b8adde979d2e7a20391bfbabaac6aebc7e6a8", size = 170579924 }, - { url = "https://files.pythonhosted.org/packages/14/f9/0430e879c1e63a1016cb843261528fd3187c872c3a9539132efc39514753/triton-3.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f617aa7925f9ea9968ec2e1adaf93e87864ff51549c8f04ce658f29bbdb71e2d", size = 159956163 }, - { url = "https://files.pythonhosted.org/packages/a4/e6/c595c35e5c50c4bc56a7bac96493dad321e9e29b953b526bbbe20f9911d0/triton-3.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0637b1efb1db599a8e9dc960d53ab6e4637db7d4ab6630a0974705d77b14b60", size = 170480488 }, - { url = "https://files.pythonhosted.org/packages/41/1e/63d367c576c75919e268e4fbc33c1cb33b6dc12bb85e8bfe531c2a8bd5d3/triton-3.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8932391d7f93698dfe5bc9bead77c47a24f97329e9f20c10786bb230a9083f56", size = 160073620 }, - { url = "https://files.pythonhosted.org/packages/16/b5/b0d3d8b901b6a04ca38df5e24c27e53afb15b93624d7fd7d658c7cd9352a/triton-3.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bac7f7d959ad0f48c0e97d6643a1cc0fd5786fe61cb1f83b537c6b2d54776478", size = 170582192 }, -] - -[[package]] -name = "typer-slim" -version = "0.20.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8e/45/81b94a52caed434b94da65729c03ad0fb7665fab0f7db9ee54c94e541403/typer_slim-0.20.0.tar.gz", hash = "sha256:9fc6607b3c6c20f5c33ea9590cbeb17848667c51feee27d9e314a579ab07d1a3", size = 106561 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/dd/5cbf31f402f1cc0ab087c94d4669cfa55bd1e818688b910631e131d74e75/typer_slim-0.20.0-py3-none-any.whl", hash = "sha256:f42a9b7571a12b97dddf364745d29f12221865acef7a2680065f9bb29c7dc89d", size = 47087 }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, -] - -[[package]] -name = "typing-inspection" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 }, -] - -[[package]] -name = "tzdata" -version = "2025.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, -] - -[[package]] -name = "umap-learn" -version = "0.5.9.post2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numba" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "pynndescent" }, - { name = "scikit-learn" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5f/ee/6bc65bd375c812026a7af63fe9d09d409382120aff25f2152f1ba12af5ec/umap_learn-0.5.9.post2.tar.gz", hash = "sha256:bdf60462d779bd074ce177a0714ced17e6d161285590fa487f3f9548dd3c31c9", size = 95441 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/b1/c24deeda9baf1fd491aaad941ed89e0fed6c583a117fd7b79e0a33a1e6c0/umap_learn-0.5.9.post2-py3-none-any.whl", hash = "sha256:fbe51166561e0e7fab00ef3d516ac2621243b8d15cf4bef9f656d701736b16a0", size = 90146 }, -] - -[[package]] -name = "urllib3" -version = "2.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, -] - -[[package]] -name = "uvicorn" -version = "0.38.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/f06b84e2697fef4688ca63bdb2fdf113ca0a3be33f94488f2cadb690b0cf/uvicorn-0.38.0.tar.gz", hash = "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d", size = 80605 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/d9/d88e73ca598f4f6ff671fb5fde8a32925c2e08a637303a1d12883c7305fa/uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02", size = 68109 }, -] - -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.22.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/14/ecceb239b65adaaf7fde510aa8bd534075695d1e5f8dadfa32b5723d9cfb/uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c", size = 1343335 }, - { url = "https://files.pythonhosted.org/packages/ba/ae/6f6f9af7f590b319c94532b9567409ba11f4fa71af1148cab1bf48a07048/uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792", size = 742903 }, - { url = "https://files.pythonhosted.org/packages/09/bd/3667151ad0702282a1f4d5d29288fce8a13c8b6858bf0978c219cd52b231/uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86", size = 3648499 }, - { url = "https://files.pythonhosted.org/packages/b3/f6/21657bb3beb5f8c57ce8be3b83f653dd7933c2fd00545ed1b092d464799a/uvloop-0.22.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd", size = 3700133 }, - { url = "https://files.pythonhosted.org/packages/09/e0/604f61d004ded805f24974c87ddd8374ef675644f476f01f1df90e4cdf72/uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2", size = 3512681 }, - { url = "https://files.pythonhosted.org/packages/bb/ce/8491fd370b0230deb5eac69c7aae35b3be527e25a911c0acdffb922dc1cd/uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec", size = 3615261 }, - { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420 }, - { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677 }, - { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819 }, - { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529 }, - { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267 }, - { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105 }, - { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936 }, - { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769 }, - { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413 }, - { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307 }, - { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970 }, - { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343 }, - { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611 }, - { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811 }, - { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562 }, - { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890 }, - { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472 }, - { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051 }, - { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067 }, - { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423 }, - { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437 }, - { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101 }, - { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360 }, - { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790 }, - { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783 }, - { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548 }, - { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065 }, - { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384 }, - { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730 }, -] - -[[package]] -name = "watchfiles" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/1a/206e8cf2dd86fddf939165a57b4df61607a1e0add2785f170a3f616b7d9f/watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c", size = 407318 }, - { url = "https://files.pythonhosted.org/packages/b3/0f/abaf5262b9c496b5dad4ed3c0e799cbecb1f8ea512ecb6ddd46646a9fca3/watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43", size = 394478 }, - { url = "https://files.pythonhosted.org/packages/b1/04/9cc0ba88697b34b755371f5ace8d3a4d9a15719c07bdc7bd13d7d8c6a341/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31", size = 449894 }, - { url = "https://files.pythonhosted.org/packages/d2/9c/eda4615863cd8621e89aed4df680d8c3ec3da6a4cf1da113c17decd87c7f/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac", size = 459065 }, - { url = "https://files.pythonhosted.org/packages/84/13/f28b3f340157d03cbc8197629bc109d1098764abe1e60874622a0be5c112/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d", size = 488377 }, - { url = "https://files.pythonhosted.org/packages/86/93/cfa597fa9389e122488f7ffdbd6db505b3b915ca7435ecd7542e855898c2/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d", size = 595837 }, - { url = "https://files.pythonhosted.org/packages/57/1e/68c1ed5652b48d89fc24d6af905d88ee4f82fa8bc491e2666004e307ded1/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863", size = 473456 }, - { url = "https://files.pythonhosted.org/packages/d5/dc/1a680b7458ffa3b14bb64878112aefc8f2e4f73c5af763cbf0bd43100658/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab", size = 455614 }, - { url = "https://files.pythonhosted.org/packages/61/a5/3d782a666512e01eaa6541a72ebac1d3aae191ff4a31274a66b8dd85760c/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82", size = 630690 }, - { url = "https://files.pythonhosted.org/packages/9b/73/bb5f38590e34687b2a9c47a244aa4dd50c56a825969c92c9c5fc7387cea1/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4", size = 622459 }, - { url = "https://files.pythonhosted.org/packages/f1/ac/c9bb0ec696e07a20bd58af5399aeadaef195fb2c73d26baf55180fe4a942/watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844", size = 272663 }, - { url = "https://files.pythonhosted.org/packages/11/a0/a60c5a7c2ec59fa062d9a9c61d02e3b6abd94d32aac2d8344c4bdd033326/watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e", size = 287453 }, - { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529 }, - { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384 }, - { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789 }, - { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521 }, - { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722 }, - { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088 }, - { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923 }, - { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080 }, - { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432 }, - { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046 }, - { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473 }, - { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598 }, - { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210 }, - { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745 }, - { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769 }, - { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374 }, - { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485 }, - { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813 }, - { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816 }, - { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186 }, - { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812 }, - { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196 }, - { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657 }, - { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042 }, - { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410 }, - { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209 }, - { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321 }, - { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783 }, - { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279 }, - { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405 }, - { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976 }, - { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506 }, - { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936 }, - { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147 }, - { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007 }, - { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280 }, - { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056 }, - { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162 }, - { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909 }, - { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389 }, - { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964 }, - { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114 }, - { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264 }, - { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877 }, - { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176 }, - { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577 }, - { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425 }, - { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826 }, - { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208 }, - { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315 }, - { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869 }, - { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919 }, - { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845 }, - { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027 }, - { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615 }, - { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836 }, - { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099 }, - { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626 }, - { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519 }, - { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078 }, - { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664 }, - { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154 }, - { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820 }, - { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510 }, - { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408 }, - { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968 }, - { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096 }, - { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040 }, - { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847 }, - { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072 }, - { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104 }, - { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112 }, - { url = "https://files.pythonhosted.org/packages/ba/4c/a888c91e2e326872fa4705095d64acd8aa2fb9c1f7b9bd0588f33850516c/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3", size = 409611 }, - { url = "https://files.pythonhosted.org/packages/1e/c7/5420d1943c8e3ce1a21c0a9330bcf7edafb6aa65d26b21dbb3267c9e8112/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2", size = 396889 }, - { url = "https://files.pythonhosted.org/packages/0c/e5/0072cef3804ce8d3aaddbfe7788aadff6b3d3f98a286fdbee9fd74ca59a7/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d", size = 451616 }, - { url = "https://files.pythonhosted.org/packages/83/4e/b87b71cbdfad81ad7e83358b3e447fedd281b880a03d64a760fe0a11fc2e/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b", size = 458413 }, - { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250 }, - { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117 }, - { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493 }, - { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546 }, -] - -[[package]] -name = "websockets" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/da/6462a9f510c0c49837bbc9345aca92d767a56c1fb2939e1579df1e1cdcf7/websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", size = 175423 }, - { url = "https://files.pythonhosted.org/packages/1c/9f/9d11c1a4eb046a9e106483b9ff69bce7ac880443f00e5ce64261b47b07e7/websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", size = 173080 }, - { url = "https://files.pythonhosted.org/packages/d5/4f/b462242432d93ea45f297b6179c7333dd0402b855a912a04e7fc61c0d71f/websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", size = 173329 }, - { url = "https://files.pythonhosted.org/packages/6e/0c/6afa1f4644d7ed50284ac59cc70ef8abd44ccf7d45850d989ea7310538d0/websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", size = 182312 }, - { url = "https://files.pythonhosted.org/packages/dd/d4/ffc8bd1350b229ca7a4db2a3e1c482cf87cea1baccd0ef3e72bc720caeec/websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", size = 181319 }, - { url = "https://files.pythonhosted.org/packages/97/3a/5323a6bb94917af13bbb34009fac01e55c51dfde354f63692bf2533ffbc2/websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", size = 181631 }, - { url = "https://files.pythonhosted.org/packages/a6/cc/1aeb0f7cee59ef065724041bb7ed667b6ab1eeffe5141696cccec2687b66/websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", size = 182016 }, - { url = "https://files.pythonhosted.org/packages/79/f9/c86f8f7af208e4161a7f7e02774e9d0a81c632ae76db2ff22549e1718a51/websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", size = 181426 }, - { url = "https://files.pythonhosted.org/packages/c7/b9/828b0bc6753db905b91df6ae477c0b14a141090df64fb17f8a9d7e3516cf/websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", size = 181360 }, - { url = "https://files.pythonhosted.org/packages/89/fb/250f5533ec468ba6327055b7d98b9df056fb1ce623b8b6aaafb30b55d02e/websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", size = 176388 }, - { url = "https://files.pythonhosted.org/packages/1c/46/aca7082012768bb98e5608f01658ff3ac8437e563eca41cf068bd5849a5e/websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", size = 176830 }, - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423 }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082 }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330 }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878 }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883 }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252 }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521 }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958 }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918 }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388 }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828 }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, - { url = "https://files.pythonhosted.org/packages/02/9e/d40f779fa16f74d3468357197af8d6ad07e7c5a27ea1ca74ceb38986f77a/websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", size = 173109 }, - { url = "https://files.pythonhosted.org/packages/bc/cd/5b887b8585a593073fd92f7c23ecd3985cd2c3175025a91b0d69b0551372/websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", size = 173343 }, - { url = "https://files.pythonhosted.org/packages/fe/ae/d34f7556890341e900a95acf4886833646306269f899d58ad62f588bf410/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", size = 174599 }, - { url = "https://files.pythonhosted.org/packages/71/e6/5fd43993a87db364ec60fc1d608273a1a465c0caba69176dd160e197ce42/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", size = 174207 }, - { url = "https://files.pythonhosted.org/packages/2b/fb/c492d6daa5ec067c2988ac80c61359ace5c4c674c532985ac5a123436cec/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", size = 174155 }, - { url = "https://files.pythonhosted.org/packages/68/a1/dcb68430b1d00b698ae7a7e0194433bce4f07ded185f0ee5fb21e2a2e91e/websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", size = 176884 }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, -] - -[[package]] -name = "xxhash" -version = "3.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/ee/f9f1d656ad168681bb0f6b092372c1e533c4416b8069b1896a175c46e484/xxhash-3.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87ff03d7e35c61435976554477a7f4cd1704c3596a89a8300d5ce7fc83874a71", size = 32845 }, - { url = "https://files.pythonhosted.org/packages/a3/b1/93508d9460b292c74a09b83d16750c52a0ead89c51eea9951cb97a60d959/xxhash-3.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f572dfd3d0e2eb1a57511831cf6341242f5a9f8298a45862d085f5b93394a27d", size = 30807 }, - { url = "https://files.pythonhosted.org/packages/07/55/28c93a3662f2d200c70704efe74aab9640e824f8ce330d8d3943bf7c9b3c/xxhash-3.6.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:89952ea539566b9fed2bbd94e589672794b4286f342254fad28b149f9615fef8", size = 193786 }, - { url = "https://files.pythonhosted.org/packages/c1/96/fec0be9bb4b8f5d9c57d76380a366f31a1781fb802f76fc7cda6c84893c7/xxhash-3.6.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e6f2ffb07a50b52465a1032c3cf1f4a5683f944acaca8a134a2f23674c2058", size = 212830 }, - { url = "https://files.pythonhosted.org/packages/c4/a0/c706845ba77b9611f81fd2e93fad9859346b026e8445e76f8c6fd057cc6d/xxhash-3.6.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b5b848ad6c16d308c3ac7ad4ba6bede80ed5df2ba8ed382f8932df63158dd4b2", size = 211606 }, - { url = "https://files.pythonhosted.org/packages/67/1e/164126a2999e5045f04a69257eea946c0dc3e86541b400d4385d646b53d7/xxhash-3.6.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a034590a727b44dd8ac5914236a7b8504144447a9682586c3327e935f33ec8cc", size = 444872 }, - { url = "https://files.pythonhosted.org/packages/2d/4b/55ab404c56cd70a2cf5ecfe484838865d0fea5627365c6c8ca156bd09c8f/xxhash-3.6.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a8f1972e75ebdd161d7896743122834fe87378160c20e97f8b09166213bf8cc", size = 193217 }, - { url = "https://files.pythonhosted.org/packages/45/e6/52abf06bac316db33aa269091ae7311bd53cfc6f4b120ae77bac1b348091/xxhash-3.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ee34327b187f002a596d7b167ebc59a1b729e963ce645964bbc050d2f1b73d07", size = 210139 }, - { url = "https://files.pythonhosted.org/packages/34/37/db94d490b8691236d356bc249c08819cbcef9273a1a30acf1254ff9ce157/xxhash-3.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:339f518c3c7a850dd033ab416ea25a692759dc7478a71131fe8869010d2b75e4", size = 197669 }, - { url = "https://files.pythonhosted.org/packages/b7/36/c4f219ef4a17a4f7a64ed3569bc2b5a9c8311abdb22249ac96093625b1a4/xxhash-3.6.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:bf48889c9630542d4709192578aebbd836177c9f7a4a2778a7d6340107c65f06", size = 210018 }, - { url = "https://files.pythonhosted.org/packages/fd/06/bfac889a374fc2fc439a69223d1750eed2e18a7db8514737ab630534fa08/xxhash-3.6.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5576b002a56207f640636056b4160a378fe36a58db73ae5c27a7ec8db35f71d4", size = 413058 }, - { url = "https://files.pythonhosted.org/packages/c9/d1/555d8447e0dd32ad0930a249a522bb2e289f0d08b6b16204cfa42c1f5a0c/xxhash-3.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af1f3278bd02814d6dedc5dec397993b549d6f16c19379721e5a1d31e132c49b", size = 190628 }, - { url = "https://files.pythonhosted.org/packages/d1/15/8751330b5186cedc4ed4b597989882ea05e0408b53fa47bcb46a6125bfc6/xxhash-3.6.0-cp310-cp310-win32.whl", hash = "sha256:aed058764db109dc9052720da65fafe84873b05eb8b07e5e653597951af57c3b", size = 30577 }, - { url = "https://files.pythonhosted.org/packages/bb/cc/53f87e8b5871a6eb2ff7e89c48c66093bda2be52315a8161ddc54ea550c4/xxhash-3.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:e82da5670f2d0d98950317f82a0e4a0197150ff19a6df2ba40399c2a3b9ae5fb", size = 31487 }, - { url = "https://files.pythonhosted.org/packages/9f/00/60f9ea3bb697667a14314d7269956f58bf56bb73864f8f8d52a3c2535e9a/xxhash-3.6.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a082ffff8c6ac07707fb6b671caf7c6e020c75226c561830b73d862060f281d", size = 27863 }, - { url = "https://files.pythonhosted.org/packages/17/d4/cc2f0400e9154df4b9964249da78ebd72f318e35ccc425e9f403c392f22a/xxhash-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b47bbd8cf2d72797f3c2772eaaac0ded3d3af26481a26d7d7d41dc2d3c46b04a", size = 32844 }, - { url = "https://files.pythonhosted.org/packages/5e/ec/1cc11cd13e26ea8bc3cb4af4eaadd8d46d5014aebb67be3f71fb0b68802a/xxhash-3.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa", size = 30809 }, - { url = "https://files.pythonhosted.org/packages/04/5f/19fe357ea348d98ca22f456f75a30ac0916b51c753e1f8b2e0e6fb884cce/xxhash-3.6.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d0a9751f71a1a65ce3584e9cae4467651c7e70c9d31017fa57574583a4540248", size = 194665 }, - { url = "https://files.pythonhosted.org/packages/90/3b/d1f1a8f5442a5fd8beedae110c5af7604dc37349a8e16519c13c19a9a2de/xxhash-3.6.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62", size = 213550 }, - { url = "https://files.pythonhosted.org/packages/c4/ef/3a9b05eb527457d5db13a135a2ae1a26c80fecd624d20f3e8dcc4cb170f3/xxhash-3.6.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6812c25fe0d6c36a46ccb002f40f27ac903bf18af9f6dd8f9669cb4d176ab18f", size = 212384 }, - { url = "https://files.pythonhosted.org/packages/0f/18/ccc194ee698c6c623acbf0f8c2969811a8a4b6185af5e824cd27b9e4fd3e/xxhash-3.6.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4ccbff013972390b51a18ef1255ef5ac125c92dc9143b2d1909f59abc765540e", size = 445749 }, - { url = "https://files.pythonhosted.org/packages/a5/86/cf2c0321dc3940a7aa73076f4fd677a0fb3e405cb297ead7d864fd90847e/xxhash-3.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8", size = 193880 }, - { url = "https://files.pythonhosted.org/packages/82/fb/96213c8560e6f948a1ecc9a7613f8032b19ee45f747f4fca4eb31bb6d6ed/xxhash-3.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0", size = 210912 }, - { url = "https://files.pythonhosted.org/packages/40/aa/4395e669b0606a096d6788f40dbdf2b819d6773aa290c19e6e83cbfc312f/xxhash-3.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7a0b169aafb98f4284f73635a8e93f0735f9cbde17bd5ec332480484241aaa77", size = 198654 }, - { url = "https://files.pythonhosted.org/packages/67/74/b044fcd6b3d89e9b1b665924d85d3f400636c23590226feb1eb09e1176ce/xxhash-3.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:08d45aef063a4531b785cd72de4887766d01dc8f362a515693df349fdb825e0c", size = 210867 }, - { url = "https://files.pythonhosted.org/packages/bc/fd/3ce73bf753b08cb19daee1eb14aa0d7fe331f8da9c02dd95316ddfe5275e/xxhash-3.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:929142361a48ee07f09121fe9e96a84950e8d4df3bb298ca5d88061969f34d7b", size = 414012 }, - { url = "https://files.pythonhosted.org/packages/ba/b3/5a4241309217c5c876f156b10778f3ab3af7ba7e3259e6d5f5c7d0129eb2/xxhash-3.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3", size = 191409 }, - { url = "https://files.pythonhosted.org/packages/c0/01/99bfbc15fb9abb9a72b088c1d95219fc4782b7d01fc835bd5744d66dd0b8/xxhash-3.6.0-cp311-cp311-win32.whl", hash = "sha256:d1927a69feddc24c987b337ce81ac15c4720955b667fe9b588e02254b80446fd", size = 30574 }, - { url = "https://files.pythonhosted.org/packages/65/79/9d24d7f53819fe301b231044ea362ce64e86c74f6e8c8e51320de248b3e5/xxhash-3.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:26734cdc2d4ffe449b41d186bbeac416f704a482ed835d375a5c0cb02bc63fef", size = 31481 }, - { url = "https://files.pythonhosted.org/packages/30/4e/15cd0e3e8772071344eab2961ce83f6e485111fed8beb491a3f1ce100270/xxhash-3.6.0-cp311-cp311-win_arm64.whl", hash = "sha256:d72f67ef8bf36e05f5b6c65e8524f265bd61071471cd4cf1d36743ebeeeb06b7", size = 27861 }, - { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744 }, - { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816 }, - { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035 }, - { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914 }, - { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163 }, - { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411 }, - { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883 }, - { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392 }, - { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898 }, - { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655 }, - { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001 }, - { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431 }, - { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617 }, - { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534 }, - { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876 }, - { url = "https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec", size = 32738 }, - { url = "https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1", size = 30821 }, - { url = "https://files.pythonhosted.org/packages/0c/ea/d387530ca7ecfa183cb358027f1833297c6ac6098223fd14f9782cd0015c/xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6", size = 194127 }, - { url = "https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263", size = 212975 }, - { url = "https://files.pythonhosted.org/packages/84/7a/c2b3d071e4bb4a90b7057228a99b10d51744878f4a8a6dd643c8bd897620/xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546", size = 212241 }, - { url = "https://files.pythonhosted.org/packages/81/5f/640b6eac0128e215f177df99eadcd0f1b7c42c274ab6a394a05059694c5a/xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89", size = 445471 }, - { url = "https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d", size = 193936 }, - { url = "https://files.pythonhosted.org/packages/2c/bd/4a5f68381939219abfe1c22a9e3a5854a4f6f6f3c4983a87d255f21f2e5d/xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7", size = 210440 }, - { url = "https://files.pythonhosted.org/packages/eb/37/b80fe3d5cfb9faff01a02121a0f4d565eb7237e9e5fc66e73017e74dcd36/xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db", size = 197990 }, - { url = "https://files.pythonhosted.org/packages/d7/fd/2c0a00c97b9e18f72e1f240ad4e8f8a90fd9d408289ba9c7c495ed7dc05c/xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42", size = 210689 }, - { url = "https://files.pythonhosted.org/packages/93/86/5dd8076a926b9a95db3206aba20d89a7fc14dd5aac16e5c4de4b56033140/xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11", size = 414068 }, - { url = "https://files.pythonhosted.org/packages/af/3c/0bb129170ee8f3650f08e993baee550a09593462a5cddd8e44d0011102b1/xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd", size = 191495 }, - { url = "https://files.pythonhosted.org/packages/e9/3a/6797e0114c21d1725e2577508e24006fd7ff1d8c0c502d3b52e45c1771d8/xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799", size = 30620 }, - { url = "https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392", size = 31542 }, - { url = "https://files.pythonhosted.org/packages/39/c5/cc01e4f6188656e56112d6a8e0dfe298a16934b8c47a247236549a3f7695/xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6", size = 27880 }, - { url = "https://files.pythonhosted.org/packages/f3/30/25e5321c8732759e930c555176d37e24ab84365482d257c3b16362235212/xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702", size = 32956 }, - { url = "https://files.pythonhosted.org/packages/9f/3c/0573299560d7d9f8ab1838f1efc021a280b5ae5ae2e849034ef3dee18810/xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db", size = 31072 }, - { url = "https://files.pythonhosted.org/packages/7a/1c/52d83a06e417cd9d4137722693424885cc9878249beb3a7c829e74bf7ce9/xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54", size = 196409 }, - { url = "https://files.pythonhosted.org/packages/e3/8e/c6d158d12a79bbd0b878f8355432075fc82759e356ab5a111463422a239b/xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f", size = 215736 }, - { url = "https://files.pythonhosted.org/packages/bc/68/c4c80614716345d55071a396cf03d06e34b5f4917a467faf43083c995155/xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5", size = 214833 }, - { url = "https://files.pythonhosted.org/packages/7e/e9/ae27c8ffec8b953efa84c7c4a6c6802c263d587b9fc0d6e7cea64e08c3af/xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1", size = 448348 }, - { url = "https://files.pythonhosted.org/packages/d7/6b/33e21afb1b5b3f46b74b6bd1913639066af218d704cc0941404ca717fc57/xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee", size = 196070 }, - { url = "https://files.pythonhosted.org/packages/96/b6/fcabd337bc5fa624e7203aa0fa7d0c49eed22f72e93229431752bddc83d9/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd", size = 212907 }, - { url = "https://files.pythonhosted.org/packages/4b/d3/9ee6160e644d660fcf176c5825e61411c7f62648728f69c79ba237250143/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729", size = 200839 }, - { url = "https://files.pythonhosted.org/packages/0d/98/e8de5baa5109394baf5118f5e72ab21a86387c4f89b0e77ef3e2f6b0327b/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292", size = 213304 }, - { url = "https://files.pythonhosted.org/packages/7b/1d/71056535dec5c3177eeb53e38e3d367dd1d16e024e63b1cee208d572a033/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf", size = 416930 }, - { url = "https://files.pythonhosted.org/packages/dc/6c/5cbde9de2cd967c322e651c65c543700b19e7ae3e0aae8ece3469bf9683d/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033", size = 193787 }, - { url = "https://files.pythonhosted.org/packages/19/fa/0172e350361d61febcea941b0cc541d6e6c8d65d153e85f850a7b256ff8a/xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec", size = 30916 }, - { url = "https://files.pythonhosted.org/packages/ad/e6/e8cf858a2b19d6d45820f072eff1bea413910592ff17157cabc5f1227a16/xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8", size = 31799 }, - { url = "https://files.pythonhosted.org/packages/56/15/064b197e855bfb7b343210e82490ae672f8bc7cdf3ddb02e92f64304ee8a/xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746", size = 28044 }, - { url = "https://files.pythonhosted.org/packages/7e/5e/0138bc4484ea9b897864d59fce9be9086030825bc778b76cb5a33a906d37/xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e", size = 32754 }, - { url = "https://files.pythonhosted.org/packages/18/d7/5dac2eb2ec75fd771957a13e5dda560efb2176d5203f39502a5fc571f899/xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405", size = 30846 }, - { url = "https://files.pythonhosted.org/packages/fe/71/8bc5be2bb00deb5682e92e8da955ebe5fa982da13a69da5a40a4c8db12fb/xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3", size = 194343 }, - { url = "https://files.pythonhosted.org/packages/e7/3b/52badfb2aecec2c377ddf1ae75f55db3ba2d321c5e164f14461c90837ef3/xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6", size = 213074 }, - { url = "https://files.pythonhosted.org/packages/a2/2b/ae46b4e9b92e537fa30d03dbc19cdae57ed407e9c26d163895e968e3de85/xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063", size = 212388 }, - { url = "https://files.pythonhosted.org/packages/f5/80/49f88d3afc724b4ac7fbd664c8452d6db51b49915be48c6982659e0e7942/xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7", size = 445614 }, - { url = "https://files.pythonhosted.org/packages/ed/ba/603ce3961e339413543d8cd44f21f2c80e2a7c5cfe692a7b1f2cccf58f3c/xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b", size = 194024 }, - { url = "https://files.pythonhosted.org/packages/78/d1/8e225ff7113bf81545cfdcd79eef124a7b7064a0bba53605ff39590b95c2/xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd", size = 210541 }, - { url = "https://files.pythonhosted.org/packages/6f/58/0f89d149f0bad89def1a8dd38feb50ccdeb643d9797ec84707091d4cb494/xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0", size = 198305 }, - { url = "https://files.pythonhosted.org/packages/11/38/5eab81580703c4df93feb5f32ff8fa7fe1e2c51c1f183ee4e48d4bb9d3d7/xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152", size = 210848 }, - { url = "https://files.pythonhosted.org/packages/5e/6b/953dc4b05c3ce678abca756416e4c130d2382f877a9c30a20d08ee6a77c0/xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11", size = 414142 }, - { url = "https://files.pythonhosted.org/packages/08/a9/238ec0d4e81a10eb5026d4a6972677cbc898ba6c8b9dbaec12ae001b1b35/xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5", size = 191547 }, - { url = "https://files.pythonhosted.org/packages/f1/ee/3cf8589e06c2164ac77c3bf0aa127012801128f1feebf2a079272da5737c/xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f", size = 31214 }, - { url = "https://files.pythonhosted.org/packages/02/5d/a19552fbc6ad4cb54ff953c3908bbc095f4a921bc569433d791f755186f1/xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad", size = 32290 }, - { url = "https://files.pythonhosted.org/packages/b1/11/dafa0643bc30442c887b55baf8e73353a344ee89c1901b5a5c54a6c17d39/xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679", size = 28795 }, - { url = "https://files.pythonhosted.org/packages/2c/db/0e99732ed7f64182aef4a6fb145e1a295558deec2a746265dcdec12d191e/xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4", size = 32955 }, - { url = "https://files.pythonhosted.org/packages/55/f4/2a7c3c68e564a099becfa44bb3d398810cc0ff6749b0d3cb8ccb93f23c14/xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67", size = 31072 }, - { url = "https://files.pythonhosted.org/packages/c6/d9/72a29cddc7250e8a5819dad5d466facb5dc4c802ce120645630149127e73/xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad", size = 196579 }, - { url = "https://files.pythonhosted.org/packages/63/93/b21590e1e381040e2ca305a884d89e1c345b347404f7780f07f2cdd47ef4/xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b", size = 215854 }, - { url = "https://files.pythonhosted.org/packages/ce/b8/edab8a7d4fa14e924b29be877d54155dcbd8b80be85ea00d2be3413a9ed4/xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b", size = 214965 }, - { url = "https://files.pythonhosted.org/packages/27/67/dfa980ac7f0d509d54ea0d5a486d2bb4b80c3f1bb22b66e6a05d3efaf6c0/xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca", size = 448484 }, - { url = "https://files.pythonhosted.org/packages/8c/63/8ffc2cc97e811c0ca5d00ab36604b3ea6f4254f20b7bc658ca825ce6c954/xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a", size = 196162 }, - { url = "https://files.pythonhosted.org/packages/4b/77/07f0e7a3edd11a6097e990f6e5b815b6592459cb16dae990d967693e6ea9/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99", size = 213007 }, - { url = "https://files.pythonhosted.org/packages/ae/d8/bc5fa0d152837117eb0bef6f83f956c509332ce133c91c63ce07ee7c4873/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3", size = 200956 }, - { url = "https://files.pythonhosted.org/packages/26/a5/d749334130de9411783873e9b98ecc46688dad5db64ca6e04b02acc8b473/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6", size = 213401 }, - { url = "https://files.pythonhosted.org/packages/89/72/abed959c956a4bfc72b58c0384bb7940663c678127538634d896b1195c10/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93", size = 417083 }, - { url = "https://files.pythonhosted.org/packages/0c/b3/62fd2b586283b7d7d665fb98e266decadf31f058f1cf6c478741f68af0cb/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518", size = 193913 }, - { url = "https://files.pythonhosted.org/packages/9a/9a/c19c42c5b3f5a4aad748a6d5b4f23df3bed7ee5445accc65a0fb3ff03953/xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119", size = 31586 }, - { url = "https://files.pythonhosted.org/packages/03/d6/4cc450345be9924fd5dc8c590ceda1db5b43a0a889587b0ae81a95511360/xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f", size = 32526 }, - { url = "https://files.pythonhosted.org/packages/0f/c9/7243eb3f9eaabd1a88a5a5acadf06df2d83b100c62684b7425c6a11bcaa8/xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95", size = 28898 }, - { url = "https://files.pythonhosted.org/packages/93/1e/8aec23647a34a249f62e2398c42955acd9b4c6ed5cf08cbea94dc46f78d2/xxhash-3.6.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0f7b7e2ec26c1666ad5fc9dbfa426a6a3367ceaf79db5dd76264659d509d73b0", size = 30662 }, - { url = "https://files.pythonhosted.org/packages/b8/0b/b14510b38ba91caf43006209db846a696ceea6a847a0c9ba0a5b1adc53d6/xxhash-3.6.0-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5dc1e14d14fa0f5789ec29a7062004b5933964bb9b02aae6622b8f530dc40296", size = 41056 }, - { url = "https://files.pythonhosted.org/packages/50/55/15a7b8a56590e66ccd374bbfa3f9ffc45b810886c8c3b614e3f90bd2367c/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13", size = 36251 }, - { url = "https://files.pythonhosted.org/packages/62/b2/5ac99a041a29e58e95f907876b04f7067a0242cb85b5f39e726153981503/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd", size = 32481 }, - { url = "https://files.pythonhosted.org/packages/7b/d9/8d95e906764a386a3d3b596f3c68bb63687dfca806373509f51ce8eea81f/xxhash-3.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:15e0dac10eb9309508bfc41f7f9deaa7755c69e35af835db9cb10751adebc35d", size = 31565 }, -] - -[[package]] -name = "yarl" -version = "1.22.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517 }, - { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495 }, - { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400 }, - { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545 }, - { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598 }, - { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893 }, - { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240 }, - { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965 }, - { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026 }, - { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637 }, - { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082 }, - { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811 }, - { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223 }, - { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118 }, - { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852 }, - { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012 }, - { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607 }, - { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027 }, - { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963 }, - { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406 }, - { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581 }, - { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924 }, - { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890 }, - { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819 }, - { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601 }, - { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072 }, - { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311 }, - { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094 }, - { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944 }, - { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804 }, - { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858 }, - { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637 }, - { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000 }, - { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338 }, - { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909 }, - { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940 }, - { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825 }, - { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705 }, - { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518 }, - { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267 }, - { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797 }, - { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535 }, - { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324 }, - { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803 }, - { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220 }, - { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589 }, - { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213 }, - { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330 }, - { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980 }, - { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424 }, - { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821 }, - { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243 }, - { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361 }, - { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036 }, - { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671 }, - { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059 }, - { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356 }, - { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331 }, - { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590 }, - { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316 }, - { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431 }, - { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555 }, - { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965 }, - { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205 }, - { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209 }, - { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966 }, - { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312 }, - { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967 }, - { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949 }, - { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818 }, - { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626 }, - { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129 }, - { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776 }, - { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879 }, - { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996 }, - { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047 }, - { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947 }, - { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943 }, - { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715 }, - { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857 }, - { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520 }, - { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504 }, - { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282 }, - { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080 }, - { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696 }, - { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121 }, - { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080 }, - { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661 }, - { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645 }, - { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361 }, - { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451 }, - { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814 }, - { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799 }, - { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990 }, - { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292 }, - { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888 }, - { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223 }, - { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981 }, - { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303 }, - { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820 }, - { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203 }, - { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173 }, - { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562 }, - { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828 }, - { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551 }, - { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512 }, - { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400 }, - { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140 }, - { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473 }, - { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056 }, - { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292 }, - { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171 }, - { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814 }, -]