diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 27272175..1a46fb37 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -12,7 +12,17 @@ applyTo: '/**' * Always run `make lint` after code changes — runs taplo, isort, black, ruff, and mypy * Never edit `readme.md` directly — it is generated from `docs/index.md` via `make docs` -* To install all dependencies (including all optional extras) run `make install-dev` — runs `uv sync --all-extras` +* To install all dependencies (including all optional extras) run `make install-dev` +* Do not modify code unless the developer explicitly asks for a code change. +* Never change code that works unless you have been asked by the developer to do so, + or you have a good reason to believe the code is wrong. +* Concentrate on fixing the problem, not on making the code look nice unless you are + extremely confident that your code style is better than the original and that the original code style + is not serving a purpose (e.g. readability, consistency with other code, etc.). + If you are unsure, ask the developer or leave the code style as it is. + +## Run Tests + * To run all tests use `make test` — runs all tests in the `tests/` directory using pytest * To run a specific test file, use `uv run pytest tests/path/to/test_file.py` @@ -29,16 +39,26 @@ applyTo: '/**' * Documentation is built using [mkdocs](https://www.mkdocs.org/) and stored in the `docs/` directory. The documentation source files are written in markdown format. * Split prose into short paragraphs (one idea per paragraph) separated by blank lines. Never write a wall-of-text paragraph that strings together mechanism, rationale, caveats and usage advice. This applies to mkdocs tutorials, theory pages and long docstrings. * Do not use dashes (em dashes, en dashes, or hyphens used as dashes) in documentation files or docstrings. Use colons, parentheses, or restructure the sentence instead. +* Always use `Annotated(..., Doc("..."))` for docstrings in code, never use triple-quoted strings below the definition of a function or class. For example: + ```python + from typing_extensions import Annotated, Doc + + def foo(x: Annotated[int, Doc("This is the docstring for x")]) -> float: + """This is the docstring for foo""" + return float(x) + ``` +* Do not use Docstrings with markdown text that may genereate headings (e.g. `# Heading`, `## Heading`, etc.) * Math in documentation and docstrings: always use `\begin{equation}...\end{equation}` for any formula or equation. Use `$...$` only for brief inline references to variables (e.g. $F$, $K$). Do not use `$$...$$`, `` `...` ``, or RST syntax (`.. math::`, `:math:`). * Math notation convention: use $\Phi$ for the characteristic function and $\phi$ for the characteristic exponent, where $\Phi = e^{-\phi}$. * Glossary entries in `docs/glossary.md` must be kept in alphabetical order. -* Do not repeat concept definitions inline in tutorials or docstrings — link to the glossary instead using a relative markdown link (e.g. `[moneyness](../glossary.md#moneyness)`). +* Do not repeat concept definitions inline in tutorials or docstrings, link to the glossary instead using a relative markdown link (e.g. `[moneyness](../glossary.md#moneyness)`). +* Use relative links for all mkdocs page links (e.g. `[Option Pricing](../theory/option_pricing.md)`) — prefer relative over absolute URLs to keep links shorter and portable. * Prefer mkdocstrings relative cross-references whenever the target is visible from the current scope: write `[label][.member]` (same class) or `[label][..Sibling]` (same module) instead of repeating the fully-qualified path. Use the full path only when the target lives in a different module than the current docstring. * To rebuild doc examples run `uv run ./dev/build-examples` — runs all scripts in `docs/examples/` and writes their output to `docs/examples_output/` ## Pydantic models -* Always document Pydantic fields with `Field(description=...)` — never use a docstring below a field assignment +* Always document Pydantic fields with `Field(description=...)`, never use a docstring below a field assignment * Split long description strings across lines using implicit string concatenation rather than shortening the text * When a docstring line exceeds the line length limit, split it across multiple lines rather than shortening the text diff --git a/.gitignore b/.gitignore index cd81b872..b6d9e488 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,8 @@ _build # builds app/docs +app/examples +app/frontend/node_modules +app/frontend/src/.observablehq docs/assets/examples docs/examples/output diff --git a/Makefile b/Makefile index 269b9883..8f2b1f12 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,10 @@ help: @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//' @echo ================================================================================ +.PHONY: app-serve +app-serve: ## serve app + @MICRO_SERVICE_HOST=127.0.0.1 uv run python -m app + .PHONY: docs docs: ## build documentation @cp docs/index.md readme.md @@ -20,8 +24,17 @@ docs-examples: ## Regenerate docs examples @uv run ./dev/build-examples .PHONY: docs-serve -docs-serve: ## serve documentation - @uv run mkdocs serve --livereload --watch quantflow --watch docs +docs-serve: ## serve docs, examples, and API with auto-reload + @bash ./dev/docs-serve + +.PHONY: frontend-build +frontend-build: ## build Observable frontend examples + @rm -rf app/examples + @npm --prefix app/frontend run build + +.PHONY: frontend-serve +frontend-serve: ## serve Observable frontend with auto-reload + @bash ./dev/frontend-serve .PHONY: install-dev install-dev: ## Install development dependencies diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/__main__.py b/app/__main__.py index 46ff3c59..6a356f78 100644 --- a/app/__main__.py +++ b/app/__main__.py @@ -1,45 +1,82 @@ import os -from pathlib import Path -import marimo +from dotenv import load_dotenv from fastapi import APIRouter, FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.openapi.docs import get_redoc_html +from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles +from fluid.utils import log -from app.utils.paths import APP_PATH, head_snippet +from app.utils.paths import APP_PATH +from quantflow import __version__ -PORT = int(os.environ.get("MICRO_SERVICE_PORT", "8001")) -status_router = APIRouter() +from .api.cointegration import cointegration_router +from .api.deps import instrument_app +from .api.heston import heston_router +from .api.hurst import hurst_router +from .api.rates import rates_router +from .api.sampling import sampling_router +from .api.smoother import smoother_router +from .api.status import status_router +from .api.volatility import volatility_router +from .utils.static import HtmlFallbackStaticFiles def crate_app() -> FastAPI: - # Create a marimo asgi app - html_head = head_snippet(APP_PATH / "docs") - server = marimo.create_asgi_app(include_code=True, html_head=html_head) - for path in APP_PATH.glob("*.py"): - if path.name.startswith("_"): - continue - dashed = path.stem.replace("_", "-") - server = server.with_app(path=f"/{dashed}", root=f"./app/{path.name}") - # Create a FastAPI app - app = FastAPI() - app.include_router(status_router) - app.mount("/examples", server.build()) - app.mount("/", StaticFiles(directory=APP_PATH / "docs", html=True), name="static") - return app - + load_dotenv() + log.config() + app = FastAPI( + version=__version__, + title="Quantflow API", + description="API for Quantflow", + ) + instrument_app(app) + cors_origins = [ + origin.strip() + for origin in os.environ.get("QUANTFLOW_CORS_ORIGINS", "").split(",") + if origin.strip() + ] + if cors_origins: + app.add_middleware( + CORSMiddleware, + allow_origins=cors_origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) -@status_router.get("/status") -async def service_status() -> dict: - return {"status": "ok"} + api = APIRouter(prefix="/.api") + @api.get("/redoc", include_in_schema=False) + async def api_redoc() -> HTMLResponse: + return get_redoc_html( + openapi_url="/openapi.json", + title="Quantflow API", + ) -@status_router.get("/ready") -async def service_ready() -> dict: - return {"status": "ok"} + api.include_router(cointegration_router) + api.include_router(heston_router) + api.include_router(hurst_router) + api.include_router(rates_router) + api.include_router(sampling_router) + api.include_router(smoother_router) + api.include_router(volatility_router) + app.include_router(api) + app.include_router(status_router, include_in_schema=False) + app.mount( + "/examples", + HtmlFallbackStaticFiles(directory=APP_PATH / "examples", html=True), + name="examples", + ) + app.mount("/", StaticFiles(directory=APP_PATH / "docs", html=True), name="static") + return app # Run the server if __name__ == "__main__": import uvicorn - uvicorn.run(crate_app(), host="0.0.0.0", port=PORT) + PORT = int(os.environ.get("MICRO_SERVICE_PORT", "8001")) + HOST = os.environ.get("MICRO_SERVICE_HOST", "0.0.0.0") + uvicorn.run(crate_app(), host=HOST, port=PORT) diff --git a/app/api/__init__.py b/app/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/api/cointegration.py b/app/api/cointegration.py new file mode 100644 index 00000000..6e2778b8 --- /dev/null +++ b/app/api/cointegration.py @@ -0,0 +1,61 @@ +from fastapi import APIRouter, Query +from pydantic import BaseModel, Field + +from quantflow.data.fmp import FMP + +cointegration_router = APIRouter() + + +class CointegrationResponse(BaseModel): + dates: list[str] = Field(description="Date strings") + residuals: list[float] = Field(description="Cointegration residual values") + deltas: list[float] = Field( + description="Cointegrating vector (eigenvector for largest eigenvalue)" + ) + + +@cointegration_router.get("/cointegration") +async def cointegration( + frequency: str = Query( + "daily", + description="Price frequency", + enum=["1min", "5min", "15min", "30min", "1hour", "4hour", "daily"], + ), +) -> CointegrationResponse: + import numpy as np + from statsmodels.tsa.vector_ar.vecm import coint_johansen + + # daily uses the EOD endpoint (frequency=None) + freq = None if frequency == "daily" else frequency + + async with FMP() as cli: + btc = await cli.prices("BTCUSD", convert_to_date=True, frequency=freq) + eth = await cli.prices("ETHUSD", convert_to_date=True, frequency=freq) + sol = await cli.prices("SOLUSD", convert_to_date=True, frequency=freq) + + btc = btc.set_index("date") + eth = eth.set_index("date") + sol = sol.set_index("date") + + prices_3 = ( + btc[["close"]] + .join(eth[["close"]], lsuffix="_btc", rsuffix="_eth") + .join(sol[["close"]]) + ) + prices_3.columns = ["btc_close", "eth_close", "sol_close"] + prices_3 = prices_3.dropna() + + log_prices_3 = np.log(prices_3) + johansen_result = coint_johansen(log_prices_3, det_order=0, k_ar_diff=1) + deltas = johansen_result.evec[:, 0] + + residuals = log_prices_3.dot(deltas) + residual_mean = residuals.mean() + residuals = residuals - residual_mean + + dates = [str(d)[:10] for d in residuals.index] + return CointegrationResponse( + dates=dates, + residuals=[float(v) for v in residuals.values], + deltas=[float(v) for v in deltas], + ) diff --git a/app/api/deps.py b/app/api/deps.py new file mode 100644 index 00000000..31a215aa --- /dev/null +++ b/app/api/deps.py @@ -0,0 +1,55 @@ +import json +from collections.abc import Awaitable, Callable +from dataclasses import dataclass +from typing import Annotated, Generic, TypeVar, cast + +from fastapi import Depends, FastAPI, Request +from fluid.utils import log +from fluid.utils.redis import FluidRedis +from pydantic import BaseModel +from redis import Redis + +M = TypeVar("M", bound=BaseModel) +logger = log.get_logger(__name__) + + +def instrument_app(app: FastAPI) -> None: + """Instrument the app with the necessary dependencies""" + redis = FluidRedis.create() + app.state.redis = redis.redis_cli + app.router.on_shutdown.append(redis.close) + + +def get_redis(request: Request) -> Redis: + """Get the redis client from the app state""" + if not hasattr(request.app.state, "redis"): + raise RuntimeError("Redis client not found in app state") + return cast(Redis, request.app.state.redis) + + +@dataclass +class RedisCache(Generic[M]): + redis: Redis + Model: type[M] + key: str + ttl: int = 60 + + async def from_cache(self, loader: Callable[[], Awaitable[M]]) -> M: + """Get a value from the cache""" + value = await self.redis.get(self.key) + if value is None: + return await self.set_cache(await loader()) + try: + return self.Model.model_validate_json(value) + except json.JSONDecodeError: + logger.exception(f"Failed to decode cache value for key {self.key}") + return await self.set_cache(await loader()) + + async def set_cache(self, value: M) -> M: + """Set a value in the cache""" + payload = value.model_dump_json() + await self.redis.set(self.key, payload, ex=self.ttl) + return value + + +RedisDep = Annotated[Redis, Depends(get_redis)] diff --git a/app/api/heston.py b/app/api/heston.py new file mode 100644 index 00000000..62bb08c6 --- /dev/null +++ b/app/api/heston.py @@ -0,0 +1,80 @@ +import numpy as np +from fastapi import APIRouter, Query +from pydantic import BaseModel, Field + +from quantflow.options.pricer import OptionPricer +from quantflow.sp.heston import HestonJ +from quantflow.sp.jump_diffusion import JumpDiffusion +from quantflow.utils.distributions import DoubleExponential + +heston_router = APIRouter() + + +class VolSurfaceGridResponse(BaseModel): + moneyness: list[float] = Field(description="Moneyness grid values") + ttm: list[float] = Field(description="Time to maturity grid values") + implied_vol: list[list[float]] = Field( + description="Implied vol grid (rows=ttm, cols=moneyness)" + ) + + +@heston_router.get("/heston-vol-surface") +async def heston_vol_surface( + model: str = Query( + "jd", + description="Model type", + enum=["jd", "hj"], + ), + vol: float = Query(0.4, description="Long term volatility", ge=0.1, le=0.8), + sigma: float = Query(0.5, description="Vol of vol", ge=0.1, le=2.0), + kappa: float = Query(0.5, description="Variance mean reversion", ge=0.1, le=2.0), + rho: float = Query(0.0, description="Correlation", ge=-0.6, le=0.6), + r: float = Query(1.0, description="Initial vol ratio", ge=0.6, le=1.6), + jump_fraction: float = Query(0.5, description="Jump fraction", ge=0.1, le=0.9), + jump_intensity: float = Query( + 10.0, description="Jump intensity", ge=10.0, le=100.0 + ), + jump_asymmetry: float = Query( + 0.0, description="Jump asymmetry (log kappa)", ge=-2.0, le=2.0 + ), +) -> VolSurfaceGridResponse: + pricer: OptionPricer + if model == "jd": + vm_jd = JumpDiffusion.create( + DoubleExponential, + vol=vol, + jump_fraction=jump_fraction, + jump_intensity=jump_intensity, + jump_asymmetry=jump_asymmetry, + ) + pricer = OptionPricer(model=vm_jd) + else: + st = sigma / vol + k = max(kappa, 0.5 * st * st) + vm_hj = HestonJ.create( + DoubleExponential, + rate=r, + vol=vol, + sigma=sigma, + kappa=k, + rho=rho, + jump_fraction=jump_fraction, + jump_intensity=jump_intensity, + jump_asymmetry=jump_asymmetry, + ) + pricer = OptionPricer(model=vm_hj) + ttm_arr = np.linspace(0.1, 1.0, 10) + moneyness_arr = np.linspace(-0.5, 0.5, 51) + implied = np.zeros((len(ttm_arr), len(moneyness_arr))) + for i, t in enumerate(ttm_arr): + maturity = pricer.maturity(float(t)) + vols = maturity.prices(moneyness_arr * np.sqrt(t))["implied_vol"].values + # replace NaN/Inf/negative with 0 + vols = np.where(np.isfinite(vols) & (vols > 0), vols, 0.0) + implied[i, :] = vols + + return VolSurfaceGridResponse( + moneyness=[float(m) for m in moneyness_arr], + ttm=[float(t) for t in ttm_arr], + implied_vol=[[float(v) for v in row] for row in implied], + ) diff --git a/app/api/hurst.py b/app/api/hurst.py new file mode 100644 index 00000000..2082bb2f --- /dev/null +++ b/app/api/hurst.py @@ -0,0 +1,157 @@ +import math +from collections import defaultdict +from typing import Any + +import numpy as np +import pandas as pd +from fastapi import APIRouter, Query +from pydantic import BaseModel, Field + +from quantflow.sp.ou import Vasicek +from quantflow.sp.wiener import WienerProcess +from quantflow.ta.ohlc import OHLC + +hurst_router = APIRouter() + +DEFAULT_PERIODS = ("10s", "20s", "30s", "1m", "2m", "3m", "5m", "10m", "30m") +VASICEK_PERIODS = ("10m", "20m", "30m", "1h") + + +class HurstWienerResponse(BaseModel): + dates: list[str] = Field(description="Datetime strings for the path") + values: list[float] = Field(description="Path values") + hurst_exponent: float = Field(description="Realized variance Hurst exponent") + realized_std: float = Field(description="Realized standard deviation (scaled)") + estimator_periods: list[str] = Field( + description="Sampling periods for range-based estimators" + ) + estimator_pk: list[float] = Field(description="Parkinson volatility estimates") + estimator_gk: list[float] = Field(description="Garman-Klass volatility estimates") + estimator_rs: list[float] = Field( + description="Rogers-Satchell volatility estimates" + ) + ohlc_hurst_pk: float = Field(description="OHLC Hurst exponent (Parkinson)") + ohlc_hurst_gk: float = Field(description="OHLC Hurst exponent (Garman-Klass)") + ohlc_hurst_rs: float = Field(description="OHLC Hurst exponent (Rogers-Satchell)") + + +class HurstVasicekResponse(BaseModel): + dates: list[str] = Field(description="Datetime strings for the path") + values: list[float] = Field(description="Path values") + hurst_realized: float = Field(description="Hurst exponent from realized variance") + hurst_pk: float = Field(description="Hurst exponent (Parkinson)") + hurst_gk: float = Field(description="Hurst exponent (Garman-Klass)") + hurst_rs: float = Field(description="Hurst exponent (Rogers-Satchell)") + + +def _range_std(pdf: Any, range_seconds: float, seconds_in_day: int) -> float: + variance = pdf.mean() + variance = seconds_in_day * variance / range_seconds + return math.sqrt(variance) + + +def _ohlc_hurst(df: pd.DataFrame, serie: str, periods: tuple) -> dict[str, float]: + template = OHLC( + serie=serie, + period="10m", + rogers_satchell_variance=True, + parkinson_variance=True, + garman_klass_variance=True, + ) + estimator_names = ("pk", "gk", "rs") + time_range = [] + estimators: dict[str, list] = defaultdict(list) + for period in periods: + ohlc = template.model_copy(update=dict(period=period)) + rf = ohlc(df) + ts = pd.to_timedelta(period).to_pytimedelta().total_seconds() + time_range.append(ts) + for name in estimator_names: + estimators[name].append(rf[f"{serie}_{name}"].mean()) + result = {} + for name in estimator_names: + result[name] = ( + float(np.polyfit(np.log(time_range), np.log(estimators[name]), 1)[0]) / 2.0 + ) + return result + + +@hurst_router.get("/hurst-wiener") +async def hurst_wiener( + sigma: float = Query(2.0, description="Wiener process volatility", ge=0.1, le=10), +) -> HurstWienerResponse: + from quantflow.utils.dates import start_of_day + + seconds_in_day = 24 * 60 * 60 + wiener = WienerProcess(sigma=sigma) + paths = wiener.sample(n=1, time_horizon=1, time_steps=seconds_in_day) + wiener_df = paths.as_datetime_df(start=start_of_day(), unit="d").reset_index() + + dates = [str(d) for d in wiener_df.iloc[:, 0]] + values = [float(v) for v in wiener_df.iloc[:, 1]] + hurst_exp = float(paths.hurst_exponent()) + realized_std = float(paths.paths_std(scaled=True)[0]) + + periods = list(DEFAULT_PERIODS) + pk_vals = [] + gk_vals = [] + rs_vals = [] + template = OHLC( + serie="0", + period="10m", + rogers_satchell_variance=True, + parkinson_variance=True, + garman_klass_variance=True, + ) + for period in periods: + ohlc = template.model_copy(update=dict(period=period)) + rf = ohlc(wiener_df) + ts = pd.to_timedelta(period).to_pytimedelta().total_seconds() + pk_vals.append(_range_std(rf["0_pk"], ts, seconds_in_day)) + gk_vals.append(_range_std(rf["0_gk"], ts, seconds_in_day)) + rs_vals.append(_range_std(rf["0_rs"], ts, seconds_in_day)) + + ohlc_hurst = _ohlc_hurst(wiener_df, "0", DEFAULT_PERIODS) + + return HurstWienerResponse( + dates=dates, + values=values, + hurst_exponent=hurst_exp, + realized_std=realized_std, + estimator_periods=periods, + estimator_pk=pk_vals, + estimator_gk=gk_vals, + estimator_rs=rs_vals, + ohlc_hurst_pk=ohlc_hurst["pk"], + ohlc_hurst_gk=ohlc_hurst["gk"], + ohlc_hurst_rs=ohlc_hurst["rs"], + ) + + +@hurst_router.get("/hurst-vasicek") +async def hurst_vasicek( + kappa: float = Query(10.0, description="Mean reversion speed", ge=1.0, le=500.0), +) -> HurstVasicekResponse: + from quantflow.utils.dates import start_of_day + + p = Vasicek(kappa=kappa) + paths = p.sample(n=1, time_horizon=1, time_steps=24 * 60 * 6) + hurst_real = float(paths.hurst_exponent()) + + pdf = pd.DataFrame( + {"0": paths.path(0)}, index=paths.dates(start=start_of_day()) + ).reset_index() + + ohlc_h = _ohlc_hurst(pdf, "0", VASICEK_PERIODS) + + dates = [str(d) for d in pdf.iloc[:, 0]] + values = [float(v) for v in pdf.iloc[:, 1]] + + return HurstVasicekResponse( + dates=dates, + values=values, + hurst_realized=hurst_real, + hurst_pk=ohlc_h["pk"], + hurst_gk=ohlc_h["gk"], + hurst_rs=ohlc_h["rs"], + ) diff --git a/app/api/rates.py b/app/api/rates.py new file mode 100644 index 00000000..b4549b0e --- /dev/null +++ b/app/api/rates.py @@ -0,0 +1,57 @@ +from typing import cast + +import numpy as np +from fastapi import APIRouter, Query +from pydantic import BaseModel, Field + +from quantflow.rates import AnyYieldCurve, YieldCurve + +rates_router = APIRouter() + + +class YieldCurveResponse(BaseModel): + curve: AnyYieldCurve = Field(description="The fitted yield curve") + ttm: list[float] = Field( + description="List of time to maturities for the fitted curve" + ) + rates: list[float] = Field(description="List of rates for the fitted curve") + + +@rates_router.get("/yield-curve") +async def yield_curve( + ttm: list[float] = Query( + ..., description="List of time to maturities corresponding to the rates" + ), + rates: list[float] = Query( + ..., description="List of rates to fit the Nelson-Siegel model" + ), + curve_type: str = Query( + "nelson_siegel", + description="Type of curve to fit", + enum=list(YieldCurve.curve_types()), + ), + max_ttm: float | None = Query( + None, + description=( + "Maximum time to maturity to consider for returning" + " the fitted curve. If not provided, the curve will be returned for all " + "time to maturities." + ), + ), + num_points: int = Query( + 100, + description=( + "Number of points to return for the fitted curve. Only used if max_ttm is " + "provided. Otherwise, the curve will be returned for all time " + "to maturities." + ), + ), +) -> YieldCurveResponse: + curve_class = YieldCurve.get_curve_class(curve_type) + if curve_class is None: + raise ValueError(f"Unsupported curve type: {curve_type}") + curve = cast(AnyYieldCurve, curve_class.calibrate(ttm, rates)) + if max_ttm is not None: + ttm = list(np.geomspace(1 / 365, max_ttm, num_points)) + rates = [float(r) for r in np.atleast_1d(curve.continuously_compounded_rate(ttm))] + return YieldCurveResponse(curve=curve, ttm=ttm, rates=rates) diff --git a/app/api/sampling.py b/app/api/sampling.py new file mode 100644 index 00000000..f8050579 --- /dev/null +++ b/app/api/sampling.py @@ -0,0 +1,74 @@ +import numpy as np +from fastapi import APIRouter, Query +from pydantic import BaseModel, Field + +from quantflow.sp.ou import Vasicek +from quantflow.sp.poisson import PoissonProcess +from quantflow.utils import bins +from quantflow.utils.distributions import DoubleExponential + +sampling_router = APIRouter() + + +class SamplingResponse(BaseModel): + x: list[float] = Field(description="Bin centers") + simulation: list[float] = Field(description="Simulated PDF values") + analytical: list[float] = Field(description="Analytical PDF values") + + +class DoubleExponentialResponse(SamplingResponse): + char_x: list[float] = Field(description="X values from characteristic function") + char_y: list[float] = Field(description="Y values from characteristic function") + + +@sampling_router.get("/gaussian-sampling") +async def gaussian_sampling( + kappa: float = Query(1.0, description="Mean reversion speed", ge=0.1, le=5.0), + samples: int = Query(1000, description="Number of sample paths", ge=100, le=10000), +) -> SamplingResponse: + pr = Vasicek(rate=0.5, kappa=kappa) + paths = pr.sample(samples, 1, 1000) + pdf = paths.pdf(num_bins=50) + x = [float(v) for v in pdf.index] + simulation = [float(v) for v in pdf["pdf"]] + analytical = [float(v) for v in np.atleast_1d(pr.marginal(1).pdf(pdf.index))] + return SamplingResponse(x=x, simulation=simulation, analytical=analytical) + + +@sampling_router.get("/poisson-sampling") +async def poisson_sampling( + intensity: float = Query(2.0, description="Poisson intensity", ge=2.0, le=5.0), + samples: int = Query(1000, description="Number of sample paths", ge=100, le=10000), +) -> SamplingResponse: + pr = PoissonProcess(intensity=intensity) + paths = pr.sample(samples, 1, 1000) + pdf = paths.pdf(delta=1) + x = [float(v) for v in pdf.index] + simulation = [float(v) for v in pdf["pdf"]] + analytical = [float(v) for v in np.atleast_1d(pr.marginal(1).pdf(pdf.index))] + return SamplingResponse(x=x, simulation=simulation, analytical=analytical) + + +@sampling_router.get("/double-exponential-sampling") +async def double_exponential_sampling( + log_kappa: float = Query( + 0.1, description="Log of asymmetry parameter", ge=-2.0, le=2.0 + ), + samples: int = Query(1000, description="Number of samples", ge=100, le=10000), +) -> DoubleExponentialResponse: + pr = DoubleExponential.from_moments(kappa=np.exp(log_kappa)) + data = pr.sample(samples) + pdf = bins.pdf(data, num_bins=50, symmetric=0) + x = [float(v) for v in pdf.index] + simulation = [float(v) for v in pdf["pdf"]] + analytical = [float(v) for v in np.atleast_1d(pr.pdf(pdf.index))] + cha = pr.pdf_from_characteristic() + char_x = [float(v) for v in cha.x] + char_y = [float(v) for v in cha.y] + return DoubleExponentialResponse( + x=x, + simulation=simulation, + analytical=analytical, + char_x=char_x, + char_y=char_y, + ) diff --git a/app/api/smoother.py b/app/api/smoother.py new file mode 100644 index 00000000..c499376b --- /dev/null +++ b/app/api/smoother.py @@ -0,0 +1,50 @@ +from datetime import date + +from fastapi import APIRouter, Query +from pydantic import BaseModel, Field + +from quantflow.data.fmp import FMP +from quantflow.ta.ewma import EWMA +from quantflow.ta.supersmoother import SuperSmoother + +smoother_router = APIRouter() + + +class SmootherPoint(BaseModel): + date: str = Field(description="Date string") + close: float = Field(description="Close price") + supersmoother: float = Field(description="SuperSmoother filtered value") + ewma: float = Field(description="EWMA filtered value") + + +class SmootherResponse(BaseModel): + data: list[SmootherPoint] = Field(description="Time series with smoothed values") + + +@smoother_router.get("/supersmoother") +async def supersmoother( + period: int = Query(10, description="Filter period", ge=2, le=100), + symbol: str = Query("BTCUSD", description="Ticker symbol"), +) -> SmootherResponse: + async with FMP() as fmp: + prices = await fmp.prices(symbol, from_date=date(2024, 1, 1)) + sm = ( + prices[["date", "close"]] + .copy() + .sort_values("date", ascending=True) + .reset_index(drop=True) + ) + smoother = SuperSmoother(period=period) + ewma = EWMA(period=period) + sm["supersmoother"] = sm["close"].apply(smoother.update) + sm["ewma"] = sm["close"].apply(ewma.update) + data = [ + SmootherPoint( + date=str(row["date"]), + close=float(row["close"]), + supersmoother=float(row["supersmoother"]), + ewma=float(row["ewma"]), + ) + for _, row in sm.iterrows() + ] + return SmootherResponse(data=data) diff --git a/app/api/status.py b/app/api/status.py new file mode 100644 index 00000000..6df04ed0 --- /dev/null +++ b/app/api/status.py @@ -0,0 +1,13 @@ +from fastapi import APIRouter + +status_router = APIRouter() + + +@status_router.get("/status") +async def service_status() -> dict: + return {"status": "ok"} + + +@status_router.get("/ready") +async def service_ready() -> dict: + return {"status": "ok"} diff --git a/app/api/volatility.py b/app/api/volatility.py new file mode 100644 index 00000000..f2bda01d --- /dev/null +++ b/app/api/volatility.py @@ -0,0 +1,89 @@ +from functools import partial +from typing import Any + +import numpy as np +from fastapi import APIRouter, Query +from pydantic import BaseModel, Field + +from quantflow.data.deribit import Deribit +from quantflow.data.yahoo import Yahoo +from quantflow.options.inputs import VolSurfaceInputs +from quantflow.options.surface import OptionInfo, VolSurfaceLoader +from quantflow.rates.nelson_siegel import NelsonSiegel + +from .deps import RedisCache, RedisDep +from .rates import YieldCurveResponse + +volatility_router = APIRouter() + +DERIBIT_ASSETS = {"BTC", "ETH"} +YAHOO_ASSETS = {"SPY", "AAPL", "NVDA"} +ALL_ASSETS = sorted(DERIBIT_ASSETS) + sorted(YAHOO_ASSETS) + + +class VolSurfaceResponse(BaseModel): + inputs: VolSurfaceInputs = Field(description="Volatility surface inputs") + options: list[OptionInfo] = Field( + description="List of option info with implied volatilities" + ) + quote_curve: YieldCurveResponse = Field( + description="Quote discount curve with rates" + ) + asset_curve: YieldCurveResponse = Field( + description="Asset discount curve with rates" + ) + + +@volatility_router.get("/volatility-surface") +async def volatility_surface( + redis: RedisDep, + asset: str = Query( + "BTC", + description="Asset symbol", + enum=ALL_ASSETS, + ), +) -> VolSurfaceResponse: + cache = RedisCache( + redis=redis, + Model=VolSurfaceResponse, + key=f"vol_surface:{asset}", + ) + return await cache.from_cache(partial(_volatility_surface, asset)) + + +def _curve_response(curve: Any, max_ttm: float) -> YieldCurveResponse: + ttm = list(np.linspace(1 / 365, max_ttm, 50)) + rates = [float(r) for r in np.atleast_1d(curve.continuously_compounded_rate(ttm))] + return YieldCurveResponse(curve=curve, ttm=ttm, rates=rates) # type: ignore[arg-type] + + +async def _load_surface(asset: str) -> VolSurfaceLoader: + if asset in DERIBIT_ASSETS: + async with Deribit() as cli: + loader = await cli.volatility_surface_loader(asset.lower(), inverse=True) + loader.calibrate_curves(quote_curve=NelsonSiegel) + return loader + else: + async with Yahoo() as cli: + loader = await cli.volatility_surface_loader(asset) + loader.calibrate_curves(quote_curve=NelsonSiegel) + return loader + + +async def _volatility_surface(asset: str) -> VolSurfaceResponse: + loader = await _load_surface(asset) + surface = loader.surface() + surface.bs() + surface.disable_outliers() + + inputs = surface.inputs(converged=True) + options = [op.info() for op in surface.option_prices(converged=True)] + + max_ttm = max(float(op.ttm) for op in options) if options else 1.0 + + return VolSurfaceResponse( + inputs=inputs, + options=options, + quote_curve=_curve_response(surface.quote_curve, max_ttm), + asset_curve=_curve_response(surface.asset_curve, max_ttm), + ) diff --git a/app/cointegration.py b/app/cointegration.py deleted file mode 100644 index b6e9c9ba..00000000 --- a/app/cointegration.py +++ /dev/null @@ -1,164 +0,0 @@ -import marimo - -__generated_with = "0.19.7" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell -def _(mo): - mo.md(r""" - # Cointegration Analysis of Cryptocurrencies - """) - return - - -@app.cell -def _(mo): - from quantflow.data.fmp import FMP - - frequency = mo.ui.dropdown( - options={x.name.replace("_", " "): x.value for x in FMP.freq}, - value="daily", - label="Frequency", - ) - frequency - return FMP, frequency - - -@app.cell -async def _(FMP, frequency): - async with FMP() as cli: - btc = await cli.prices("BTCUSD", convert_to_date=True, frequency=frequency.value) - eth = await cli.prices("ETHUSD", convert_to_date=True, frequency=frequency.value) - sol = await cli.prices("SOLUSD", convert_to_date=True, frequency=frequency.value) - - btc = btc.set_index("date") - eth = eth.set_index("date") - sol = sol.set_index("date") - return btc, eth, sol - - -@app.cell -def _(btc, eth, sol): - # Merge the three price series on the date - prices_3 = btc[['close']].join(eth[['close']], lsuffix='_btc', rsuffix='_eth').join(sol[['close']]) - prices_3.columns = ['btc_close', 'eth_close', 'sol_close'] - prices_3 = prices_3.dropna() - prices_3 - return (prices_3,) - - -@app.cell -def _(prices_3): - import numpy as np - log_prices_3 = np.log(prices_3) - return (log_prices_3,) - - -@app.cell -def _(log_prices_3): - from statsmodels.tsa.vector_ar.vecm import coint_johansen - - # Perform the Johansen cointegration test - # We choose det_order=0 for a constant term in the cointegrating relation - # and k_ar_diff=1 for the number of lags in the VAR model. - johansen_result = coint_johansen(log_prices_3, det_order=0, k_ar_diff=1) - deltas = johansen_result.evec[:, 0] - deltas - - return (deltas,) - - -@app.cell -def _(deltas, log_prices_3): - residuals = log_prices_3.dot(deltas) - residual_mean = residuals.mean() - residuals = residuals - residual_mean - return (residuals,) - - -@app.cell -def _(residuals): - import pandas as pd - import altair as alt - - - # Create a DataFrame for plotting - residuals_df = pd.DataFrame({ - "date": residuals.index, - "residual": residuals.values - }) - - # Create the base chart - base = alt.Chart(residuals_df).encode( - x=alt.X('date:T', title='Date') - ).properties( - title='First Cointegration Residual of BTC, ETH, and SOL', - width='container' - ) - - # Create the line chart for the residuals - line = base.mark_line(color='steelblue').encode( - y=alt.Y('residual:Q', title='Residual (Spread)'), - tooltip=[ - alt.Tooltip('date:T', title='Date'), - alt.Tooltip('residual:Q', title='Residual', format='.4f') - ] - ) - - line.interactive() - return - - -@app.cell -def _(): - return - - -@app.cell -def _(mo): - mo.md(r""" - ### Why Pick the Largest Eigenvalue? - - In the Johansen cointegration test, the eigenvalues ($\lambda$) are sorted in descending order, and each one corresponds to a different potential cointegrating vector. - - **The magnitude of the eigenvalue represents the strength and stability of the corresponding cointegrating relationship.** - - 1. **Strongest Relationship:** The largest eigenvalue corresponds to the linear combination of the time series that is "most stationary." This means the resulting spread (the residuals) has the strongest tendency to revert to its mean over time. - 2. **Statistical Significance:** The test statistics used in the Johansen test (the Trace test and the Maximum Eigenvalue test) are functions of these eigenvalues. These tests help us determine how many statistically significant cointegrating relationships exist, starting from the one associated with the largest eigenvalue. - 3. **Practical Application:** For applications like pairs trading, we want to find the most reliable and predictable long-run equilibrium relationship. By choosing the cointegrating vector associated with the largest eigenvalue, we are selecting the portfolio of assets whose value is most likely to be mean-reverting, making it the best candidate for a statistical arbitrage strategy. - - In short, picking the largest eigenvalue is equivalent to picking the **most significant and stable cointegrating vector** found by the test. - """) - return - - -@app.cell -def _(mo): - mo.md(r""" - ### Should You Use Log Prices? - - **Yes, using log prices is generally recommended** for cointegration analysis in finance. Here is why: - - 1. **Percentage vs. Absolute Changes:** Log-prices allow the model to work with **relative percentage changes** rather than absolute dollar amounts. This is crucial when assets trade at vastly different scales (e.g., BTC at \$60k vs. SOL at \$150). - 2. **Variance Stabilization:** Financial time series often exhibit heteroscedasticity, meaning volatility increases as the price level rises. Log transformation helps stabilize this variance, making the data more suitable for linear statistical models. - 3. **Linearization:** Standard cointegration tests (like Johansen or Engle-Granger) look for linear combinations. Real-world economic relationships between assets are often multiplicative (based on ratios); taking logarithms converts these into linear additive relationships. - """) - return - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/app/double_exponential_sampling.py b/app/double_exponential_sampling.py deleted file mode 100644 index 4c95adfd..00000000 --- a/app/double_exponential_sampling.py +++ /dev/null @@ -1,81 +0,0 @@ -import marimo - -__generated_with = "0.19.7" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell -def _(mo): - mo.md(r""" - # Double Exponential Sampling - - Here we sample the Asymmetric Laplace distribution, a.k.a double exponential - We will set the mean to 0 and the variance to 1 so that the distribution is fully determined by the asymmetric parameter $\kappa$. - - ```python - from quantflow.utils.distributions import DoubleExponential - ``` - """) - return - - -@app.cell -def _(): - from quantflow.utils.distributions import DoubleExponential - from quantflow.utils import bins - import numpy as np - - def simulate_double_exponential(log_kappa: float, samples: int): - pr = DoubleExponential.from_moments(kappa=np.exp(log_kappa)) - data = pr.sample(samples) - pdf = bins.pdf(data, num_bins=50, symmetric=0) - pdf["simulation"] = pdf["pdf"] - pdf["analytical"] = pr.pdf(pdf.index) - cha = pr.pdf_from_characteristic() - return pdf, cha - return (simulate_double_exponential,) - - -@app.cell -def _(mo): - samples = mo.ui.slider(start=100, stop=10000, step=100, value=1000, debounce=True, label="Samples") - log_kappa = mo.ui.slider(start=-2, stop=2, step=0.1, value=0.1, debounce=True, label="Asymmetry - $\log \kappa$") - - controls = mo.hstack([samples, log_kappa], justify="start") - controls - return log_kappa, samples - - -@app.cell -def _(log_kappa, samples, simulate_double_exponential): - df, cha = simulate_double_exponential(log_kappa.value, samples.value) - return cha, df - - -@app.cell -def _(cha, df): - import plotly.graph_objects as go - - simulation = go.Bar(x=df.index, y=df["simulation"], name="simulation") - analytical = go.Scatter(x=df.index, y=df["analytical"], name="analytical") - characteristic = go.Scatter(x=cha.x, y=cha.y, name="from characteristic", mode="markers") - fig = go.Figure(data=[simulation, characteristic, analytical]) - fig - return - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/app/frontend/observablehq.config.js b/app/frontend/observablehq.config.js new file mode 100644 index 00000000..b678970e --- /dev/null +++ b/app/frontend/observablehq.config.js @@ -0,0 +1,30 @@ +import {readFileSync} from "node:fs"; +import {resolve, dirname} from "node:path"; +import {fileURLToPath} from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const apiOrigin = process.env.QUANTFLOW_API_ORIGIN || ""; +const headSnippet = readFileSync(resolve(__dirname, "../../docs/assets/logos/head-snippet.html"), "utf-8") + .trim() + .replace(/href="\//g, 'href="https://quantflow.quantmind.com/'); + +export default { + title: "Quantflow Examples", + root: "src", + output: "../examples", + base: "/examples", + head: `\n${headSnippet}`, + style: "style.css", + pages: [{name: "Volatility Surface", path: "/volatility-surface"}, {name: "Yield Curve", path: "/yield-curve"}, {name: "Sampling", path: "/sampling"}, {name: "SuperSmoother", path: "/supersmoother"}, {name: "Cointegration", path: "/cointegration"}, {name: "Hurst Exponent", path: "/hurst"}, {name: "Heston Vol Surface", path: "/heston-vol-surface"}], + header: ` + + `, + footer: "Quantflow live examples" +}; diff --git a/app/frontend/package-lock.json b/app/frontend/package-lock.json new file mode 100644 index 00000000..3e3a46da --- /dev/null +++ b/app/frontend/package-lock.json @@ -0,0 +1,5062 @@ +{ + "name": "quantflow-examples", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "quantflow-examples", + "dependencies": { + "@observablehq/framework": "^1.13.4", + "@observablehq/plot": "^0.6.17", + "d3": "^7.9.0" + }, + "devDependencies": { + "concurrently": "^9.2.1", + "typescript": "^5.9.3" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz", + "integrity": "sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==", + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^2.3.1", + "is-potential-custom-element-name": "^1.0.1" + } + }, + "node_modules/@clack/core": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.5.tgz", + "integrity": "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.7.0.tgz", + "integrity": "sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==", + "bundleDependencies": [ + "is-unicode-supported" + ], + "license": "MIT", + "dependencies": { + "@clack/core": "^0.3.3", + "is-unicode-supported": "*", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts/node_modules/is-unicode-supported": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@observablehq/framework": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@observablehq/framework/-/framework-1.13.4.tgz", + "integrity": "sha512-/qSEsd1R0n7wgVQHBpF8slShQhB2TDAWma1AllddYb3e1T72mm6dMSL3PaVUNx3Tx2lM3wXjPxcAH431yvdTHw==", + "license": "ISC", + "dependencies": { + "@clack/prompts": "^0.7.0", + "@observablehq/inputs": "^0.12.0", + "@observablehq/inspector": "^5.0.1", + "@observablehq/runtime": "^6.0.0", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-virtual": "^3.0.2", + "@sindresorhus/slugify": "^2.2.1", + "acorn": "^8.11.2", + "acorn-walk": "^8.3.0", + "ci-info": "^4.0.0", + "cross-spawn": "^7.0.3", + "d3-array": "^3.2.4", + "d3-hierarchy": "^3.1.2", + "esbuild": "^0.27.3", + "fast-array-diff": "^1.1.0", + "fast-deep-equal": "^3.1.3", + "glob": "^10.3.10", + "gray-matter": "^4.0.3", + "he": "^1.2.0", + "highlight.js": "^11.8.0", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "jsdom": "^23.2.0", + "jszip": "^3.10.1", + "markdown-it": "^14.0.0", + "markdown-it-anchor": "^8.6.7", + "mime": "^4.0.0", + "minisearch": "^6.3.0", + "open": "^10.1.0", + "picocolors": "^1.1.1", + "pkg-dir": "^8.0.0", + "resolve.exports": "^2.0.2", + "rollup": "^4.6.0", + "rollup-plugin-esbuild": "^6.1.0", + "semver": "^7.5.4", + "send": "^0.19.0", + "tar": "^7.5.9", + "tar-stream": "^3.1.6", + "tsx": "^4.7.1", + "untildify": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.14.2" + }, + "bin": { + "observable": "dist/bin/observable.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@observablehq/inputs": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@observablehq/inputs/-/inputs-0.12.0.tgz", + "integrity": "sha512-1ln7+PYe31cMx00K9awVbiCscQM0THnXRJ/AEzd+FfTA25Gu3KRWknAGECxU49QzHyKqiXpLl5LCg3XtYm70eQ==", + "license": "ISC", + "dependencies": { + "htl": "^0.3.1", + "isoformat": "^0.2.0" + }, + "engines": { + "node": ">=14.5.0" + } + }, + "node_modules/@observablehq/inspector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@observablehq/inspector/-/inspector-5.0.1.tgz", + "integrity": "sha512-euwWxwDa6KccU4G3D2JBD7GI/2McJh/z7HHEzJKbj2TDa7zhI37eTbTxiwE9rgTWBagvVBel+hAmnJRYBYOv2Q==", + "license": "ISC", + "dependencies": { + "isoformat": "^0.2.0" + } + }, + "node_modules/@observablehq/plot": { + "version": "0.6.17", + "resolved": "https://registry.npmjs.org/@observablehq/plot/-/plot-0.6.17.tgz", + "integrity": "sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==", + "license": "ISC", + "dependencies": { + "d3": "^7.9.0", + "interval-tree-1d": "^1.0.0", + "isoformat": "^0.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@observablehq/runtime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@observablehq/runtime/-/runtime-6.0.0.tgz", + "integrity": "sha512-t3UXP69O0JK20HY/neF4/DDDSDorwo92As806Y1pNTgTmj1NtoPyVpesYzfH31gTFOFrXC2cArV+wLpebMk9eA==", + "license": "ISC" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-virtual": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", + "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.3.tgz", + "integrity": "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz", + "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz", + "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz", + "integrity": "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.3.tgz", + "integrity": "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "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==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "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-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "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-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "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-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "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-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "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", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-array-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-array-diff/-/fast-array-diff-1.1.0.tgz", + "integrity": "sha512-muSPyZa/yHCoDQhah9th57AmLENB1nekbrUoLAqOpQXdl1Kw8VbH24Syl5XLscaQJlx7KRU95bfTDPvVB5BJvw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/htl": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/htl/-/htl-0.3.1.tgz", + "integrity": "sha512-1LBtd+XhSc+++jpOOt0lCcEycXs/zTQSupOISnVAUmvGBpV7DH+C2M6hwV7zWYfpTMMg9ch4NO0lHiOTAMHdVA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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/interval-tree-1d": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz", + "integrity": "sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==", + "license": "MIT", + "dependencies": { + "binary-search-bounds": "^2.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isoformat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/isoformat/-/isoformat-0.2.1.tgz", + "integrity": "sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.2.0.tgz", + "integrity": "sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/dom-selector": "^2.0.1", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.16.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "license": "MIT" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", + "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-esbuild": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.2.1.tgz", + "integrity": "sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "get-tsconfig": "^4.10.0", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14.18.0" + }, + "peerDependencies": { + "esbuild": ">=0.18.0", + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.3.tgz", + "integrity": "sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", + "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/untildify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-5.0.0.tgz", + "integrity": "sha512-bOgQLUnd2G5rhzaTvh1VCI9Fo6bC5cLTpH17T5aFfamyXFYDbbdzN6IXdeoc3jBS7T9hNTmJtYUzJCJ2Xlc9gA==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/app/frontend/package.json b/app/frontend/package.json new file mode 100644 index 00000000..856def32 --- /dev/null +++ b/app/frontend/package.json @@ -0,0 +1,18 @@ +{ + "name": "quantflow-examples", + "private": true, + "type": "module", + "scripts": { + "build": "observable build", + "dev": "observable preview --host 0.0.0.0" + }, + "dependencies": { + "@observablehq/framework": "^1.13.4", + "@observablehq/plot": "^0.6.17", + "d3": "^7.9.0" + }, + "devDependencies": { + "concurrently": "^9.2.1", + "typescript": "^5.9.3" + } +} diff --git a/app/frontend/src/cointegration.md b/app/frontend/src/cointegration.md new file mode 100644 index 00000000..81447007 --- /dev/null +++ b/app/frontend/src/cointegration.md @@ -0,0 +1,64 @@ +--- +title: Cointegration +--- + +# Cointegration Analysis of Cryptocurrencies + +Johansen cointegration test on BTC, ETH, and SOL log prices. The residual (spread) of the first cointegrating vector is plotted below. + +```js +import {fetchJson} from "./lib/api.js"; +import * as Plot from "npm:@observablehq/plot"; +``` + +```js +const frequencyInput = Inputs.select(["daily", "4hour", "1hour", "30min", "15min", "5min", "1min"], {label: "Frequency", value: "daily"}); +const frequency = Generators.input(frequencyInput); +``` + +```js +display(frequencyInput); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const data = await fetchJson(`/.api/cointegration?frequency=${frequency}`); +``` + +```js +display(html`

Cointegrating vector (BTC, ETH, SOL): [${data.deltas.map(d => d.toFixed(4)).join(", ")}]

`); +``` + +```js +const residuals = data.dates.map((d, i) => ({date: new Date(d), residual: data.residuals[i]})); + +display(Plot.plot({ + width: 900, + height: 400, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Date", type: "utc"}, + y: {label: "Residual (Spread)"}, + marks: [ + Plot.line(residuals, {x: "date", y: "residual", stroke: "var(--theme-foreground-focus)", strokeWidth: 1.5, tip: true}), + Plot.ruleY([0], {stroke: "var(--theme-foreground-muted)", strokeDasharray: "4,4"}), + ] +})); +``` + +## Why Pick the Largest Eigenvalue? + +In the Johansen cointegration test, the eigenvalues are sorted in descending order, and each one corresponds to a different potential cointegrating vector. The magnitude of the eigenvalue represents the strength and stability of the corresponding cointegrating relationship. + +1. **Strongest Relationship:** The largest eigenvalue corresponds to the linear combination of the time series that is "most stationary." The resulting spread has the strongest tendency to revert to its mean. +2. **Statistical Significance:** The test statistics (Trace and Maximum Eigenvalue tests) are functions of these eigenvalues, helping determine how many significant cointegrating relationships exist. +3. **Practical Application:** For pairs trading, we want the most reliable long-run equilibrium. The vector associated with the largest eigenvalue gives the most mean-reverting portfolio. + +## Should You Use Log Prices? + +Yes, using log prices is generally recommended for cointegration analysis in finance: + +1. **Percentage vs. Absolute Changes:** Log prices work with relative percentage changes rather than absolute dollar amounts, which is crucial when assets trade at vastly different scales. +2. **Variance Stabilization:** Log transformation helps stabilize variance in heteroscedastic financial data. +3. **Linearization:** Real-world economic relationships between assets are often multiplicative; logarithms convert these into linear additive relationships suitable for the Johansen test. diff --git a/app/frontend/src/heston-vol-surface.md b/app/frontend/src/heston-vol-surface.md new file mode 100644 index 00000000..7c3b8782 --- /dev/null +++ b/app/frontend/src/heston-vol-surface.md @@ -0,0 +1,102 @@ +--- +title: Jump Diffusion Vol Surface +--- + +# Jump Diffusion Volatility Surface + +Compare a Jump Diffusion volatility surface with a Heston Stochastic Volatility with Jumps model. + +```js +import {fetchJson} from "./lib/api.js"; +import * as Plot from "npm:@observablehq/plot"; +``` + +```js +const modelInput = Inputs.select(new Map([["Jump Diffusion", "jd"], ["Heston with Jumps", "hj"]]), {label: "Model", value: "jd"}); +const modelVal = Generators.input(modelInput); + +const volInput = Inputs.range([0.1, 0.8], {step: 0.01, value: 0.4, label: "Long term volatility"}); +const volVal = Generators.input(volInput); + +const sigmaInput = Inputs.range([0.1, 2], {step: 0.1, value: 0.5, label: "Vol of vol"}); +const sigmaVal = Generators.input(sigmaInput); + +const kappaInput = Inputs.range([0.1, 2], {step: 0.1, value: 0.5, label: "Variance mean reversion"}); +const kappaVal = Generators.input(kappaInput); + +const rhoInput = Inputs.range([-0.6, 0.6], {step: 0.1, value: 0, label: "Correlation"}); +const rhoVal = Generators.input(rhoInput); + +const rInput = Inputs.range([0.6, 1.6], {step: 0.1, value: 1.0, label: "Initial vol ratio"}); +const rVal = Generators.input(rInput); + +const jfInput = Inputs.range([0.1, 0.9], {step: 0.05, value: 0.5, label: "Jump fraction"}); +const jfVal = Generators.input(jfInput); + +const jiInput = Inputs.range([10, 100], {step: 5, value: 10, label: "Jump intensity"}); +const jiVal = Generators.input(jiInput); + +const jaInput = Inputs.range([-2, 2], {step: 0.1, value: 0, label: "Jump asymmetry"}); +const jaVal = Generators.input(jaInput); +``` + +```js +display(html`
+ ${modelInput}${volInput}${rInput}${sigmaInput}${kappaInput}${rhoInput}${jfInput}${jiInput}${jaInput} +
`); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const params = new URLSearchParams({ + model: modelVal, vol: volVal, sigma: sigmaVal, kappa: kappaVal, + rho: rhoVal, r: rVal, jump_fraction: jfVal, jump_intensity: jiVal, jump_asymmetry: jaVal +}); +const data = await fetchJson(`/.api/heston-vol-surface?${params}`); +``` + +## Volatility Smile + +```js +const flat = data.ttm.flatMap((t, i) => + data.moneyness.map((m, j) => ({ttm: t.toFixed(2), moneyness: m, implied_vol: data.implied_vol[i][j]})) +).filter(d => d.implied_vol > 0); + +display(Plot.plot({ + width: 800, + height: 450, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Moneyness"}, + y: {label: "Implied Volatility", percent: true}, + color: {type: "ordinal", scheme: "turbo", legend: true, label: "TTM"}, + marks: [ + Plot.line(flat, {x: "moneyness", y: "implied_vol", stroke: "ttm", strokeWidth: 1.5, tip: true}), + Plot.ruleX([0], {stroke: "var(--theme-foreground-muted)", strokeDasharray: "4,4"}), + ] +})); +``` + +## Volatility Term Structure + +```js +const atmByTtm = data.ttm.map((t, i) => { + const midIdx = Math.floor(data.moneyness.length / 2); + return {ttm: t, implied_vol: data.implied_vol[i][midIdx]}; +}).filter(d => d.implied_vol > 0); + +display(Plot.plot({ + width: 800, + height: 350, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Time to Maturity"}, + y: {label: "ATM Implied Volatility", percent: true}, + marks: [ + Plot.line(atmByTtm, {x: "ttm", y: "implied_vol", stroke: "var(--theme-foreground-focus)", strokeWidth: 2}), + Plot.dot(atmByTtm, {x: "ttm", y: "implied_vol", fill: "var(--theme-foreground-focus)", r: 4, tip: true}), + ] +})); +``` diff --git a/app/frontend/src/hurst.md b/app/frontend/src/hurst.md new file mode 100644 index 00000000..1ba779a0 --- /dev/null +++ b/app/frontend/src/hurst.md @@ -0,0 +1,111 @@ +--- +title: Hurst Exponent +--- + +# Hurst Exponent + +The [Hurst exponent](https://en.wikipedia.org/wiki/Hurst_exponent) is a statistical measure used to uncover the long-term memory of a time series. It helps determine if a financial asset is purely random (H = 0.5), trending (H > 0.5), or mean-reverting (H < 0.5). + +```js +import {fetchJson} from "./lib/api.js"; +import * as Plot from "npm:@observablehq/plot"; +``` + +## Wiener Process + +We sample a Wiener process path over one day (one time step per second) and estimate the Hurst exponent from both realized variance and range-based OHLC estimators. + +```js +const sigmaInput = Inputs.range([0.1, 10], {step: 0.1, value: 2.0, label: "Sigma (volatility)"}); +const sigma = Generators.input(sigmaInput); +``` + +```js +display(sigmaInput); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const wiener = await fetchJson(`/.api/hurst-wiener?sigma=${sigma}`); +``` + +```js +display(html`
+
Realized Std: ${wiener.realized_std.toFixed(4)}
+
Hurst (realized): ${wiener.hurst_exponent.toFixed(4)}
+
Hurst (Parkinson): ${wiener.ohlc_hurst_pk.toFixed(4)}
+
Hurst (Garman-Klass): ${wiener.ohlc_hurst_gk.toFixed(4)}
+
Hurst (Rogers-Satchell): ${wiener.ohlc_hurst_rs.toFixed(4)}
+
`); +``` + +### Range-based Volatility Estimators + +Volatility estimated from OHLC data using Parkinson (1980), Garman & Klass (1980), and Rogers & Satchell (1991) estimators across different sampling periods. + +```js +const estData = wiener.estimator_periods.flatMap((p, i) => [ + {period: p, value: wiener.estimator_pk[i], estimator: "Parkinson"}, + {period: p, value: wiener.estimator_gk[i], estimator: "Garman-Klass"}, + {period: p, value: wiener.estimator_rs[i], estimator: "Rogers-Satchell"}, +]); + +display(Plot.plot({ + width: 800, + height: 400, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Sampling Period", type: "point"}, + y: {label: "Estimated Volatility"}, + color: {legend: true, label: "Estimator"}, + marks: [ + Plot.dot(estData, {x: "period", y: "value", fill: "estimator", r: 5, tip: true}), + Plot.ruleY([sigma], {stroke: "var(--theme-foreground-muted)", strokeDasharray: "4,4"}), + ] +})); +``` + +## Mean-Reverting (Vasicek) + +For mean-reverting processes, the Hurst exponent is less than 0.5. Higher mean reversion (kappa) leads to a lower Hurst exponent. + +```js +const kappaInput = Inputs.range([1, 500], {step: 1, value: 10, label: "Kappa (mean reversion)"}); +const kappa = Generators.input(kappaInput); +``` + +```js +display(kappaInput); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const vasicek = await fetchJson(`/.api/hurst-vasicek?kappa=${kappa}`); +``` + +```js +display(html`
+
Hurst (realized): ${vasicek.hurst_realized.toFixed(4)}
+
Hurst (Parkinson): ${vasicek.hurst_pk.toFixed(4)}
+
Hurst (Garman-Klass): ${vasicek.hurst_gk.toFixed(4)}
+
Hurst (Rogers-Satchell): ${vasicek.hurst_rs.toFixed(4)}
+
`); +``` + +```js +const vasicekPath = vasicek.dates.map((d, i) => ({date: new Date(d), value: vasicek.values[i]})); + +display(Plot.plot({ + width: 800, + height: 350, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Time", type: "utc"}, + y: {label: "Value"}, + marks: [ + Plot.line(vasicekPath, {x: "date", y: "value", stroke: "var(--theme-foreground-focus)", strokeWidth: 1.5}), + ] +})); +``` diff --git a/app/frontend/src/index.md b/app/frontend/src/index.md new file mode 100644 index 00000000..69acd785 --- /dev/null +++ b/app/frontend/src/index.md @@ -0,0 +1,18 @@ +--- +title: Quantflow examples +--- + +# Quantflow examples + +Interactive examples are built as static Observable pages and use the Quantflow +FastAPI service for Python computations and market data. + +
+ Volatility Surface + Yield Curve + Sampling + SuperSmoother + Cointegration + Hurst Exponent + Heston Vol Surface +
diff --git a/app/frontend/src/lib/api.ts b/app/frontend/src/lib/api.ts new file mode 100644 index 00000000..8ff581f0 --- /dev/null +++ b/app/frontend/src/lib/api.ts @@ -0,0 +1,15 @@ +function apiOrigin(): string { + return ( + document + .querySelector('meta[name="quantflow-api-origin"]') + ?.getAttribute("content") || "" + ); +} + +export async function fetchJson(path: string): Promise { + const response = await fetch(`${apiOrigin()}${path}`); + if (!response.ok) { + throw new Error(`${response.status} ${response.statusText}: ${path}`); + } + return response.json() as Promise; +} diff --git a/app/frontend/src/sampling.md b/app/frontend/src/sampling.md new file mode 100644 index 00000000..680b0537 --- /dev/null +++ b/app/frontend/src/sampling.md @@ -0,0 +1,138 @@ +--- +title: Sampling +--- + +# Sampling + +Monte Carlo sampling of stochastic processes compared against their analytical distributions. + +```js +import {fetchJson} from "./lib/api.js"; +import * as Plot from "npm:@observablehq/plot"; +``` + +## Gaussian (Vasicek) + +Sample the Gaussian OU (Vasicek) process for different mean reversion speeds and number of paths. + +```js +const gKappaInput = Inputs.range([0.1, 5], {step: 0.1, value: 1.0, label: "Kappa (mean reversion)"}); +const gKappa = Generators.input(gKappaInput); + +const gSamplesInput = Inputs.range([100, 10000], {step: 100, value: 1000, label: "Samples"}); +const gSamples = Generators.input(gSamplesInput); +``` + +```js +display(html`
${gKappaInput}${gSamplesInput}
`); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const gaussianData = await fetchJson(`/.api/gaussian-sampling?kappa=${gKappa}&samples=${gSamples}`); +``` + +```js +const gBarData = gaussianData.x.map((x, i) => ({x, y: gaussianData.simulation[i]})); +const gLineData = gaussianData.x.map((x, i) => ({x, y: gaussianData.analytical[i]})); +const gBinWidth = gaussianData.x[1] - gaussianData.x[0]; + +display(Plot.plot({ + width: 800, + height: 450, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Value"}, + y: {label: "Density"}, + marks: [ + Plot.rectY(gBarData, {x1: d => d.x - gBinWidth / 2, x2: d => d.x + gBinWidth / 2, y: "y", fill: "var(--theme-foreground-muted)", fillOpacity: 0.6, tip: true}), + Plot.line(gLineData, {x: "x", y: "y", stroke: "var(--theme-foreground-focus)", strokeWidth: 2}), + ] +})); +``` + +## Poisson + +Evaluate the Monte Carlo simulation for the Poisson process against the analytical PDF. + +```js +const pIntensityInput = Inputs.range([2, 5], {step: 0.1, value: 2.0, label: "Intensity (λ)"}); +const pIntensity = Generators.input(pIntensityInput); + +const pSamplesInput = Inputs.range([100, 10000], {step: 100, value: 1000, label: "Samples"}); +const pSamples = Generators.input(pSamplesInput); +``` + +```js +display(html`
${pIntensityInput}${pSamplesInput}
`); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const poissonData = await fetchJson(`/.api/poisson-sampling?intensity=${pIntensity}&samples=${pSamples}`); +``` + +```js +const pBarSim = poissonData.x.map((x, i) => ({x, y: poissonData.simulation[i], type: "Simulation"})); +const pBarAna = poissonData.x.map((x, i) => ({x, y: poissonData.analytical[i], type: "Analytical"})); +const pBinWidth = poissonData.x.length > 1 ? poissonData.x[1] - poissonData.x[0] : 1; + +display(Plot.plot({ + width: 800, + height: 450, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Value"}, + y: {label: "Probability"}, + color: {legend: true, label: "Source"}, + marks: [ + Plot.barY(pBarSim, {x: "x", y: "y", fill: "var(--theme-foreground-muted)", fillOpacity: 0.6, dx: -2, tip: true}), + Plot.barY(pBarAna, {x: "x", y: "y", fill: "var(--theme-foreground-focus)", fillOpacity: 0.6, dx: 2}), + ] +})); +``` + +## Double Exponential + +Sample the Asymmetric Laplace (double exponential) distribution with mean 0 and variance 1, parameterised by the asymmetry parameter κ. + +```js +const deLogKappaInput = Inputs.range([-2, 2], {step: 0.1, value: 0.1, label: "log(κ) asymmetry"}); +const deLogKappa = Generators.input(deLogKappaInput); + +const deSamplesInput = Inputs.range([100, 10000], {step: 100, value: 1000, label: "Samples"}); +const deSamples = Generators.input(deSamplesInput); +``` + +```js +display(html`
${deLogKappaInput}${deSamplesInput}
`); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const deData = await fetchJson(`/.api/double-exponential-sampling?log_kappa=${deLogKappa}&samples=${deSamples}`); +``` + +```js +const deBarData = deData.x.map((x, i) => ({x, y: deData.simulation[i]})); +const deLineData = deData.x.map((x, i) => ({x, y: deData.analytical[i]})); +const deCharData = deData.char_x.map((x, i) => ({x, y: deData.char_y[i]})); +const deBinWidth = deData.x[1] - deData.x[0]; + +display(Plot.plot({ + width: 800, + height: 450, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Value"}, + y: {label: "Density"}, + marks: [ + Plot.rectY(deBarData, {x1: d => d.x - deBinWidth / 2, x2: d => d.x + deBinWidth / 2, y: "y", fill: "var(--theme-foreground-muted)", fillOpacity: 0.6, tip: true}), + Plot.line(deLineData, {x: "x", y: "y", stroke: "var(--theme-foreground-focus)", strokeWidth: 2}), + Plot.dot(deCharData, {x: "x", y: "y", fill: "var(--theme-accent)", r: 3}), + ] +})); +``` diff --git a/app/frontend/src/style.css b/app/frontend/src/style.css new file mode 100644 index 00000000..ca0e8527 --- /dev/null +++ b/app/frontend/src/style.css @@ -0,0 +1,76 @@ +@import url("observablehq:default.css"); +@import url("observablehq:theme-slate.css"); + +:root { + --observablehq-header-height: 3rem; + --theme-background-b: #1E2129; + --theme-foreground: #ffffffd1; + --theme-foreground-focus: #00ccb8; + --qf-primary: #009688; + --qf-accent: #ffc107; + font-family: Roboto, Helvetica, Arial, sans-serif; +} + +#observablehq-header { + background: var(--qf-primary); + color: #fff; + padding: 0; + margin: 0; + left: 0 !important; + right: 0 !important; + border-bottom: none; +} + +.qf-header-inner { + display: flex; + align-items: center; + padding: 0.4rem 0.8rem; + width: 100%; +} + +.qf-header-logo { + display: flex; + align-items: center; + gap: 0.5rem; + text-decoration: none; + color: #fff !important; +} + +.qf-header-logo img { + height: 1.5rem; + width: auto; +} + +.qf-header-title { + font-size: 0.9rem; + font-weight: 700; + white-space: nowrap; +} + +.qf-header-spacer { + flex: 1; +} + +.qf-header-link { + color: #ffffffcc !important; + font-size: 0.8rem; + text-decoration: none; +} + +.qf-header-link:hover { + color: #fff !important; +} + +.card { + border: 1px solid var(--theme-foreground-faintest); + border-radius: 0.4rem; + color: var(--theme-foreground); + display: block; + font-weight: 600; + padding: 1rem; + text-decoration: none; +} + +.card:hover { + border-color: var(--qf-primary); +} diff --git a/app/frontend/src/supersmoother.md b/app/frontend/src/supersmoother.md new file mode 100644 index 00000000..681d75d2 --- /dev/null +++ b/app/frontend/src/supersmoother.md @@ -0,0 +1,48 @@ +--- +title: SuperSmoother & EWMA +--- + +# SuperSmoother & EWMA + +Compare the SuperSmoother and EWMA filters applied to BTCUSD daily close prices. + +```js +import {fetchJson} from "./lib/api.js"; +import * as Plot from "npm:@observablehq/plot"; +``` + +```js +const periodInput = Inputs.range([2, 100], {step: 1, value: 10, label: "Period"}); +const period = Generators.input(periodInput); +``` + +```js +display(periodInput); +``` + +```js +await new Promise(r => setTimeout(r, 300)); +const result = await fetchJson(`/.api/supersmoother?period=${period}`); +``` + +```js +const long = result.data.flatMap(d => [ + {date: d.date, price: d.close, signal: "Close"}, + {date: d.date, price: d.supersmoother, signal: "SuperSmoother"}, + {date: d.date, price: d.ewma, signal: "EWMA"}, +]); + +display(Plot.plot({ + width: 900, + height: 450, + marginLeft: 70, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Date", type: "utc"}, + y: {label: "Price (USD)"}, + color: {legend: true, label: "Signal", domain: ["Close", "SuperSmoother", "EWMA"], range: ["#4c78a8", "#f58518", "#e45756"]}, + marks: [ + Plot.line(long, {x: "date", y: "price", stroke: "signal", strokeWidth: 1.5, tip: true}), + ] +})); +``` diff --git a/app/frontend/src/volatility-surface.md b/app/frontend/src/volatility-surface.md new file mode 100644 index 00000000..adbbb58b --- /dev/null +++ b/app/frontend/src/volatility-surface.md @@ -0,0 +1,184 @@ +--- +title: Volatility Surface +--- + +# Volatility Surface + +Live implied volatility surface from market options data. Crypto assets (BTC, ETH) use [Deribit](https://www.deribit.com/); equities (SPY, AAPL, NVDA) use [Yahoo Finance](https://finance.yahoo.com/). + +```js +import {fetchJson} from "./lib/api.js"; +import * as Plot from "npm:@observablehq/plot"; +import * as d3 from "npm:d3"; +``` + +```js +const assetInput = Inputs.select(["BTC", "ETH", "SPY", "AAPL", "NVDA"], {label: "Asset", value: "BTC"}); +const asset = Generators.input(assetInput); +``` + +```js +display(assetInput); +``` + +```js +const data = await fetchJson(`/.api/volatility-surface?asset=${asset}`); +``` + +```js +// Options come pre-computed from the API with all fields +const options = data.options; + +// Unique maturities sorted by date +const maturities = [...new Set(options.map(d => d.maturity))].sort(); + +// Parse numeric fields (API returns Decimals as strings) +const enriched = options.map(d => ({ + ...d, + strike: parseFloat(d.strike), + forward: parseFloat(d.forward), + log_strike: parseFloat(d.log_strike), + moneyness: parseFloat(d.moneyness), + ttm: parseFloat(d.ttm), + implied_vol: parseFloat(d.implied_vol), + price_bp: parseFloat(d.price_bp), + open_interest: parseFloat(d.open_interest), + volume: parseFloat(d.volume), +})); + +// Get spot from inputs +const spotInput = data.inputs.inputs.find(d => d.security_type === "spot"); +const spotMid = spotInput ? (parseFloat(spotInput.bid) + parseFloat(spotInput.ask)) / 2 : null; +``` + +```js +const refDate = new Date(data.inputs.quote_curve.ref_date); +const formatDate = d3.utcFormat("%d %b %Y %H:%M:%S UTC"); +display(html`

${formatDate(refDate)} · Spot: ${spotMid ? d3.format(",.0f")(spotMid) : "N/A"} USD · ${enriched.length} options across ${maturities.length} maturities

`); +``` + +```js +const downloadInputs = () => { + const blob = new Blob([JSON.stringify(data.inputs, null, 2)], {type: "application/json"}); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `volsurface_${asset}_${d3.utcFormat("%Y%m%d_%H%M%S")(refDate)}.json`; + a.click(); + URL.revokeObjectURL(url); +}; + +display(html``); +``` + +```js +const maturityInput = Inputs.select( + [null, ...maturities], + {label: "Maturity", value: null, format: d => d === null ? "All" : d.slice(0, 10)} +); +const selectedMaturity = Generators.input(maturityInput); + +const xAxisInput = Inputs.select( + ["moneyness", "log_strike", "strike"], + {label: "X-Axis", value: "moneyness", format: d => ({moneyness: "Moneyness", log_strike: "Log Strike", strike: "Strike"}[d])} +); +const xAxis = Generators.input(xAxisInput); +``` + +```js +display(html`
${maturityInput}${xAxisInput}
`); +``` + +## Volatility Smile + +```js +const smileData = selectedMaturity === null + ? enriched + : enriched.filter(d => d.maturity === selectedMaturity); + +const xLabel = {moneyness: "Moneyness (log(K/F) / √T)", log_strike: "Log Strike (log K/F)", strike: "Strike"}[xAxis]; + +display(Plot.plot({ + width: 800, + height: 450, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: xLabel}, + y: {label: "Implied Volatility", percent: true}, + color: { + type: "ordinal", + domain: maturities, + scheme: "turbo", + legend: selectedMaturity === null, + label: "Maturity", + tickFormat: d => d.slice(5, 10) + }, + marks: [ + Plot.dot(smileData, { + x: xAxis, + y: "implied_vol", + fill: "maturity", + r: 3, + opacity: 0.8, + tip: true + }), + Plot.ruleY([0]), + ...(xAxis === "moneyness" ? [Plot.ruleX([0], {stroke: "var(--theme-foreground-muted)", strokeDasharray: "4,4"})] : []) + ] +})); +``` + +## Volatility Term Structure + +```js +// ATM vol per maturity (closest to moneyness = 0) +const atmByMaturity = maturities.map(m => { + const slice = enriched.filter(d => d.maturity === m); + const atm = slice.reduce((best, d) => Math.abs(d.moneyness) < Math.abs(best.moneyness) ? d : best); + return {maturity: m, implied_vol: atm.implied_vol}; +}); + +display(Plot.plot({ + width: 800, + height: 350, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Maturity", type: "point"}, + y: {label: "ATM Implied Volatility", percent: true}, + marks: [ + Plot.line(atmByMaturity, {x: "maturity", y: "implied_vol", stroke: "var(--theme-foreground-focus)", strokeWidth: 2}), + Plot.dot(atmByMaturity, { + x: "maturity", + y: "implied_vol", + fill: "var(--theme-foreground-focus)", + r: 5, + tip: true + }) + ] +})); +``` + +## Discount Curves + +```js +const quoteCurve = data.quote_curve.ttm.map((t, i) => ({ttm: t, rate: data.quote_curve.rates[i], curve: "Quote"})); +const assetCurve = data.asset_curve.ttm.map((t, i) => ({ttm: t, rate: data.asset_curve.rates[i], curve: "Asset"})); +const curveData = [...quoteCurve, ...assetCurve]; + +display(Plot.plot({ + width: 800, + height: 350, + marginLeft: 60, + marginBottom: 50, + style: {background: "transparent"}, + x: {label: "Time to Maturity (years)"}, + y: {label: "Rate", percent: true}, + color: {legend: true, label: "Curve"}, + marks: [ + Plot.line(curveData, {x: "ttm", y: "rate", stroke: "curve", strokeWidth: 2}), + Plot.ruleY([0], {stroke: "var(--theme-foreground-muted)", strokeDasharray: "4,4"}) + ] +})); +``` diff --git a/app/frontend/src/yield-curve.md b/app/frontend/src/yield-curve.md new file mode 100644 index 00000000..e8498367 --- /dev/null +++ b/app/frontend/src/yield-curve.md @@ -0,0 +1,142 @@ +--- +title: Yield Curve +--- + +# Yield Curve + +Fit a yield curve to a set of interest rates. Drag the points to change the input rates. + +```js +import {fetchJson} from "./lib/api.js"; +import * as Plot from "npm:@observablehq/plot"; +import * as d3 from "npm:d3"; +``` + +```js +const curveType = view(Inputs.select(["nelson_siegel", "vasicek_curve"], {label: "Curve type"})); +``` + +```js +const defaultRates = [ + {ttm: 1/365, rate: 0.043}, + {ttm: 7/365, rate: 0.043}, + {ttm: 1/12, rate: 0.044}, + {ttm: 0.25, rate: 0.045}, + {ttm: 0.5, rate: 0.046}, + {ttm: 1, rate: 0.047}, + {ttm: 2, rate: 0.043}, + {ttm: 3, rate: 0.041}, + {ttm: 5, rate: 0.040}, + {ttm: 7, rate: 0.041}, + {ttm: 10, rate: 0.043}, + {ttm: 20, rate: 0.048}, + {ttm: 30, rate: 0.049} +]; + +const inputRates = Mutable(defaultRates); +const setInputRates = (v) => inputRates.value = v; +``` + +```js +const params = new URLSearchParams(); +for (const {ttm, rate} of inputRates) { + params.append("ttm", ttm); + params.append("rates", rate); +} +params.set("curve_type", curveType); +params.set("max_ttm", "30"); +params.set("num_points", "200"); + +const result = await fetchJson(`/.api/yield-curve?${params}`); +``` + +```js +const fittedData = result.ttm + .map((t, i) => ({ttm: t, rate: result.rates[i]})) + .filter(d => d.ttm >= 1/365); +``` + +```js +const width = 640; +const height = 400; +const marginTop = 30; +const marginRight = 20; +const marginBottom = 40; +const marginLeft = 50; + +const x = d3.scaleLog() + .domain([1/365, 32]) + .range([marginLeft, width - marginRight]); + +const y = d3.scaleLinear() + .domain([0.02, 0.06]) + .range([height - marginBottom, marginTop]); + +const svg = d3.create("svg") + .attr("width", width) + .attr("height", height) + .attr("viewBox", [0, 0, width, height]) + .attr("style", "max-width: 100%; height: auto;"); + +svg.append("g") + .attr("transform", `translate(0,${height - marginBottom})`) + .call(d3.axisBottom(x) + .tickValues([1/365, 1/52, 1/12, 0.25, 0.5, 1, 2, 5, 10, 30]) + .tickFormat(d => d < 1/12 ? `${Math.round(d*365)}d` : d < 1 ? `${Math.round(d*12)}m` : `${d}y`) + ) + .append("text") + .attr("x", width / 2) + .attr("y", 35) + .attr("fill", "currentColor") + .attr("text-anchor", "middle") + .text("Time to Maturity (years)"); + +svg.append("g") + .attr("transform", `translate(${marginLeft},0)`) + .call(d3.axisLeft(y).tickFormat(d3.format(".1%"))) + .append("text") + .attr("x", -marginLeft + 10) + .attr("y", marginTop - 15) + .attr("fill", "currentColor") + .attr("text-anchor", "start") + .text("Rate"); + +const line = d3.line() + .x(d => x(d.ttm)) + .y(d => y(d.rate)); + +const curvePath = svg.append("path") + .datum(fittedData) + .attr("fill", "none") + .attr("stroke", "var(--qf-primary)") + .attr("stroke-width", 2) + .attr("d", line); + +const points = [...inputRates]; + +svg.selectAll("circle") + .data(points) + .join("circle") + .attr("cx", d => x(d.ttm)) + .attr("cy", d => y(d.rate)) + .attr("r", 7) + .attr("fill", "var(--qf-accent)") + .attr("cursor", "ns-resize") + .call(d3.drag() + .on("drag", function(event, d) { + const newRate = y.invert(event.y); + const clamped = Math.max(0.001, Math.min(0.1, newRate)); + d.rate = clamped; + d3.select(this).attr("cy", y(clamped)); + }) + .on("end", function() { + setInputRates(points.map(p => ({ttm: p.ttm, rate: p.rate}))); + }) + ); + +display(svg.node()); +``` + +```js +display(result.curve); +``` \ No newline at end of file diff --git a/app/gaussian_sampling.py b/app/gaussian_sampling.py deleted file mode 100644 index 465ceead..00000000 --- a/app/gaussian_sampling.py +++ /dev/null @@ -1,91 +0,0 @@ - import marimo - -__generated_with = "0.19.7" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell -def _(mo): - mo.md(r""" - # Gaussian Sampling - - Here we sample the gaussian OU process for different mean reversion speed and number of paths. - """) - return - - -@app.cell -def _(mo): - import inspect - from quantflow.sp.ou import Vasicek - import pandas as pd - - def simulate_vasicek(kappa: float, samples: int) -> pd.DataFrame: - pr = Vasicek(rate=0.5, kappa=kappa) - paths = pr.sample(samples, 1, 1000) - pdf = paths.pdf(num_bins=50) - pdf["simulation"] = pdf["pdf"] - pdf["analytical"] = pr.marginal(1).pdf(pdf.index) - return pdf - - # 1. Get the source code of your function - # Note: The function must be defined in a previous cell or imported - try: - source_code = inspect.getsource(simulate_vasicek) - except OSError: - source_code = "# Code not available (source file not found)" - - # 2. Display it inside an accordion so it doesn't clutter the view - mo.accordion({ - "Show Simulation Code": mo.md(f"```python\n{source_code}\n```") - }) - return (simulate_vasicek,) - - -@app.cell -def _(mo): - samples = mo.ui.slider(start=100, stop=10000, step=100, value=1000, debounce=True, full_width=True) - kappa = mo.ui.slider(start=0.1, stop=5, step=0.1, debounce=True, full_width=True) - - def input_label(text): - return mo.Html(f"{text}") - - controls = mo.vstack([ - mo.hstack([input_label("Samples:"), samples], align="center"), - mo.hstack([input_label("Kappa (Mean reversion):"), kappa], align="center") - ]) - controls - return kappa, samples - - -@app.cell -def _(kappa, samples, simulate_vasicek): - df = simulate_vasicek(kappa=kappa.value, samples=samples.value) - return (df,) - - -@app.cell -def _(df): - import plotly.graph_objects as go - simulation = go.Bar(x=df.index, y=df["simulation"], name="simulation") - analytical = go.Scatter(x=df.index, y=df["analytical"], name="analytical") - fig = go.Figure(data=[simulation, analytical]) - fig - return - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/app/heston_vol_surface.py b/app/heston_vol_surface.py deleted file mode 100644 index 75cf8ec3..00000000 --- a/app/heston_vol_surface.py +++ /dev/null @@ -1,165 +0,0 @@ -import marimo - -__generated_with = "0.22.0" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell(hide_code=True) -def _(mo): - mo.md(r""" - ## Jump Diffusion - - We conside a Jump Diffuxion volatility surface and compare it with a more powerful Hest Stochastioc volatility with Jumps. - """) - return - - -@app.cell -def _(mo): - from quantflow.sp.jump_diffusion import JumpDiffusion - from quantflow.sp.heston import HestonJ - from quantflow.utils.distributions import DoubleExponential - from quantflow.options.pricer import OptionPricer - import numpy as np - - - models = dict(jd="Jump Diffusion", hj="Heston with Jumps") - model = mo.ui.dropdown({v: n for n, v in models.items()}, value="Jump Diffusion", label="model") - vol = mo.ui.slider(start=0.1, stop=0.8, value=0.4, debounce=True, label="Long term volatility") - sigma = mo.ui.slider(start=0.1, stop=2, step=0.1, value=0.5, debounce=True, label="vol of vol") - kappa = mo.ui.slider(start=0.1, stop=2, step=0.5, value=0.5, debounce=True, label="Variance mean reversion") - rho = mo.ui.slider(start=-0.6, stop=0.6, step=0.1, value=0, debounce=True, label="Correlation") - r = mo.ui.slider(start=0.6, stop=1.6, step=0.1, value=1, debounce=True, label="Initial vol") - jump_fraction = mo.ui.slider(start=0.1, stop=0.9, step=0.05, value=0.5, debounce=True, label="Jump Fraction") - jump_intensity = mo.ui.slider(start=10, stop=100, step=5, debounce=True, label="Jump Intensity") - jump_asymmetry = mo.ui.slider(start=-2, stop=2, step=0.1, value=0, debounce=True, label="Jump Asymmetry") - - - class Surface: - - def __init__(self): - self.fig = None - - @property - def scene_camera(self): - return self.fig.layout["scene"]["camera"] if self.fig is not None else None - - def plot(self, model, pr): - name = models[model] - self.fig = pr.plot3d( - ttm=np.linspace(start=0.1, stop=1.0, num=10), - title=f"Implied Volatility Surface: {name}", - scene_camera=self.scene_camera - ) - return self.fig - - surface = Surface() - return ( - DoubleExponential, - HestonJ, - JumpDiffusion, - OptionPricer, - jump_asymmetry, - jump_fraction, - jump_intensity, - kappa, - model, - r, - rho, - sigma, - surface, - vol, - ) - - -@app.cell -def _( - DoubleExponential, - HestonJ, - JumpDiffusion, - OptionPricer, - jump_asymmetry, - jump_fraction, - jump_intensity, - kappa, - model, - r, - rho, - sigma, - vol, -): - def get_model(value: str): - match value: - case "jd": - return JumpDiffusion.create( - DoubleExponential, - vol=vol.value, - jump_fraction=jump_fraction.value, - jump_intensity=jump_intensity.value, - jump_asymmetry=jump_asymmetry.value, - ) - case "hj": - st = sigma.value/vol.value - k = max((kappa.value, 0.5*st*st)) - return HestonJ.create( - DoubleExponential, - rate=r.value, - vol=vol.value, - sigma=sigma.value, - kappa=k, - rho=rho.value, - jump_fraction=jump_fraction.value, - jump_intensity=jump_intensity.value, - jump_asymmetry=jump_asymmetry.value, - ) - case _: - raise ValueError(f"Mode {value} not supported") - - vm = get_model(model.value) - pricer = OptionPricer(model=vm) - return (pricer,) - - -@app.cell -def _( - jump_asymmetry, - jump_fraction, - jump_intensity, - kappa, - mo, - model, - r, - rho, - sigma, - vol, -): - mo.vstack([ - mo.hstack([jump_fraction, jump_intensity, jump_asymmetry]), - mo.hstack([vol, sigma, kappa]), - mo.hstack([rho, r, model]), - ]) - return - - -@app.cell -def _(model, pricer, surface): - fig = surface.plot(model.value, pricer) - fig - return - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/app/hurst.py b/app/hurst.py deleted file mode 100644 index 3b296b87..00000000 --- a/app/hurst.py +++ /dev/null @@ -1,327 +0,0 @@ -import marimo - -__generated_with = "0.19.7" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell -def _(mo): - mo.md(r""" - # Hurst Exponent - - The [Hurst exponent](https://en.wikipedia.org/wiki/Hurst_exponent) is a statistical measure used to uncover the long-term memory of a time series. It helps determine if a financial asset is purely random, trending, or mean-reverting. - - The intuition is based on how the volatility of a time series scales with time. If a time series $x_t$ follows a standard Brownian motion (a Random Walk), the variance of the changes increases linearly with the time. - - \begin{align} - \text{Var}(x_{t_2} - x_{t_1}) &\propto t_2 - t_1 \\ - &\propto \Delta t^{2H}\\ - H &= 0.5 - \end{align} - - where $H$ is the Hurst exponent. - - Trending time-series have a Hurst exponent H > 0.5, while mean reverting time-series have H < 0.5. Understanding in which regime a time-series is can be useful for trading strategies. - - These are some references to understand the Hurst exponent and its applications: - - * [Hurst Exponent for Algorithmic Trading](https://robotwealth.com/demystifying-the-hurst-exponent-part-1/) - * [Basics of Statistical Mean Reversion Testing](https://www.quantstart.com/articles/Basics-of-Statistical-Mean-Reversion-Testing/) - - ## Estimate from OHLC data - - We want to construct a mechanism to estimate the Hurst exponent via OHLC data because it is widely available from data providers and easily constructed as an online signal during trading. - - In order to evaluate results against known solutions, we consider the Wiener process as generator of timeseries. - - We use the **WienerProcess** from the stochastic process library and sample one path over a time horizon of 1 (day) with a time step every second. - """) - return - - -@app.cell -def _(mo): - regenerate_btn = mo.ui.run_button(label="Regenerate Path", kind="info") - regenerate_btn - return (regenerate_btn,) - - -@app.cell -def _(regenerate_btn): - from quantflow.sp.wiener import WienerProcess - from quantflow.utils import plot - from quantflow.utils.dates import start_of_day - - regenerate_btn - - wiener = WienerProcess(sigma=2.0) - wiener_paths = wiener.sample(n=1, time_horizon=1, time_steps=24*60*60) - wiener_df = wiener_paths.as_datetime_df(start=start_of_day(), unit="d").reset_index() - - plot.plot_lines( - wiener_df, - x=wiener_df.columns[0], - y=wiener_df.columns[1], - title="Wiener Process Path", - labels={"value": "Value", "variable": "Path", wiener_df.columns[0]: "Date"}, - ) - return plot, start_of_day, wiener_df, wiener_paths - - -@app.cell -def _(mo): - mo.md(r""" - In order to down-sample the timeseries, we need to convert it into a dataframe with dates as indices. - """) - return - - -@app.cell -def _(mo): - mo.md(r""" - ### Realized Variance - - At this point we estimate the standard deviation using the **realized variance** along the path (we use the **scaled** flag so that the standard deviation is scaled by the square-root of time step, in this way it removes the dependency on the time step size). - The value should be close to the **sigma** of the WienerProcess defined above. - """) - return - - -@app.cell -def _(wiener_paths): - float(wiener_paths.paths_std(scaled=True)[0]) - return - - -@app.cell -def _(mo): - mo.md(r""" - The evaluation of the hurst exponent is done by calculating the variance for several time windows and by fitting a line to the log-log plot of the variance vs the time window. - """) - return - - -@app.cell -def _(wiener_paths): - wiener_paths.hurst_exponent() - return - - -@app.cell -def _(mo): - mo.md(r""" - As expected, the Hurst exponent should be close to 0.5, since we have calculated the exponent from the paths of a Wiener process. - """) - return - - -@app.cell -def _(mo): - mo.md(r""" - ### Range-based Variance Estimators - - We now turn our attention to range-based variance estimators. These estimators depends on OHLC timeseries, which are widely available from data providers such as [FMP](https://site.financialmodelingprep.com/). - To analyze range-based variance estimators, we use he **quantflow.ta.OHLC** tool which allows to down-sample a timeserie to OHLC series and estimate variance with three different estimators - - * **Parkinson** (1980) - * **Garman & Klass** (1980) - * **Rogers & Satchell** (1991) - - See [molnar](/bibliography/#molnar) for a detailed overview of the properties of range-based estimators. - - For this we build an OHLC estimator as template and use it to create OHLC estimators for different periods. - """) - return - - -@app.cell -def _(wiener_df): - import pandas as pd - import polars as pl - import math - from quantflow.ta.ohlc import OHLC - template = OHLC( - serie="0", - period="10m", - rogers_satchell_variance=True, - parkinson_variance=True, - garman_klass_variance=True - ) - seconds_in_day = 24*60*60 - - def rstd(pdf: pl.Series, range_seconds: float) -> float: - """Calculate the standard deviation from a range-based variance estimator""" - variance = pdf.mean() - # scale the variance by the number of seconds in the period - variance = seconds_in_day * variance / range_seconds - return math.sqrt(variance) - - results = [] - for period in ("10s", "20s", "30s", "1m", "2m", "3m", "5m", "10m", "30m"): - ohlc = template.model_copy(update=dict(period=period)) - rf = ohlc(wiener_df) - ts = pd.to_timedelta(period).to_pytimedelta().total_seconds() - data = dict(period=period) - for name in ("pk", "gk", "rs"): - estimator = rf[f"0_{name}"] - data[name] = rstd(estimator, ts) - results.append(data) - vdf = pd.DataFrame(results).set_index("period") - return OHLC, pd, vdf - - -@app.cell -def _(plot, vdf): - # Create a scatter plot comparing the three estimators - # We use the dataframe index (period) for the x-axis and the columns for the y-axis - fig2 = plot.plot_scatter( - vdf, - x=vdf.index, - y=vdf.columns, - title="Range-based Volatility Estimators vs Sampling Period", - labels={ - "period": "Sampling Period", - "value": "Estimated Volatility (Annualized)", - "variable": "Estimator" - }, - ) - - # Increase marker size and add opacity for better visibility - fig2.update_traces(marker=dict(size=10, opacity=0.8)) - - # Add hover lines to easily compare values at the same period - fig2.update_layout(hovermode="x unified") - - fig2 - return - - -@app.cell -def _(mo): - mo.md(r""" - These numbers are different from the realized variance because they are based on the range of the prices, not on the actual prices. The realized variance is a more direct measure of the volatility of the process, while the range-based estimators are more robust to market microstructure noise. - - The Parkinson estimator is always higher than both the Garman-Klass and Rogers-Satchell estimators, the reason is due to the use of the high and low prices only, which are always further apart than the open and close prices. The GK and RS estimators are similar and are more accurate than the Parkinson estimator, especially for greater periods. - - To estimate the Hurst exponent with the range-based estimators, we calculate the variance of the log of the range for different time windows and fit a line to the log-log plot of the variance vs the time window. - """) - return - - -@app.cell -def _(OHLC, pd): - from typing import Sequence - import numpy as np - from collections import defaultdict - from quantflow.ta.base import DataFrame - - default_periods = ("10s", "20s", "30s", "1m", "2m", "3m", "5m", "10m", "30m") - - def ohlc_hurst_exponent( - df: DataFrame, - series: Sequence[str], - periods: Sequence[str] = default_periods, - ) -> DataFrame: - results = {} - estimator_names = ("pk", "gk", "rs") - for serie in series: - template = OHLC( - serie=serie, - period="10m", - rogers_satchell_variance=True, - parkinson_variance=True, - garman_klass_variance=True - ) - time_range = [] - estimators = defaultdict(list) - for period in periods: - ohlc = template.model_copy(update=dict(period=period)) - rf = ohlc(df) - ts = pd.to_timedelta(period).to_pytimedelta().total_seconds() - time_range.append(ts) - for name in estimator_names: - estimators[name].append(rf[f"{serie}_{name}"].mean()) - results[serie] = [float(np.polyfit(np.log(time_range), np.log(estimators[name]), 1)[0])/2.0 for name in estimator_names] - return pd.DataFrame(results, index=estimator_names) - return (ohlc_hurst_exponent,) - - -@app.cell -def _(ohlc_hurst_exponent, wiener_df): - ohlc_hurst_exponent(wiener_df, series=["0"]) - return - - -@app.cell -def _(mo): - mo.md(r""" - The Hurst exponent should be close to 0.5, since we have calculated the exponent from the paths of a Wiener process. But it is not exactly 0.5 because the range-based estimators are not the same as the realized variance. Interestingly, the Parkinson estimator gives a Hurst exponent closer to 0.5 than the Garman-Klass and Rogers-Satchell estimators. - - ## Mean Reverting Time Series - - We now turn our attention to mean reverting time series, where the Hurst exponent is less than 0.5. - """) - return - - -@app.cell -def _(pd, regenerate_vasicek, start_of_day): - from quantflow.sp.ou import Vasicek - regenerate_vasicek - p = Vasicek(kappa=2) - paths = {f"kappa={k}": Vasicek(kappa=float(k)).sample(n=1, time_horizon=1, time_steps=24*60*6) for k in (1, 10, 50, 100, 500)} - pdf = pd.DataFrame({k: p.path(0) for k, p in paths.items()}, index=paths["kappa=1"].dates(start=start_of_day())) - pdf.plot() - return paths, pdf - - -@app.cell -def _(mo): - regenerate_vasicek = mo.ui.run_button(label="Regenerate Paths", kind="info") - regenerate_vasicek - return (regenerate_vasicek,) - - -@app.cell -def _(mo): - mo.md(r""" - ~We can now estimate the Hurst exponent from the realized variance. As we can see the Hurst exponent decreases as we increase the mean reversion parameter. - """) - return - - -@app.cell -def _(paths, pd): - pd.DataFrame({k: [p.hurst_exponent()] for k, p in paths.items()}) - return - - -@app.cell -def _(mo): - mo.md(r""" - And we can also estimate the Hurst exponent from the range-based estimators. As we can see the Hurst exponent decreases as we increase the mean reversion parameter along the same lines as the realized variance. - """) - return - - -@app.cell -def _(ohlc_hurst_exponent, paths, pdf): - ohlc_hurst_exponent(pdf.reset_index(), list(paths), periods=("10m", "20m", "30m", "1h")) - return - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/app/poisson_sampling.py b/app/poisson_sampling.py deleted file mode 100644 index 6c2406b1..00000000 --- a/app/poisson_sampling.py +++ /dev/null @@ -1,72 +0,0 @@ -import marimo - -__generated_with = "0.19.7" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell -def _(mo): - mo.md(r""" - # Poisson Sampling - - Evaluate the MC simulation for The Poisson process against the analytical PDF. - """) - return - - -@app.cell -def _(): - from quantflow.sp.poisson import PoissonProcess - import pandas as pd - - def simulate_poisson(intensity: float, samples: int) -> pd.DataFrame: - pr = PoissonProcess(intensity=intensity) - paths = pr.sample(samples, 1, 1000) - pdf = paths.pdf(delta=1) - pdf["simulation"] = pdf["pdf"] - pdf["analytical"] = pr.marginal(1).pdf(pdf.index) - return pdf - return (simulate_poisson,) - - -@app.cell -def _(mo): - samples = mo.ui.slider(start=100, stop=10000, step=100, value=1000, debounce=True, label="Samples") - intensity = mo.ui.slider(start=2, stop=5, step=0.1, debounce=True, label="Poisson intensity $\lambda$") - - controls = mo.hstack([samples, intensity], justify="start") - controls - return intensity, samples - - -@app.cell -def _(intensity, samples, simulate_poisson): - df = simulate_poisson(intensity=intensity.value, samples=samples.value) - return (df,) - - -@app.cell -def _(df): - import plotly.graph_objects as go - simulation = go.Bar(x=df.index, y=df["simulation"], name="simulation") - analytical = go.Bar(x=df.index, y=df["analytical"], name="analytical") - fig = go.Figure(data=[simulation, analytical]) - fig - return - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/app/supersmoother.py b/app/supersmoother.py deleted file mode 100644 index dc0f9ed3..00000000 --- a/app/supersmoother.py +++ /dev/null @@ -1,110 +0,0 @@ -import marimo - -__generated_with = "0.19.7" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell(hide_code=True) -def _(mo): - mo.md(r""" - # Supermsoother & EWMA - """) - return - - -@app.cell -def _(): - from quantflow.data.fmp import FMP - fmp = FMP() - return (fmp,) - - -@app.cell -async def _(fmp): - from datetime import date - data = await fmp.prices("BTCUSD", from_date=date(2024,1,1)) - data - return (data,) - - -@app.cell -def _(): - import altair as alt - import pandas as pd - return (alt,) - - -@app.cell -def _(mo): - period = mo.ui.slider(start=2, stop=100, step=1, value=10, label="Period:") - period - return (period,) - - -@app.cell -def _(data, period): - from quantflow.ta.supersmoother import SuperSmoother - from quantflow.ta.ewma import EWMA - # create the filters - smoother = SuperSmoother(period=period.value) - ewma = EWMA(period=period.value) - # sort dates ascending - sm = data[["date", "close"]].copy().sort_values("date", ascending=True).reset_index(drop=True) - sm["supersmoother"] = sm["close"].apply(smoother.update) - sm["ewma"] = sm["close"].apply(ewma.update) - return (sm,) - - -@app.cell -def _(alt, sm): - # Melt the dataframe to a long format suitable for Altair - sm_long = sm.melt( - id_vars=['date'], - value_vars=['close', 'supersmoother', "ewma"], - var_name='Signal', - value_name='Price' - ) - - # Create the chart with both SuperSmoothers - line_chart_combined = alt.Chart(sm_long).mark_line().encode( - x=alt.X('date:T', title='Date'), - y=alt.Y('Price:Q', title='Price (USD)', scale=alt.Scale(zero=False)), - color=alt.Color('Signal:N', title='Signal', - scale=alt.Scale( - domain=['close', 'supersmoother', 'ewma'], - range=['#4c78a8', '#f58518', '#e45756']) # Vega-Lite default palette - ), - tooltip=[ - alt.Tooltip('date:T', title='Date'), - alt.Tooltip('Signal:N', title='Signal'), - alt.Tooltip('Price:Q', title='Price', format='$,.2f') - ] - ).properties( - title='BTCUSD Close Price vs. SuperSmoothers' - ).interactive() - - line_chart_combined - return - - -@app.cell -def _(sm): - sm - return - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/app/utils/__init__.py b/app/utils/__init__.py index ffd18da2..e69de29b 100644 --- a/app/utils/__init__.py +++ b/app/utils/__init__.py @@ -1,12 +0,0 @@ -import marimo as mo -import pandas as pd - -pd.options.plotting.backend = "plotly" - -def nav_menu(): - return mo.nav_menu( - { - "/": "Quantflow", - "/api": "API Reference", - } - ) diff --git a/app/utils/paths.py b/app/utils/paths.py index 4ef2f26d..c1243083 100644 --- a/app/utils/paths.py +++ b/app/utils/paths.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing import Any APP_PATH = Path(__file__).parent.parent @@ -7,7 +8,7 @@ def head_snippet(path: Path) -> str: return (path / "assets" / "logos" / "head-snippet.html").read_text() -def on_post_page(output: str, page, config) -> str: +def on_post_page(output: str, page: Any, config: Any) -> str: """Hook to inject custom HTML into the head of each page in mkdocs build.""" snippet = head_snippet(APP_PATH.parent / "docs") return output.replace("", f"{snippet}", 1) diff --git a/app/utils/static.py b/app/utils/static.py new file mode 100644 index 00000000..b9175d9c --- /dev/null +++ b/app/utils/static.py @@ -0,0 +1,15 @@ +from typing import Any + +from fastapi.staticfiles import StaticFiles +from starlette.exceptions import HTTPException +from starlette.responses import Response + + +class HtmlFallbackStaticFiles(StaticFiles): + async def get_response(self, path: str, scope: Any) -> Response: + try: + return await super().get_response(path, scope) + except HTTPException as e: + if e.status_code == 404: + return await super().get_response(path + ".html", scope) + raise diff --git a/app/volatility_surface.py b/app/volatility_surface.py deleted file mode 100644 index b0ac27eb..00000000 --- a/app/volatility_surface.py +++ /dev/null @@ -1,118 +0,0 @@ -import marimo - -__generated_with = "0.22.0" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - from app.utils import nav_menu - nav_menu() - return (mo,) - - -@app.cell(hide_code=True) -def _(mo): - mo.md(r""" - # Volatility Surface - - In this notebook we illustrate the use of the Volatility Surface tool in the library. We use [deribit](https://docs.deribit.com/) options on ETHUSD as example. - - The library provide a [VolSurfaceLoader](api/options/vol_surface/#quantflow.options.surface.VolSurfaceLoader) for Deribit: - - ```python - import pandas as pd - from quantflow.data.deribit import Deribit - - async with Deribit() as cli: - loader = await cli.volatility_surface_loader("eth", exclude_open_interest=0) - - # build the volatility surface - surface = loader.surface() - # calculate black implied volatilities - surface.bs() - # disable outliers - surface.disable_outliers() - # display inputs - only options with converged implied volatility - surface_inputs = surface.inputs(converged=True) - pd.DataFrame([i.model_dump() for i in surface_inputs.inputs]) - ``` - """) - return - - -@app.cell -def _(mo): - asset = mo.ui.dropdown(["btc", "eth", "sol"], value="btc", label="asset") - inverse = mo.ui.checkbox(value=True, label="Inverse options") - mo.hstack([asset, inverse]) - return asset, inverse - - -@app.cell -async def _(asset, inverse, mo): - import pandas as pd - from quantflow.data.deribit import Deribit - - async with Deribit() as cli: - loader = await cli.volatility_surface_loader( - asset.value, - inverse=inverse.value, - use_perp=not inverse.value - ) - - # build the volatility surface - surface = loader.surface() - # calculate black implied volatilities - surface.bs() - # disable outliers - surface.disable_outliers() - # - def int_or_none(v): - try: - return int(v) - except TypeError: - return None - - maturites = [c.maturity for c in surface.maturities] - maturity_dropdown = mo.ui.dropdown( - options={m.strftime("%Y-%m-%d"): i for i, m in enumerate(maturites)}, - label="Maturity" - ) - maturity_dropdown - return int_or_none, maturity_dropdown, pd, surface - - -@app.cell -def _(int_or_none, maturity_dropdown, surface): - index = int_or_none(maturity_dropdown.value) - surface.plot3d(index=index) - return (index,) - - -@app.cell -def _(index, pd, surface): - # display inputs - only options with converged implied volatility - surface_inputs = surface.inputs(converged=True, index=index) - pd.DataFrame([i.model_dump() for i in surface_inputs.inputs]) - return - - -@app.cell -def _(surface): - ts = surface.term_structure() - ts - return (ts,) - - -@app.cell -def _(ts): - from quantflow.utils import plot - - plot.plot_lines(ts, x="ttm", y="rate_percent") - return - - -if __name__ == "__main__": - app.run() diff --git a/dev/api-serve b/dev/api-serve new file mode 100755 index 00000000..c14a5586 --- /dev/null +++ b/dev/api-serve @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -e + +API_PORT=${API_PORT:-8001} + +echo "API: http://127.0.0.1:${API_PORT}" + +uv run uvicorn \ + app.__main__:crate_app \ + --factory \ + --host 127.0.0.1 \ + --port ${API_PORT} \ + --reload \ + --reload-dir app \ + --reload-dir quantflow diff --git a/dev/docs-serve b/dev/docs-serve new file mode 100755 index 00000000..4e44b39b --- /dev/null +++ b/dev/docs-serve @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -e + +OBSERVABLE_PORT=${OBSERVABLE_PORT:-3001} +DOCS_PORT=${DOCS_PORT:-8000} +API_PORT=${API_PORT:-8001} +FRONTEND_ORIGIN=${FRONTEND_ORIGIN:-http://127.0.0.1:${OBSERVABLE_PORT}} +QUANTFLOW_API_ORIGIN=${QUANTFLOW_API_ORIGIN:-http://127.0.0.1:${API_PORT}} + +npm --prefix app/frontend exec concurrently -- \ + --kill-others \ + --names docs,examples,api \ + --prefix "[{name}]" \ + "DOCS_PORT=${DOCS_PORT} bash ./dev/mkdocs-serve" \ + "OBSERVABLE_PORT=${OBSERVABLE_PORT} QUANTFLOW_API_ORIGIN=${QUANTFLOW_API_ORIGIN} bash ./dev/frontend-serve" \ + "API_PORT=${API_PORT} QUANTFLOW_CORS_ORIGINS=${FRONTEND_ORIGIN} bash ./dev/api-serve" diff --git a/dev/frontend-serve b/dev/frontend-serve new file mode 100755 index 00000000..a18a3676 --- /dev/null +++ b/dev/frontend-serve @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -e + +OBSERVABLE_PORT=${OBSERVABLE_PORT:-3001} + +echo "Examples: http://127.0.0.1:${OBSERVABLE_PORT}" + +npm --prefix app/frontend run dev -- --host 127.0.0.1 --port ${OBSERVABLE_PORT} diff --git a/dev/lint b/dev/lint index adfca376..2cde4b93 100755 --- a/dev/lint +++ b/dev/lint @@ -5,7 +5,7 @@ ISORT_ARGS="-c" BLACK_ARG="--check" RUFF_ARG="" TAPLO_ARG="format --check" -PACKAGES="quantflow quantflow_tests docs/examples" +PACKAGES="quantflow quantflow_tests docs/examples app/api app/utils app/__main__.py" if [ "$1" = "fix" ] ; then ISORT_ARGS="" diff --git a/dev/mkdocs-serve b/dev/mkdocs-serve new file mode 100755 index 00000000..a6209383 --- /dev/null +++ b/dev/mkdocs-serve @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -e + +DOCS_PORT=${DOCS_PORT:-8000} + +echo "Documentation: http://127.0.0.1:${DOCS_PORT}" + +uv run mkdocs serve \ + --dev-addr 127.0.0.1:${DOCS_PORT} \ + --livereload \ + --watch quantflow \ + --watch docs diff --git a/dev/quantflow.dockerfile b/dev/quantflow.dockerfile index c9c11afe..7c52811e 100644 --- a/dev/quantflow.dockerfile +++ b/dev/quantflow.dockerfile @@ -13,7 +13,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY pyproject.toml uv.lock readme.md ./ # Install dependencies (no root package, with needed extras) -RUN uv sync --frozen --no-install-project --extra ai --extra book --extra docs --extra data +RUN uv sync --frozen --no-install-project --extra ai --extra docs --extra data # Copy source, generate example outputs and images, then build docs COPY mkdocs.yml ./ diff --git a/dev/serve-info b/dev/serve-info new file mode 100644 index 00000000..82461c8c --- /dev/null +++ b/dev/serve-info @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -e + +OBSERVABLE_PORT=${OBSERVABLE_PORT:-3001} +DOCS_PORT=${DOCS_PORT:-8000} +API_PORT=${API_PORT:-8001} + +echo "Documentation: http://127.0.0.1:${DOCS_PORT}" +echo "Examples: http://127.0.0.1:${OBSERVABLE_PORT}" +echo "API: http://127.0.0.1:${API_PORT}" diff --git a/docs/api/data/index.md b/docs/api/data/index.md index db925569..5ea40949 100644 --- a/docs/api/data/index.md +++ b/docs/api/data/index.md @@ -19,7 +19,7 @@ pip install quantflow[data] | [Financial Modeling Prep](fmp.md) | Equity prices, company profiles, and sector data | | [FRED](fred.md) | US macroeconomic time series from the St. Louis Fed | | [Federal Reserve](fed.md) | Federal Reserve H.15 selected interest rate data | -| [Yahoo](yahoo.md) | Equity option chains from Yahoo Finance | +| [Yahoo](yahoo.md) | Equity prices and option chains from Yahoo Finance | ## Usage diff --git a/docs/api/options/black.md b/docs/api/options/black.md index 5107fdbd..9da130af 100644 --- a/docs/api/options/black.md +++ b/docs/api/options/black.md @@ -3,10 +3,10 @@ Here we define the [log strike](../../glossary.md#log-strike) `k` as \begin{equation} - k = \log{\frac{K}{F}} + k = \log{\frac{K}{F_\tau}} \end{equation} -where $K$ is the strike price and $F$ is the forward price of the underlying asset. +where $K$ is the strike price and $F_\tau$ is the forward price of the underlying asset at time to maturity $\tau$. ::: quantflow.options.bs.black_price diff --git a/docs/api/options/calibration.md b/docs/api/options/calibration.md index b2eadd87..022ebd48 100644 --- a/docs/api/options/calibration.md +++ b/docs/api/options/calibration.md @@ -1,5 +1,7 @@ # Vol Model Calibration +::: quantflow.options.calibration.base.ResidualKind + ::: quantflow.options.calibration.base.OptionEntry ::: quantflow.options.calibration.base.VolModelCalibration diff --git a/docs/api/options/parity.md b/docs/api/options/parity.md new file mode 100644 index 00000000..35f2fa9b --- /dev/null +++ b/docs/api/options/parity.md @@ -0,0 +1,6 @@ +# Put-Call Parity + + +::: quantflow.options.parity.PutCallParity + +::: quantflow.options.parity.PutCallParities diff --git a/docs/api/options/vol_surface.md b/docs/api/options/vol_surface.md index 666a753b..cc52999e 100644 --- a/docs/api/options/vol_surface.md +++ b/docs/api/options/vol_surface.md @@ -19,8 +19,6 @@ ::: quantflow.options.surface.FwdPrice -::: quantflow.options.surface.ImpliedFwdPrice - ::: quantflow.options.surface.Strike ::: quantflow.options.surface.OptionArrays diff --git a/docs/api/rates/index.md b/docs/api/rates/index.md index bb62d8ed..bea75bc9 100644 --- a/docs/api/rates/index.md +++ b/docs/api/rates/index.md @@ -1 +1,17 @@ # Interest Rates + +The `quantflow.rates` module provides primitives for interest rate modelling: flat rates, yield curves, and curve fitting. + +The central concept is the [discount factor](../../glossary.md#discount-factor) $D_\tau$, the present value of one unit of currency paid at time $\tau$. Every class in this module exposes a `discount_factor` method that computes $D_\tau$ from the configured rate or curve. + +**[Rate](interest_rate.md)** represents a spot or forward interest rate with a chosen compounding frequency (continuous by default) and day count convention. It supports continuous and periodic compounding and can be bootstrapped directly from a spot/forward pair. + +**[YieldCurve](yield_curve.md)** is the abstract base for term-structure models. It defines the interface via `discount_factor` and `instantaneous_forward_rate`, with the two quantities linked by + +\begin{equation} + f(\tau) = -\frac{\partial \ln D_\tau}{\partial \tau} +\end{equation} + +**[NelsonSiegel](nelson_siegel.md)** is a concrete `YieldCurve` implementation that fits a smooth parametric curve to observed zero-coupon rates using the Nelson-Siegel functional form. + +**[Options Discounting](options.md)** provides `YieldCurveCalibration`, the base class for fitting a yield curve to discount factors, and `OptionsDiscountingCalibration`, which bootstraps asset and quote curves from put-call parity observations. diff --git a/docs/api/rates/nelson_siegel.md b/docs/api/rates/nelson_siegel.md new file mode 100644 index 00000000..9b30a719 --- /dev/null +++ b/docs/api/rates/nelson_siegel.md @@ -0,0 +1,3 @@ +# Nelson Siegel Curve + +::: quantflow.rates.nelson_siegel.NelsonSiegel diff --git a/docs/api/rates/options.md b/docs/api/rates/options.md new file mode 100644 index 00000000..9e403bd5 --- /dev/null +++ b/docs/api/rates/options.md @@ -0,0 +1,5 @@ +# Options Discounting + +::: quantflow.rates.options.YieldCurveCalibration + +::: quantflow.rates.options.OptionsDiscountingCalibration diff --git a/docs/api/rates/yield_curve.md b/docs/api/rates/yield_curve.md index f2f41c8b..77e74ce3 100644 --- a/docs/api/rates/yield_curve.md +++ b/docs/api/rates/yield_curve.md @@ -2,5 +2,3 @@ ::: quantflow.rates.yield_curve.YieldCurve - -::: quantflow.rates.nelson_siegel.NelsonSiegel diff --git a/docs/examples/fixtures/volsurface_btc.json b/docs/examples/fixtures/volsurface_btc.json index 35d4d689..e045ae02 100644 --- a/docs/examples/fixtures/volsurface_btc.json +++ b/docs/examples/fixtures/volsurface_btc.json @@ -1,5347 +1,5150 @@ { - "asset": "BTC", - "ref_date": "2026-04-27T08:54:57.694519Z", + "asset": "btc", + "asset_curve": { + "ref_date": "2026-05-21T10:04:10.269985Z", + "curve_type": "no_discount" + }, + "quote_curve": { + "ref_date": "2026-05-21T10:04:10.269985Z", + "curve_type": "nelson_siegel", + "beta1": "-1.3242608183", + "beta2": "1.3324170039", + "beta3": "1.6559934427", + "lambda_": "0.3139300004" + }, "inputs": [ { - "bid": "77775.5", - "ask": "77776", - "open_interest": "987675860", - "volume": "434177180", + "bid": "77596.5", + "ask": "77597", + "open_interest": "1010106310", + "volume": "310861580", "security_type": "spot" }, { - "bid": "77688.0", - "ask": "77847.5", - "open_interest": "0", - "volume": "0", - "maturity": "2026-04-28T08:00:00Z", + "bid": "77567.5", + "ask": "77570", + "open_interest": "6770230", + "volume": "2446790", + "maturity": "2026-05-22T08:00:00Z", "security_type": "forward" }, { "bid": "0.0001", "ask": "0.0002", - "open_interest": "112.9", - "volume": "1727.33", - "strike": "73000", - "maturity": "2026-04-28T08:00:00Z", + "open_interest": "1003", + "volume": "27274.34", + "strike": "74000", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5375622", - "iv_ask": "0.5919214", + "iv_bid": "0.429617", + "iv_ask": "0.4756913", "inverse": true }, { - "bid": "0.0004", - "ask": "0.0006", - "open_interest": "250.8", - "volume": "1424.59", + "bid": "0.0003", + "ask": "0.0004", + "open_interest": "428.6", + "volume": "3943.98", "strike": "75000", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4188391", - "iv_ask": "0.4554825", + "iv_bid": "0.3867369", + "iv_ask": "0.408779", "inverse": true }, { - "bid": "0.0006", - "ask": "0.0008", - "open_interest": "49.3", - "volume": "3460.73", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "76.4", + "volume": "4231.52", "strike": "75500", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3889021", - "iv_ask": "0.4165291", + "iv_bid": "0.3437617", + "iv_ask": "0.3761377", "inverse": true }, { - "bid": "0.001", - "ask": "0.0012", - "open_interest": "100.2", - "volume": "8113.88", + "bid": "0.0008", + "ask": "0.0011", + "open_interest": "656.6", + "volume": "10576.95", "strike": "76000", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3668268", - "iv_ask": "0.3868547", + "iv_bid": "0.3290538", + "iv_ask": "0.360526", "inverse": true }, { - "bid": "0.0016", + "bid": "0.0015", "ask": "0.0019", - "open_interest": "66.7", - "volume": "8226.51", + "open_interest": "86.5", + "volume": "10478.47", "strike": "76500", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3392663", - "iv_ask": "0.3616924", + "iv_bid": "0.3105365", + "iv_ask": "0.3401717", "inverse": true }, { - "bid": "0.0028", - "ask": "0.0032", - "open_interest": "98.1", - "volume": "26045.32", + "bid": "0.0029", + "ask": "0.0033", + "open_interest": "432.3", + "volume": "20894.33", "strike": "77000", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3235727", - "iv_ask": "0.3467574", + "iv_bid": "0.3008514", + "iv_ask": "0.3236012", "inverse": true }, { - "bid": "0.0048", + "bid": "0.005", "ask": "0.0055", - "open_interest": "63.7", - "volume": "24109.03", + "open_interest": "70.9", + "volume": "34549.57", "strike": "77500", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3117853", - "iv_ask": "0.3467488", + "iv_bid": "0.2813215", + "iv_ask": "0.3064808", "inverse": true }, { - "bid": "0.005", - "ask": "0.0055", - "open_interest": "45.5", - "volume": "20438.49", + "bid": "0.0032", + "ask": "0.0036", + "open_interest": "460.9", + "volume": "46727.7", "strike": "78000", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3111888", - "iv_ask": "0.3359649", + "iv_bid": "0.2696848", + "iv_ask": "0.291074", "inverse": true }, { - "bid": "0.0032", - "ask": "0.0035", - "open_interest": "38.8", - "volume": "16645.2", + "bid": "0.0015", + "ask": "0.0019", + "open_interest": "200.2", + "volume": "10400.16", "strike": "78500", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.335916", - "iv_ask": "0.3526992", + "iv_bid": "0.2713719", + "iv_ask": "0.2990356", "inverse": true }, { - "bid": "0.0017", - "ask": "0.0021", - "open_interest": "70.5", - "volume": "12791.91", + "bid": "0.0008", + "ask": "0.0009", + "open_interest": "517.3", + "volume": "23993.21", "strike": "79000", - "maturity": "2026-04-28T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3353014", - "iv_ask": "0.3637628", - "inverse": true - }, - { - "bid": "0.001", - "ask": "0.0012", - "open_interest": "33.7", - "volume": "9985.45", - "strike": "79500", - "maturity": "2026-04-28T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.353494", - "iv_ask": "0.3729134", - "inverse": true - }, - { - "bid": "0.0005", - "ask": "0.0007", - "open_interest": "304.8", - "volume": "11838.5", - "strike": "80000", - "maturity": "2026-04-28T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3582481", - "iv_ask": "0.3870258", - "inverse": true - }, - { - "bid": "0.0003", - "ask": "0.0004", - "open_interest": "78", - "volume": "8399.42", - "strike": "80500", - "maturity": "2026-04-28T08:00:00Z", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3787766", - "iv_ask": "0.4001093", + "iv_bid": "0.2935461", + "iv_ask": "0.3037228", "inverse": true }, { "bid": "0.0002", "ask": "0.0003", - "open_interest": "67.7", - "volume": "2909.5", - "strike": "81000", - "maturity": "2026-04-28T08:00:00Z", + "open_interest": "1156.4", + "volume": "33764.55", + "strike": "80000", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4046507", - "iv_ask": "0.4333609", + "iv_bid": "0.3264002", + "iv_ask": "0.3512333", "inverse": true }, { "bid": "0.0001", "ask": "0.0002", - "open_interest": "101.3", - "volume": "2441.79", - "strike": "82000", - "maturity": "2026-04-28T08:00:00Z", + "open_interest": "994.5", + "volume": "1787.07", + "strike": "81000", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4573552", - "iv_ask": "0.5047645", + "iv_bid": "0.3911805", + "iv_ask": "0.4336455", "inverse": true }, { - "bid": "77700.0", - "ask": "77815.0", - "open_interest": "0", - "volume": "0", - "maturity": "2026-04-29T08:00:00Z", + "bid": "77255", + "ask": "77627.5", + "open_interest": "54290", + "volume": "6260", + "maturity": "2026-05-23T08:00:00Z", "security_type": "forward" }, { "bid": "0.0001", - "ask": "0.0003", - "open_interest": "78.1", - "volume": "949.38", - "strike": "70000", - "maturity": "2026-04-29T08:00:00Z", + "ask": "0.0002", + "open_interest": "28.2", + "volume": "69.95", + "strike": "72000", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5886027", - "iv_ask": "0.6803194", + "iv_bid": "0.4418664", + "iv_ask": "0.485088", "inverse": true }, { "bid": "0.0002", "ask": "0.0004", - "open_interest": "8.8", - "volume": "187.38", - "strike": "71000", - "maturity": "2026-04-29T08:00:00Z", - "option_type": "put", - "security_type": "option", - "iv_bid": "0.5664797", - "iv_ask": "0.6280995", - "inverse": true - }, - { - "bid": "0.0002", - "ask": "0.0005", - "open_interest": "3.6", - "volume": "60.16", - "strike": "72000", - "maturity": "2026-04-29T08:00:00Z", + "open_interest": "84.1", + "volume": "1258.29", + "strike": "73000", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4902668", - "iv_ask": "0.5665876", + "iv_bid": "0.407351", + "iv_ask": "0.4556122", "inverse": true }, { "bid": "0.0004", "ask": "0.0007", - "open_interest": "46", - "volume": "1682.65", - "strike": "73000", - "maturity": "2026-04-29T08:00:00Z", - "option_type": "put", - "security_type": "option", - "iv_bid": "0.4623826", - "iv_ask": "0.5127515", - "inverse": true - }, - { - "bid": "0.0007", - "ask": "0.001", - "open_interest": "32.2", - "volume": "1348.04", + "open_interest": "11.5", + "volume": "371.77", "strike": "74000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4220138", - "iv_ask": "0.4563569", + "iv_bid": "0.3700709", + "iv_ask": "0.4133213", "inverse": true }, { - "bid": "0.001", - "ask": "0.0012", - "open_interest": "20.1", - "volume": "929.25", + "bid": "0.0007", + "ask": "0.0009", + "open_interest": "27.8", + "volume": "200.7", "strike": "74500", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.407718", - "iv_ask": "0.4263311", + "iv_bid": "0.3663527", + "iv_ask": "0.3878956", "inverse": true }, { - "bid": "0.0013", - "ask": "0.0016", - "open_interest": "52.2", - "volume": "2394.27", + "bid": "0.001", + "ask": "0.0013", + "open_interest": "26.7", + "volume": "4071.74", "strike": "75000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3835137", - "iv_ask": "0.4062553", + "iv_bid": "0.3473141", + "iv_ask": "0.3721851", "inverse": true }, { - "bid": "0.0019", - "ask": "0.0023", - "open_interest": "10.9", - "volume": "2131.48", + "bid": "0.0016", + "ask": "0.0019", + "open_interest": "32.7", + "volume": "6591.67", "strike": "75500", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3709432", - "iv_ask": "0.3950226", + "iv_bid": "0.3387223", + "iv_ask": "0.3577577", "inverse": true }, { - "bid": "0.0028", - "ask": "0.003", - "open_interest": "30.5", - "volume": "7010.16", + "bid": "0.0025", + "ask": "0.0028", + "open_interest": "7.8", + "volume": "1423.38", "strike": "76000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3606688", - "iv_ask": "0.3706205", + "iv_bid": "0.3300149", + "iv_ask": "0.3451084", "inverse": true }, { - "bid": "0.0041", - "ask": "0.0044", - "open_interest": "165.7", - "volume": "6172.95", + "bid": "0.0038", + "ask": "0.0041", + "open_interest": "25.6", + "volume": "9566.44", "strike": "76500", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.352067", - "iv_ask": "0.3646061", + "iv_bid": "0.3208607", + "iv_ask": "0.333405", "inverse": true }, { - "bid": "0.006", - "ask": "0.0065", - "open_interest": "44.6", - "volume": "17287.94", + "bid": "0.0055", + "ask": "0.006", + "open_interest": "3.9", + "volume": "1481.76", "strike": "77000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.34822", - "iv_ask": "0.3666432", + "iv_bid": "0.3069603", + "iv_ask": "0.3253663", "inverse": true }, { "bid": "0.008", "ask": "0.009", - "open_interest": "19.8", - "volume": "8876.2", + "open_interest": "18.3", + "volume": "13806.5", "strike": "77500", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3275722", - "iv_ask": "0.362119", + "iv_bid": "0.2989107", + "iv_ask": "0.3336076", "inverse": true }, { - "bid": "0.0085", - "ask": "0.009", - "open_interest": "13.9", - "volume": "9131.59", + "bid": "0.006", + "ask": "0.007", + "open_interest": "329.4", + "volume": "147856.15", "strike": "78000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3407638", - "iv_ask": "0.3579606", + "iv_bid": "0.2874394", + "iv_ask": "0.3229204", "inverse": true }, { - "bid": "0.006", - "ask": "0.0065", - "open_interest": "6.2", - "volume": "5492.23", + "bid": "0.0039", + "ask": "0.0043", + "open_interest": "20.5", + "volume": "7080.72", "strike": "78500", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3423951", - "iv_ask": "0.3606088", + "iv_bid": "0.2913542", + "iv_ask": "0.3072174", "inverse": true }, { - "bid": "0.0041", - "ask": "0.0044", - "open_interest": "5", - "volume": "4461.19", + "bid": "0.0023", + "ask": "0.0027", + "open_interest": "37.4", + "volume": "5866.37", "strike": "79000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3443416", - "iv_ask": "0.3566525", + "iv_bid": "0.28883", + "iv_ask": "0.3081595", "inverse": true }, { - "bid": "0.0027", - "ask": "0.0029", - "open_interest": "21.4", - "volume": "15740.49", + "bid": "0.0013", + "ask": "0.0017", + "open_interest": "15.1", + "volume": "612.35", "strike": "79500", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3458753", - "iv_ask": "0.3556803", + "iv_bid": "0.2890175", + "iv_ask": "0.3142938", "inverse": true }, { - "bid": "0.0018", - "ask": "0.002", - "open_interest": "136.9", - "volume": "46707.64", + "bid": "0.0009", + "ask": "0.001", + "open_interest": "41.3", + "volume": "1458", "strike": "80000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.352621", - "iv_ask": "0.3647188", + "iv_bid": "0.3084363", + "iv_ask": "0.3168659", "inverse": true }, { - "bid": "0.0012", - "ask": "0.0015", - "open_interest": "57", - "volume": "21009.19", + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "4", + "volume": "293.59", "strike": "80500", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3609259", - "iv_ask": "0.3835217", + "iv_bid": "0.3113354", + "iv_ask": "0.3346143", "inverse": true }, { - "bid": "0.0008", - "ask": "0.001", - "open_interest": "31.3", - "volume": "7861.02", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "63.4", + "volume": "587.34", "strike": "81000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3699856", - "iv_ask": "0.3896471", + "iv_bid": "0.320528", + "iv_ask": "0.3524184", "inverse": true }, { - "bid": "0.0004", - "ask": "0.0006", - "open_interest": "3.6", - "volume": "428.85", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "33", + "volume": "681.71", "strike": "82000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3969482", - "iv_ask": "0.4280958", + "iv_bid": "0.33562", + "iv_ask": "0.3945901", "inverse": true }, { - "bid": "0.0002", - "ask": "0.0004", - "open_interest": "22.9", - "volume": "905.57", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "2.6", + "volume": "48.27", "strike": "83000", - "maturity": "2026-04-29T08:00:00Z", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4214744", - "iv_ask": "0.4699667", + "iv_bid": "0.3986911", + "iv_ask": "0.4379765", "inverse": true }, { - "bid": "0.0001", - "ask": "0.0003", - "open_interest": "10.1", - "volume": "523.75", - "strike": "84000", - "maturity": "2026-04-29T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.4439978", - "iv_ask": "0.5163625", - "inverse": true + "bid": "77270", + "ask": "77835", + "open_interest": "10410", + "volume": "10150", + "maturity": "2026-05-24T08:00:00Z", + "security_type": "forward" }, { "bid": "0.0001", - "ask": "0.0003", - "open_interest": "13.4", - "volume": "171.28", - "strike": "85000", - "maturity": "2026-04-29T08:00:00Z", - "option_type": "call", + "ask": "0.0002", + "open_interest": "1.5", + "volume": "30.39", + "strike": "70000", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.5028555", - "iv_ask": "0.5823179", + "iv_bid": "0.4748059", + "iv_ask": "0.5185349", "inverse": true }, { - "bid": "77709.5", - "ask": "77821.5", - "open_interest": "0", - "volume": "0", - "maturity": "2026-04-30T08:00:00Z", - "security_type": "forward" - }, - { - "bid": "0.0003", - "ask": "0.0005", - "open_interest": "56.5", - "volume": "2535.67", - "strike": "69000", - "maturity": "2026-04-30T08:00:00Z", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "10.6", + "volume": "2.33", + "strike": "71000", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6190282", - "iv_ask": "0.6685198", + "iv_bid": "0.416506", + "iv_ask": "0.4559338", "inverse": true }, { - "bid": "0.0004", - "ask": "0.0006", - "open_interest": "0.1", - "volume": "3.9", - "strike": "70000", - "maturity": "2026-04-30T08:00:00Z", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "8.8", + "volume": "25.56", + "strike": "72000", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5787191", - "iv_ask": "0.6181027", + "iv_bid": "0.3932479", + "iv_ask": "0.4378054", "inverse": true }, { - "bid": "0.0006", - "ask": "0.0008", - "open_interest": "0.4", - "volume": "21.79", - "strike": "71000", - "maturity": "2026-04-30T08:00:00Z", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "27.4", + "volume": "518.23", + "strike": "73000", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5476061", - "iv_ask": "0.5768897", + "iv_bid": "0.3693727", + "iv_ask": "0.397771", "inverse": true }, { "bid": "0.0008", "ask": "0.001", - "open_interest": "0.7", - "volume": "45.13", - "strike": "72000", - "maturity": "2026-04-30T08:00:00Z", + "open_interest": "112.5", + "volume": "9228", + "strike": "74000", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5033645", - "iv_ask": "0.5263468", + "iv_bid": "0.3448846", + "iv_ask": "0.3626844", "inverse": true }, { "bid": "0.0011", "ask": "0.0014", - "open_interest": "127.2", - "volume": "13425.15", - "strike": "73000", - "maturity": "2026-04-30T08:00:00Z", - "option_type": "put", - "security_type": "option", - "iv_bid": "0.4592521", - "iv_ask": "0.4852733", - "inverse": true - }, - { - "bid": "0.0018", - "ask": "0.002", - "open_interest": "26", - "volume": "4001.11", - "strike": "74000", - "maturity": "2026-04-30T08:00:00Z", + "open_interest": "9.3", + "volume": "501.87", + "strike": "74500", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4306846", - "iv_ask": "0.4433194", + "iv_bid": "0.3301382", + "iv_ask": "0.3512342", "inverse": true }, { - "bid": "0.0029", - "ask": "0.0033", - "open_interest": "32.2", - "volume": "8385.22", + "bid": "0.0016", + "ask": "0.0019", + "open_interest": "59.9", + "volume": "7354.21", "strike": "75000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3990423", - "iv_ask": "0.4174519", + "iv_bid": "0.3199972", + "iv_ask": "0.3368257", "inverse": true }, { - "bid": "0.0038", - "ask": "0.0042", - "open_interest": "19.5", - "volume": "8779.89", + "bid": "0.0022", + "ask": "0.0026", + "open_interest": "29.2", + "volume": "7246.7", "strike": "75500", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3873955", - "iv_ask": "0.4033429", + "iv_bid": "0.3046823", + "iv_ask": "0.3230649", "inverse": true }, { - "bid": "0.005", - "ask": "0.0055", - "open_interest": "18.1", - "volume": "6707.94", + "bid": "0.0033", + "ask": "0.0036", + "open_interest": "5.9", + "volume": "2617.8", "strike": "76000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3772585", - "iv_ask": "0.3947663", + "iv_bid": "0.2995157", + "iv_ask": "0.3109128", "inverse": true }, { - "bid": "0.0065", - "ask": "0.0075", - "open_interest": "3.5", - "volume": "2969.98", + "bid": "0.0047", + "ask": "0.0055", + "open_interest": "4.3", + "volume": "3662.7", "strike": "76500", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.366274", - "iv_ask": "0.3977172", + "iv_bid": "0.290402", + "iv_ask": "0.3163913", "inverse": true }, { - "bid": "0.0085", - "ask": "0.009", - "open_interest": "17.1", - "volume": "13690.5", + "bid": "0.0065", + "ask": "0.0075", + "open_interest": "10.3", + "volume": "6978.72", "strike": "77000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3586642", - "iv_ask": "0.3732924", + "iv_bid": "0.2788022", + "iv_ask": "0.3082419", "inverse": true }, { - "bid": "0.011", - "ask": "0.012", - "open_interest": "26.7", - "volume": "22941.75", + "bid": "0.009", + "ask": "0.01", + "open_interest": "25.3", + "volume": "25783.65", "strike": "77500", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3521661", - "iv_ask": "0.3801943", + "iv_bid": "0.2707164", + "iv_ask": "0.2988297", "inverse": true }, { - "bid": "0.0115", - "ask": "0.012", - "open_interest": "114.8", - "volume": "125803.96", + "bid": "0.007", + "ask": "0.008", + "open_interest": "12.6", + "volume": "12412.58", "strike": "78000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3598777", - "iv_ask": "0.3738297", + "iv_bid": "0.2614019", + "iv_ask": "0.289999", "inverse": true }, { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "18", - "volume": "21300.07", + "bid": "0.0048", + "ask": "0.0055", + "open_interest": "3.4", + "volume": "1501.51", "strike": "78500", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3508133", - "iv_ask": "0.3796688", + "iv_bid": "0.2645518", + "iv_ask": "0.2863374", "inverse": true }, { - "bid": "0.0065", - "ask": "0.007", - "open_interest": "112", - "volume": "142139.84", + "bid": "0.0031", + "ask": "0.0035", + "open_interest": "14.2", + "volume": "5268.42", "strike": "79000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3565683", - "iv_ask": "0.37206", + "iv_bid": "0.2645833", + "iv_ask": "0.2791584", "inverse": true }, { - "bid": "0.0048", - "ask": "0.0055", - "open_interest": "82.4", - "volume": "56724.13", + "bid": "0.002", + "ask": "0.0022", + "open_interest": "25.4", + "volume": "2653.6", "strike": "79500", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3584929", - "iv_ask": "0.3824691", + "iv_bid": "0.2687246", + "iv_ask": "0.2777732", "inverse": true }, { - "bid": "0.0034", - "ask": "0.0038", - "open_interest": "24", - "volume": "11431.76", + "bid": "0.0013", + "ask": "0.0015", + "open_interest": "25.8", + "volume": "3810.16", "strike": "80000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3573297", - "iv_ask": "0.3732309", + "iv_bid": "0.2754615", + "iv_ask": "0.2869724", "inverse": true }, { - "bid": "0.0024", - "ask": "0.0028", - "open_interest": "160", - "volume": "72073.42", + "bid": "0.0008", + "ask": "0.001", + "open_interest": "0.9", + "volume": "76.81", "strike": "80500", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3589487", - "iv_ask": "0.3777727", + "iv_bid": "0.2794076", + "iv_ask": "0.2947166", "inverse": true }, { - "bid": "0.0017", - "ask": "0.0019", - "open_interest": "14.6", - "volume": "5405.8", - "strike": "81000", - "maturity": "2026-04-30T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3629189", - "iv_ask": "0.3744968", - "inverse": true - }, - { - "bid": "0.0012", - "ask": "0.0014", - "open_interest": "1.9", - "volume": "195.91", - "strike": "81500", - "maturity": "2026-04-30T08:00:00Z", + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "63.7", + "volume": "2239.71", + "strike": "81000", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3677125", - "iv_ask": "0.3819824", + "iv_bid": "0.2854745", + "iv_ask": "0.3059472", "inverse": true }, { - "bid": "0.0008", - "ask": "0.001", - "open_interest": "42.8", - "volume": "6840.17", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "0.4", + "volume": "12.39", "strike": "82000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3687651", - "iv_ask": "0.3870011", + "iv_bid": "0.2998333", + "iv_ask": "0.335726", "inverse": true }, { - "bid": "0.0004", - "ask": "0.0006", - "open_interest": "33.7", - "volume": "3504.41", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "0.1", + "volume": "1.56", "strike": "83000", - "maturity": "2026-04-30T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3819902", - "iv_ask": "0.4104745", - "inverse": true - }, - { - "bid": "0.0002", - "ask": "0.0004", - "open_interest": "50.6", - "volume": "3508.83", - "strike": "84000", - "maturity": "2026-04-30T08:00:00Z", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3955028", - "iv_ask": "0.4392871", + "iv_bid": "0.3230049", + "iv_ask": "0.3772798", "inverse": true }, { "bid": "0.0001", - "ask": "0.0003", - "open_interest": "46.2", - "volume": "2409.81", - "strike": "85000", - "maturity": "2026-04-30T08:00:00Z", + "ask": "0.0002", + "open_interest": "2.3", + "volume": "42.78", + "strike": "84000", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4088416", - "iv_ask": "0.4734637", + "iv_bid": "0.3725421", + "iv_ask": "0.4080264", "inverse": true }, { - "bid": "77730", - "ask": "77732.5", - "open_interest": "30198620", - "volume": "5038760", - "maturity": "2026-05-01T08:00:00Z", + "bid": "77275", + "ask": "77840", + "open_interest": "0", + "volume": "0", + "maturity": "2026-05-25T08:00:00Z", "security_type": "forward" }, { "bid": "0.0001", - "ask": "0.0003", - "open_interest": "996.5", - "volume": "1651.85", - "strike": "65000", - "maturity": "2026-05-01T08:00:00Z", + "ask": "0.0002", + "open_interest": "20", + "volume": "155.41", + "strike": "69000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6662974", - "iv_ask": "0.7605", + "iv_bid": "0.4602006", + "iv_ask": "0.5015937", "inverse": true }, { "bid": "0.0001", "ask": "0.0002", - "open_interest": "774.4", - "volume": "460.43", - "strike": "66000", - "maturity": "2026-05-01T08:00:00Z", + "open_interest": "0", + "volume": "0", + "strike": "70000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.614914", - "iv_ask": "0.6671515", + "iv_bid": "0.4097721", + "iv_ask": "0.4475098", "inverse": true }, { - "bid": "0.0003", - "ask": "0.0005", - "open_interest": "551.5", - "volume": "13.36", - "strike": "68000", - "maturity": "2026-05-01T08:00:00Z", + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "0", + "volume": "0", + "strike": "71000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5898027", - "iv_ask": "0.6359126", + "iv_bid": "0.3934965", + "iv_ask": "0.4173482", "inverse": true }, { "bid": "0.0004", - "ask": "0.0006", - "open_interest": "213.5", - "volume": "1598.06", - "strike": "69000", - "maturity": "2026-05-01T08:00:00Z", - "option_type": "put", - "security_type": "option", - "iv_bid": "0.5565995", - "iv_ask": "0.5934968", - "inverse": true - }, - { - "bid": "0.0005", - "ask": "0.0007", - "open_interest": "1573.6", - "volume": "1174.28", - "strike": "70000", - "maturity": "2026-05-01T08:00:00Z", + "ask": "0.0005", + "open_interest": "0", + "volume": "0", + "strike": "72000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5166318", - "iv_ask": "0.5469371", + "iv_bid": "0.3778649", + "iv_ask": "0.3925531", "inverse": true }, { - "bid": "0.0008", - "ask": "0.0011", - "open_interest": "447.3", - "volume": "1654.46", - "strike": "71000", - "maturity": "2026-05-01T08:00:00Z", + "bid": "0.0007", + "ask": "0.0009", + "open_interest": "1.2", + "volume": "74.52", + "strike": "73000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4968149", - "iv_ask": "0.5286282", + "iv_bid": "0.3538191", + "iv_ask": "0.3725539", "inverse": true }, { - "bid": "0.0012", - "ask": "0.0014", - "open_interest": "1153.7", - "volume": "20262.68", - "strike": "72000", - "maturity": "2026-05-01T08:00:00Z", + "bid": "0.0014", + "ask": "0.0015", + "open_interest": "5.8", + "volume": "672.77", + "strike": "74000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4707589", - "iv_ask": "0.487009", + "iv_bid": "0.3397653", + "iv_ask": "0.3458473", "inverse": true }, { - "bid": "0.0017", - "ask": "0.002", - "open_interest": "679", - "volume": "3836.82", - "strike": "73000", - "maturity": "2026-05-01T08:00:00Z", + "bid": "0.0026", + "ask": "0.0029", + "open_interest": "0", + "volume": "0", + "strike": "75000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4374705", - "iv_ask": "0.4559868", + "iv_bid": "0.3215794", + "iv_ask": "0.3338328", "inverse": true }, { - "bid": "0.0027", - "ask": "0.0031", - "open_interest": "431.6", - "volume": "6673.85", - "strike": "74000", - "maturity": "2026-05-01T08:00:00Z", + "bid": "0.0035", + "ask": "0.0039", + "open_interest": "0.2", + "volume": "49.79", + "strike": "75500", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.415717", - "iv_ask": "0.4340148", + "iv_bid": "0.3120235", + "iv_ask": "0.3259059", "inverse": true }, { - "bid": "0.0044", - "ask": "0.0047", - "open_interest": "584.5", - "volume": "64541.48", - "strike": "75000", - "maturity": "2026-05-01T08:00:00Z", + "bid": "0.0048", + "ask": "0.0055", + "open_interest": "53.9", + "volume": "19215.72", + "strike": "76000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3987878", - "iv_ask": "0.4093333", + "iv_bid": "0.3060527", + "iv_ask": "0.3270361", "inverse": true }, { - "bid": "0.007", - "ask": "0.0075", - "open_interest": "1073.9", - "volume": "30847.2", - "strike": "76000", - "maturity": "2026-05-01T08:00:00Z", + "bid": "0.0065", + "ask": "0.007", + "open_interest": "0.2", + "volume": "93.26", + "strike": "76500", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3816549", - "iv_ask": "0.395859", + "iv_bid": "0.3006115", + "iv_ask": "0.3141044", "inverse": true }, { - "bid": "0.011", - "ask": "0.0115", - "open_interest": "565.5", - "volume": "89851.21", + "bid": "0.0085", + "ask": "0.0095", + "open_interest": "0", + "volume": "0", "strike": "77000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3685241", - "iv_ask": "0.3809728", + "iv_bid": "0.2914305", + "iv_ask": "0.316497", "inverse": true }, { - "bid": "0.0135", - "ask": "0.0145", - "open_interest": "6.3", - "volume": "7191.7", + "bid": "0.011", + "ask": "0.012", + "open_interest": "0", + "volume": "0", "strike": "77500", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3600164", - "iv_ask": "0.3841877", + "iv_bid": "0.2823985", + "iv_ask": "0.3066479", "inverse": true }, { - "bid": "0.0135", - "ask": "0.014", - "open_interest": "520.4", - "volume": "84779.86", + "bid": "0.009", + "ask": "0.01", + "open_interest": "0.9", + "volume": "767.01", "strike": "78000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3642812", - "iv_ask": "0.3763406", + "iv_bid": "0.2745331", + "iv_ask": "0.2990391", "inverse": true }, { - "bid": "0.0105", - "ask": "0.011", - "open_interest": "0.2", - "volume": "155.35", + "bid": "0.0065", + "ask": "0.0075", + "open_interest": "0.1", + "volume": "50.42", "strike": "78500", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3573817", - "iv_ask": "0.3697657", + "iv_bid": "0.2732062", + "iv_ask": "0.2991565", "inverse": true }, { - "bid": "0.008", - "ask": "0.009", - "open_interest": "471.1", - "volume": "209444.25", + "bid": "0.0049", + "ask": "0.0055", + "open_interest": "0.5", + "volume": "216.24", "strike": "79000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3519466", - "iv_ask": "0.3780838", + "iv_bid": "0.282447", + "iv_ask": "0.2995996", "inverse": true }, { - "bid": "0.0047", - "ask": "0.005", - "open_interest": "1442.7", - "volume": "137543.46", + "bid": "0.0034", + "ask": "0.0037", + "open_interest": "1.8", + "volume": "553.88", + "strike": "79500", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.2823709", + "iv_ask": "0.2923432", + "inverse": true + }, + { + "bid": "0.0023", + "ask": "0.0027", + "open_interest": "4.2", + "volume": "933.71", "strike": "80000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3553669", - "iv_ask": "0.3649151", + "iv_bid": "0.2827487", + "iv_ask": "0.2986393", "inverse": true }, { - "bid": "0.0025", - "ask": "0.0028", - "open_interest": "491.3", - "volume": "110407.93", + "bid": "0.0016", + "ask": "0.0019", + "open_interest": "0.1", + "volume": "15.58", + "strike": "80500", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.2876692", + "iv_ask": "0.3023128", + "inverse": true + }, + { + "bid": "0.0011", + "ask": "0.0013", + "open_interest": "1.6", + "volume": "161.97", "strike": "81000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3540833", - "iv_ask": "0.3669875", + "iv_bid": "0.2925095", + "iv_ask": "0.3048741", "inverse": true }, { - "bid": "0.0014", - "ask": "0.0016", - "open_interest": "825.1", - "volume": "69654.05", + "bid": "0.0006", + "ask": "0.0007", + "open_interest": "2.1", + "volume": "114.46", "strike": "82000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.364147", - "iv_ask": "0.3763902", + "iv_bid": "0.3120796", + "iv_ask": "0.3217238", "inverse": true }, { - "bid": "0.0008", - "ask": "0.0009", - "open_interest": "667.4", - "volume": "8398.29", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "0", + "volume": "0", "strike": "83000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3771286", - "iv_ask": "0.3862035", + "iv_bid": "0.3254275", + "iv_ask": "0.354409", "inverse": true }, { - "bid": "0.0004", - "ask": "0.0006", - "open_interest": "129.8", - "volume": "3924.17", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "0", + "volume": "0", "strike": "84000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3816245", - "iv_ask": "0.408895", + "iv_bid": "0.3519634", + "iv_ask": "0.3906923", "inverse": true }, { - "bid": "0.0003", - "ask": "0.0005", - "open_interest": "954.6", - "volume": "415.26", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "0", + "volume": "0", "strike": "85000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4110852", - "iv_ask": "0.4453186", + "iv_bid": "0.3629208", + "iv_ask": "0.4200007", "inverse": true }, { - "bid": "0.0002", + "bid": "0.0001", "ask": "0.0003", - "open_interest": "39.2", - "volume": "306.28", + "open_interest": "0", + "volume": "0", "strike": "86000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4312223", - "iv_ask": "0.4561907", + "iv_bid": "0.4034472", + "iv_ask": "0.4652873", "inverse": true }, { "bid": "0.0001", "ask": "0.0003", - "open_interest": "205.4", - "volume": "155.2", + "open_interest": "0", + "volume": "0", "strike": "87000", - "maturity": "2026-05-01T08:00:00Z", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4347883", - "iv_ask": "0.5001501", + "iv_bid": "0.4430337", + "iv_ask": "0.5094337", "inverse": true }, { - "bid": "77755", - "ask": "77757.5", - "open_interest": "2718240", - "volume": "2864240", - "maturity": "2026-05-08T08:00:00Z", + "bid": "77615", + "ask": "77617.5", + "open_interest": "96001750", + "volume": "6722440", + "maturity": "2026-05-29T08:00:00Z", "security_type": "forward" }, { - "bid": "0.001", - "ask": "0.0012", - "open_interest": "217.3", - "volume": "1119.53", - "strike": "65000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "293.6", + "volume": "125.36", + "strike": "58000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5487305", - "iv_ask": "0.5664115", + "iv_bid": "0.733615", + "iv_ask": "0.7905761", "inverse": true }, { - "bid": "0.0012", - "ask": "0.0014", - "open_interest": "370.2", - "volume": "5839.88", - "strike": "66000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "338.8", + "volume": "1.56", + "strike": "59000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5257564", - "iv_ask": "0.5409071", + "iv_bid": "0.6942328", + "iv_ask": "0.7486132", "inverse": true }, { - "bid": "0.0018", - "ask": "0.002", - "open_interest": "1041.1", - "volume": "14507.73", - "strike": "68000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "1979.6", + "volume": "926.56", + "strike": "60000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4824045", - "iv_ask": "0.493292", + "iv_bid": "0.65537", + "iv_ask": "0.7071899", "inverse": true }, { - "bid": "0.0029", - "ask": "0.0032", - "open_interest": "108.4", - "volume": "3075.54", - "strike": "70000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "303.5", + "volume": "0", + "strike": "61000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4446109", - "iv_ask": "0.455945", + "iv_bid": "0.6169972", + "iv_ask": "0.6662741", "inverse": true }, { - "bid": "0.0038", - "ask": "0.0041", - "open_interest": "137", - "volume": "11800.49", - "strike": "71000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "303.5", + "volume": "209.54", + "strike": "62000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4289334", - "iv_ask": "0.4383776", + "iv_bid": "0.579085", + "iv_ask": "0.6578869", "inverse": true }, { - "bid": "0.005", - "ask": "0.0055", - "open_interest": "170.8", - "volume": "22088.81", - "strike": "72000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "424.9", + "volume": "3107.24", + "strike": "63000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4139109", - "iv_ask": "0.4270395", + "iv_bid": "0.5858339", + "iv_ask": "0.6162078", "inverse": true }, { - "bid": "0.0065", - "ask": "0.007", - "open_interest": "192.5", - "volume": "6559.66", - "strike": "73000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "363.1", + "volume": "3.12", + "strike": "64000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3974257", - "iv_ask": "0.4086612", + "iv_bid": "0.5462422", + "iv_ask": "0.5976688", "inverse": true }, { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "621.5", - "volume": "42889.31", - "strike": "74000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "2450.1", + "volume": "1217.8", + "strike": "65000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3820314", - "iv_ask": "0.4013904", + "iv_bid": "0.5340454", + "iv_ask": "0.5735944", "inverse": true }, { - "bid": "0.012", - "ask": "0.0125", - "open_interest": "255.4", - "volume": "107071.38", - "strike": "75000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "1059.4", + "volume": "2275.24", + "strike": "66000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3824536", - "iv_ask": "0.3909715", + "iv_bid": "0.5136121", + "iv_ask": "0.5456127", "inverse": true }, { - "bid": "0.0155", - "ask": "0.0165", - "open_interest": "87.3", - "volume": "28202.41", - "strike": "76000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0006", + "ask": "0.0007", + "open_interest": "1112.1", + "volume": "66.84", + "strike": "67000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3687289", - "iv_ask": "0.3842928", + "iv_bid": "0.5020094", + "iv_ask": "0.514634", "inverse": true }, { - "bid": "0.0205", - "ask": "0.021", - "open_interest": "293.6", - "volume": "56530.03", - "strike": "77000", - "maturity": "2026-05-08T08:00:00Z", + "bid": "0.0008", + "ask": "0.0009", + "open_interest": "1307.3", + "volume": "1371.15", + "strike": "68000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3643546", - "iv_ask": "0.3717117", + "iv_bid": "0.4812067", + "iv_ask": "0.491222", "inverse": true }, { - "bid": "0.0235", - "ask": "0.0245", - "open_interest": "441.7", - "volume": "106843.94", - "strike": "78000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3616212", - "iv_ask": "0.3760875", - "inverse": true - }, - { - "bid": "0.0175", - "ask": "0.0185", - "open_interest": "271.8", - "volume": "250080.7", - "strike": "79000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.354168", - "iv_ask": "0.368993", - "inverse": true - }, - { - "bid": "0.013", - "ask": "0.0135", - "open_interest": "574.4", - "volume": "90683.65", - "strike": "80000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3537403", - "iv_ask": "0.3616659", - "inverse": true - }, - { - "bid": "0.0095", - "ask": "0.01", - "open_interest": "438.6", - "volume": "44904.99", - "strike": "81000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.354583", - "iv_ask": "0.36338", - "inverse": true - }, - { - "bid": "0.0065", - "ask": "0.007", - "open_interest": "913.3", - "volume": "154210.98", - "strike": "82000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3493293", - "iv_ask": "0.3595734", - "inverse": true - }, - { - "bid": "0.0031", - "ask": "0.0034", - "open_interest": "939.8", - "volume": "93358.52", - "strike": "84000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3520139", - "iv_ask": "0.3611368", - "inverse": true - }, - { - "bid": "0.0021", - "ask": "0.0024", - "open_interest": "1483.1", - "volume": "57029.06", - "strike": "85000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", + "bid": "0.001", + "ask": "0.0013", + "open_interest": "843.4", + "volume": "2506.83", + "strike": "69000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3542017", - "iv_ask": "0.3657113", + "iv_bid": "0.4543972", + "iv_ask": "0.477926", "inverse": true }, { - "bid": "0.0015", + "bid": "0.0014", "ask": "0.0017", - "open_interest": "302.6", - "volume": "10072.55", - "strike": "86000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3614836", - "iv_ask": "0.3711836", - "inverse": true - }, - { - "bid": "0.0004", - "ask": "0.0006", - "open_interest": "479.2", - "volume": "8258.29", - "strike": "90000", - "maturity": "2026-05-08T08:00:00Z", - "option_type": "call", + "open_interest": "3544.9", + "volume": "28177.55", + "strike": "70000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3908739", - "iv_ask": "0.4149628", + "iv_bid": "0.4366525", + "iv_ask": "0.4551727", "inverse": true }, { - "bid": "77701.5", - "ask": "77862.0", - "open_interest": "0", - "volume": "0", - "maturity": "2026-05-15T08:00:00Z", - "security_type": "forward" - }, - { - "bid": "0.0023", - "ask": "0.0026", - "open_interest": "124.9", - "volume": "813.5", - "strike": "65000", - "maturity": "2026-05-15T08:00:00Z", + "bid": "0.002", + "ask": "0.0023", + "open_interest": "1810", + "volume": "15470.38", + "strike": "71000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5021365", - "iv_ask": "0.5152999", + "iv_bid": "0.4207728", + "iv_ask": "0.4352691", "inverse": true }, { - "bid": "0.006", - "ask": "0.0065", - "open_interest": "70.3", - "volume": "18603.75", - "strike": "70000", - "maturity": "2026-05-15T08:00:00Z", + "bid": "0.0029", + "ask": "0.0032", + "open_interest": "1169.4", + "volume": "1468.49", + "strike": "72000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4268486", - "iv_ask": "0.4377581", + "iv_bid": "0.4068536", + "iv_ask": "0.4182367", "inverse": true }, { - "bid": "0.0095", - "ask": "0.0105", - "open_interest": "124.6", - "volume": "9119.02", - "strike": "72000", - "maturity": "2026-05-15T08:00:00Z", + "bid": "0.0042", + "ask": "0.0045", + "open_interest": "980", + "volume": "5561.06", + "strike": "73000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4077988", - "iv_ask": "0.4244853", + "iv_bid": "0.3937874", + "iv_ask": "0.4028787", "inverse": true }, { - "bid": "0.015", - "ask": "0.016", - "open_interest": "129.5", - "volume": "39340.5", + "bid": "0.0055", + "ask": "0.0065", + "open_interest": "2478.8", + "volume": "44786.16", "strike": "74000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3929067", - "iv_ask": "0.4064881", + "iv_bid": "0.3676371", + "iv_ask": "0.3927052", "inverse": true }, { - "bid": "0.019", - "ask": "0.0195", - "open_interest": "50.7", - "volume": "41847.1", + "bid": "0.008", + "ask": "0.009", + "open_interest": "5082.6", + "volume": "91033.07", "strike": "75000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.390482", - "iv_ask": "0.3967645", + "iv_bid": "0.3568048", + "iv_ask": "0.3779735", "inverse": true }, { - "bid": "0.023", - "ask": "0.024", - "open_interest": "32", - "volume": "49361.37", + "bid": "0.0115", + "ask": "0.0125", + "open_interest": "1627.4", + "volume": "103099.78", "strike": "76000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3796642", - "iv_ask": "0.3915336", + "iv_bid": "0.3477398", + "iv_ask": "0.366378", "inverse": true }, { - "bid": "0.0285", - "ask": "0.0295", - "open_interest": "108.7", - "volume": "56828.82", + "bid": "0.016", + "ask": "0.017", + "open_interest": "826", + "volume": "41062.04", "strike": "77000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.3781084", - "iv_ask": "0.3895557", + "iv_bid": "0.3366352", + "iv_ask": "0.3539406", "inverse": true }, { - "bid": "0.032", - "ask": "0.0325", - "open_interest": "176.4", - "volume": "141630.22", + "bid": "0.017", + "ask": "0.018", + "open_interest": "918.2", + "volume": "387262.01", "strike": "78000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3768078", - "iv_ask": "0.3824578", + "iv_bid": "0.3293645", + "iv_ask": "0.3464361", "inverse": true }, { - "bid": "0.0255", - "ask": "0.0265", - "open_interest": "43.4", - "volume": "48689", + "bid": "0.0115", + "ask": "0.0125", + "open_interest": "752.3", + "volume": "42604.93", "strike": "79000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3671444", - "iv_ask": "0.378566", + "iv_bid": "0.322708", + "iv_ask": "0.340735", "inverse": true }, { - "bid": "0.0205", - "ask": "0.0215", - "open_interest": "85", - "volume": "25163.88", + "bid": "0.0075", + "ask": "0.008", + "open_interest": "6866.8", + "volume": "90507.57", "strike": "80000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3656068", - "iv_ask": "0.3774266", + "iv_bid": "0.3196261", + "iv_ask": "0.3298768", "inverse": true }, { - "bid": "0.016", - "ask": "0.017", - "open_interest": "42.2", - "volume": "7730.4", + "bid": "0.0048", + "ask": "0.005", + "open_interest": "1913.4", + "volume": "72252.34", "strike": "81000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3609931", - "iv_ask": "0.3735362", + "iv_bid": "0.3206313", + "iv_ask": "0.3256201", "inverse": true }, { - "bid": "0.0125", - "ask": "0.0135", - "open_interest": "85.7", - "volume": "9669.77", + "bid": "0.003", + "ask": "0.0032", + "open_interest": "2466", + "volume": "404269.51", "strike": "82000", - "maturity": "2026-05-15T08:00:00Z", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3600389", - "iv_ask": "0.3736357", + "iv_bid": "0.3230775", + "iv_ask": "0.329457", "inverse": true }, { - "bid": "0.0075", - "ask": "0.008", - "open_interest": "460.4", - "volume": "13417.51", - "strike": "84000", - "maturity": "2026-05-15T08:00:00Z", + "bid": "0.0019", + "ask": "0.002", + "open_interest": "1402.3", + "volume": "13095.04", + "strike": "83000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3615357", - "iv_ask": "0.3700621", + "iv_bid": "0.3291435", + "iv_ask": "0.3333866", "inverse": true }, { - "bid": "0.0043", - "ask": "0.0046", - "open_interest": "88.4", - "volume": "7720.93", - "strike": "86000", - "maturity": "2026-05-15T08:00:00Z", + "bid": "0.0011", + "ask": "0.0014", + "open_interest": "1957", + "volume": "17424.15", + "strike": "84000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3628801", - "iv_ask": "0.3698054", + "iv_bid": "0.3299835", + "iv_ask": "0.3472624", "inverse": true }, { - "bid": "0.0015", - "ask": "0.0018", - "open_interest": "129.4", - "volume": "2242.32", - "strike": "90000", - "maturity": "2026-05-15T08:00:00Z", + "bid": "0.0008", + "ask": "0.0011", + "open_interest": "2822.4", + "volume": "20253.4", + "strike": "85000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3782631", - "iv_ask": "0.3918298", + "iv_bid": "0.346729", + "iv_ask": "0.3684132", "inverse": true }, { "bid": "0.0005", - "ask": "0.0007", - "open_interest": "6.1", - "volume": "22.62", - "strike": "95000", - "maturity": "2026-05-15T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.4108303", - "iv_ask": "0.4310875", - "inverse": true - }, - { - "bid": "77812.5", - "ask": "77815", - "open_interest": "67350560", - "volume": "9387130", - "maturity": "2026-05-29T08:00:00Z", - "security_type": "forward" - }, - { - "bid": "0.0007", - "ask": "0.0009", - "open_interest": "739.1", - "volume": "249.12", - "strike": "48000", + "ask": "0.0008", + "open_interest": "1091.7", + "volume": "3790", + "strike": "86000", "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "option_type": "call", "security_type": "option", - "iv_bid": "0.7241261", - "iv_ask": "0.749391", + "iv_bid": "0.3532887", + "iv_ask": "0.38247", "inverse": true }, { - "bid": "0.0008", - "ask": "0.001", - "open_interest": "1250.9", - "volume": "2674.89", - "strike": "50000", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "729", + "volume": "693.45", + "strike": "87000", "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "option_type": "call", "security_type": "option", - "iv_bid": "0.6812462", - "iv_ask": "0.7031067", + "iv_bid": "0.3732087", + "iv_ask": "0.3975479", "inverse": true }, { - "bid": "0.0011", - "ask": "0.0013", - "open_interest": "496.1", - "volume": "47.67", - "strike": "52000", + "bid": "0.0004", + "ask": "0.0005", + "open_interest": "931.8", + "volume": "194.38", + "strike": "88000", "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "option_type": "call", "security_type": "option", - "iv_bid": "0.6567867", - "iv_ask": "0.6737252", + "iv_bid": "0.4044815", + "iv_ask": "0.4182131", "inverse": true }, { - "bid": "0.0014", - "ask": "0.0016", - "open_interest": "472.3", - "volume": "991.8", - "strike": "54000", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "414", + "volume": "216.27", + "strike": "89000", "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "option_type": "call", "security_type": "option", - "iv_bid": "0.6255369", - "iv_ask": "0.6392689", + "iv_bid": "0.3963949", + "iv_ask": "0.4350493", "inverse": true }, { - "bid": "0.0018", - "ask": "0.002", - "open_interest": "525.2", - "volume": "142", - "strike": "56000", + "bid": "0.0003", + "ask": "0.0004", + "open_interest": "1902.4", + "volume": "3275.9", + "strike": "90000", "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "option_type": "call", "security_type": "option", - "iv_bid": "0.5957779", - "iv_ask": "0.6068514", + "iv_bid": "0.4469673", + "iv_ask": "0.4649646", "inverse": true }, { - "bid": "0.002", - "ask": "0.0023", - "open_interest": "527.5", - "volume": "1373.33", - "strike": "57000", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "1034.3", + "volume": "342.53", + "strike": "92000", "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "option_type": "call", "security_type": "option", - "iv_bid": "0.5789308", - "iv_ask": "0.593825", + "iv_bid": "0.4422465", + "iv_ask": "0.5033281", "inverse": true }, { - "bid": "0.0023", - "ask": "0.0026", - "open_interest": "282.7", - "volume": "148.52", - "strike": "58000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", - "security_type": "option", - "iv_bid": "0.5657187", - "iv_ask": "0.579027", - "inverse": true + "bid": "77622.5", + "ask": "77625", + "open_interest": "8424810", + "volume": "2094940", + "maturity": "2026-06-05T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0026", - "ask": "0.0029", - "open_interest": "346", - "volume": "84.41", - "strike": "59000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0014", + "ask": "0.0017", + "open_interest": "257.5", + "volume": "4812.81", + "strike": "65000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5507657", - "iv_ask": "0.5627731", + "iv_bid": "0.4955249", + "iv_ask": "0.5140271", "inverse": true }, { - "bid": "0.003", - "ask": "0.0033", - "open_interest": "852", - "volume": "10889.66", - "strike": "60000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0018", + "ask": "0.0019", + "open_interest": "0.9", + "volume": "133.58", + "strike": "66000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5380795", - "iv_ask": "0.5488048", + "iv_bid": "0.4828669", + "iv_ask": "0.4881512", "inverse": true }, { - "bid": "0.0034", - "ask": "0.0038", - "open_interest": "290.6", - "volume": "262.53", - "strike": "61000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0028", + "ask": "0.0031", + "open_interest": "520.6", + "volume": "150947.3", + "strike": "68000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5234718", - "iv_ask": "0.5362842", + "iv_bid": "0.4517302", + "iv_ask": "0.462836", "inverse": true }, { - "bid": "0.0039", - "ask": "0.0043", - "open_interest": "347.7", - "volume": "304.55", - "strike": "62000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0046", + "ask": "0.0048", + "open_interest": "268.5", + "volume": "11455.2", + "strike": "70000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5102348", - "iv_ask": "0.5217509", + "iv_bid": "0.4267441", + "iv_ask": "0.4320624", "inverse": true }, { - "bid": "0.0045", - "ask": "0.0049", - "open_interest": "275.5", - "volume": "3685.61", - "strike": "63000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.007", + "ask": "0.0075", + "open_interest": "109.1", + "volume": "15346.65", + "strike": "72000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4977308", - "iv_ask": "0.5080668", + "iv_bid": "0.3923341", + "iv_ask": "0.4023312", "inverse": true }, { - "bid": "0.005", - "ask": "0.0055", - "open_interest": "344.9", - "volume": "17058.37", - "strike": "64000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.009", + "ask": "0.01", + "open_interest": "2.3", + "volume": "1259.06", + "strike": "73000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4807026", - "iv_ask": "0.4924656", + "iv_bid": "0.380996", + "iv_ask": "0.3983532", "inverse": true }, { - "bid": "0.006", - "ask": "0.0065", - "open_interest": "967.7", - "volume": "20444.21", - "strike": "65000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.012", + "ask": "0.0125", + "open_interest": "125.3", + "volume": "24915.61", + "strike": "74000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.473088", - "iv_ask": "0.4835113", + "iv_bid": "0.377332", + "iv_ask": "0.3850406", "inverse": true }, { - "bid": "0.007", - "ask": "0.0075", - "open_interest": "767.4", - "volume": "38202.78", - "strike": "66000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.015", + "ask": "0.016", + "open_interest": "180.5", + "volume": "6412.82", + "strike": "75000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4622161", - "iv_ask": "0.4715945", + "iv_bid": "0.3637011", + "iv_ask": "0.3777339", "inverse": true }, { - "bid": "0.008", - "ask": "0.009", - "open_interest": "381.4", - "volume": "19427.36", - "strike": "67000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0195", + "ask": "0.02", + "open_interest": "632.3", + "volume": "13857.69", + "strike": "76000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4486493", - "iv_ask": "0.4655219", + "iv_bid": "0.3608082", + "iv_ask": "0.3673447", "inverse": true }, { - "bid": "0.0095", - "ask": "0.01", - "open_interest": "695.2", - "volume": "2533.12", - "strike": "68000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0245", + "ask": "0.025", + "open_interest": "169", + "volume": "44354.62", + "strike": "77000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4405757", - "iv_ask": "0.4482546", + "iv_bid": "0.35328", + "iv_ask": "0.3595495", "inverse": true }, { - "bid": "0.011", - "ask": "0.012", - "open_interest": "660.7", - "volume": "8364.57", - "strike": "69000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0255", + "ask": "0.026", + "open_interest": "154.4", + "volume": "76667.56", + "strike": "78000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.429087", - "iv_ask": "0.4430004", + "iv_bid": "0.3442852", + "iv_ask": "0.3504889", "inverse": true }, { - "bid": "0.013", - "ask": "0.014", - "open_interest": "3084.5", - "volume": "36353.17", - "strike": "70000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0195", + "ask": "0.0205", + "open_interest": "184.7", + "volume": "16347.49", + "strike": "79000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.4210971", - "iv_ask": "0.4337965", + "iv_bid": "0.3372516", + "iv_ask": "0.3499487", "inverse": true }, { - "bid": "0.0155", - "ask": "0.0165", - "open_interest": "360.6", - "volume": "36300.47", - "strike": "71000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0145", + "ask": "0.0155", + "open_interest": "519.7", + "volume": "86265.15", + "strike": "80000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.4153419", - "iv_ask": "0.4269854", + "iv_bid": "0.3307813", + "iv_ask": "0.3442524", "inverse": true }, { - "bid": "0.0185", - "ask": "0.019", - "open_interest": "1096.9", - "volume": "20156", - "strike": "72000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0105", + "ask": "0.0115", + "open_interest": "343.2", + "volume": "20160.47", + "strike": "81000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.4109078", - "iv_ask": "0.4163026", + "iv_bid": "0.3253839", + "iv_ask": "0.3402158", "inverse": true }, { - "bid": "0.0215", - "ask": "0.0225", - "open_interest": "479.9", - "volume": "673656.53", - "strike": "73000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0075", + "ask": "0.008", + "open_interest": "433", + "volume": "60267.48", + "strike": "82000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.4021122", - "iv_ask": "0.412195", + "iv_bid": "0.3225841", + "iv_ask": "0.3310965", "inverse": true }, { - "bid": "0.0255", - "ask": "0.0265", - "open_interest": "1841.2", - "volume": "36817.48", - "strike": "74000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0055", + "ask": "0.006", + "open_interest": "72.6", + "volume": "5481.62", + "strike": "83000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.3989167", - "iv_ask": "0.4084237", + "iv_bid": "0.3257491", + "iv_ask": "0.3356494", "inverse": true }, { - "bid": "0.03", - "ask": "0.0305", - "open_interest": "991.1", - "volume": "84666.73", - "strike": "75000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0039", + "ask": "0.0043", + "open_interest": "99", + "volume": "1220.48", + "strike": "84000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.3956157", - "iv_ask": "0.400154", + "iv_bid": "0.3267716", + "iv_ask": "0.3363094", "inverse": true }, { - "bid": "0.035", - "ask": "0.0355", - "open_interest": "981.3", - "volume": "90930.8", - "strike": "76000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.0028", + "ask": "0.0032", + "open_interest": "595.7", + "volume": "158700.42", + "strike": "85000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.3920165", - "iv_ask": "0.396398", + "iv_bid": "0.3302033", + "iv_ask": "0.3417768", "inverse": true }, { - "bid": "0.0405", - "ask": "0.041", - "open_interest": "241.5", - "volume": "303035.32", - "strike": "77000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "put", + "bid": "0.002", + "ask": "0.0023", + "open_interest": "177.4", + "volume": "1256.25", + "strike": "86000", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", "security_type": "option", - "iv_bid": "0.3879827", - "iv_ask": "0.3922652", + "iv_bid": "0.3338807", + "iv_ask": "0.3446652", "inverse": true }, { - "bid": "0.044", - "ask": "0.045", - "open_interest": "1029.4", - "volume": "413684.52", - "strike": "78000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0011", + "ask": "0.0014", + "open_interest": "603.4", + "volume": "2413.16", + "strike": "88000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3825106", - "iv_ask": "0.390987", + "iv_bid": "0.3470625", + "iv_ask": "0.3631434", "inverse": true }, { - "bid": "0.038", - "ask": "0.039", - "open_interest": "330.9", - "volume": "93354.3", - "strike": "79000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0007", + "ask": "0.0008", + "open_interest": "54.3", + "volume": "177.63", + "strike": "90000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3803055", - "iv_ask": "0.3888008", + "iv_bid": "0.3678199", + "iv_ask": "0.3758029", "inverse": true }, { - "bid": "0.0325", - "ask": "0.0335", - "open_interest": "7198.7", - "volume": "14159.05", - "strike": "80000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "276.8", + "volume": "0", + "strike": "95000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3774939", - "iv_ask": "0.3861169", + "iv_bid": "0.4047617", + "iv_ask": "0.4250875", "inverse": true }, { - "bid": "0.0275", - "ask": "0.0285", - "open_interest": "1002.5", - "volume": "58284.14", - "strike": "81000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.374137", - "iv_ask": "0.3830036", - "inverse": true + "bid": "77572.5", + "ask": "77670", + "open_interest": "3160", + "volume": "3170", + "maturity": "2026-06-12T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.023", - "ask": "0.024", - "open_interest": "4595.2", - "volume": "260884.82", - "strike": "82000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", + "bid": "0.0029", + "ask": "0.0033", + "open_interest": "1", + "volume": "489.73", + "strike": "65000", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3703197", - "iv_ask": "0.3795593", + "iv_bid": "0.4740863", + "iv_ask": "0.488063", "inverse": true }, { - "bid": "0.0195", - "ask": "0.02", - "open_interest": "864.3", - "volume": "129161.75", - "strike": "83000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", + "bid": "0.0075", + "ask": "0.008", + "open_interest": "0", + "volume": "0", + "strike": "70000", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3710584", - "iv_ask": "0.3759287", + "iv_bid": "0.4106372", + "iv_ask": "0.4197066", "inverse": true }, { - "bid": "0.016", - "ask": "0.017", - "open_interest": "2237.3", - "volume": "207661.75", - "strike": "84000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", + "bid": "0.0115", + "ask": "0.012", + "open_interest": "1.8", + "volume": "1570.52", + "strike": "72000", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.367117", - "iv_ask": "0.3775085", + "iv_bid": "0.3937229", + "iv_ask": "0.4009085", "inverse": true }, { - "bid": "0.013", - "ask": "0.014", - "open_interest": "1754", - "volume": "20347.15", - "strike": "85000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", + "bid": "0.017", + "ask": "0.018", + "open_interest": "0.2", + "volume": "264.25", + "strike": "74000", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3634411", - "iv_ask": "0.3746992", + "iv_bid": "0.3739904", + "iv_ask": "0.3859807", "inverse": true }, { - "bid": "0.011", - "ask": "0.0115", - "open_interest": "708.9", - "volume": "27863.79", - "strike": "86000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", + "bid": "0.021", + "ask": "0.022", + "open_interest": "0", + "volume": "0", + "strike": "75000", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3667496", - "iv_ask": "0.3728768", + "iv_bid": "0.3693841", + "iv_ask": "0.3805748", "inverse": true }, { - "bid": "0.009", - "ask": "0.0095", - "open_interest": "215.5", - "volume": "116228.33", - "strike": "87000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", + "bid": "0.0255", + "ask": "0.0265", + "open_interest": "0", + "volume": "0", + "strike": "76000", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3660756", - "iv_ask": "0.3728294", + "iv_bid": "0.3630418", + "iv_ask": "0.3736895", "inverse": true }, { - "bid": "0.007", - "ask": "0.008", - "open_interest": "812.7", - "volume": "11422.71", - "strike": "88000", - "maturity": "2026-05-29T08:00:00Z", - "option_type": "call", + "bid": "0.0305", + "ask": "0.0315", + "open_interest": "0", + "volume": "0", + "strike": "77000", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", "security_type": "option", - "iv_bid": "0.3605964", - "iv_ask": "0.3756909", + "iv_bid": "0.3546863", + "iv_ask": "0.365016", "inverse": true }, { - "bid": "0.0048", - "ask": "0.0055", - "open_interest": "1147.9", - "volume": "152285.26", - "strike": "90000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.032", + "ask": "0.033", + "open_interest": "0", + "volume": "0", + "strike": "78000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3654597", - "iv_ask": "0.3786821", + "iv_bid": "0.3493457", + "iv_ask": "0.3595761", "inverse": true }, { - "bid": "0.0032", - "ask": "0.0035", - "open_interest": "533.7", - "volume": "7006.13", - "strike": "92000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.026", + "ask": "0.027", + "open_interest": "0", + "volume": "0", + "strike": "79000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3685609", - "iv_ask": "0.3759941", + "iv_bid": "0.3448915", + "iv_ask": "0.3552505", "inverse": true }, { - "bid": "0.0022", - "ask": "0.0024", - "open_interest": "1158.7", - "volume": "2448.17", - "strike": "94000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0205", + "ask": "0.0215", + "open_interest": "0", + "volume": "0", + "strike": "80000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3746106", - "iv_ask": "0.3810515", + "iv_bid": "0.3375731", + "iv_ask": "0.348317", "inverse": true }, { - "bid": "0.0018", - "ask": "0.0021", - "open_interest": "1463", - "volume": "1559.6", - "strike": "95000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0165", + "ask": "0.017", + "open_interest": "0", + "volume": "0", + "strike": "81000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3767028", - "iv_ask": "0.3876312", + "iv_bid": "0.3384761", + "iv_ask": "0.344171", "inverse": true }, { - "bid": "0.0014", - "ask": "0.0015", - "open_interest": "205.8", - "volume": "5771.38", - "strike": "96000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0125", + "ask": "0.0135", + "open_interest": "0", + "volume": "0", + "strike": "82000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3755968", - "iv_ask": "0.3800562", + "iv_bid": "0.3313625", + "iv_ask": "0.3437451", "inverse": true }, { - "bid": "0.0011", - "ask": "0.0012", - "open_interest": "1441.5", - "volume": "220.47", - "strike": "98000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "1.3", + "volume": "801.68", + "strike": "84000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3898627", - "iv_ask": "0.3952896", + "iv_bid": "0.3318968", + "iv_ask": "0.347283", "inverse": true }, { - "bid": "0.0008", - "ask": "0.0009", - "open_interest": "283.4", - "volume": "204.77", - "strike": "100000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0044", + "ask": "0.0048", + "open_interest": "0", + "volume": "0", + "strike": "86000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3984549", - "iv_ask": "0.4053762", + "iv_bid": "0.3346273", + "iv_ask": "0.3429262", "inverse": true }, { - "bid": "0.0003", - "ask": "0.0005", - "open_interest": "871.6", - "volume": "7905.91", - "strike": "105000", - "maturity": "2026-05-29T08:00:00Z", + "bid": "0.0015", + "ask": "0.0019", + "open_interest": "15.6", + "volume": "2045.73", + "strike": "90000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4084979", - "iv_ask": "0.4345937", + "iv_bid": "0.345667", + "iv_ask": "0.3618859", "inverse": true }, { - "bid": "77920", - "ask": "77922.5", - "open_interest": "588089150", - "volume": "6932390", + "bid": "77697.5", + "ask": "77700", + "open_interest": "587314120", + "volume": "20900300", "maturity": "2026-06-26T08:00:00Z", "security_type": "forward" }, { - "bid": "0.0013", - "ask": "0.0016", - "open_interest": "1700.5", - "volume": "5327.23", - "strike": "40000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option", - "iv_bid": "0.7705258", - "iv_ask": "0.7944322", - "inverse": true - }, - { - "bid": "0.002", - "ask": "0.0023", - "open_interest": "1859.9", - "volume": "0", + "bid": "0.0005", + "ask": "0.0006", + "open_interest": "1872.9", + "volume": "15.56", "strike": "45000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6913868", - "iv_ask": "0.7074736", + "iv_bid": "0.7312121", + "iv_ask": "0.7480836", "inverse": true }, { - "bid": "0.0032", - "ask": "0.0035", - "open_interest": "2511.2", - "volume": "868.37", + "bid": "0.001", + "ask": "0.0011", + "open_interest": "2406.4", + "volume": "41.88", "strike": "50000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6231686", - "iv_ask": "0.6338104", + "iv_bid": "0.6612595", + "iv_ask": "0.6705402", "inverse": true }, { - "bid": "0.005", - "ask": "0.0055", - "open_interest": "1334.6", - "volume": "14343.48", + "bid": "0.0018", + "ask": "0.002", + "open_interest": "1285.8", + "volume": "178.72", "strike": "55000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5567148", - "iv_ask": "0.568612", + "iv_bid": "0.5861374", + "iv_ask": "0.5969319", "inverse": true }, { - "bid": "0.007", - "ask": "0.0075", - "open_interest": "562.1", - "volume": "14669.57", + "bid": "0.0026", + "ask": "0.0028", + "open_interest": "812", + "volume": "1412.77", "strike": "58000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5270521", - "iv_ask": "0.5362689", + "iv_bid": "0.5438646", + "iv_ask": "0.5517577", "inverse": true }, { - "bid": "0.009", - "ask": "0.0095", - "open_interest": "4488.5", - "volume": "891477.33", + "bid": "0.0034", + "ask": "0.0036", + "open_interest": "4113.1", + "volume": "4933.32", "strike": "60000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5120157", - "iv_ask": "0.5197543", + "iv_bid": "0.5184896", + "iv_ask": "0.5248414", "inverse": true }, { - "bid": "0.0105", - "ask": "0.0115", - "open_interest": "975.9", - "volume": "46965.67", + "bid": "0.0044", + "ask": "0.0046", + "open_interest": "997.5", + "volume": "609.94", "strike": "62000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4839094", - "iv_ask": "0.4973974", + "iv_bid": "0.4921997", + "iv_ask": "0.4973638", "inverse": true }, { - "bid": "0.0135", - "ask": "0.014", - "open_interest": "351.5", - "volume": "13461.97", + "bid": "0.0055", + "ask": "0.006", + "open_interest": "767.6", + "volume": "193.87", "strike": "64000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.47048", - "iv_ask": "0.476281", + "iv_bid": "0.4617876", + "iv_ask": "0.4723854", "inverse": true }, { - "bid": "0.015", - "ask": "0.016", - "open_interest": "1857.7", - "volume": "376167.1", + "bid": "0.0065", + "ask": "0.007", + "open_interest": "1848.6", + "volume": "58465.03", "strike": "65000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4610231", - "iv_ask": "0.4717971", + "iv_bid": "0.453227", + "iv_ask": "0.4626974", "inverse": true }, { - "bid": "0.017", - "ask": "0.018", - "open_interest": "984.4", - "volume": "14762.43", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "1157.7", + "volume": "837.76", "strike": "66000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.455103", - "iv_ask": "0.4651352", + "iv_bid": "0.441873", + "iv_ask": "0.4588076", "inverse": true }, { - "bid": "0.0215", - "ask": "0.022", - "open_interest": "2331.5", - "volume": "15414.79", + "bid": "0.0105", + "ask": "0.011", + "open_interest": "1804.1", + "volume": "261786.55", "strike": "68000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4418524", - "iv_ask": "0.4462776", + "iv_bid": "0.426679", + "iv_ask": "0.4336515", "inverse": true }, { - "bid": "0.027", - "ask": "0.0275", - "open_interest": "2642.7", - "volume": "25180.56", + "bid": "0.0145", + "ask": "0.015", + "open_interest": "2693.4", + "volume": "156262.54", "strike": "70000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4289799", - "iv_ask": "0.4329336", + "iv_bid": "0.4114612", + "iv_ask": "0.4172817", "inverse": true }, { - "bid": "0.034", - "ask": "0.035", - "open_interest": "1834.5", - "volume": "54826.62", + "bid": "0.0195", + "ask": "0.0205", + "open_interest": "2788.3", + "volume": "46272.92", "strike": "72000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4189497", - "iv_ask": "0.4261325", + "iv_bid": "0.3936792", + "iv_ask": "0.4036897", "inverse": true }, { - "bid": "0.0425", - "ask": "0.0435", - "open_interest": "364.5", - "volume": "20003.28", + "bid": "0.0265", + "ask": "0.027", + "open_interest": "1539.6", + "volume": "31915.53", "strike": "74000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4101679", - "iv_ask": "0.4168459", + "iv_bid": "0.3805915", + "iv_ask": "0.385045", "inverse": true }, { - "bid": "0.0475", - "ask": "0.0485", - "open_interest": "2108.6", - "volume": "223992.04", + "bid": "0.031", + "ask": "0.0315", + "open_interest": "2072.4", + "volume": "8294.88", "strike": "75000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4071464", - "iv_ask": "0.4136411", + "iv_bid": "0.376697", + "iv_ask": "0.3809547", "inverse": true }, { - "bid": "0.0525", - "ask": "0.0535", - "open_interest": "687.1", - "volume": "327012.65", + "bid": "0.0355", + "ask": "0.0365", + "open_interest": "1697.8", + "volume": "38046.47", "strike": "76000", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4016744", - "iv_ask": "0.4080308", + "iv_bid": "0.3684674", + "iv_ask": "0.3767064", "inverse": true }, { - "bid": "0.0635", - "ask": "0.0645", - "open_interest": "1441.2", - "volume": "34976.14", + "bid": "0.043", + "ask": "0.044", + "open_interest": "1809.7", + "volume": "328917.75", "strike": "78000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3960528", - "iv_ask": "0.4022545", + "iv_bid": "0.3585696", + "iv_ask": "0.3665627", "inverse": true }, { - "bid": "0.0515", - "ask": "0.0525", - "open_interest": "3569.8", - "volume": "2513250", + "bid": "0.0315", + "ask": "0.032", + "open_interest": "3958.1", + "volume": "477882.47", "strike": "80000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3907505", - "iv_ask": "0.3969573", + "iv_bid": "0.352804", + "iv_ask": "0.3568861", "inverse": true }, { - "bid": "0.0415", - "ask": "0.0425", - "open_interest": "628.9", - "volume": "54016.85", + "bid": "0.022", + "ask": "0.023", + "open_interest": "3064.7", + "volume": "248114.98", "strike": "82000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3880683", - "iv_ask": "0.3944372", + "iv_bid": "0.3447232", + "iv_ask": "0.3535177", "inverse": true }, { - "bid": "0.033", - "ask": "0.0335", - "open_interest": "621.1", - "volume": "54173.91", + "bid": "0.015", + "ask": "0.016", + "open_interest": "1095.7", + "volume": "220482.13", "strike": "84000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3854263", - "iv_ask": "0.3887765", + "iv_bid": "0.3399865", + "iv_ask": "0.3499685", "inverse": true }, { - "bid": "0.029", - "ask": "0.03", - "open_interest": "4113.3", - "volume": "793351.7", + "bid": "0.0125", + "ask": "0.0135", + "open_interest": "4598.5", + "volume": "126055.1", "strike": "85000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3821867", - "iv_ask": "0.3891201", + "iv_bid": "0.3408542", + "iv_ask": "0.351629", "inverse": true }, { - "bid": "0.0255", - "ask": "0.0265", - "open_interest": "380.4", - "volume": "6595.8", + "bid": "0.01", + "ask": "0.011", + "open_interest": "1109.5", + "volume": "7148.1", "strike": "86000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3800176", - "iv_ask": "0.3872386", + "iv_bid": "0.3373432", + "iv_ask": "0.3492113", "inverse": true }, { - "bid": "0.02", - "ask": "0.0205", - "open_interest": "1700.4", - "volume": "1400183.63", + "bid": "0.007", + "ask": "0.0075", + "open_interest": "1974.1", + "volume": "16982.56", "strike": "88000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3800168", - "iv_ask": "0.3839904", - "inverse": true - }, - { - "bid": "0.015", - "ask": "0.016", - "open_interest": "6366.2", - "volume": "54063.27", - "strike": "90000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3751772", - "iv_ask": "0.384126", - "inverse": true - }, - { - "bid": "0.0115", - "ask": "0.0125", - "open_interest": "165.3", - "volume": "18050.06", - "strike": "92000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3752646", - "iv_ask": "0.3854642", - "inverse": true - }, - { - "bid": "0.0075", - "ask": "0.008", - "open_interest": "3273.8", - "volume": "48362.74", - "strike": "95000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3741708", - "iv_ask": "0.3806715", - "inverse": true - }, - { - "bid": "0.004", - "ask": "0.0042", - "open_interest": "3712.3", - "volume": "21691.86", - "strike": "100000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.382784", - "iv_ask": "0.3867213", - "inverse": true - }, - { - "bid": "0.0021", - "ask": "0.0023", - "open_interest": "1825.8", - "volume": "8512.31", - "strike": "105000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.3902033", - "iv_ask": "0.3963578", + "iv_bid": "0.3430513", + "iv_ask": "0.3502962", "inverse": true }, - { - "bid": "0.0011", - "ask": "0.0014", - "open_interest": "1453.8", - "volume": "3311.61", - "strike": "110000", + { + "bid": "0.0047", + "ask": "0.0049", + "open_interest": "5606.5", + "volume": "516356.96", + "strike": "90000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3972395", - "iv_ask": "0.4115515", + "iv_bid": "0.345534", + "iv_ask": "0.3492293", "inverse": true }, { - "bid": "0.0006", - "ask": "0.0008", - "open_interest": "2391.3", - "volume": "515.9", - "strike": "115000", + "bid": "0.0031", + "ask": "0.0033", + "open_interest": "651", + "volume": "7902.37", + "strike": "92000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4058538", - "iv_ask": "0.4210114", + "iv_bid": "0.3476826", + "iv_ask": "0.3524896", "inverse": true }, { - "bid": "0.0004", - "ask": "0.0007", - "open_interest": "2121.6", - "volume": "3.89", - "strike": "120000", + "bid": "0.0021", + "ask": "0.0024", + "open_interest": "128", + "volume": "157.03", + "strike": "94000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4228396", - "iv_ask": "0.4519006", + "iv_bid": "0.3524808", + "iv_ask": "0.3617506", "inverse": true }, { - "bid": "0.0003", - "ask": "0.0006", - "open_interest": "1877.2", - "volume": "0", - "strike": "125000", + "bid": "0.0019", + "ask": "0.002", + "open_interest": "3914.1", + "volume": "58056.38", + "strike": "95000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4431012", - "iv_ask": "0.4789481", + "iv_bid": "0.361102", + "iv_ask": "0.3645497", "inverse": true }, { - "bid": "0.0003", - "ask": "0.0004", - "open_interest": "1532.4", - "volume": "64.54", - "strike": "130000", + "bid": "0.0009", + "ask": "0.0011", + "open_interest": "3792.4", + "volume": "242.72", + "strike": "100000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4749204", - "iv_ask": "0.4897225", + "iv_bid": "0.3843633", + "iv_ask": "0.3961793", "inverse": true }, { - "bid": "0.0002", - "ask": "0.0003", - "open_interest": "819.1", - "volume": "2.33", - "strike": "135000", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "1486.9", + "volume": "123.9", + "strike": "105000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4852468", - "iv_ask": "0.5052415", + "iv_bid": "0.4005138", + "iv_ask": "0.4215658", "inverse": true }, { - "bid": "0.0001", - "ask": "0.0003", - "open_interest": "742.6", - "volume": "128.7", - "strike": "140000", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "1335", + "volume": "0", + "strike": "110000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4820369", - "iv_ask": "0.5342025", + "iv_bid": "0.4384558", + "iv_ask": "0.4656032", "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "595.4", - "volume": "14.21", - "strike": "145000", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "2510.2", + "volume": "0", + "strike": "115000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5076161", - "iv_ask": "0.5401968", + "iv_bid": "0.4662348", + "iv_ask": "0.5027862", "inverse": true }, { "bid": "0.0001", - "ask": "0.0003", - "open_interest": "2595.8", + "ask": "0.0004", + "open_interest": "2689.7", "volume": "0", - "strike": "150000", + "strike": "120000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5321674", - "iv_ask": "0.588503", + "iv_bid": "0.4775807", + "iv_ask": "0.5495393", "inverse": true }, { "bid": "0.0001", - "ask": "0.0003", - "open_interest": "254.9", + "ask": "0.0004", + "open_interest": "1875.4", "volume": "0", - "strike": "155000", + "strike": "125000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5557704", - "iv_ask": "0.6140355", + "iv_bid": "0.5172833", + "iv_ask": "0.5938204", "inverse": true }, { "bid": "0.0001", - "ask": "0.0002", - "open_interest": "1221.2", + "ask": "0.0003", + "open_interest": "1493.3", "volume": "0", - "strike": "160000", + "strike": "130000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5784956", - "iv_ask": "0.6145991", + "iv_bid": "0.5550711", + "iv_ask": "0.6166916", "inverse": true }, { "bid": "0.0001", - "ask": "0.0002", - "open_interest": "177", + "ask": "0.0003", + "open_interest": "881.7", "volume": "0", - "strike": "165000", + "strike": "135000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.6004055", - "iv_ask": "0.6375765", + "iv_bid": "0.5911258", + "iv_ask": "0.6558426", "inverse": true }, { "bid": "0.0001", "ask": "0.0002", - "open_interest": "753.2", + "open_interest": "732", "volume": "0", - "strike": "170000", + "strike": "140000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.6215564", - "iv_ask": "0.6597485", + "iv_bid": "0.6256028", + "iv_ask": "0.6661626", "inverse": true }, { "bid": "0.0001", - "ask": "0.0002", - "open_interest": "1178.8", - "volume": "0", - "strike": "180000", + "ask": "0.0003", + "open_interest": "589.1", + "volume": "15.45", + "strike": "145000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.661777", - "iv_ask": "0.7018874", + "iv_bid": "0.658636", + "iv_ask": "0.7290331", "inverse": true }, { - "bid": "78012.0", - "ask": "78185.5", - "open_interest": "0", - "volume": "0", + "bid": "77830", + "ask": "77847.5", + "open_interest": "5813390", + "volume": "845200", "maturity": "2026-07-31T08:00:00Z", "security_type": "forward" }, { - "bid": "0.0125", - "ask": "0.0135", - "open_interest": "43.1", - "volume": "1405.02", + "bid": "0.006", + "ask": "0.007", + "open_interest": "88.9", + "volume": "256.12", + "strike": "56000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5097194", + "iv_ask": "0.5287411", + "inverse": true + }, + { + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "169.6", + "volume": "9347.53", "strike": "58000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4928138", - "iv_ask": "0.5042139", + "iv_bid": "0.4919384", + "iv_ask": "0.5081114", "inverse": true }, { - "bid": "0.0155", - "ask": "0.0165", - "open_interest": "38.6", - "volume": "13565.91", + "bid": "0.0095", + "ask": "0.01", + "open_interest": "120.9", + "volume": "409.89", "strike": "60000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4816157", - "iv_ask": "0.4915485", + "iv_bid": "0.4766844", + "iv_ask": "0.4836297", "inverse": true }, { - "bid": "0.019", - "ask": "0.0195", - "open_interest": "67.2", - "volume": "53391.07", + "bid": "0.012", + "ask": "0.0125", + "open_interest": "431.8", + "volume": "19340.44", "strike": "62000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4699701", - "iv_ask": "0.4743675", + "iv_bid": "0.4620901", + "iv_ask": "0.468025", "inverse": true }, { - "bid": "0.023", - "ask": "0.0235", - "open_interest": "17.3", - "volume": "1552.84", + "bid": "0.015", + "ask": "0.0155", + "open_interest": "195", + "volume": "61326.6", "strike": "64000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.457463", - "iv_ask": "0.4613839", + "iv_bid": "0.4470167", + "iv_ask": "0.4521543", "inverse": true }, { - "bid": "0.028", - "ask": "0.0285", - "open_interest": "8.8", - "volume": "640.92", + "bid": "0.0185", + "ask": "0.0195", + "open_interest": "98.1", + "volume": "6788.44", "strike": "66000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4473491", - "iv_ask": "0.4508734", + "iv_bid": "0.4307497", + "iv_ask": "0.4397374", "inverse": true }, { - "bid": "0.0305", - "ask": "0.0315", - "open_interest": "49.5", - "volume": "1903.78", + "bid": "0.021", + "ask": "0.022", + "open_interest": "99.9", + "volume": "7997.5", "strike": "67000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4402805", - "iv_ask": "0.4469974", + "iv_bid": "0.4267865", + "iv_ask": "0.4352005", "inverse": true }, { - "bid": "0.0335", - "ask": "0.0345", - "open_interest": "26.5", - "volume": "238.29", + "bid": "0.0235", + "ask": "0.0245", + "open_interest": "257.6", + "volume": "3209.66", "strike": "68000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4352386", - "iv_ask": "0.441658", + "iv_bid": "0.420802", + "iv_ask": "0.4287368", "inverse": true }, { - "bid": "0.037", - "ask": "0.038", - "open_interest": "26.9", - "volume": "262.04", + "bid": "0.026", + "ask": "0.027", + "open_interest": "124.1", + "volume": "0", "strike": "69000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4318989", - "iv_ask": "0.4380467", + "iv_bid": "0.4130091", + "iv_ask": "0.4205365", "inverse": true }, { - "bid": "0.0405", - "ask": "0.0415", - "open_interest": "20.1", - "volume": "16806.44", + "bid": "0.0295", + "ask": "0.03", + "open_interest": "733.5", + "volume": "30409.52", "strike": "70000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4270392", - "iv_ask": "0.4329541", + "iv_bid": "0.4107304", + "iv_ask": "0.4143027", "inverse": true }, { - "bid": "0.0445", - "ask": "0.0455", - "open_interest": "0.2", - "volume": "666.55", + "bid": "0.0325", + "ask": "0.0335", + "open_interest": "89.1", + "volume": "780.56", "strike": "71000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4236284", - "iv_ask": "0.4293353", + "iv_bid": "0.4028269", + "iv_ask": "0.4096516", "inverse": true }, { - "bid": "0.049", - "ask": "0.05", - "open_interest": "3.2", - "volume": "361.22", + "bid": "0.0365", + "ask": "0.0375", + "open_interest": "383.4", + "volume": "58255.75", "strike": "72000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4214726", - "iv_ask": "0.4269974", + "iv_bid": "0.3997415", + "iv_ask": "0.4062813", "inverse": true }, { - "bid": "0.0535", - "ask": "0.0545", - "open_interest": "0.3", - "volume": "1240.9", + "bid": "0.0405", + "ask": "0.0415", + "open_interest": "53.5", + "volume": "21449.97", "strike": "73000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4177374", - "iv_ask": "0.4231095", + "iv_bid": "0.3945086", + "iv_ask": "0.4008148", "inverse": true }, { - "bid": "0.0585", - "ask": "0.0595", - "open_interest": "8.5", - "volume": "0", + "bid": "0.045", + "ask": "0.046", + "open_interest": "130.4", + "volume": "371.83", "strike": "74000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4151357", - "iv_ask": "0.4203781", + "iv_bid": "0.3903181", + "iv_ask": "0.3964291", "inverse": true }, { - "bid": "0.0635", - "ask": "0.0645", - "open_interest": "2.2", - "volume": "471.15", + "bid": "0.05", + "ask": "0.0505", + "open_interest": "337.8", + "volume": "381447.32", "strike": "75000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4109944", - "iv_ask": "0.416131", + "iv_bid": "0.3870014", + "iv_ask": "0.3899788", "inverse": true }, { - "bid": "0.069", - "ask": "0.0705", - "open_interest": "0.3", - "volume": "1030.72", + "bid": "0.055", + "ask": "0.056", + "open_interest": "400.1", + "volume": "2242.39", "strike": "76000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4078978", - "iv_ask": "0.4154751", + "iv_bid": "0.3815221", + "iv_ask": "0.3873571", "inverse": true }, { - "bid": "0.075", - "ask": "0.0765", - "open_interest": "8.2", - "volume": "46759.25", + "bid": "0.061", + "ask": "0.062", + "open_interest": "53.5", + "volume": "15760.08", "strike": "77000", "maturity": "2026-07-31T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4057753", - "iv_ask": "0.413257", + "iv_bid": "0.3796833", + "iv_ask": "0.385434", "inverse": true }, { - "bid": "0.0815", - "ask": "0.0825", - "open_interest": "24", - "volume": "0", + "bid": "0.065", + "ask": "0.066", + "open_interest": "255", + "volume": "161998.55", "strike": "78000", "maturity": "2026-07-31T08:00:00Z", - "option_type": "put", + "option_type": "call", "security_type": "option", - "iv_bid": "0.404587", - "iv_ask": "0.4095311", + "iv_bid": "0.37513", + "iv_ask": "0.3808316", "inverse": true }, { - "bid": "0.0765", - "ask": "0.0775", - "open_interest": "0", - "volume": "0", + "bid": "0.0585", + "ask": "0.0595", + "open_interest": "145.7", + "volume": "7476.58", "strike": "79000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4020575", - "iv_ask": "0.4069774", + "iv_bid": "0.3708304", + "iv_ask": "0.3765173", "inverse": true }, { - "bid": "0.0705", - "ask": "0.0715", - "open_interest": "138.9", - "volume": "267403.7", + "bid": "0.0525", + "ask": "0.0535", + "open_interest": "944.7", + "volume": "462038.01", "strike": "80000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3993124", - "iv_ask": "0.4042273", + "iv_bid": "0.3671482", + "iv_ask": "0.3728559", "inverse": true }, { - "bid": "0.065", - "ask": "0.066", - "open_interest": "0.1", - "volume": "0", + "bid": "0.0475", + "ask": "0.0485", + "open_interest": "818.7", + "volume": "51556.24", "strike": "81000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3975185", - "iv_ask": "0.4024473", + "iv_bid": "0.3669694", + "iv_ask": "0.3727311", "inverse": true }, { - "bid": "0.06", - "ask": "0.061", - "open_interest": "13.9", - "volume": "0", + "bid": "0.0425", + "ask": "0.0435", + "open_interest": "974.1", + "volume": "42233.75", "strike": "82000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3967051", - "iv_ask": "0.4016662", + "iv_bid": "0.3646151", + "iv_ask": "0.3704674", "inverse": true }, { - "bid": "0.055", - "ask": "0.056", - "open_interest": "2", - "volume": "4581.03", + "bid": "0.038", + "ask": "0.039", + "open_interest": "382.5", + "volume": "1542.4", "strike": "83000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3944221", - "iv_ask": "0.3994351", + "iv_bid": "0.3630191", + "iv_ask": "0.3689977", "inverse": true }, { - "bid": "0.0505", - "ask": "0.0515", - "open_interest": "1.1", + "bid": "0.034", + "ask": "0.0345", + "open_interest": "87.9", "volume": "0", "strike": "84000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3931913", - "iv_ask": "0.3982745", + "iv_bid": "0.3623045", + "iv_ask": "0.3653772", "inverse": true }, { - "bid": "0.046", - "ask": "0.0475", - "open_interest": "3.5", - "volume": "0", + "bid": "0.03", + "ask": "0.031", + "open_interest": "619.2", + "volume": "221575.57", "strike": "85000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3905105", - "iv_ask": "0.3982701", + "iv_bid": "0.3594643", + "iv_ask": "0.3658145", "inverse": true }, { - "bid": "0.042", - "ask": "0.0435", - "open_interest": "3.5", - "volume": "12678.25", + "bid": "0.0265", + "ask": "0.0275", + "open_interest": "48.8", + "volume": "641.27", "strike": "86000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3889773", - "iv_ask": "0.3969027", + "iv_bid": "0.3576603", + "iv_ask": "0.3642618", "inverse": true }, { - "bid": "0.0385", - "ask": "0.0395", - "open_interest": "5", - "volume": "16185.96", + "bid": "0.0235", + "ask": "0.024", + "open_interest": "294.2", + "volume": "5736.86", "strike": "87000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3887166", - "iv_ask": "0.3941323", + "iv_bid": "0.3571286", + "iv_ask": "0.3605819", "inverse": true }, { - "bid": "0.035", - "ask": "0.036", - "open_interest": "0.5", - "volume": "841.8", + "bid": "0.0205", + "ask": "0.0215", + "open_interest": "232.6", + "volume": "156792.29", "strike": "88000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3870983", - "iv_ask": "0.3926691", + "iv_bid": "0.3545421", + "iv_ask": "0.361794", "inverse": true }, { - "bid": "0.032", - "ask": "0.033", - "open_interest": "1.2", + "bid": "0.018", + "ask": "0.019", + "open_interest": "120.3", "volume": "0", "strike": "89000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3869391", - "iv_ask": "0.3926805", + "iv_bid": "0.3535409", + "iv_ask": "0.3611957", "inverse": true }, { - "bid": "0.029", - "ask": "0.03", - "open_interest": "334.3", - "volume": "702111.4", + "bid": "0.016", + "ask": "0.0165", + "open_interest": "988.5", + "volume": "99813.86", "strike": "90000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3854712", - "iv_ask": "0.3914152", + "iv_bid": "0.3545589", + "iv_ask": "0.358619", "inverse": true }, { - "bid": "0.0265", - "ask": "0.0275", - "open_interest": "5", - "volume": "0", + "bid": "0.014", + "ask": "0.0145", + "open_interest": "266.6", + "volume": "2532.19", "strike": "91000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3857126", - "iv_ask": "0.391871", + "iv_bid": "0.3537972", + "iv_ask": "0.3581236", "inverse": true }, { - "bid": "0.024", - "ask": "0.025", - "open_interest": "5.2", - "volume": "0", + "bid": "0.0125", + "ask": "0.013", + "open_interest": "272.6", + "volume": "197.69", "strike": "92000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3847205", - "iv_ask": "0.3911306", + "iv_bid": "0.3556985", + "iv_ask": "0.3602919", "inverse": true }, { - "bid": "0.0215", - "ask": "0.0225", - "open_interest": "0", - "volume": "0", + "bid": "0.0105", + "ask": "0.0115", + "open_interest": "96.7", + "volume": "9799.23", "strike": "93000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3824065", - "iv_ask": "0.3891159", + "iv_bid": "0.3510342", + "iv_ask": "0.3609526", "inverse": true }, { - "bid": "0.0195", - "ask": "0.0205", - "open_interest": "68.4", - "volume": "81762.95", + "bid": "0.0095", + "ask": "0.01", + "open_interest": "836.2", + "volume": "6385.51", "strike": "94000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3821924", - "iv_ask": "0.3892072", + "iv_bid": "0.3546241", + "iv_ask": "0.3599375", "inverse": true }, { - "bid": "0.016", - "ask": "0.0165", - "open_interest": "19.9", - "volume": "133149.86", + "bid": "0.008", + "ask": "0.009", + "open_interest": "45", + "volume": "66.25", + "strike": "95000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3511667", + "iv_ask": "0.3626681", + "inverse": true + }, + { + "bid": "0.007", + "ask": "0.008", + "open_interest": "183.5", + "volume": "0", "strike": "96000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3819147", - "iv_ask": "0.3857958", + "iv_bid": "0.3517152", + "iv_ask": "0.3641281", "inverse": true }, { - "bid": "0.013", - "ask": "0.014", - "open_interest": "1018.5", - "volume": "15984.97", + "bid": "0.0055", + "ask": "0.006", + "open_interest": "1102.9", + "volume": "368.18", "strike": "98000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3810492", - "iv_ask": "0.3896375", + "iv_bid": "0.3552503", + "iv_ask": "0.3625767", "inverse": true }, { - "bid": "0.0105", - "ask": "0.011", - "open_interest": "33.2", - "volume": "17857.78", + "bid": "0.0043", + "ask": "0.0047", + "open_interest": "152.6", + "volume": "3528.56", "strike": "100000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3801337", - "iv_ask": "0.3850011", + "iv_bid": "0.3583671", + "iv_ask": "0.3652718", "inverse": true }, { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "9.2", - "volume": "4041.41", + "bid": "0.0034", + "ask": "0.0038", + "open_interest": "109.9", + "volume": "347.78", "strike": "102000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.379947", - "iv_ask": "0.3908171", + "iv_bid": "0.3622637", + "iv_ask": "0.3703492", "inverse": true }, { - "bid": "0.007", - "ask": "0.008", - "open_interest": "11.4", - "volume": "96898.84", + "bid": "0.0027", + "ask": "0.003", + "open_interest": "337.4", + "volume": "76946.24", "strike": "104000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3816213", - "iv_ask": "0.3938358", + "iv_bid": "0.3662936", + "iv_ask": "0.3734663", + "inverse": true + }, + { + "bid": "0.0025", + "ask": "0.0028", + "open_interest": "362.8", + "volume": "1302.71", + "strike": "105000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3707317", + "iv_ask": "0.3783452", + "inverse": true + }, + { + "bid": "0.0022", + "ask": "0.0025", + "open_interest": "39.7", + "volume": "18.68", + "strike": "106000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3717582", + "iv_ask": "0.3800736", "inverse": true }, { - "bid": "0.0055", - "ask": "0.0065", - "open_interest": "12.9", - "volume": "1866.75", - "strike": "106000", + "bid": "0.0017", + "ask": "0.0021", + "open_interest": "244.1", + "volume": "1089.58", + "strike": "108000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3795041", - "iv_ask": "0.3935809", + "iv_bid": "0.3737024", + "iv_ask": "0.3867538", "inverse": true }, { - "bid": "0.004", - "ask": "0.0043", - "open_interest": "34", - "volume": "490.85", + "bid": "0.0014", + "ask": "0.0017", + "open_interest": "137.6", + "volume": "0", "strike": "110000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3885566", - "iv_ask": "0.3940005", + "iv_bid": "0.3792555", + "iv_ask": "0.3907244", "inverse": true }, { - "bid": "0.0024", - "ask": "0.0029", - "open_interest": "11.1", - "volume": "497.37", + "bid": "0.001", + "ask": "0.0011", + "open_interest": "23.8", + "volume": "7.69", "strike": "115000", "maturity": "2026-07-31T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3910344", - "iv_ask": "0.4036299", + "iv_bid": "0.3996393", + "iv_ask": "0.4049242", + "inverse": true + }, + { + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "163.1", + "volume": "4.67", + "strike": "120000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3996656", + "iv_ask": "0.416279", "inverse": true }, { - "bid": "78407.5", - "ask": "78410", - "open_interest": "276427820", - "volume": "7071210", + "bid": "78167.5", + "ask": "78170", + "open_interest": "289191460", + "volume": "3088870", "maturity": "2026-09-25T08:00:00Z", "security_type": "forward" }, { - "bid": "0.0023", - "ask": "0.0027", - "open_interest": "1576.9", - "volume": "103.03", + "bid": "0.0015", + "ask": "0.0018", + "open_interest": "1748.7", + "volume": "5732.93", "strike": "30000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.7387981", - "iv_ask": "0.7578277", + "iv_bid": "0.7540254", + "iv_ask": "0.7742621", "inverse": true }, { - "bid": "0.0036", - "ask": "0.004", - "open_interest": "543.3", - "volume": "544.4", + "bid": "0.0024", + "ask": "0.0027", + "open_interest": "546.3", + "volume": "20.9", "strike": "35000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6780532", - "iv_ask": "0.6908654", + "iv_bid": "0.6887831", + "iv_ask": "0.7020779", "inverse": true }, { - "bid": "0.0055", - "ask": "0.006", - "open_interest": "1844.5", - "volume": "357.77", + "bid": "0.0037", + "ask": "0.0041", + "open_interest": "2023.9", + "volume": "5282.55", "strike": "40000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6249601", - "iv_ask": "0.6360055", + "iv_bid": "0.6299359", + "iv_ask": "0.6418935", "inverse": true }, { - "bid": "0.008", - "ask": "0.0085", - "open_interest": "1676.4", - "volume": "444.41", + "bid": "0.006", + "ask": "0.0065", + "open_interest": "1629.2", + "volume": "186.8", "strike": "45000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5737061", - "iv_ask": "0.5817025", + "iv_bid": "0.5851877", + "iv_ask": "0.595219", "inverse": true }, { - "bid": "0.012", - "ask": "0.013", - "open_interest": "3174", - "volume": "14910.53", + "bid": "0.009", + "ask": "0.0095", + "open_interest": "3168.2", + "volume": "6377.66", "strike": "50000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5328755", - "iv_ask": "0.5443926", + "iv_bid": "0.5376121", + "iv_ask": "0.5447974", "inverse": true }, { - "bid": "0.0185", - "ask": "0.0195", - "open_interest": "1520.4", - "volume": "12538.34", + "bid": "0.014", + "ask": "0.0145", + "open_interest": "1833.4", + "volume": "445004.22", "strike": "55000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5023818", - "iv_ask": "0.5109083", + "iv_bid": "0.5004397", + "iv_ask": "0.5056182", "inverse": true }, { - "bid": "0.02", - "ask": "0.021", - "open_interest": "102.9", - "volume": "713.74", + "bid": "0.0155", + "ask": "0.016", + "open_interest": "106.6", + "volume": "120.8", "strike": "56000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4957369", - "iv_ask": "0.5038211", + "iv_bid": "0.4957336", + "iv_ask": "0.5005767", "inverse": true }, { - "bid": "0.0235", - "ask": "0.0245", - "open_interest": "551.9", - "volume": "174.49", + "bid": "0.0185", + "ask": "0.019", + "open_interest": "602.6", + "volume": "9110.88", "strike": "58000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4840656", - "iv_ask": "0.4913477", + "iv_bid": "0.4831756", + "iv_ask": "0.4874751", "inverse": true }, { - "bid": "0.0275", - "ask": "0.0285", - "open_interest": "3852.1", - "volume": "27987.2", + "bid": "0.0215", + "ask": "0.0225", + "open_interest": "3349.6", + "volume": "440069", "strike": "60000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4727332", - "iv_ask": "0.4793387", + "iv_bid": "0.4671972", + "iv_ask": "0.4749172", "inverse": true }, { - "bid": "0.0325", - "ask": "0.0335", - "open_interest": "719.5", - "volume": "11432.55", + "bid": "0.026", + "ask": "0.0265", + "open_interest": "827.2", + "volume": "18861.5", "strike": "62000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4644218", - "iv_ask": "0.470436", + "iv_bid": "0.45894", + "iv_ask": "0.46241", "inverse": true }, { - "bid": "0.038", - "ask": "0.039", - "open_interest": "212.7", - "volume": "1163.89", + "bid": "0.0305", + "ask": "0.032", + "open_interest": "184.5", + "volume": "1500.8", "strike": "64000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4553685", - "iv_ask": "0.4608988", + "iv_bid": "0.4464424", + "iv_ask": "0.4558838", "inverse": true }, { - "bid": "0.0415", - "ask": "0.0425", - "open_interest": "460.2", - "volume": "7438.92", + "bid": "0.0335", + "ask": "0.0345", + "open_interest": "627.8", + "volume": "40437.02", "strike": "65000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.453539", - "iv_ask": "0.4588471", + "iv_bid": "0.4433767", + "iv_ask": "0.4493944", "inverse": true }, { - "bid": "0.0445", - "ask": "0.0455", - "open_interest": "114.2", - "volume": "656.41", + "bid": "0.0365", + "ask": "0.0375", + "open_interest": "177.5", + "volume": "0", "strike": "66000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.448075", - "iv_ask": "0.4531978", + "iv_bid": "0.4391212", + "iv_ask": "0.4448873", "inverse": true }, { - "bid": "0.052", - "ask": "0.053", - "open_interest": "576.2", - "volume": "2371.39", + "bid": "0.0435", + "ask": "0.0445", + "open_interest": "561.7", + "volume": "21198.3", "strike": "68000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.441974", - "iv_ask": "0.4467614", + "iv_bid": "0.4327811", + "iv_ask": "0.4381104", "inverse": true }, { - "bid": "0.0605", - "ask": "0.0615", - "open_interest": "1487.2", - "volume": "64675.18", + "bid": "0.051", + "ask": "0.052", + "open_interest": "1446.8", + "volume": "118968.71", "strike": "70000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4366797", - "iv_ask": "0.4411965", + "iv_bid": "0.4244617", + "iv_ask": "0.42945", "inverse": true }, { - "bid": "0.0695", - "ask": "0.071", - "open_interest": "261.1", - "volume": "31282.09", + "bid": "0.06", + "ask": "0.061", + "open_interest": "277.9", + "volume": "24486.2", "strike": "72000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4297844", - "iv_ask": "0.4362407", + "iv_bid": "0.4189874", + "iv_ask": "0.423705", "inverse": true }, { - "bid": "0.08", - "ask": "0.081", - "open_interest": "68.6", - "volume": "6700.79", + "bid": "0.0695", + "ask": "0.0705", + "open_interest": "88.8", + "volume": "0", "strike": "74000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4255159", - "iv_ask": "0.4296568", + "iv_bid": "0.4112388", + "iv_ask": "0.4157551", "inverse": true }, { - "bid": "0.0855", - "ask": "0.0865", - "open_interest": "3022.8", - "volume": "670604", + "bid": "0.075", + "ask": "0.076", + "open_interest": "3024.3", + "volume": "12412.49", "strike": "75000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4229795", - "iv_ask": "0.4270557", + "iv_bid": "0.4090425", + "iv_ask": "0.4134802", "inverse": true }, { - "bid": "0.091", - "ask": "0.0925", - "open_interest": "369.5", - "volume": "0", + "bid": "0.08", + "ask": "0.0815", + "open_interest": "567.6", + "volume": "12494.14", "strike": "76000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4195139", - "iv_ask": "0.425547", + "iv_bid": "0.4034978", + "iv_ask": "0.4100583", "inverse": true }, { - "bid": "0.1035", - "ask": "0.1045", - "open_interest": "252.9", - "volume": "368973.54", + "bid": "0.092", + "ask": "0.0935", + "open_interest": "623.1", + "volume": "212534.55", "strike": "78000", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4158037", - "iv_ask": "0.4197477", + "iv_bid": "0.3977517", + "iv_ask": "0.4041812", "inverse": true }, { - "bid": "0.0965", - "ask": "0.0975", - "open_interest": "1788", - "volume": "303998.18", + "bid": "0.0825", + "ask": "0.0835", + "open_interest": "2270.4", + "volume": "412339.64", "strike": "80000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4115207", - "iv_ask": "0.4154247", + "iv_bid": "0.3942133", + "iv_ask": "0.398465", "inverse": true }, { - "bid": "0.086", - "ask": "0.087", - "open_interest": "985.2", - "volume": "0", + "bid": "0.0715", + "ask": "0.0725", + "open_interest": "1428.7", + "volume": "14743.49", "strike": "82000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4102988", - "iv_ask": "0.414199", + "iv_bid": "0.3903293", + "iv_ask": "0.3945973", "inverse": true }, { - "bid": "0.076", - "ask": "0.077", - "open_interest": "570.9", - "volume": "12082.44", + "bid": "0.062", + "ask": "0.063", + "open_interest": "624.4", + "volume": "37259.74", "strike": "84000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4075023", - "iv_ask": "0.411433", + "iv_bid": "0.3884229", + "iv_ask": "0.3927561", "inverse": true }, { - "bid": "0.071", - "ask": "0.0725", - "open_interest": "589.4", - "volume": "17080.56", + "bid": "0.0575", + "ask": "0.0585", + "open_interest": "775.1", + "volume": "1366.21", "strike": "85000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4047999", - "iv_ask": "0.4107383", + "iv_bid": "0.3869298", + "iv_ask": "0.3913145", "inverse": true }, { - "bid": "0.067", - "ask": "0.068", - "open_interest": "448", + "bid": "0.053", + "ask": "0.054", + "open_interest": "464.4", "volume": "0", "strike": "86000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4052159", - "iv_ask": "0.4092107", + "iv_bid": "0.3843524", + "iv_ask": "0.3888036", "inverse": true }, { - "bid": "0.059", - "ask": "0.06", - "open_interest": "306.5", + "bid": "0.0455", + "ask": "0.0465", + "open_interest": "323", "volume": "0", "strike": "88000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4036245", - "iv_ask": "0.4077164", + "iv_bid": "0.3827502", + "iv_ask": "0.3873678", "inverse": true }, { - "bid": "0.0515", - "ask": "0.0525", - "open_interest": "1433.9", - "volume": "4157939.27", + "bid": "0.0385", + "ask": "0.0395", + "open_interest": "1627.1", + "volume": "8932.45", "strike": "90000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4008612", - "iv_ask": "0.4050876", + "iv_bid": "0.3793618", + "iv_ask": "0.3842081", "inverse": true }, { - "bid": "0.045", - "ask": "0.046", - "open_interest": "307.8", - "volume": "43549.7", + "bid": "0.033", + "ask": "0.034", + "open_interest": "530.1", + "volume": "2938.7", "strike": "92000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3991974", - "iv_ask": "0.4035926", + "iv_bid": "0.3793488", + "iv_ask": "0.3844671", "inverse": true }, { - "bid": "0.0395", - "ask": "0.04", - "open_interest": "89.7", - "volume": "60443.34", + "bid": "0.028", + "ask": "0.029", + "open_interest": "133.4", + "volume": "441.68", "strike": "94000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3989996", - "iv_ask": "0.4013002", + "iv_bid": "0.3782503", + "iv_ask": "0.3837088", "inverse": true }, { - "bid": "0.0365", - "ask": "0.0375", - "open_interest": "482.3", - "volume": "54697.29", + "bid": "0.0255", + "ask": "0.0265", + "open_interest": "1228.3", + "volume": "393.25", "strike": "95000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3966385", - "iv_ask": "0.4013613", + "iv_bid": "0.3762776", + "iv_ask": "0.3819479", "inverse": true }, { - "bid": "0.034", - "ask": "0.035", - "open_interest": "114.4", - "volume": "1963.53", + "bid": "0.0235", + "ask": "0.0245", + "open_interest": "194", + "volume": "0", "strike": "96000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3958875", - "iv_ask": "0.4007404", + "iv_bid": "0.3762327", + "iv_ask": "0.3821139", "inverse": true }, { - "bid": "0.0295", - "ask": "0.0305", - "open_interest": "82.9", - "volume": "37404.99", + "bid": "0.02", + "ask": "0.021", + "open_interest": "159", + "volume": "0", "strike": "98000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3947589", - "iv_ask": "0.3999035", + "iv_bid": "0.3766939", + "iv_ask": "0.3830441", "inverse": true }, { - "bid": "0.0255", - "ask": "0.0265", - "open_interest": "3607.7", - "volume": "25051.74", + "bid": "0.017", + "ask": "0.018", + "open_interest": "3887.7", + "volume": "8998.15", "strike": "100000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3935173", - "iv_ask": "0.3990043", + "iv_bid": "0.3772592", + "iv_ask": "0.3841538", "inverse": true }, { - "bid": "0.018", - "ask": "0.0185", - "open_interest": "1003.3", - "volume": "41824.99", + "bid": "0.0145", + "ask": "0.0155", + "open_interest": "44.1", + "volume": "0", + "strike": "102000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3784069", + "iv_ask": "0.3859159", + "inverse": true + }, + { + "bid": "0.011", + "ask": "0.012", + "open_interest": "1354", + "volume": "0", "strike": "105000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3938507", - "iv_ask": "0.3971326", + "iv_bid": "0.3765661", + "iv_ask": "0.385299", "inverse": true }, { - "bid": "0.0125", - "ask": "0.013", - "open_interest": "1752.4", - "volume": "24687.25", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "1496.2", + "volume": "1051.45", "strike": "110000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3933668", - "iv_ask": "0.3973912", + "iv_bid": "0.3816648", + "iv_ask": "0.3926917", "inverse": true }, { - "bid": "0.0085", - "ask": "0.009", - "open_interest": "2039.5", - "volume": "14708.22", + "bid": "0.0055", + "ask": "0.006", + "open_interest": "2420.3", + "volume": "1027.39", "strike": "115000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.3918607", - "iv_ask": "0.3969331", + "iv_bid": "0.3919664", + "iv_ask": "0.398899", "inverse": true }, { - "bid": "0.0065", - "ask": "0.007", - "open_interest": "922.8", - "volume": "2026.33", + "bid": "0.0039", + "ask": "0.0042", + "open_interest": "984.4", + "volume": "126.73", "strike": "120000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4004925", - "iv_ask": "0.4065865", + "iv_bid": "0.3984314", + "iv_ask": "0.4037731", "inverse": true }, { - "bid": "0.0047", - "ask": "0.0055", - "open_interest": "2218.4", - "volume": "203.19", + "bid": "0.0029", + "ask": "0.0033", + "open_interest": "2266.7", + "volume": "495.74", "strike": "125000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4038175", - "iv_ask": "0.4157425", + "iv_bid": "0.4072225", + "iv_ask": "0.4159936", "inverse": true }, { - "bid": "0.0036", - "ask": "0.0038", - "open_interest": "2226.1", - "volume": "351.74", + "bid": "0.0022", + "ask": "0.0025", + "open_interest": "1425.3", + "volume": "74.41", "strike": "130000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4107317", - "iv_ask": "0.4144832", + "iv_bid": "0.4161483", + "iv_ask": "0.4243203", "inverse": true }, { - "bid": "0.0027", - "ask": "0.0031", - "open_interest": "146.6", - "volume": "2608.55", + "bid": "0.0017", + "ask": "0.002", + "open_interest": "159.9", + "volume": "0", "strike": "135000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4154483", - "iv_ask": "0.4245169", + "iv_bid": "0.4250954", + "iv_ask": "0.4350339", "inverse": true }, { - "bid": "0.0021", - "ask": "0.0025", - "open_interest": "1134.5", - "volume": "4327.41", + "bid": "0.0013", + "ask": "0.0016", + "open_interest": "1137.2", + "volume": "0", "strike": "140000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4218051", - "iv_ask": "0.432708", + "iv_bid": "0.4324387", + "iv_ask": "0.4445829", "inverse": true }, { - "bid": "0.0017", - "ask": "0.002", - "open_interest": "475.8", + "bid": "0.0011", + "ask": "0.0014", + "open_interest": "477.2", "volume": "0", "strike": "145000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4297655", - "iv_ask": "0.4395167", + "iv_bid": "0.444507", + "iv_ask": "0.4584254", "inverse": true }, { - "bid": "0.0013", - "ask": "0.0015", - "open_interest": "542.4", - "volume": "35.08", + "bid": "0.0009", + "ask": "0.0011", + "open_interest": "758", + "volume": "0", "strike": "150000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4337369", - "iv_ask": "0.4418277", + "iv_bid": "0.4536976", + "iv_ask": "0.4648723", "inverse": true }, { - "bid": "0.0011", - "ask": "0.0013", - "open_interest": "316.7", - "volume": "10.28", + "bid": "0.0007", + "ask": "0.001", + "open_interest": "318.8", + "volume": "0", "strike": "155000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4426635", - "iv_ask": "0.4519309", + "iv_bid": "0.4593963", + "iv_ask": "0.4788539", "inverse": true }, { - "bid": "0.0009", - "ask": "0.0012", - "open_interest": "830.5", - "volume": "7.84", + "bid": "0.0006", + "ask": "0.0009", + "open_interest": "827.4", + "volume": "0", "strike": "160000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4490589", - "iv_ask": "0.4647861", + "iv_bid": "0.4694182", + "iv_ask": "0.491344", "inverse": true }, { - "bid": "0.0008", - "ask": "0.0012", - "open_interest": "127.7", + "bid": "0.0005", + "ask": "0.0008", + "open_interest": "131.4", "volume": "0", "strike": "165000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4591254", - "iv_ask": "0.4814855", + "iv_bid": "0.4772616", + "iv_ask": "0.5022968", "inverse": true }, { - "bid": "0.0006", - "ask": "0.0009", - "open_interest": "368.9", + "bid": "0.0004", + "ask": "0.0007", + "open_interest": "352.5", "volume": "0", "strike": "170000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4599512", - "iv_ask": "0.4810538", + "iv_bid": "0.482482", + "iv_ask": "0.5116173", "inverse": true }, { - "bid": "0.0005", - "ask": "0.0007", - "open_interest": "1412", - "volume": "18.81", + "bid": "0.0003", + "ask": "0.0006", + "open_interest": "1448.7", + "volume": "0", "strike": "175000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4656563", - "iv_ask": "0.4825423", + "iv_bid": "0.4842356", + "iv_ask": "0.5191386", "inverse": true }, { - "bid": "0.0004", - "ask": "0.0008", - "open_interest": "751.7", - "volume": "3.91", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "751.2", + "volume": "0", "strike": "180000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.468996", - "iv_ask": "0.5041863", + "iv_bid": "0.4989006", + "iv_ask": "0.524579", "inverse": true }, { - "bid": "0.0003", - "ask": "0.0007", - "open_interest": "824.3", + "bid": "0.0002", + "ask": "0.0006", + "open_interest": "824.6", "volume": "0", "strike": "190000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4817765", - "iv_ask": "0.524214", + "iv_bid": "0.507848", + "iv_ask": "0.564019", "inverse": true }, { - "bid": "0.0002", - "ask": "0.0006", - "open_interest": "1128.2", + "bid": "0.0001", + "ask": "0.0004", + "open_interest": "1131.6", "volume": "0", "strike": "200000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.487836", - "iv_ask": "0.5411607", + "iv_bid": "0.503566", + "iv_ask": "0.5683326", "inverse": true }, { "bid": "0.0001", "ask": "0.0003", - "open_interest": "272.8", + "open_interest": "279.7", "volume": "0", "strike": "220000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5017463", - "iv_ask": "0.5501913", - "inverse": true - }, - { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "249.5", - "volume": "3.11", - "strike": "240000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option", - "iv_bid": "0.5389329", - "iv_ask": "0.5697779", + "iv_bid": "0.548504", + "iv_ask": "0.6014345", "inverse": true }, { - "bid": "79082.5", - "ask": "79092.5", - "open_interest": "121192440", - "volume": "2532540", + "bid": "78887.5", + "ask": "78892.5", + "open_interest": "125882130", + "volume": "1281370", "maturity": "2026-12-25T08:00:00Z", "security_type": "forward" }, { - "bid": "0.005", - "ask": "0.006", - "open_interest": "1404.7", - "volume": "0", + "bid": "0.0047", + "ask": "0.0049", + "open_interest": "1603.5", + "volume": "1929.79", "strike": "30000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6715134", - "iv_ask": "0.6952157", + "iv_bid": "0.6979647", + "iv_ask": "0.7033441", "inverse": true }, { - "bid": "0.008", - "ask": "0.009", - "open_interest": "2067.1", - "volume": "2809.05", + "bid": "0.007", + "ask": "0.0075", + "open_interest": "2086.4", + "volume": "1155.98", "strike": "35000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.6310269", - "iv_ask": "0.6473544", + "iv_bid": "0.6448642", + "iv_ask": "0.6541921", "inverse": true }, { - "bid": "0.012", - "ask": "0.013", - "open_interest": "2801.6", - "volume": "3785.67", + "bid": "0.0105", + "ask": "0.011", + "open_interest": "3079.6", + "volume": "14963.8", "strike": "40000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5928292", - "iv_ask": "0.6046837", + "iv_bid": "0.6031506", + "iv_ask": "0.6098451", "inverse": true }, { - "bid": "0.017", - "ask": "0.018", - "open_interest": "1982.1", - "volume": "0", + "bid": "0.0145", + "ask": "0.0155", + "open_interest": "2102.6", + "volume": "233.87", "strike": "45000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5548153", - "iv_ask": "0.5638314", + "iv_bid": "0.557817", + "iv_ask": "0.5679378", "inverse": true }, { - "bid": "0.024", - "ask": "0.025", - "open_interest": "1403.5", - "volume": "13076.74", + "bid": "0.021", + "ask": "0.022", + "open_interest": "1406.2", + "volume": "173.42", "strike": "50000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5232647", - "iv_ask": "0.5302812", + "iv_bid": "0.5263559", + "iv_ask": "0.5340901", "inverse": true }, { - "bid": "0.0315", - "ask": "0.033", - "open_interest": "1708.2", - "volume": "477.09", + "bid": "0.028", + "ask": "0.0295", + "open_interest": "1710.7", + "volume": "0", "strike": "54000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5021622", - "iv_ask": "0.5109207", + "iv_bid": "0.5047503", + "iv_ask": "0.5142862", "inverse": true }, { - "bid": "0.0335", - "ask": "0.035", - "open_interest": "1004.5", - "volume": "17069.39", + "bid": "0.03", + "ask": "0.0315", + "open_interest": "911.7", + "volume": "14736.48", "strike": "55000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4963488", - "iv_ask": "0.5047596", + "iv_bid": "0.4995092", + "iv_ask": "0.5086321", "inverse": true }, { - "bid": "0.036", - "ask": "0.0375", - "open_interest": "70.9", - "volume": "5834.36", + "bid": "0.0325", + "ask": "0.034", + "open_interest": "72.2", + "volume": "0", "strike": "56000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4927808", - "iv_ask": "0.500843", + "iv_bid": "0.4966248", + "iv_ask": "0.5053355", "inverse": true }, { - "bid": "0.0415", - "ask": "0.043", - "open_interest": "59.9", - "volume": "315.08", + "bid": "0.0375", + "ask": "0.0385", + "open_interest": "127", + "volume": "13031.62", "strike": "58000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4863054", - "iv_ask": "0.4937464", + "iv_bid": "0.488647", + "iv_ask": "0.4939975", "inverse": true }, { - "bid": "0.047", - "ask": "0.0485", - "open_interest": "6301.9", - "volume": "5915.37", + "bid": "0.043", + "ask": "0.044", + "open_interest": "6493.6", + "volume": "230934.51", "strike": "60000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4773844", - "iv_ask": "0.4843161", + "iv_bid": "0.4806593", + "iv_ask": "0.485613", "inverse": true }, { - "bid": "0.0535", - "ask": "0.0555", - "open_interest": "601.8", + "bid": "0.049", + "ask": "0.0505", + "open_interest": "624.9", "volume": "0", "strike": "62000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4707383", - "iv_ask": "0.4793757", + "iv_bid": "0.4725478", + "iv_ask": "0.4794678", "inverse": true }, { - "bid": "0.061", - "ask": "0.0625", - "open_interest": "50.7", - "volume": "1417.49", + "bid": "0.056", + "ask": "0.0575", + "open_interest": "69.1", + "volume": "0", "strike": "64000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4658683", - "iv_ask": "0.4719648", + "iv_bid": "0.4663949", + "iv_ask": "0.4728811", "inverse": true }, { - "bid": "0.065", - "ask": "0.0665", - "open_interest": "409.3", - "volume": "0", + "bid": "0.0595", + "ask": "0.061", + "open_interest": "470.5", + "volume": "958527.77", "strike": "65000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4634874", - "iv_ask": "0.4694142", + "iv_bid": "0.4623341", + "iv_ask": "0.4686335", "inverse": true }, { - "bid": "0.069", - "ask": "0.071", - "open_interest": "37.4", - "volume": "15240", + "bid": "0.0635", + "ask": "0.065", + "open_interest": "126.6", + "volume": "0", "strike": "66000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4604877", - "iv_ask": "0.4681817", + "iv_bid": "0.4597206", + "iv_ask": "0.465844", "inverse": true }, { - "bid": "0.078", - "ask": "0.08", - "open_interest": "241.9", - "volume": "0", + "bid": "0.0725", + "ask": "0.0735", + "open_interest": "264.5", + "volume": "19352.04", "strike": "68000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4564555", - "iv_ask": "0.4637856", + "iv_bid": "0.4564068", + "iv_ask": "0.4602832", "inverse": true }, { - "bid": "0.0885", - "ask": "0.0895", - "open_interest": "1173.4", - "volume": "43093.73", + "bid": "0.0815", + "ask": "0.083", + "open_interest": "1124.6", + "volume": "6505.06", "strike": "70000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4553156", - "iv_ask": "0.4588291", + "iv_bid": "0.4503714", + "iv_ask": "0.4559327", "inverse": true }, { - "bid": "0.098", - "ask": "0.0995", - "open_interest": "210.6", - "volume": "59325.12", + "bid": "0.0915", + "ask": "0.093", + "open_interest": "366.4", + "volume": "29717.34", "strike": "72000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4482641", - "iv_ask": "0.45335", + "iv_bid": "0.445472", + "iv_ask": "0.4508264", "inverse": true }, { - "bid": "0.109", - "ask": "0.1115", - "open_interest": "55.9", - "volume": "0", + "bid": "0.102", + "ask": "0.104", + "open_interest": "57.3", + "volume": "796.91", "strike": "74000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4440836", - "iv_ask": "0.4523094", + "iv_bid": "0.4398255", + "iv_ask": "0.4467439", "inverse": true }, { - "bid": "0.115", - "ask": "0.117", - "open_interest": "729.7", - "volume": "4512.24", + "bid": "0.108", + "ask": "0.1095", + "open_interest": "794.6", + "volume": "37634.74", "strike": "75000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4427834", - "iv_ask": "0.4492804", + "iv_bid": "0.4386538", + "iv_ask": "0.4437741", "inverse": true }, { - "bid": "0.121", - "ask": "0.1235", - "open_interest": "127.2", + "bid": "0.1135", + "ask": "0.1155", + "open_interest": "132.3", "volume": "0", "strike": "76000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4409156", - "iv_ask": "0.4489453", + "iv_bid": "0.4351538", + "iv_ask": "0.4419011", "inverse": true }, { - "bid": "0.134", - "ask": "0.1365", - "open_interest": "216", - "volume": "2082.33", + "bid": "0.126", + "ask": "0.128", + "open_interest": "248.2", + "volume": "0", "strike": "78000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4387076", - "iv_ask": "0.4465904", + "iv_bid": "0.4313785", + "iv_ask": "0.4380005", "inverse": true }, { - "bid": "0.1365", - "ask": "0.1385", - "open_interest": "3942.4", - "volume": "325204.46", + "bid": "0.127", + "ask": "0.1275", + "open_interest": "4855.9", + "volume": "512397.91", "strike": "80000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4375664", - "iv_ask": "0.443791", + "iv_bid": "0.4333078", + "iv_ask": "0.4349429", "inverse": true }, { - "bid": "0.125", - "ask": "0.1275", - "open_interest": "77.3", + "bid": "0.115", + "ask": "0.116", + "open_interest": "185.2", "volume": "0", "strike": "82000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4335411", - "iv_ask": "0.4412604", + "iv_bid": "0.4275045", + "iv_ask": "0.4307526", "inverse": true }, { - "bid": "0.115", - "ask": "0.117", - "open_interest": "527.5", - "volume": "19189.3", + "bid": "0.1045", + "ask": "0.1055", + "open_interest": "591.4", + "volume": "807.59", "strike": "84000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.432112", - "iv_ask": "0.4382695", + "iv_bid": "0.4242835", + "iv_ask": "0.4275287", "inverse": true }, { - "bid": "0.1105", - "ask": "0.112", - "open_interest": "1380.3", - "volume": "17323.71", + "bid": "0.1", + "ask": "0.1005", + "open_interest": "1539.7", + "volume": "80021.74", "strike": "85000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4321908", - "iv_ask": "0.4368105", + "iv_bid": "0.424262", + "iv_ask": "0.4258873", "inverse": true }, { - "bid": "0.105", - "ask": "0.1075", - "open_interest": "112.1", - "volume": "16586.39", + "bid": "0.0945", + "ask": "0.096", + "open_interest": "120.7", + "volume": "1477.19", "strike": "86000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4287009", - "iv_ask": "0.4364123", + "iv_bid": "0.4204317", + "iv_ask": "0.4253225", "inverse": true }, { - "bid": "0.0965", - "ask": "0.0975", - "open_interest": "1586.6", - "volume": "34774.46", + "bid": "0.086", + "ask": "0.0865", + "open_interest": "1712.6", + "volume": "68319.83", "strike": "88000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.428003", - "iv_ask": "0.4311079", + "iv_bid": "0.4192873", + "iv_ask": "0.4209341", "inverse": true }, { - "bid": "0.0885", - "ask": "0.09", - "open_interest": "2240.3", - "volume": "27861.5", + "bid": "0.0775", + "ask": "0.079", + "open_interest": "2227.3", + "volume": "2463.37", "strike": "90000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4270223", - "iv_ask": "0.4317289", + "iv_bid": "0.4160191", + "iv_ask": "0.4210341", "inverse": true }, { - "bid": "0.0805", - "ask": "0.0825", - "open_interest": "138.1", - "volume": "13318.92", + "bid": "0.07", + "ask": "0.0715", + "open_interest": "217.5", + "volume": "0", "strike": "92000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.424245", - "iv_ask": "0.430615", + "iv_bid": "0.414019", + "iv_ask": "0.4191349", "inverse": true }, { - "bid": "0.0735", - "ask": "0.0755", - "open_interest": "52.7", + "bid": "0.0635", + "ask": "0.0645", + "open_interest": "65.3", "volume": "0", "strike": "94000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4229086", - "iv_ask": "0.4293985", + "iv_bid": "0.4134683", + "iv_ask": "0.4169626", "inverse": true }, { - "bid": "0.071", - "ask": "0.072", - "open_interest": "878.5", - "volume": "40877.5", + "bid": "0.06", + "ask": "0.0615", + "open_interest": "1168.3", + "volume": "39554.5", "strike": "95000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4248858", - "iv_ask": "0.4281638", + "iv_bid": "0.4115896", + "iv_ask": "0.416905", "inverse": true }, { - "bid": "0.067", - "ask": "0.069", - "open_interest": "49", + "bid": "0.057", + "ask": "0.0585", + "open_interest": "65.6", "volume": "0", "strike": "96000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4215262", - "iv_ask": "0.4281631", + "iv_bid": "0.4109999", + "iv_ask": "0.4163942", "inverse": true }, { - "bid": "0.061", - "ask": "0.063", - "open_interest": "37.6", + "bid": "0.0515", + "ask": "0.0535", + "open_interest": "70", "volume": "0", "strike": "98000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4201873", - "iv_ask": "0.4269985", + "iv_bid": "0.4102709", + "iv_ask": "0.4176904", "inverse": true }, { - "bid": "0.056", - "ask": "0.0575", - "open_interest": "2382", - "volume": "1773.15", + "bid": "0.0465", + "ask": "0.048", + "open_interest": "2356.2", + "volume": "37380.71", "strike": "100000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4207486", - "iv_ask": "0.4260033", + "iv_bid": "0.4096577", + "iv_ask": "0.4154293", "inverse": true }, { - "bid": "0.051", - "ask": "0.0525", - "open_interest": "39.9", - "volume": "78938.4", + "bid": "0.042", + "ask": "0.0435", + "open_interest": "57.7", + "volume": "0", "strike": "102000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4198637", - "iv_ask": "0.4252884", + "iv_bid": "0.4093035", + "iv_ask": "0.4153022", "inverse": true }, { - "bid": "0.0465", - "ask": "0.048", - "open_interest": "35.2", - "volume": "107766.3", + "bid": "0.038", + "ask": "0.0395", + "open_interest": "64", + "volume": "0", "strike": "104000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4193658", - "iv_ask": "0.4249792", + "iv_bid": "0.4093728", + "iv_ask": "0.4156223", "inverse": true }, { - "bid": "0.0445", - "ask": "0.0455", - "open_interest": "755.1", - "volume": "0", + "bid": "0.036", + "ask": "0.0375", + "open_interest": "708", + "volume": "153314.78", "strike": "105000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4195455", - "iv_ask": "0.4233592", + "iv_bid": "0.4088213", + "iv_ask": "0.4152136", "inverse": true }, { - "bid": "0.035", - "ask": "0.0365", - "open_interest": "1905", - "volume": "2288.72", + "bid": "0.0345", + "ask": "0.0355", + "open_interest": "74.7", + "volume": "0", + "strike": "106000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4100557", + "iv_ask": "0.414412", + "inverse": true + }, + { + "bid": "0.031", + "ask": "0.0325", + "open_interest": "76", + "volume": "0", + "strike": "108000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4092779", + "iv_ask": "0.4161181", + "inverse": true + }, + { + "bid": "0.0285", + "ask": "0.0295", + "open_interest": "2910.1", + "volume": "59348.43", "strike": "110000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4175218", - "iv_ask": "0.423841", + "iv_bid": "0.4117678", + "iv_ask": "0.4165397", "inverse": true }, { - "bid": "0.028", - "ask": "0.029", - "open_interest": "2688.7", - "volume": "23290.69", + "bid": "0.022", + "ask": "0.0235", + "open_interest": "2501.3", + "volume": "5485.34", "strike": "115000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4185056", - "iv_ask": "0.4232116", + "iv_bid": "0.4114016", + "iv_ask": "0.4195322", "inverse": true }, { - "bid": "0.0225", - "ask": "0.0235", - "open_interest": "6583.5", - "volume": "27714.15", + "bid": "0.018", + "ask": "0.0185", + "open_interest": "7058.2", + "volume": "5733.95", "strike": "120000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.420054", - "iv_ask": "0.425338", + "iv_bid": "0.4177896", + "iv_ask": "0.420869", "inverse": true }, { - "bid": "0.018", - "ask": "0.019", - "open_interest": "501.9", - "volume": "0", + "bid": "0.014", + "ask": "0.015", + "open_interest": "820.3", + "volume": "7301.8", "strike": "125000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4209927", - "iv_ask": "0.4269805", + "iv_bid": "0.4181325", + "iv_ask": "0.4252136", "inverse": true }, { - "bid": "0.014", - "ask": "0.0155", - "open_interest": "1730.3", - "volume": "19458.27", + "bid": "0.011", + "ask": "0.012", + "open_interest": "1508.9", + "volume": "170.4", "strike": "130000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4190828", - "iv_ask": "0.4293767", + "iv_bid": "0.4194931", + "iv_ask": "0.4276967", "inverse": true }, { - "bid": "0.0115", - "ask": "0.013", - "open_interest": "699.1", - "volume": "13730.46", + "bid": "0.009", + "ask": "0.01", + "open_interest": "901.7", + "volume": "0", "strike": "135000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4225318", - "iv_ask": "0.4341579", + "iv_bid": "0.4242077", + "iv_ask": "0.4335599", "inverse": true }, { - "bid": "0.0095", - "ask": "0.0105", - "open_interest": "1103.5", - "volume": "389.72", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "1400.6", + "volume": "58.21", "strike": "140000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4260323", - "iv_ask": "0.4348952", + "iv_bid": "0.4298431", + "iv_ask": "0.4404236", "inverse": true }, { - "bid": "0.0065", - "ask": "0.008", - "open_interest": "1508.9", - "volume": "0", + "bid": "0.005", + "ask": "0.006", + "open_interest": "1559.8", + "volume": "38.79", "strike": "150000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4319949", - "iv_ask": "0.4487617", + "iv_bid": "0.4362192", + "iv_ask": "0.4501", "inverse": true }, { - "bid": "0.005", - "ask": "0.006", - "open_interest": "1029.6", - "volume": "567.37", + "bid": "0.0037", + "ask": "0.0042", + "open_interest": "1172.5", + "volume": "2323.3", "strike": "160000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4449599", - "iv_ask": "0.4587394", + "iv_bid": "0.4482195", + "iv_ask": "0.4571405", "inverse": true }, { - "bid": "0.0039", - "ask": "0.0044", - "open_interest": "1979.8", - "volume": "1368.16", + "bid": "0.0031", + "ask": "0.0034", + "open_interest": "2143.3", + "volume": "492.14", "strike": "170000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4566378", - "iv_ask": "0.4651832", + "iv_bid": "0.4662594", + "iv_ask": "0.4725881", "inverse": true }, { - "bid": "0.0028", - "ask": "0.0035", - "open_interest": "831.5", + "bid": "0.0022", + "ask": "0.0027", + "open_interest": "919.2", "volume": "0", "strike": "180000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4610361", - "iv_ask": "0.4759005", + "iv_bid": "0.471281", + "iv_ask": "0.4845143", "inverse": true }, { - "bid": "0.0021", - "ask": "0.0028", - "open_interest": "963.2", - "volume": "35.07", + "bid": "0.0017", + "ask": "0.0023", + "open_interest": "989.2", + "volume": "0", "strike": "190000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4671526", - "iv_ask": "0.4853673", + "iv_bid": "0.4803256", + "iv_ask": "0.499248", "inverse": true }, { - "bid": "0.0016", + "bid": "0.0013", "ask": "0.002", - "open_interest": "922.6", - "volume": "128.87", + "open_interest": "942.4", + "volume": "0", "strike": "200000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4731253", - "iv_ask": "0.4863711", + "iv_bid": "0.4874298", + "iv_ask": "0.5135969", "inverse": true }, { - "bid": "0.0014", - "ask": "0.0018", - "open_interest": "134.2", + "bid": "0.0011", + "ask": "0.0017", + "open_interest": "149.2", "volume": "0", "strike": "210000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4858514", - "iv_ask": "0.5006689", + "iv_bid": "0.4990451", + "iv_ask": "0.524983", "inverse": true }, { - "bid": "0.0014", - "ask": "0.0017", - "open_interest": "222.2", + "bid": "0.0011", + "ask": "0.0015", + "open_interest": "221.8", "volume": "0", "strike": "220000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5049758", - "iv_ask": "0.5166325", + "iv_bid": "0.5188023", + "iv_ask": "0.5374411", "inverse": true }, { - "bid": "0.0009", - "ask": "0.0014", - "open_interest": "186.3", - "volume": "7.78", + "bid": "0.0008", + "ask": "0.0013", + "open_interest": "186.8", + "volume": "0", "strike": "230000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4982523", - "iv_ask": "0.5231024", + "iv_bid": "0.5195513", + "iv_ask": "0.5476157", "inverse": true }, { - "bid": "0.0009", - "ask": "0.0015", - "open_interest": "877.9", + "bid": "0.0007", + "ask": "0.0012", + "open_interest": "879.2", "volume": "0", "strike": "240000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5148978", - "iv_ask": "0.5445898", + "iv_bid": "0.5296618", + "iv_ask": "0.5606509", "inverse": true }, { "bid": "0.0007", - "ask": "0.0012", - "open_interest": "1135.2", - "volume": "255.77", + "ask": "0.0011", + "open_interest": "1186.4", + "volume": "0", "strike": "250000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.5172986", - "iv_ask": "0.5473116", + "iv_bid": "0.5460613", + "iv_ask": "0.5723", "inverse": true }, { - "bid": "79800", - "ask": "79802.5", - "open_interest": "15964110", - "volume": "3373920", + "bid": "79542.5", + "ask": "79560", + "open_interest": "16356610", + "volume": "1525090", "maturity": "2027-03-26T08:00:00Z", "security_type": "forward" }, { - "bid": "0.018", - "ask": "0.0195", - "open_interest": "430.9", - "volume": "22395.24", + "bid": "0.016", + "ask": "0.017", + "open_interest": "740", + "volume": "34382.22", "strike": "40000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.5675747", - "iv_ask": "0.5803427", + "iv_bid": "0.5692864", + "iv_ask": "0.5786", "inverse": true }, { - "bid": "0.0355", - "ask": "0.037", - "open_interest": "1288.2", - "volume": "1942.15", + "bid": "0.0325", + "ask": "0.0335", + "open_interest": "1916.2", + "volume": "1307554.9", "strike": "50000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.517943", - "iv_ask": "0.5259073", + "iv_bid": "0.5190345", + "iv_ask": "0.5246949", "inverse": true }, { - "bid": "0.0485", - "ask": "0.05", - "open_interest": "629.3", - "volume": "376.13", + "bid": "0.045", + "ask": "0.0465", + "open_interest": "1213.6", + "volume": "0", "strike": "55000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.499579", - "iv_ask": "0.506169", + "iv_bid": "0.5004849", + "iv_ask": "0.5074307", "inverse": true }, { - "bid": "0.0515", - "ask": "0.053", - "open_interest": "34.8", + "bid": "0.048", + "ask": "0.0495", + "open_interest": "53.4", "volume": "0", "strike": "56000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4963148", - "iv_ask": "0.5026841", + "iv_bid": "0.4976177", + "iv_ask": "0.504317", "inverse": true }, { - "bid": "0.058", - "ask": "0.06", - "open_interest": "23.9", + "bid": "0.054", + "ask": "0.0555", + "open_interest": "49.6", "volume": "0", "strike": "58000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4904471", - "iv_ask": "0.4984018", + "iv_bid": "0.4903554", + "iv_ask": "0.4966245", "inverse": true }, { - "bid": "0.065", - "ask": "0.067", - "open_interest": "122.7", - "volume": "1491.49", + "bid": "0.0605", + "ask": "0.0625", + "open_interest": "144.5", + "volume": "4714.29", "strike": "60000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4846734", - "iv_ask": "0.4921719", + "iv_bid": "0.4832935", + "iv_ask": "0.4911506", "inverse": true }, { - "bid": "0.0725", - "ask": "0.075", - "open_interest": "60.1", + "bid": "0.068", + "ask": "0.07", + "open_interest": "75.1", "volume": "0", "strike": "62000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4789458", - "iv_ask": "0.4878228", + "iv_bid": "0.4782111", + "iv_ask": "0.4856328", "inverse": true }, { - "bid": "0.081", - "ask": "0.0835", - "open_interest": "22.7", + "bid": "0.076", + "ask": "0.078", + "open_interest": "73", "volume": "0", "strike": "64000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4749216", - "iv_ask": "0.4833696", + "iv_bid": "0.4729972", + "iv_ask": "0.4800463", "inverse": true }, { - "bid": "0.0855", - "ask": "0.088", - "open_interest": "25.4", + "bid": "0.0805", + "ask": "0.0825", + "open_interest": "265.1", "volume": "0", "strike": "65000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4730537", - "iv_ask": "0.4813104", + "iv_bid": "0.4714147", + "iv_ask": "0.4782955", "inverse": true }, { - "bid": "0.09", - "ask": "0.0925", - "open_interest": "29.4", + "bid": "0.0845", + "ask": "0.087", + "open_interest": "57.7", "volume": "0", "strike": "66000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4707328", - "iv_ask": "0.4788136", + "iv_bid": "0.4676429", + "iv_ask": "0.4760536", "inverse": true }, { - "bid": "0.0995", - "ask": "0.102", - "open_interest": "34.1", - "volume": "0", + "bid": "0.094", + "ask": "0.096", + "open_interest": "40.2", + "volume": "743.62", "strike": "68000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4663906", - "iv_ask": "0.4741575", + "iv_bid": "0.4637569", + "iv_ask": "0.4702126", "inverse": true }, { - "bid": "0.11", - "ask": "0.1125", - "open_interest": "72.7", - "volume": "84054.42", + "bid": "0.104", + "ask": "0.106", + "open_interest": "73.6", + "volume": "3276.79", "strike": "70000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4634057", - "iv_ask": "0.4709042", + "iv_bid": "0.4596019", + "iv_ask": "0.4658256", "inverse": true }, { - "bid": "0.121", - "ask": "0.124", - "open_interest": "104.3", + "bid": "0.115", + "ask": "0.117", + "open_interest": "107.1", "volume": "0", "strike": "72000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4601959", - "iv_ask": "0.4689229", + "iv_bid": "0.4567083", + "iv_ask": "0.462737", "inverse": true }, { - "bid": "0.1325", - "ask": "0.1355", + "bid": "0.126", + "ask": "0.1285", "open_interest": "23.1", "volume": "0", "strike": "74000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4567922", - "iv_ask": "0.4652929", + "iv_bid": "0.4520399", + "iv_ask": "0.4593739", "inverse": true }, { - "bid": "0.145", - "ask": "0.148", - "open_interest": "5.2", + "bid": "0.138", + "ask": "0.141", + "open_interest": "7.7", "volume": "0", "strike": "76000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4546068", - "iv_ask": "0.462922", + "iv_bid": "0.4486009", + "iv_ask": "0.4572049", "inverse": true }, { - "bid": "0.1575", - "ask": "0.1595", - "open_interest": "114.5", + "bid": "0.151", + "ask": "0.1535", + "open_interest": "176", "volume": "0", "strike": "78000", "maturity": "2027-03-26T08:00:00Z", "option_type": "put", "security_type": "option", - "iv_bid": "0.4508679", - "iv_ask": "0.4563106", + "iv_bid": "0.4463247", + "iv_ask": "0.4533647", "inverse": true }, { - "bid": "0.1685", - "ask": "0.1715", - "open_interest": "306.6", + "bid": "0.159", + "ask": "0.1615", + "open_interest": "525.8", "volume": "0", "strike": "80000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4483291", - "iv_ask": "0.4563785", + "iv_bid": "0.4415988", + "iv_ask": "0.4485389", "inverse": true }, { - "bid": "0.158", - "ask": "0.1595", - "open_interest": "100.9", - "volume": "1312.3", + "bid": "0.148", + "ask": "0.15", + "open_interest": "149", + "volume": "44978.86", "strike": "82000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4471844", - "iv_ask": "0.4511663", + "iv_bid": "0.4391986", + "iv_ask": "0.4446949", "inverse": true }, { - "bid": "0.1475", - "ask": "0.15", - "open_interest": "27", - "volume": "1190.08", + "bid": "0.1375", + "ask": "0.1395", + "open_interest": "73.2", + "volume": "0", "strike": "84000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4446112", - "iv_ask": "0.4512014", + "iv_bid": "0.4366111", + "iv_ask": "0.4420737", "inverse": true }, { - "bid": "0.1375", - "ask": "0.1405", - "open_interest": "30", + "bid": "0.1275", + "ask": "0.13", + "open_interest": "30.8", "volume": "0", "strike": "86000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4419852", - "iv_ask": "0.4498641", + "iv_bid": "0.4338765", + "iv_ask": "0.4406886", "inverse": true }, { - "bid": "0.1285", - "ask": "0.1315", - "open_interest": "19.6", + "bid": "0.1185", + "ask": "0.1205", + "open_interest": "19.7", "volume": "0", "strike": "88000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4406535", - "iv_ask": "0.4485282", + "iv_bid": "0.432398", + "iv_ask": "0.4378542", "inverse": true }, { - "bid": "0.12", - "ask": "0.123", - "open_interest": "58.4", - "volume": "993.16", + "bid": "0.11", + "ask": "0.112", + "open_interest": "390.9", + "volume": "0", "strike": "90000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4393464", - "iv_ask": "0.4472404", + "iv_bid": "0.4308631", + "iv_ask": "0.4363441", "inverse": true }, { - "bid": "0.1115", - "ask": "0.1145", - "open_interest": "63.3", - "volume": "9113.44", + "bid": "0.102", + "ask": "0.104", + "open_interest": "64", + "volume": "0", "strike": "92000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4367892", - "iv_ask": "0.4447267", + "iv_bid": "0.4293254", + "iv_ask": "0.4348491", "inverse": true }, { - "bid": "0.104", - "ask": "0.107", - "open_interest": "28.2", + "bid": "0.0945", + "ask": "0.0965", + "open_interest": "35.5", "volume": "0", "strike": "94000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4356695", - "iv_ask": "0.4436715", + "iv_bid": "0.4278404", + "iv_ask": "0.4334243", "inverse": true }, { - "bid": "0.1005", - "ask": "0.1035", - "open_interest": "65", - "volume": "16048.48", + "bid": "0.091", + "ask": "0.093", + "open_interest": "69.1", + "volume": "0", "strike": "95000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4353399", - "iv_ask": "0.4433815", + "iv_bid": "0.4273117", + "iv_ask": "0.4329318", "inverse": true }, { - "bid": "0.097", - "ask": "0.1", - "open_interest": "51.4", - "volume": "8945.05", + "bid": "0.0875", + "ask": "0.0895", + "open_interest": "59.4", + "volume": "676.51", "strike": "96000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.434726", - "iv_ask": "0.4428132", + "iv_bid": "0.4264671", + "iv_ask": "0.4321282", "inverse": true }, { - "bid": "0.0905", - "ask": "0.0935", - "open_interest": "19", + "bid": "0.081", + "ask": "0.083", + "open_interest": "18.6", "volume": "0", "strike": "98000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4340182", - "iv_ask": "0.4422103", + "iv_bid": "0.4252696", + "iv_ask": "0.4310243", "inverse": true }, { - "bid": "0.084", - "ask": "0.087", - "open_interest": "128", - "volume": "6961.12", + "bid": "0.075", + "ask": "0.077", + "open_interest": "137.5", + "volume": "5963.63", "strike": "100000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4322207", - "iv_ask": "0.4405429", + "iv_bid": "0.4243178", + "iv_ask": "0.4301823", "inverse": true }, { - "bid": "0.0785", - "ask": "0.0815", - "open_interest": "22.5", - "volume": "6478.32", + "bid": "0.0695", + "ask": "0.0715", + "open_interest": "34.4", + "volume": "0", "strike": "102000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4321595", - "iv_ask": "0.4406239", + "iv_bid": "0.4236896", + "iv_ask": "0.4296788", "inverse": true }, { - "bid": "0.073", - "ask": "0.076", - "open_interest": "1", + "bid": "0.0645", + "ask": "0.0665", + "open_interest": "9.6", "volume": "0", "strike": "104000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.431101", - "iv_ask": "0.4397331", + "iv_bid": "0.4234716", + "iv_ask": "0.4295994", "inverse": true }, { - "bid": "0.0705", - "ask": "0.0735", - "open_interest": "51.9", + "bid": "0.062", + "ask": "0.064", + "open_interest": "97.4", "volume": "0", "strike": "105000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4309251", - "iv_ask": "0.4396462", + "iv_bid": "0.4229626", + "iv_ask": "0.4291682", "inverse": true }, { - "bid": "0.068", - "ask": "0.071", - "open_interest": "0", + "bid": "0.06", + "ask": "0.0615", + "open_interest": "15.4", "volume": "0", "strike": "106000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.430512", - "iv_ask": "0.4393289", + "iv_bid": "0.4237602", + "iv_ask": "0.4284732", "inverse": true }, { - "bid": "0.063", - "ask": "0.066", - "open_interest": "5", - "volume": "27513.66", + "bid": "0.0555", + "ask": "0.057", + "open_interest": "32.9", + "volume": "0", "strike": "108000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4289668", - "iv_ask": "0.4379983", + "iv_bid": "0.4230437", + "iv_ask": "0.4278879", "inverse": true }, { - "bid": "0.059", - "ask": "0.062", - "open_interest": "35.2", + "bid": "0.0515", + "ask": "0.053", + "open_interest": "90.6", "volume": "0", "strike": "110000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4295475", - "iv_ask": "0.4387921", + "iv_bid": "0.422967", + "iv_ask": "0.427951", "inverse": true }, { - "bid": "0.049", - "ask": "0.052", - "open_interest": "393.3", + "bid": "0.0475", + "ask": "0.0495", + "open_interest": "18.2", "volume": "0", - "strike": "115000", + "strike": "112000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4273018", - "iv_ask": "0.4372142", + "iv_bid": "0.4219323", + "iv_ask": "0.4287816", "inverse": true }, { - "bid": "0.0415", + "bid": "0.0425", "ask": "0.044", - "open_interest": "80.5", + "open_interest": "527.2", "volume": "0", - "strike": "120000", + "strike": "115000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4284489", - "iv_ask": "0.4373427", + "iv_bid": "0.4221283", + "iv_ask": "0.4275233", "inverse": true }, { - "bid": "0.035", - "ask": "0.0375", - "open_interest": "22.6", + "bid": "0.0355", + "ask": "0.037", + "open_interest": "185.2", "volume": "0", - "strike": "125000", + "strike": "120000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.428861", - "iv_ask": "0.4384941", + "iv_bid": "0.423243", + "iv_ask": "0.4291091", "inverse": true }, { "bid": "0.0295", - "ask": "0.0315", - "open_interest": "592.1", - "volume": "253.38", + "ask": "0.031", + "open_interest": "48.1", + "volume": "14508.61", + "strike": "125000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4235706", + "iv_ask": "0.4300026", + "inverse": true + }, + { + "bid": "0.025", + "ask": "0.026", + "open_interest": "638.4", + "volume": "3190.44", "strike": "130000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4291369", - "iv_ask": "0.4375563", + "iv_bid": "0.426195", + "iv_ask": "0.430905", "inverse": true }, { - "bid": "0.0215", - "ask": "0.0235", - "open_interest": "80.5", - "volume": "2002.98", + "bid": "0.018", + "ask": "0.019", + "open_interest": "110.7", + "volume": "1481.29", "strike": "140000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4323137", - "iv_ask": "0.4423314", + "iv_bid": "0.4306551", + "iv_ask": "0.4363593", "inverse": true }, { - "bid": "0.0155", - "ask": "0.017", - "open_interest": "83", - "volume": "271.41", + "bid": "0.013", + "ask": "0.0145", + "open_interest": "1260.7", + "volume": "551576.81", "strike": "150000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4335328", - "iv_ask": "0.4426856", + "iv_bid": "0.4342409", + "iv_ask": "0.4446091", "inverse": true }, { - "bid": "0.012", - "ask": "0.013", - "open_interest": "604", - "volume": "467.16", + "bid": "0.01", + "ask": "0.011", + "open_interest": "814.3", + "volume": "155.27", "strike": "160000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4405418", - "iv_ask": "0.4478131", + "iv_bid": "0.4422051", + "iv_ask": "0.4505239", "inverse": true }, { - "bid": "0.009", - "ask": "0.0105", - "open_interest": "63.3", - "volume": "82.66", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "145.5", + "volume": "5960.34", "strike": "170000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4434883", - "iv_ask": "0.4564694", + "iv_bid": "0.4465725", + "iv_ask": "0.4566574", "inverse": true }, { - "bid": "0.007", - "ask": "0.0085", - "open_interest": "198.7", - "volume": "7845.12", + "bid": "0.006", + "ask": "0.007", + "open_interest": "299", + "volume": "251.79", "strike": "180000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.4484281", - "iv_ask": "0.4637703", + "iv_bid": "0.4547126", + "iv_ask": "0.4665266", "inverse": true }, { - "bid": "0.0055", - "ask": "0.0075", - "open_interest": "64.9", - "volume": "6366.53", + "bid": "0.005", + "ask": "0.006", + "open_interest": "161.9", + "volume": "0", "strike": "190000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.453116", - "iv_ask": "0.476623", + "iv_bid": "0.4644076", + "iv_ask": "0.4779217", "inverse": true }, { - "bid": "0.0048", - "ask": "0.0055", - "open_interest": "57.8", - "volume": "218.23", + "bid": "0.0041", + "ask": "0.0049", + "open_interest": "259.5", + "volume": "300.11", "strike": "200000", "maturity": "2027-03-26T08:00:00Z", "option_type": "call", "security_type": "option", - "iv_bid": "0.464132", - "iv_ask": "0.4738818", + "iv_bid": "0.4716403", + "iv_ask": "0.4842735", "inverse": true } ] diff --git a/docs/examples/fixtures/volsurface_eth.json b/docs/examples/fixtures/volsurface_eth.json index 1e23240d..e67b375c 100644 --- a/docs/examples/fixtures/volsurface_eth.json +++ b/docs/examples/fixtures/volsurface_eth.json @@ -1,4359 +1,3916 @@ { "asset": "eth", - "ref_date": "2026-01-31T12:25:19.499850Z", + "asset_curve": { + "ref_date": "2026-05-21T10:08:42.397057Z", + "curve_type": "no_discount" + }, + "quote_curve": { + "ref_date": "2026-05-21T10:08:42.397057Z", + "curve_type": "nelson_siegel", + "beta1": "0.0430852145", + "beta2": "-0.0189909065", + "beta3": "-0.0679762918", + "lambda_": "9.9928466198" + }, "inputs": [ { - "bid": "2635.25", - "ask": "2635.30", - "open_interest": "397478495", - "volume": "233177071.0", + "bid": "2125.7", + "ask": "2125.75", + "open_interest": "311539747", + "volume": "73039627", "security_type": "spot" }, { - "bid": "2637.00", - "ask": "2637.75", - "open_interest": "8615529", - "volume": "7197233.0", - "maturity": "2026-02-06T08:00:00Z", + "bid": "2125.5", + "ask": "2125.75", + "open_interest": "5430815", + "volume": "1488159", + "maturity": "2026-05-22T08:00:00Z", "security_type": "forward" }, { - "bid": "0.0970", - "ask": "0.1000", - "open_interest": "65.0", - "volume": "17808.85", - "strike": "2400.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0080", - "ask": "0.0085", - "open_interest": "8334.0", - "volume": "39295.43", - "strike": "2400.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "7621", + "volume": "2631.85", + "strike": "2000", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5898448", + "iv_ask": "0.6597484", + "inverse": true }, { - "bid": "0.0100", - "ask": "0.0110", - "open_interest": "790.0", - "volume": "20308.16", - "strike": "2450.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0004", + "ask": "0.0007", + "open_interest": "430", + "volume": "363.26", + "strike": "2025", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5466591", + "iv_ask": "0.6101786", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0145", - "open_interest": "336.0", - "volume": "12741.23", - "strike": "2500.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0008", + "ask": "0.0011", + "open_interest": "1062", + "volume": "2065", + "strike": "2050", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5005718", + "iv_ask": "0.5412402", + "inverse": true }, { - "bid": "0.0500", - "ask": "0.0535", - "open_interest": "1.0", - "volume": "172.2", - "strike": "2550.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0180", - "ask": "0.0190", - "open_interest": "993.0", - "volume": "142363.24", - "strike": "2550.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0016", + "ask": "0.002", + "open_interest": "445", + "volume": "864.04", + "strike": "2075", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4505546", + "iv_ask": "0.4853175", + "inverse": true }, { - "bid": "0.0385", - "ask": "0.0395", - "open_interest": "72.0", - "volume": "5403.44", - "strike": "2600.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0240", - "ask": "0.0255", - "open_interest": "5175.0", - "volume": "97966.61", - "strike": "2600.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0036", + "ask": "0.0041", + "open_interest": "8411", + "volume": "7425.66", + "strike": "2100", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4191678", + "iv_ask": "0.4487797", + "inverse": true }, { - "bid": "0.0275", - "ask": "0.0290", - "open_interest": "237.0", - "volume": "23482.45", - "strike": "2650.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0325", - "ask": "0.0335", - "open_interest": "788.0", - "volume": "61913.3", - "strike": "2650.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "7358", + "volume": "103676.78", + "strike": "2125", + "maturity": "2026-05-22T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3864152", + "iv_ask": "0.4366218", + "inverse": true }, { - "bid": "0.0195", - "ask": "0.0200", - "open_interest": "511.0", - "volume": "33138.18", - "strike": "2700.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0033", + "ask": "0.0039", + "open_interest": "3840", + "volume": "36964.72", + "strike": "2150", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0415", - "ask": "0.0450", - "open_interest": "6388.0", - "volume": "57465.12", - "strike": "2700.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3832703", + "iv_ask": "0.4183887", + "inverse": true }, { - "bid": "0.0130", - "ask": "0.0140", - "open_interest": "776.0", - "volume": "32574.29", - "strike": "2750.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0014", + "ask": "0.0017", + "open_interest": "2707", + "volume": "2814.05", + "strike": "2175", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0540", - "ask": "0.0575", - "open_interest": "2691.0", - "volume": "93993.49", - "strike": "2750.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4121547", + "iv_ask": "0.4387093", + "inverse": true }, { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "2046.0", - "volume": "39680.28", - "strike": "2800.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0006", + "ask": "0.0009", + "open_interest": "3623", + "volume": "3658.14", + "strike": "2200", + "maturity": "2026-05-22T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.444837", + "iv_ask": "0.4885229", + "inverse": true }, { - "bid": "0.0680", - "ask": "0.0715", - "open_interest": "4290.0", - "volume": "26795.96", - "strike": "2800.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "2714", + "volume": "2443.65", + "strike": "2250", + "maturity": "2026-05-22T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5497289", + "iv_ask": "0.6150819", + "inverse": true }, { - "bid": "0.0055", - "ask": "0.0060", - "open_interest": "1699.0", - "volume": "6380.46", - "strike": "2850.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "6578", + "volume": "432.18", + "strike": "2300", + "maturity": "2026-05-22T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.6628309", + "iv_ask": "0.7260448", + "inverse": true + }, + { + "bid": "2116", + "ask": "2132.5", + "open_interest": "17067", + "volume": "10710", + "maturity": "2026-05-23T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0830", - "ask": "0.0890", - "open_interest": "2040.0", - "volume": "58465.05", - "strike": "2850.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "695", + "volume": "3.41", + "strike": "1900", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6904371", + "iv_ask": "0.7623777", + "inverse": true }, { - "bid": "0.0035", - "ask": "0.0040", - "open_interest": "1675.0", - "volume": "4139.29", - "strike": "2900.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "103", + "volume": "90.34", + "strike": "1950", + "maturity": "2026-05-23T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6096839", + "iv_ask": "0.6529888", + "inverse": true }, { - "bid": "0.1000", - "ask": "0.1060", - "open_interest": "3555.0", - "volume": "7128.68", - "strike": "2900.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0006", + "ask": "0.0008", + "open_interest": "294", + "volume": "1187.98", + "strike": "1975", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5723022", + "iv_ask": "0.6044527", + "inverse": true }, { - "bid": "0.0028", - "ask": "0.0033", - "open_interest": "1218.0", - "volume": "9791.21", - "strike": "2925.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.001", + "ask": "0.0012", + "open_interest": "1740", + "volume": "48.85", + "strike": "2000", + "maturity": "2026-05-23T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5449622", + "iv_ask": "0.5675813", + "inverse": true }, { - "bid": "0.1090", - "ask": "0.1145", - "open_interest": "1317.0", - "volume": "9570.87", - "strike": "2925.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0015", + "ask": "0.0017", + "open_interest": "274", + "volume": "99.64", + "strike": "2025", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5036662", + "iv_ask": "0.5204981", + "inverse": true }, { "bid": "0.0023", - "ask": "0.0026", - "open_interest": "1937.0", - "volume": "1391.37", - "strike": "2950.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1180", - "ask": "0.1235", - "open_interest": "1125.0", - "volume": "1996.38", - "strike": "2950.0000", - "maturity": "2026-02-06T08:00:00Z", + "ask": "0.0027", + "open_interest": "103", + "volume": "118.69", + "strike": "2050", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0015", - "ask": "0.0019", - "open_interest": "4544.0", - "volume": "9774.06", - "strike": "3000.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4619188", + "iv_ask": "0.4867005", + "inverse": true }, { - "bid": "0.1360", - "ask": "0.1415", - "open_interest": "13493.0", - "volume": "8342.81", - "strike": "3000.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0039", + "ask": "0.0044", + "open_interest": "120", + "volume": "165.75", + "strike": "2075", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4336451", + "iv_ask": "0.4569453", + "inverse": true }, { - "bid": "0.0010", - "ask": "0.0013", - "open_interest": "2036.0", - "volume": "1212.68", - "strike": "3050.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0065", + "ask": "0.0075", + "open_interest": "220", + "volume": "820.52", + "strike": "2100", + "maturity": "2026-05-23T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4045199", + "iv_ask": "0.4423182", + "inverse": true }, { - "bid": "0.1545", - "ask": "0.1600", - "open_interest": "559.0", - "volume": "629.96", - "strike": "3050.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.011", + "ask": "0.012", + "open_interest": "361", + "volume": "10714.51", + "strike": "2125", + "maturity": "2026-05-23T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3893008", + "iv_ask": "0.4239628", + "inverse": true }, { - "bid": "0.0007", - "ask": "0.0010", - "open_interest": "3019.0", - "volume": "8077.18", - "strike": "3100.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.006", + "ask": "0.007", + "open_interest": "673", + "volume": "9786.5", + "strike": "2150", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3690337", + "iv_ask": "0.406368", + "inverse": true }, { - "bid": "0.1730", - "ask": "0.1785", - "open_interest": "1698.0", - "volume": "0.0", - "strike": "3100.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0033", + "ask": "0.0037", + "open_interest": "251", + "volume": "2262.53", + "strike": "2175", + "maturity": "2026-05-23T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3859476", + "iv_ask": "0.4047696", + "inverse": true }, { - "bid": "0.0006", - "ask": "0.0009", - "open_interest": "3461.0", - "volume": "1003.42", - "strike": "3150.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0016", + "ask": "0.002", + "open_interest": "246", + "volume": "449.82", + "strike": "2200", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3921861", + "iv_ask": "0.4190799", + "inverse": true }, { - "bid": "0.1920", - "ask": "0.1975", - "open_interest": "150.0", - "volume": "0.0", - "strike": "3150.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0009", + "ask": "0.0012", + "open_interest": "1255", + "volume": "3275.3", + "strike": "2225", + "maturity": "2026-05-23T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4183812", + "iv_ask": "0.4475877", + "inverse": true }, { - "bid": "0.0004", + "bid": "0.0006", "ask": "0.0007", - "open_interest": "2895.0", - "volume": "29.82", - "strike": "3200.0000", - "maturity": "2026-02-06T08:00:00Z", + "open_interest": "555", + "volume": "74.51", + "strike": "2250", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2110", - "ask": "0.2165", - "open_interest": "853.0", - "volume": "49751.34", - "strike": "3200.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4569462", + "iv_ask": "0.4709649", + "inverse": true }, { "bid": "0.0003", - "ask": "0.0006", - "open_interest": "1694.0", - "volume": "16.95", - "strike": "3250.0000", - "maturity": "2026-02-06T08:00:00Z", + "ask": "0.0005", + "open_interest": "203", + "volume": "232.32", + "strike": "2275", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2295", - "ask": "0.2350", - "open_interest": "246.0", - "volume": "0.0", - "strike": "3250.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4687542", + "iv_ask": "0.5104235", + "inverse": true }, { "bid": "0.0002", - "ask": "0.0005", - "open_interest": "1916.0", - "volume": "15.8", - "strike": "3300.0000", - "maturity": "2026-02-06T08:00:00Z", + "ask": "0.0004", + "open_interest": "24", + "volume": "29.8", + "strike": "2300", + "maturity": "2026-05-23T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5008554", + "iv_ask": "0.5560522", + "inverse": true }, { - "bid": "0.2485", - "ask": "0.2540", - "open_interest": "306.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "3", + "volume": "1.28", + "strike": "2350", + "maturity": "2026-05-23T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5648167", + "iv_ask": "0.6518551", + "inverse": true + }, + { + "bid": "2116", + "ask": "2133.5", + "open_interest": "0", + "volume": "0", + "maturity": "2026-05-24T08:00:00Z", + "security_type": "forward" }, { "bid": "0.0001", - "ask": "0.0004", - "open_interest": "1848.0", - "volume": "7.01", - "strike": "3350.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "ask": "0.0003", + "open_interest": "235", + "volume": "214.04", + "strike": "1800", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.7288311", + "iv_ask": "0.8331671", + "inverse": true }, { - "bid": "0.2675", - "ask": "0.2730", - "open_interest": "42.0", - "volume": "0.0", - "strike": "3350.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "612", + "volume": "21.36", + "strike": "1900", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6179026", + "iv_ask": "0.6593642", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0004", - "open_interest": "666.0", - "volume": "103.36", - "strike": "3400.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0007", + "ask": "0.001", + "open_interest": "1501", + "volume": "2014.98", + "strike": "1950", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5442104", + "iv_ask": "0.5827092", + "inverse": true }, { - "bid": "0.2860", - "ask": "0.2920", - "open_interest": "103.0", - "volume": "0.0", - "strike": "3400.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0011", + "ask": "0.0012", + "open_interest": "41", + "volume": "156.84", + "strike": "1975", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5229804", + "iv_ask": "0.5328746", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0003", - "open_interest": "1528.0", - "volume": "18.54", - "strike": "3450.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0015", + "ask": "0.0017", + "open_interest": "232", + "volume": "792.17", + "strike": "2000", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4849481", + "iv_ask": "0.5001637", + "inverse": true }, { - "bid": "0.3050", - "ask": "0.3110", - "open_interest": "65.0", - "volume": "0.0", - "strike": "3450.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0021", + "ask": "0.0025", + "open_interest": "2", + "volume": "6.43", + "strike": "2025", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4473162", + "iv_ask": "0.4706452", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "1005.0", - "volume": "13.37", - "strike": "3500.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0033", + "ask": "0.0037", + "open_interest": "75", + "volume": "52.65", + "strike": "2050", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4229207", + "iv_ask": "0.4407995", + "inverse": true }, { - "bid": "0.3240", - "ask": "0.3300", - "open_interest": "6.0", - "volume": "0.0", - "strike": "3500.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.005", + "ask": "0.006", + "open_interest": "62", + "volume": "1021.13", + "strike": "2075", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3926257", + "iv_ask": "0.4280636", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "741.0", - "volume": "0.27", - "strike": "3550.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.008", + "ask": "0.009", + "open_interest": "1050", + "volume": "22757.79", + "strike": "2100", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3740384", + "iv_ask": "0.4041321", + "inverse": true }, { - "bid": "0.3430", - "ask": "0.3490", - "open_interest": "3.0", - "volume": "0.0", - "strike": "3550.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0125", + "ask": "0.014", + "open_interest": "751", + "volume": "18830.38", + "strike": "2125", + "maturity": "2026-05-24T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3581984", + "iv_ask": "0.4003254", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "863.0", - "volume": "9.02", - "strike": "3600.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.008", + "ask": "0.0085", + "open_interest": "373", + "volume": "10475.49", + "strike": "2150", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3585822", + "iv_ask": "0.3733821", + "inverse": true }, { - "bid": "0.3620", - "ask": "0.3680", - "open_interest": "18.0", - "volume": "1776.78", - "strike": "3600.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0046", + "ask": "0.005", + "open_interest": "268", + "volume": "4417.63", + "strike": "2175", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3604301", + "iv_ask": "0.3745463", + "inverse": true }, { - "bid": "0.3995", - "ask": "0.4060", - "open_interest": "10.0", - "volume": "0.0", - "strike": "3700.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0027", + "ask": "0.003", + "open_interest": "886", + "volume": "7582.74", + "strike": "2200", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3736216", + "iv_ask": "0.387351", + "inverse": true }, { - "bid": "0.5130", - "ask": "0.5205", - "open_interest": "5.0", - "volume": "6236.57", - "strike": "4000.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0015", + "ask": "0.0018", + "open_interest": "203", + "volume": "14.35", + "strike": "2225", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.383282", + "iv_ask": "0.4023574", + "inverse": true }, { - "bid": "0.5885", - "ask": "0.5965", - "open_interest": "142.0", - "volume": "4490.75", - "strike": "4200.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0009", + "ask": "0.0011", + "open_interest": "14", + "volume": "14.97", + "strike": "2250", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4016103", + "iv_ask": "0.4196097", + "inverse": true }, { - "bid": "2638.50", - "ask": "2639.00", - "open_interest": "1793521", - "volume": "3591089.0", - "maturity": "2026-02-13T08:00:00Z", - "security_type": "forward" + "bid": "0.0005", + "ask": "0.0008", + "open_interest": "266", + "volume": "277.33", + "strike": "2275", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4133124", + "iv_ask": "0.4512002", + "inverse": true }, { - "bid": "0.1720", - "ask": "0.1750", - "open_interest": "36.0", - "volume": "0.0", - "strike": "2200.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0003", + "ask": "0.0004", + "open_interest": "114", + "volume": "235.88", + "strike": "2300", + "maturity": "2026-05-24T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4303763", + "iv_ask": "0.4502918", + "inverse": true }, { - "bid": "0.0060", - "ask": "0.0070", - "open_interest": "2557.0", - "volume": "7628.56", - "strike": "2200.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "1", + "volume": "0.64", + "strike": "2350", + "maturity": "2026-05-24T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4574285", + "iv_ask": "0.5279253", + "inverse": true + }, + { + "bid": "2117", + "ask": "2133.5", + "open_interest": "0", + "volume": "0", + "maturity": "2026-05-25T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.1045", - "ask": "0.1085", - "open_interest": "26.0", - "volume": "1311.26", - "strike": "2400.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "90", + "volume": "86.55", + "strike": "1800", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.7189681", + "iv_ask": "0.7728417", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0160", - "open_interest": "2531.0", - "volume": "9805.64", - "strike": "2400.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0007", + "ask": "0.0008", + "open_interest": "0", + "volume": "0", + "strike": "1900", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5841816", + "iv_ask": "0.598068", + "inverse": true }, { - "bid": "0.0190", - "ask": "0.0200", - "open_interest": "137.0", - "volume": "6730.16", - "strike": "2450.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0012", + "ask": "0.0014", + "open_interest": "25", + "volume": "48.03", + "strike": "1950", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5220594", + "iv_ask": "0.5395355", + "inverse": true }, { - "bid": "0.0755", - "ask": "0.0790", - "open_interest": "25.0", - "volume": "5100.76", - "strike": "2500.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0016", + "ask": "0.0019", + "open_interest": "1", + "volume": "2.99", + "strike": "1975", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4908857", + "iv_ask": "0.5116076", + "inverse": true }, { - "bid": "0.0240", - "ask": "0.0250", - "open_interest": "735.0", - "volume": "16615.35", - "strike": "2500.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0022", + "ask": "0.0026", + "open_interest": "0", + "volume": "0", + "strike": "2000", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.461736", + "iv_ask": "0.4835807", + "inverse": true }, { - "bid": "0.0300", - "ask": "0.0310", - "open_interest": "10.0", - "volume": "958.44", - "strike": "2550.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0032", + "ask": "0.0036", + "open_interest": "0", + "volume": "0", + "strike": "2025", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4386838", + "iv_ask": "0.4559745", + "inverse": true }, { - "bid": "0.0520", - "ask": "0.0535", - "open_interest": "62.0", - "volume": "6790.02", - "strike": "2600.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0047", + "ask": "0.0055", + "open_interest": "5", + "volume": "41.65", + "strike": "2050", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4170839", + "iv_ask": "0.4446746", + "inverse": true }, { - "bid": "0.0370", - "ask": "0.0380", - "open_interest": "1803.0", - "volume": "54753.08", - "strike": "2600.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.007", + "ask": "0.008", + "open_interest": "2", + "volume": "28.7", + "strike": "2075", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3992538", + "iv_ask": "0.4280909", + "inverse": true }, { - "bid": "0.0420", - "ask": "0.0430", - "open_interest": "94.0", - "volume": "15978.18", - "strike": "2650.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0105", + "ask": "0.0115", + "open_interest": "1", + "volume": "18.15", + "strike": "2100", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3876481", + "iv_ask": "0.4131372", + "inverse": true }, { - "bid": "0.0455", - "ask": "0.0470", - "open_interest": "399.0", - "volume": "32858.32", - "strike": "2650.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.015", + "ask": "0.0165", + "open_interest": "57", + "volume": "1876.57", + "strike": "2125", + "maturity": "2026-05-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.37017", + "iv_ask": "0.4065161", + "inverse": true }, { - "bid": "0.0330", - "ask": "0.0340", - "open_interest": "202.0", - "volume": "17763.67", - "strike": "2700.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0105", + "ask": "0.0115", + "open_interest": "45", + "volume": "1172.42", + "strike": "2150", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3722401", + "iv_ask": "0.3972876", + "inverse": true }, { - "bid": "0.0560", - "ask": "0.0570", - "open_interest": "1627.0", - "volume": "69889.92", - "strike": "2700.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0065", + "ask": "0.0075", + "open_interest": "110", + "volume": "1780.44", + "strike": "2175", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.366776", + "iv_ask": "0.3950436", + "inverse": true }, { - "bid": "0.0260", - "ask": "0.0270", - "open_interest": "364.0", - "volume": "38301.64", - "strike": "2750.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0042", + "ask": "0.0046", + "open_interest": "63", + "volume": "655.13", + "strike": "2200", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3778136", + "iv_ask": "0.3915648", + "inverse": true }, { - "bid": "0.0660", - "ask": "0.0705", - "open_interest": "660.0", - "volume": "61385.41", - "strike": "2750.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0027", + "ask": "0.0029", + "open_interest": "0", + "volume": "0", + "strike": "2225", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3902128", + "iv_ask": "0.3990012", + "inverse": true }, { - "bid": "0.0200", - "ask": "0.0210", - "open_interest": "469.0", - "volume": "20120.55", - "strike": "2800.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0017", + "ask": "0.002", + "open_interest": "0", + "volume": "0", + "strike": "2250", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4012579", + "iv_ask": "0.4184585", + "inverse": true }, { - "bid": "0.0790", - "ask": "0.0835", - "open_interest": "563.0", - "volume": "43479.87", - "strike": "2800.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0012", + "ask": "0.0014", + "open_interest": "5", + "volume": "12.39", + "strike": "2275", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4232369", + "iv_ask": "0.4380503", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0160", - "open_interest": "843.0", - "volume": "30665.25", - "strike": "2850.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0008", + "ask": "0.001", + "open_interest": "0", + "volume": "0", + "strike": "2300", + "maturity": "2026-05-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4385199", + "iv_ask": "0.4580562", + "inverse": true }, { - "bid": "0.0930", - "ask": "0.0975", - "open_interest": "597.0", - "volume": "40759.3", - "strike": "2850.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0005", + "ask": "0.0006", + "open_interest": "0", + "volume": "0", + "strike": "2350", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4922109", + "iv_ask": "0.5071885", + "inverse": true }, { - "bid": "0.0115", - "ask": "0.0125", - "open_interest": "1061.0", - "volume": "33224.32", - "strike": "2900.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0003", + "ask": "0.0004", + "open_interest": "30", + "volume": "27.78", + "strike": "2400", + "maturity": "2026-05-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5355226", + "iv_ask": "0.5580377", + "inverse": true + }, + { + "bid": "2126.5", + "ask": "2127", + "open_interest": "28999132", + "volume": "3685069", + "maturity": "2026-05-29T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.1070", - "ask": "0.1130", - "open_interest": "1412.0", - "volume": "77553.06", - "strike": "2900.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0006", + "ask": "0.0008", + "open_interest": "11306", + "volume": "149.68", + "strike": "1700", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.7215095", + "iv_ask": "0.7534892", + "inverse": true }, { - "bid": "0.0090", - "ask": "0.0095", - "open_interest": "1967.0", - "volume": "22104.43", - "strike": "2950.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0008", + "ask": "0.0011", + "open_interest": "4431", + "volume": "21.34", + "strike": "1750", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6688583", + "iv_ask": "0.7049865", + "inverse": true }, { - "bid": "0.1230", - "ask": "0.1295", - "open_interest": "1107.0", - "volume": "0.0", - "strike": "2950.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0012", + "ask": "0.0015", + "open_interest": "10666", + "volume": "46", + "strike": "1800", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6278276", + "iv_ask": "0.6543077", + "inverse": true }, { - "bid": "0.0065", - "ask": "0.0075", - "open_interest": "2947.0", - "volume": "14510.47", - "strike": "3000.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0017", + "ask": "0.0021", + "open_interest": "3578", + "volume": "213.7", + "strike": "1850", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5790283", + "iv_ask": "0.6052631", + "inverse": true }, { - "bid": "0.1405", - "ask": "0.1465", - "open_interest": "497.0", - "volume": "1942.36", - "strike": "3000.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0027", + "ask": "0.003", + "open_interest": "11680", + "volume": "2639.34", + "strike": "1900", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.542507", + "iv_ask": "0.5567728", + "inverse": true }, { - "bid": "0.0050", - "ask": "0.0060", - "open_interest": "770.0", - "volume": "2741.81", - "strike": "3050.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0043", + "ask": "0.0047", + "open_interest": "6105", + "volume": "6805.47", + "strike": "1950", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5058849", + "iv_ask": "0.5196545", + "inverse": true }, { - "bid": "0.1580", - "ask": "0.1640", - "open_interest": "398.0", - "volume": "666.19", - "strike": "3050.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.007", + "ask": "0.0075", + "open_interest": "23914", + "volume": "82869.67", + "strike": "2000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4727668", + "iv_ask": "0.485597", + "inverse": true }, { - "bid": "0.0041", - "ask": "0.0045", - "open_interest": "1841.0", - "volume": "784.72", - "strike": "3100.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0115", + "ask": "0.0125", + "open_interest": "7256", + "volume": "7639.54", + "strike": "2050", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4437291", + "iv_ask": "0.4639094", + "inverse": true }, { - "bid": "0.1750", - "ask": "0.1820", - "open_interest": "1195.0", - "volume": "364.96", - "strike": "3100.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0195", + "ask": "0.0205", + "open_interest": "75411", + "volume": "119342.67", + "strike": "2100", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4331064", + "iv_ask": "0.4505752", + "inverse": true }, { - "bid": "0.0032", - "ask": "0.0035", - "open_interest": "1111.0", - "volume": "394.09", - "strike": "3150.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0195", + "ask": "0.0205", + "open_interest": "14600", + "volume": "27307.93", + "strike": "2150", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4166556", + "iv_ask": "0.4338577", + "inverse": true }, { - "bid": "0.1930", - "ask": "0.2000", - "open_interest": "8.0", - "volume": "1726.42", - "strike": "3150.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.011", + "ask": "0.012", + "open_interest": "13418", + "volume": "69364.08", + "strike": "2200", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4097906", + "iv_ask": "0.429265", + "inverse": true }, { - "bid": "0.0025", - "ask": "0.0029", - "open_interest": "5029.0", - "volume": "4107.27", - "strike": "3200.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.006", + "ask": "0.007", + "open_interest": "14425", + "volume": "22633.29", + "strike": "2250", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4137438", + "iv_ask": "0.4385522", + "inverse": true }, { - "bid": "0.2115", - "ask": "0.2185", - "open_interest": "27.0", - "volume": "0.0", - "strike": "3200.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0033", + "ask": "0.0038", + "open_interest": "14902", + "volume": "2378.88", + "strike": "2300", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4259386", + "iv_ask": "0.4432802", + "inverse": true }, { - "bid": "0.0016", - "ask": "0.0020", - "open_interest": "1966.0", - "volume": "2844.13", - "strike": "3300.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0019", + "ask": "0.0022", + "open_interest": "10564", + "volume": "56.38", + "strike": "2350", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2490", - "ask": "0.2555", - "open_interest": "6.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0011", - "ask": "0.0014", - "open_interest": "2460.0", - "volume": "1870.7", - "strike": "3400.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0005", - "ask": "0.0008", - "open_interest": "1537.0", - "volume": "12.75", - "strike": "3600.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0003", - "ask": "0.0006", - "open_interest": "298.0", - "volume": "14.52", - "strike": "3800.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "2641.75", - "ask": "2642.50", - "open_interest": "39806132", - "volume": "2917427.0", - "maturity": "2026-02-27T08:00:00Z", - "security_type": "forward" - }, - { - "bid": "0.4325", - "ask": "0.4350", - "open_interest": "37.0", - "volume": "22493.2", - "strike": "1500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0010", - "ask": "0.0012", - "open_interest": "8160.0", - "volume": "1027.3", - "strike": "1500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2490", - "ask": "0.2520", - "open_interest": "90.0", - "volume": "384784.09", - "strike": "2000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0065", - "ask": "0.0070", - "open_interest": "13386.0", - "volume": "8713.36", - "strike": "2000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1180", - "ask": "0.1215", - "open_interest": "2916.0", - "volume": "742.53", - "strike": "2400.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0275", - "ask": "0.0280", - "open_interest": "10615.0", - "volume": "90062.38", - "strike": "2400.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0915", - "ask": "0.0950", - "open_interest": "28.0", - "volume": "5822.63", - "strike": "2500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0390", - "ask": "0.0395", - "open_interest": "16411.0", - "volume": "497716.42", - "strike": "2500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0700", - "ask": "0.0715", - "open_interest": "262.0", - "volume": "38654.38", - "strike": "2600.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0535", - "ask": "0.0550", - "open_interest": "13574.0", - "volume": "217258.45", - "strike": "2600.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0515", - "ask": "0.0525", - "open_interest": "243.0", - "volume": "14246.82", - "strike": "2700.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0725", - "ask": "0.0740", - "open_interest": "6346.0", - "volume": "230336.81", - "strike": "2700.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0370", - "ask": "0.0375", - "open_interest": "2284.0", - "volume": "40517.06", - "strike": "2800.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0955", - "ask": "0.0985", - "open_interest": "7559.0", - "volume": "117513.15", - "strike": "2800.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0310", - "ask": "0.0320", - "open_interest": "1095.0", - "volume": "30306.07", - "strike": "2850.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1075", - "ask": "0.1120", - "open_interest": "890.0", - "volume": "5128.61", - "strike": "2850.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0260", - "ask": "0.0265", - "open_interest": "4056.0", - "volume": "46909.13", - "strike": "2900.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1220", - "ask": "0.1260", - "open_interest": "5364.0", - "volume": "20429.94", - "strike": "2900.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0215", - "ask": "0.0225", - "open_interest": "2190.0", - "volume": "18903.96", - "strike": "2950.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1355", - "ask": "0.1400", - "open_interest": "844.0", - "volume": "3805.06", - "strike": "2950.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0180", - "ask": "0.0190", - "open_interest": "11071.0", - "volume": "29625.59", - "strike": "3000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1495", - "ask": "0.1550", - "open_interest": "6092.0", - "volume": "68573.33", - "strike": "3000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0150", - "ask": "0.0155", - "open_interest": "847.0", - "volume": "11219.97", - "strike": "3050.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1650", - "ask": "0.1730", - "open_interest": "286.0", - "volume": "3958.45", - "strike": "3050.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0125", - "ask": "0.0130", - "open_interest": "5952.0", - "volume": "40623.98", - "strike": "3100.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1810", - "ask": "0.1895", - "open_interest": "4122.0", - "volume": "43080.5", - "strike": "3100.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "6936.0", - "volume": "14280.86", - "strike": "3200.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2150", - "ask": "0.2235", - "open_interest": "2626.0", - "volume": "2013.75", - "strike": "3200.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0060", - "ask": "0.0070", - "open_interest": "14920.0", - "volume": "19381.75", - "strike": "3300.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2505", - "ask": "0.2590", - "open_interest": "2863.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0045", - "ask": "0.0049", - "open_interest": "8132.0", - "volume": "1229.63", - "strike": "3400.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2865", - "ask": "0.2950", - "open_interest": "1123.0", - "volume": "0.0", - "strike": "3400.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0034", - "ask": "0.0038", - "open_interest": "6440.0", - "volume": "3217.49", - "strike": "3500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3230", - "ask": "0.3320", - "open_interest": "640.0", - "volume": "4505.66", - "strike": "3500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0025", - "ask": "0.0029", - "open_interest": "6370.0", - "volume": "83.28", - "strike": "3600.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3600", - "ask": "0.3690", - "open_interest": "150.0", - "volume": "0.0", - "strike": "3600.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0020", - "ask": "0.0023", - "open_interest": "2072.0", - "volume": "24.99", - "strike": "3700.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3970", - "ask": "0.4065", - "open_interest": "103.0", - "volume": "0.0", - "strike": "3700.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0015", - "ask": "0.0019", - "open_interest": "6066.0", - "volume": "116.68", - "strike": "3800.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.4345", - "ask": "0.4440", - "open_interest": "30.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4445969", + "iv_ask": "0.4595853", + "inverse": true }, { "bid": "0.0012", - "ask": "0.0016", - "open_interest": "3005.0", - "volume": "170.27", - "strike": "3900.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.4720", - "ask": "0.4815", - "open_interest": "5.0", - "volume": "0.0", - "strike": "3900.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0011", - "ask": "0.0013", - "open_interest": "3809.0", - "volume": "53.85", - "strike": "4000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.5095", - "ask": "0.5200", - "open_interest": "132.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0007", - "ask": "0.0010", - "open_interest": "3139.0", - "volume": "19.64", - "strike": "4200.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0004", - "ask": "0.0007", - "open_interest": "4886.0", - "volume": "8.72", - "strike": "4500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.6970", - "ask": "0.7090", - "open_interest": "1.0", - "volume": "0.0", - "strike": "4500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0004", - "open_interest": "3663.0", - "volume": "162.61", - "strike": "5000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "5584.0", - "volume": "5.39", - "strike": "5500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.0735", - "ask": "1.0885", - "open_interest": "862.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "2649.25", - "ask": "2649.50", - "open_interest": "127513022", - "volume": "5914666.0", - "maturity": "2026-03-27T08:00:00Z", - "security_type": "forward" - }, - { - "bid": "0.8095", - "ask": "0.8120", - "open_interest": "1229.0", - "volume": "0.0", - "strike": "500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.6215", - "ask": "0.6245", - "open_interest": "191.0", - "volume": "0.0", - "strike": "1000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0003", - "ask": "0.0005", - "open_interest": "15884.0", - "volume": "112.92", - "strike": "1000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.5470", - "ask": "0.5495", - "open_interest": "108.0", - "volume": "0.0", - "strike": "1200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0009", "ask": "0.0014", - "open_interest": "4155.0", - "volume": "5.35", - "strike": "1200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.5095", - "ask": "0.5125", - "open_interest": "81.0", - "volume": "0.0", - "strike": "1300.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0015", - "ask": "0.0019", - "open_interest": "2009.0", - "volume": "0.0", - "strike": "1300.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.4725", - "ask": "0.4755", - "open_interest": "167.0", - "volume": "0.0", - "strike": "1400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0022", - "ask": "0.0026", - "open_interest": "1424.0", - "volume": "0.0", - "strike": "1400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.4355", - "ask": "0.4390", - "open_interest": "469.0", - "volume": "0.0", - "strike": "1500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0031", - "ask": "0.0035", - "open_interest": "3118.0", - "volume": "31.65", - "strike": "1500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.3990", - "ask": "0.4025", - "open_interest": "760.0", - "volume": "0.0", - "strike": "1600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0044", - "ask": "0.0048", - "open_interest": "6396.0", - "volume": "11.89", - "strike": "1600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.3275", - "ask": "0.3310", - "open_interest": "752.0", - "volume": "0.0", - "strike": "1800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0080", - "ask": "0.0090", - "open_interest": "9932.0", - "volume": "629.52", - "strike": "1800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2590", - "ask": "0.2625", - "open_interest": "2242.0", - "volume": "2273.85", - "strike": "2000.0000", - "maturity": "2026-03-27T08:00:00Z", + "open_interest": "20999", + "volume": "3.62", + "strike": "2400", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4703419", + "iv_ask": "0.4844348", + "inverse": true }, - { - "bid": "0.0150", - "ask": "0.0160", - "open_interest": "14029.0", - "volume": "46084.53", - "strike": "2000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1955", - "ask": "0.1995", - "open_interest": "9808.0", - "volume": "0.0", - "strike": "2200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0270", - "ask": "0.0285", - "open_interest": "6140.0", - "volume": "74443.2", - "strike": "2200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1395", - "ask": "0.1435", - "open_interest": "12137.0", - "volume": "0.0", - "strike": "2400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0475", - "ask": "0.0490", - "open_interest": "9087.0", - "volume": "158492.99", - "strike": "2400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1175", - "ask": "0.1200", - "open_interest": "1685.0", - "volume": "9273.65", - "strike": "2500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0620", - "ask": "0.0630", - "open_interest": "24803.0", - "volume": "360220.03", - "strike": "2500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0970", - "ask": "0.0985", - "open_interest": "2659.0", - "volume": "461328.1", - "strike": "2600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0785", - "ask": "0.0800", - "open_interest": "13629.0", - "volume": "271734.24", - "strike": "2600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0790", - "ask": "0.0805", - "open_interest": "537.0", - "volume": "120536.37", - "strike": "2700.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0980", - "ask": "0.1000", - "open_interest": "2002.0", - "volume": "133210.99", - "strike": "2700.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0640", - "ask": "0.0655", - "open_interest": "3107.0", - "volume": "3179.84", - "strike": "2800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1205", - "ask": "0.1225", - "open_interest": "9219.0", - "volume": "152274.58", - "strike": "2800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0510", - "ask": "0.0525", - "open_interest": "1363.0", - "volume": "55582.05", - "strike": "2900.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1445", - "ask": "0.1485", - "open_interest": "2288.0", - "volume": "36418.75", - "strike": "2900.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0410", - "ask": "0.0420", - "open_interest": "7879.0", - "volume": "140805.33", - "strike": "3000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1720", - "ask": "0.1765", - "open_interest": "12988.0", - "volume": "92927.36", - "strike": "3000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0325", - "ask": "0.0335", - "open_interest": "2637.0", - "volume": "6257.55", - "strike": "3100.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1985", - "ask": "0.2080", - "open_interest": "17328.0", - "volume": "27748.62", - "strike": "3100.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0255", - "ask": "0.0270", - "open_interest": "19963.0", - "volume": "84839.34", - "strike": "3200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2285", - "ask": "0.2395", - "open_interest": "3824.0", - "volume": "153278.2", - "strike": "3200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0205", - "ask": "0.0215", - "open_interest": "3186.0", - "volume": "16683.15", - "strike": "3300.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2605", - "ask": "0.2715", - "open_interest": "5430.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0160", - "ask": "0.0175", - "open_interest": "13410.0", - "volume": "4837.48", - "strike": "3400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2940", - "ask": "0.3060", - "open_interest": "3811.0", - "volume": "36043.8", - "strike": "3400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0130", - "ask": "0.0140", - "open_interest": "22490.0", - "volume": "3884.36", - "strike": "3500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3285", - "ask": "0.3410", - "open_interest": "8707.0", - "volume": "1699.81", - "strike": "3500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0105", - "ask": "0.0115", - "open_interest": "7719.0", - "volume": "6366.67", - "strike": "3600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3630", - "ask": "0.3760", - "open_interest": "2118.0", - "volume": "925.35", - "strike": "3600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "5006.0", - "volume": "4160.62", - "strike": "3700.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3990", - "ask": "0.4115", - "open_interest": "47.0", - "volume": "0.0", - "strike": "3700.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0070", - "ask": "0.0080", - "open_interest": "8235.0", - "volume": "9314.26", - "strike": "3800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.4340", - "ask": "0.4480", - "open_interest": "2026.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0055", - "ask": "0.0065", - "open_interest": "1601.0", - "volume": "2112.02", - "strike": "3900.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0049", - "ask": "0.0055", - "open_interest": "16718.0", - "volume": "29327.33", - "strike": "4000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.5070", - "ask": "0.5225", - "open_interest": "8666.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0041", - "ask": "0.0044", - "open_interest": "858.0", - "volume": "548.96", - "strike": "4100.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0035", - "ask": "0.0040", - "open_interest": "6496.0", - "volume": "264.82", - "strike": "4200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.5810", - "ask": "0.5965", - "open_interest": "757.0", - "volume": "0.0", - "strike": "4200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0026", - "ask": "0.0030", - "open_interest": "5749.0", - "volume": "54.69", - "strike": "4400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.6550", - "ask": "0.6725", - "open_interest": "3228.0", - "volume": "0.0", - "strike": "4400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0023", - "ask": "0.0026", - "open_interest": "15123.0", - "volume": "118.03", - "strike": "4500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.6925", - "ask": "0.7095", - "open_interest": "2600.0", - "volume": "0.0", - "strike": "4500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0020", - "ask": "0.0023", - "open_interest": "4231.0", - "volume": "65.96", - "strike": "4600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.7295", - "ask": "0.7470", - "open_interest": "242.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0015", - "ask": "0.0019", - "open_interest": "4199.0", - "volume": "69.62", - "strike": "4800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.8045", - "ask": "0.8220", - "open_interest": "220.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0011", - "ask": "0.0015", - "open_interest": "8050.0", - "volume": "172.95", - "strike": "5000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.8795", - "ask": "0.8985", - "open_interest": "992.0", - "volume": "0.0", - "strike": "5000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0008", - "ask": "0.0013", - "open_interest": "8078.0", - "volume": "296.12", - "strike": "5200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.9540", - "ask": "0.9735", - "open_interest": "284.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0006", - "ask": "0.0011", - "open_interest": "3452.0", - "volume": "90.01", - "strike": "5400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.0280", - "ask": "1.0495", - "open_interest": "81.0", - "volume": "0.0", - "strike": "5400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0006", - "ask": "0.0010", - "open_interest": "49199.0", - "volume": "75.47", - "strike": "5500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.0655", - "ask": "1.0870", - "open_interest": "156.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0005", - "ask": "0.0009", - "open_interest": "1908.0", - "volume": "20.12", - "strike": "5600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.1030", - "ask": "1.1260", - "open_interest": "44.0", - "volume": "0.0", - "strike": "5600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0004", - "ask": "0.0007", - "open_interest": "4698.0", - "volume": "49.7", - "strike": "5800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.1780", - "ask": "1.2005", - "open_interest": "16.0", - "volume": "0.0", - "strike": "5800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0003", - "ask": "0.0007", - "open_interest": "9987.0", - "volume": "1.91", - "strike": "6000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.2535", - "ask": "1.2775", - "open_interest": "2.0", - "volume": "0.0", - "strike": "6000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0006", - "open_interest": "2260.0", - "volume": "2.18", - "strike": "6200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.3280", - "ask": "1.3520", - "open_interest": "4.0", - "volume": "0.0", - "strike": "6200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0005", - "open_interest": "3778.0", - "volume": "10.76", - "strike": "6400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0003", - "ask": "0.0005", - "open_interest": "53376.0", - "volume": "1.08", - "strike": "6500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0005", - "open_interest": "1457.0", - "volume": "4.07", - "strike": "6600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0005", - "open_interest": "1969.0", - "volume": "0.0", - "strike": "6800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0004", - "open_interest": "14068.0", - "volume": "0.0", - "strike": "7000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0001", - "ask": "0.0003", - "open_interest": "3116.0", - "volume": "0.0", - "strike": "7500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0001", - "ask": "0.0003", - "open_interest": "6360.0", - "volume": "0.0", - "strike": "8000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "2.0010", - "ask": "2.0365", - "open_interest": "506.0", - "volume": "0.0", - "strike": "8000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0001", - "ask": "0.0003", - "open_interest": "2367.0", - "volume": "0.0", - "strike": "8500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "3739.0", - "volume": "0.0", - "strike": "9000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "2.7485", - "ask": "2.7965", - "open_interest": "11.0", - "volume": "0.0", - "strike": "10000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "3.5000", - "ask": "3.5565", - "open_interest": "21.0", - "volume": "0.0", - "strike": "12000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "2672.25", - "ask": "2672.75", - "open_interest": "53720583", - "volume": "2902678.0", - "maturity": "2026-06-26T08:00:00Z", - "security_type": "forward" - }, - { - "bid": "0.8120", - "ask": "0.8140", - "open_interest": "334.0", - "volume": "0.0", - "strike": "500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0003", - "open_interest": "26674.0", - "volume": "0.0", - "strike": "500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.6275", - "ask": "0.6310", - "open_interest": "494.0", - "volume": "0.0", - "strike": "1000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0034", - "ask": "0.0041", - "open_interest": "7717.0", - "volume": "769.28", - "strike": "1000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.4520", - "ask": "0.4565", - "open_interest": "18.0", - "volume": "0.0", - "strike": "1500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0155", - "ask": "0.0170", - "open_interest": "7398.0", - "volume": "4300.45", - "strike": "1500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0315", - "ask": "0.0335", - "open_interest": "52.0", - "volume": "540.84", - "strike": "1800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2975", - "ask": "0.3030", - "open_interest": "492.0", - "volume": "883.07", - "strike": "2000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0485", - "ask": "0.0505", - "open_interest": "18245.0", - "volume": "3418.78", - "strike": "2000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2465", - "ask": "0.2515", - "open_interest": "82.0", - "volume": "0.0", - "strike": "2200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0715", - "ask": "0.0740", - "open_interest": "16099.0", - "volume": "55438.45", - "strike": "2200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2010", - "ask": "0.2065", - "open_interest": "7.0", - "volume": "542.17", - "strike": "2400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1010", - "ask": "0.1035", - "open_interest": "2949.0", - "volume": "49608.68", - "strike": "2400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1830", - "ask": "0.1860", - "open_interest": "625.0", - "volume": "0.0", - "strike": "2500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1185", - "ask": "0.1210", - "open_interest": "3375.0", - "volume": "1502.29", - "strike": "2500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1645", - "ask": "0.1675", - "open_interest": "1357.0", - "volume": "2947.94", - "strike": "2600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1375", - "ask": "0.1400", - "open_interest": "18710.0", - "volume": "15566.93", - "strike": "2600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1325", - "ask": "0.1350", - "open_interest": "4936.0", - "volume": "553375.49", - "strike": "2800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1800", - "ask": "0.1830", - "open_interest": "4566.0", - "volume": "21016.1", - "strike": "2800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + { + "bid": "0.0008", + "ask": "0.001", + "open_interest": "9009", + "volume": "790.95", + "strike": "2450", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4977246", + "iv_ask": "0.5168521", + "inverse": true }, { - "bid": "0.1060", - "ask": "0.1085", - "open_interest": "4995.0", - "volume": "530361.8", - "strike": "3000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0005", + "ask": "0.0008", + "open_interest": "25244", + "volume": "13.5", + "strike": "2500", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5173543", + "iv_ask": "0.5556877", + "inverse": true }, { - "bid": "0.2275", - "ask": "0.2350", - "open_interest": "13780.0", - "volume": "7194.75", - "strike": "3000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "16576", + "volume": "143.37", + "strike": "2550", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5530704", + "iv_ask": "0.5855428", + "inverse": true }, { - "bid": "0.0845", - "ask": "0.0865", - "open_interest": "2511.0", - "volume": "149706.39", - "strike": "3200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0003", + "ask": "0.0004", + "open_interest": "26179", + "volume": "165.23", + "strike": "2600", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5812452", + "iv_ask": "0.6031905", + "inverse": true }, { - "bid": "0.2810", - "ask": "0.2840", - "open_interest": "2558.0", - "volume": "0.0", - "strike": "3200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "8480", + "volume": "0.64", + "strike": "2650", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5989191", + "iv_ask": "0.6284835", + "inverse": true }, { - "bid": "0.0675", - "ask": "0.0695", - "open_interest": "2228.0", - "volume": "3211.07", - "strike": "3400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "18325", + "volume": "4.26", + "strike": "2700", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6431273", + "iv_ask": "0.6743626", + "inverse": true }, { - "bid": "0.3325", - "ask": "0.3465", - "open_interest": "6002.0", - "volume": "0.0", - "strike": "3400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "22411", + "volume": "0", + "strike": "2800", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.6774029", + "iv_ask": "0.7624207", + "inverse": true + }, + { + "bid": "2125.75", + "ask": "2126.5", + "open_interest": "5729802", + "volume": "722790", + "maturity": "2026-06-05T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0600", - "ask": "0.0625", - "open_interest": "2832.0", - "volume": "71023.55", - "strike": "3500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0039", + "ask": "0.0044", + "open_interest": "5138", + "volume": "111.16", + "strike": "1800", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5859417", + "iv_ask": "0.6036698", + "inverse": true }, { - "bid": "0.3620", - "ask": "0.3775", - "open_interest": "4075.0", - "volume": "0.0", - "strike": "3500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "1219", + "volume": "3877.84", + "strike": "1900", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5279543", + "iv_ask": "0.5504442", + "inverse": true }, { - "bid": "0.0535", - "ask": "0.0560", - "open_interest": "3765.0", - "volume": "60049.47", - "strike": "3600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.011", + "ask": "0.0115", + "open_interest": "2194", + "volume": "368.46", + "strike": "1950", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5106228", + "iv_ask": "0.5198153", + "inverse": true }, { - "bid": "0.3930", - "ask": "0.4085", - "open_interest": "2592.0", - "volume": "0.0", - "strike": "3600.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0155", + "ask": "0.0165", + "open_interest": "982", + "volume": "22065.1", + "strike": "2000", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4884372", + "iv_ask": "0.5039086", + "inverse": true }, { - "bid": "0.0430", - "ask": "0.0450", - "open_interest": "1032.0", - "volume": "6235.32", - "strike": "3800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.022", + "ask": "0.023", + "open_interest": "1104", + "volume": "31861.72", + "strike": "2050", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4723366", + "iv_ask": "0.4859407", + "inverse": true }, { - "bid": "0.4565", - "ask": "0.4730", - "open_interest": "1190.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.031", + "ask": "0.032", + "open_interest": "835", + "volume": "20899.95", + "strike": "2100", + "maturity": "2026-06-05T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4625308", + "iv_ask": "0.4751426", + "inverse": true }, { - "bid": "0.0345", - "ask": "0.0365", - "open_interest": "8019.0", - "volume": "27453.46", - "strike": "4000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0315", + "ask": "0.0325", + "open_interest": "997", + "volume": "24201.29", + "strike": "2150", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4517714", + "iv_ask": "0.4642028", + "inverse": true }, { - "bid": "0.5225", - "ask": "0.5415", - "open_interest": "3990.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.022", + "ask": "0.0225", + "open_interest": "1014", + "volume": "14615.68", + "strike": "2200", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4463917", + "iv_ask": "0.4529286", + "inverse": true }, { - "bid": "0.0280", - "ask": "0.0300", - "open_interest": "5251.0", - "volume": "2763.51", - "strike": "4200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.015", + "ask": "0.0155", + "open_interest": "2451", + "volume": "6805.97", + "strike": "2250", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4450852", + "iv_ask": "0.4523944", + "inverse": true }, { - "bid": "0.5900", - "ask": "0.6085", - "open_interest": "2111.0", - "volume": "0.0", - "strike": "4200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0095", + "ask": "0.0105", + "open_interest": "3641", + "volume": "7643.52", + "strike": "2300", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4372256", + "iv_ask": "0.4546071", + "inverse": true }, { - "bid": "0.0230", - "ask": "0.0250", - "open_interest": "4234.0", - "volume": "119.77", - "strike": "4400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0065", + "ask": "0.007", + "open_interest": "1170", + "volume": "4265.42", + "strike": "2350", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4474492", + "iv_ask": "0.4581288", + "inverse": true }, { - "bid": "0.6590", - "ask": "0.6785", - "open_interest": "4317.0", - "volume": "0.0", - "strike": "4400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0043", + "ask": "0.0047", + "open_interest": "1284", + "volume": "1391.98", + "strike": "2400", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4541381", + "iv_ask": "0.4650089", + "inverse": true }, { - "bid": "0.0210", - "ask": "0.0225", - "open_interest": "3921.0", - "volume": "8394.82", - "strike": "4500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0029", + "ask": "0.0033", + "open_interest": "752", + "volume": "0", + "strike": "2450", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4638575", + "iv_ask": "0.4777899", + "inverse": true }, { - "bid": "0.6940", - "ask": "0.7155", - "open_interest": "411.0", - "volume": "0.0", - "strike": "4500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0019", + "ask": "0.0023", + "open_interest": "1318", + "volume": "163.36", + "strike": "2500", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.470869", + "iv_ask": "0.4891746", + "inverse": true }, { - "bid": "0.0190", - "ask": "0.0205", - "open_interest": "4309.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.001", + "ask": "0.0013", + "open_interest": "1874", + "volume": "3", + "strike": "2600", + "maturity": "2026-06-05T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5013057", + "iv_ask": "0.5233498", + "inverse": true }, { - "bid": "0.7295", - "ask": "0.7495", - "open_interest": "3460.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "581", + "volume": "105.24", + "strike": "2800", + "maturity": "2026-06-05T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.554879", + "iv_ask": "0.5909788", + "inverse": true + }, + { + "bid": "2122.25", + "ask": "2128.25", + "open_interest": "6", + "volume": "6", + "maturity": "2026-06-12T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0160", - "ask": "0.0175", - "open_interest": "745.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0024", + "ask": "0.0028", + "open_interest": "0", + "volume": "0", + "strike": "1600", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6712824", + "iv_ask": "0.6916138", + "inverse": true }, { - "bid": "0.8005", - "ask": "0.8215", - "open_interest": "340.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.007", + "ask": "0.0075", + "open_interest": "50", + "volume": "694.51", + "strike": "1800", + "maturity": "2026-06-12T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5646614", + "iv_ask": "0.5760703", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0150", - "open_interest": "16134.0", - "volume": "380964.1", - "strike": "5000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.013", + "ask": "0.0135", + "open_interest": "0", + "volume": "0", + "strike": "1900", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5305516", + "iv_ask": "0.5384319", + "inverse": true }, { - "bid": "0.8720", - "ask": "0.8965", - "open_interest": "433.0", - "volume": "11543.83", - "strike": "5000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.023", + "ask": "0.024", + "open_interest": "52", + "volume": "2389.51", + "strike": "2000", + "maturity": "2026-06-12T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4965638", + "iv_ask": "0.5085588", + "inverse": true }, { - "bid": "0.0110", - "ask": "0.0125", - "open_interest": "2305.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0305", + "ask": "0.0315", + "open_interest": "1", + "volume": "60.91", + "strike": "2050", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.484771", + "iv_ask": "0.4957249", + "inverse": true }, { - "bid": "0.9440", - "ask": "0.9675", - "open_interest": "360.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.04", + "ask": "0.041", + "open_interest": "0", + "volume": "0", + "strike": "2100", + "maturity": "2026-06-12T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4761048", + "iv_ask": "0.4864843", + "inverse": true }, { - "bid": "0.0095", - "ask": "0.0110", - "open_interest": "767.0", - "volume": "27.31", - "strike": "5400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0405", + "ask": "0.0415", + "open_interest": "0", + "volume": "0", + "strike": "2150", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4639298", + "iv_ask": "0.4741663", + "inverse": true }, { - "bid": "1.0165", - "ask": "1.0435", - "open_interest": "15.0", - "volume": "0.0", - "strike": "5400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0305", + "ask": "0.0315", + "open_interest": "0", + "volume": "0", + "strike": "2200", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4579469", + "iv_ask": "0.4684714", + "inverse": true }, { - "bid": "0.0090", - "ask": "0.0105", - "open_interest": "45069.0", - "volume": "728.82", - "strike": "5500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0225", + "ask": "0.0235", + "open_interest": "0", + "volume": "0", + "strike": "2250", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4538406", + "iv_ask": "0.4651133", + "inverse": true }, { - "bid": "1.0530", - "ask": "1.0805", - "open_interest": "20.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0165", + "ask": "0.0175", + "open_interest": "32", + "volume": "1203.1", + "strike": "2300", + "maturity": "2026-06-12T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4539639", + "iv_ask": "0.4664757", + "inverse": true }, { - "bid": "0.0080", + "bid": "0.0085", "ask": "0.0095", - "open_interest": "1322.0", - "volume": "256.16", - "strike": "5600.0000", - "maturity": "2026-06-26T08:00:00Z", + "open_interest": "23", + "volume": "458.42", + "strike": "2400", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4561324", + "iv_ask": "0.4730239", + "inverse": true }, { - "bid": "0.0070", - "ask": "0.0085", - "open_interest": "665.0", - "volume": "20.48", - "strike": "5800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0024", + "ask": "0.0029", + "open_interest": "0", + "volume": "0", + "strike": "2600", + "maturity": "2026-06-12T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4821009", + "iv_ask": "0.5006523", + "inverse": true }, { - "bid": "1.1625", - "ask": "1.1920", - "open_interest": "44.0", - "volume": "0.0", - "strike": "5800.0000", + "bid": "2127.25", + "ask": "2127.5", + "open_interest": "91532882", + "volume": "5153214", "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "forward" }, { - "bid": "0.0060", - "ask": "0.0075", - "open_interest": "6485.0", - "volume": "19.18", - "strike": "6000.0000", + "bid": "0.0023", + "ask": "0.0027", + "open_interest": "6295", + "volume": "2102.35", + "strike": "1400", "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.7220753", + "iv_ask": "0.7429887", + "inverse": true }, { - "bid": "1.2360", - "ask": "1.2665", - "open_interest": "5.0", - "volume": "0.0", - "strike": "6000.0000", + "bid": "0.0036", + "ask": "0.0037", + "open_interest": "12591", + "volume": "324.91", + "strike": "1500", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.673963", + "iv_ask": "0.6777027", + "inverse": true }, { "bid": "0.0055", "ask": "0.0065", - "open_interest": "1062.0", - "volume": "0.0", - "strike": "6200.0000", + "open_interest": "9705", + "volume": "6052.95", + "strike": "1600", "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6254", + "iv_ask": "0.6510014", + "inverse": true }, { - "bid": "1.3095", - "ask": "1.3410", - "open_interest": "18.0", - "volume": "0.0", - "strike": "6200.0000", + "bid": "0.009", + "ask": "0.0095", + "open_interest": "5315", + "volume": "11796.83", + "strike": "1700", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5904337", + "iv_ask": "0.5997074", + "inverse": true }, { - "bid": "0.0050", - "ask": "0.0060", - "open_interest": "689.0", - "volume": "0.0", - "strike": "6400.0000", + "bid": "0.0145", + "ask": "0.015", + "open_interest": "7948", + "volume": "17773.91", + "strike": "1800", "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5581504", + "iv_ask": "0.5650107", + "inverse": true }, { - "bid": "1.3830", - "ask": "1.4130", - "open_interest": "31.0", - "volume": "0.0", - "strike": "6400.0000", + "bid": "0.023", + "ask": "0.024", + "open_interest": "6559", + "volume": "124208.23", + "strike": "1900", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5295156", + "iv_ask": "0.5401895", + "inverse": true }, { - "bid": "0.0047", - "ask": "0.0055", - "open_interest": "37688.0", - "volume": "0.0", - "strike": "6500.0000", + "bid": "0.036", + "ask": "0.037", + "open_interest": "19680", + "volume": "67094.79", + "strike": "2000", "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5077279", + "iv_ask": "0.5166439", + "inverse": true }, { - "bid": "1.4195", - "ask": "1.4505", - "open_interest": "60.0", - "volume": "0.0", - "strike": "6500.0000", + "bid": "0.055", + "ask": "0.056", + "open_interest": "13981", + "volume": "42220.67", + "strike": "2100", "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4949915", + "iv_ask": "0.5030916", + "inverse": true }, { - "bid": "0.0044", - "ask": "0.0055", - "open_interest": "1218.0", - "volume": "4259.41", - "strike": "6600.0000", + "bid": "0.0455", + "ask": "0.0465", + "open_interest": "7800", + "volume": "10768.03", + "strike": "2200", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4785464", + "iv_ask": "0.4866195", + "inverse": true }, { - "bid": "0.0040", - "ask": "0.0047", - "open_interest": "933.0", - "volume": "0.0", - "strike": "6800.0000", + "bid": "0.0295", + "ask": "0.0305", + "open_interest": "9912", + "volume": "160055.7", + "strike": "2300", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4737501", + "iv_ask": "0.4825604", + "inverse": true }, { - "bid": "1.5300", - "ask": "1.5660", - "open_interest": "1.0", - "volume": "0.0", - "strike": "6800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0036", - "ask": "0.0043", - "open_interest": "6490.0", - "volume": "0.0", - "strike": "7000.0000", + "bid": "0.0185", + "ask": "0.019", + "open_interest": "14883", + "volume": "12829.27", + "strike": "2400", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4719197", + "iv_ask": "0.4771436", + "inverse": true }, { - "bid": "0.0032", - "ask": "0.0039", - "open_interest": "1068.0", - "volume": "19.95", - "strike": "7200.0000", + "bid": "0.011", + "ask": "0.012", + "open_interest": "68572", + "volume": "76676.51", + "strike": "2500", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.6775", - "ask": "1.7160", - "open_interest": "76.0", - "volume": "0.0", - "strike": "7200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4681885", + "iv_ask": "0.4814408", + "inverse": true }, { - "bid": "0.0029", - "ask": "0.0036", - "open_interest": "2242.0", - "volume": "0.0", - "strike": "7400.0000", + "bid": "0.007", + "ask": "0.0075", + "open_interest": "15892", + "volume": "31.9", + "strike": "2600", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4781266", + "iv_ask": "0.4868166", + "inverse": true }, { - "bid": "0.0027", - "ask": "0.0034", - "open_interest": "1289.0", - "volume": "3921.85", - "strike": "7500.0000", + "bid": "0.0045", + "ask": "0.0049", + "open_interest": "16511", + "volume": "2951.61", + "strike": "2700", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4890707", + "iv_ask": "0.4983296", + "inverse": true }, { - "bid": "0.0021", - "ask": "0.0028", - "open_interest": "1908.0", - "volume": "51.21", - "strike": "8000.0000", + "bid": "0.0029", + "ask": "0.0033", + "open_interest": "17794", + "volume": "1263.99", + "strike": "2800", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4995412", + "iv_ask": "0.5119932", + "inverse": true }, { - "bid": "0.0017", + "bid": "0.002", "ask": "0.0023", - "open_interest": "4017.0", - "volume": "7283.62", - "strike": "8500.0000", + "open_interest": "15071", + "volume": "486.94", + "strike": "2900", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.514955", + "iv_ask": "0.5272995", + "inverse": true }, { - "bid": "0.0014", - "ask": "0.0019", - "open_interest": "9538.0", - "volume": "0.0", - "strike": "9000.0000", + "bid": "0.0013", + "ask": "0.0016", + "open_interest": "21551", + "volume": "408.6", + "strike": "3000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5239483", + "iv_ask": "0.540699", + "inverse": true }, { "bid": "0.0009", - "ask": "0.0014", - "open_interest": "2018.0", - "volume": "0.0", - "strike": "10000.0000", + "ask": "0.0013", + "open_interest": "6617", + "volume": "7.26", + "strike": "3100", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5367198", + "iv_ask": "0.5650581", + "inverse": true }, { - "bid": "0.0006", - "ask": "0.0011", - "open_interest": "1832.0", - "volume": "0.0", - "strike": "11000.0000", + "bid": "0.0007", + "ask": "0.001", + "open_interest": "15035", + "volume": "2.35", + "strike": "3200", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5562015", + "iv_ask": "0.5827433", + "inverse": true }, { "bid": "0.0004", - "ask": "0.0009", - "open_interest": "3617.0", - "volume": "0.0", - "strike": "12000.0000", + "ask": "0.0007", + "open_interest": "12008", + "volume": "3.2", + "strike": "3400", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "3.4510", - "ask": "3.5215", - "open_interest": "55.0", - "volume": "0.0", - "strike": "12000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5861117", + "iv_ask": "0.6256834", + "inverse": true }, { "bid": "0.0002", - "ask": "0.0007", - "open_interest": "3262.0", - "volume": "0.0", - "strike": "13000.0000", + "ask": "0.0005", + "open_interest": "10563", + "volume": "257.14", + "strike": "3500", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.574405", + "iv_ask": "0.6329249", + "inverse": true }, { "bid": "0.0001", - "ask": "0.0006", - "open_interest": "3571.0", - "volume": "0.0", - "strike": "14000.0000", + "ask": "0.0005", + "open_interest": "7085", + "volume": "0", + "strike": "3600", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5654173", + "iv_ask": "0.6635841", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0004", - "open_interest": "2736.0", - "volume": "0.0", - "strike": "15000.0000", + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "7017", + "volume": "26.12", + "strike": "3800", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "2698.00", - "ask": "2699.75", - "open_interest": "23582530", - "volume": "3549252.0", - "maturity": "2026-09-25T08:00:00Z", - "security_type": "forward" + "security_type": "option", + "iv_bid": "0.6569811", + "iv_ask": "0.6837684", + "inverse": true }, { - "bid": "0.6355", - "ask": "0.6415", - "open_interest": "55.0", - "volume": "0.0", - "strike": "1000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "13122", + "volume": "0", + "strike": "4000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0085", - "ask": "0.0100", - "open_interest": "1564.0", - "volume": "1981.77", - "strike": "1000.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6651664", + "iv_ask": "0.7361061", + "inverse": true }, { - "bid": "0.4730", - "ask": "0.4790", - "open_interest": "4.0", - "volume": "0.0", - "strike": "1500.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "2131.75", + "ask": "2132.25", + "open_interest": "2446074", + "volume": "263778", + "maturity": "2026-07-31T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0305", - "ask": "0.0330", - "open_interest": "6296.0", - "volume": "1536.16", - "strike": "1500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.017", + "ask": "0.018", + "open_interest": "3560", + "volume": "3715.65", + "strike": "1600", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6105739", + "iv_ask": "0.6221458", + "inverse": true }, { - "bid": "0.0555", - "ask": "0.0580", - "open_interest": "19.0", - "volume": "0.0", - "strike": "1800.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0335", + "ask": "0.0345", + "open_interest": "7870", + "volume": "0", + "strike": "1800", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5632748", + "iv_ask": "0.5711162", + "inverse": true + }, + { + "bid": "0.0465", + "ask": "0.0475", + "open_interest": "1778", + "volume": "191.4", + "strike": "1900", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5472005", + "iv_ask": "0.5539907", + "inverse": true + }, + { + "bid": "0.054", + "ask": "0.0555", + "open_interest": "95", + "volume": "2443.4", + "strike": "1950", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5379451", + "iv_ask": "0.5475732", + "inverse": true + }, + { + "bid": "0.063", + "ask": "0.064", + "open_interest": "2063", + "volume": "0", + "strike": "2000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5328136", + "iv_ask": "0.5389454", + "inverse": true + }, + { + "bid": "0.073", + "ask": "0.074", + "open_interest": "336", + "volume": "153.58", + "strike": "2050", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5281861", + "iv_ask": "0.5341071", + "inverse": true + }, + { + "bid": "0.084", + "ask": "0.085", + "open_interest": "582", + "volume": "19869.82", + "strike": "2100", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5239524", + "iv_ask": "0.5297329", + "inverse": true + }, + { + "bid": "0.087", + "ask": "0.0885", + "open_interest": "199", + "volume": "0", + "strike": "2150", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5177179", + "iv_ask": "0.5262742", + "inverse": true + }, + { + "bid": "0.0765", + "ask": "0.0775", + "open_interest": "613", + "volume": "0", + "strike": "2200", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5140201", + "iv_ask": "0.5197087", + "inverse": true + }, + { + "bid": "0.067", + "ask": "0.068", + "open_interest": "303", + "volume": "0", + "strike": "2250", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5108267", + "iv_ask": "0.5165586", + "inverse": true + }, + { + "bid": "0.0585", + "ask": "0.0595", + "open_interest": "1883", + "volume": "0", + "strike": "2300", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5083247", + "iv_ask": "0.5141569", + "inverse": true + }, + { + "bid": "0.051", + "ask": "0.052", + "open_interest": "2982", + "volume": "112.56", + "strike": "2350", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5067894", + "iv_ask": "0.5127782", + "inverse": true + }, + { + "bid": "0.044", + "ask": "0.045", + "open_interest": "3953", + "volume": "3990.34", + "strike": "2400", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5034967", + "iv_ask": "0.5097061", + "inverse": true + }, + { + "bid": "0.038", + "ask": "0.039", + "open_interest": "554", + "volume": "0", + "strike": "2450", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5017914", + "iv_ask": "0.5082811", + "inverse": true + }, + { + "bid": "0.033", + "ask": "0.034", + "open_interest": "435", + "volume": "0", + "strike": "2500", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5022651", + "iv_ask": "0.5090885", + "inverse": true }, { - "bid": "0.3365", - "ask": "0.3420", - "open_interest": "243.0", - "volume": "0.0", - "strike": "2000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0285", + "ask": "0.0295", + "open_interest": "902", + "volume": "0", + "strike": "2550", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.502076", + "iv_ask": "0.5093036", + "inverse": true }, { - "bid": "0.0780", - "ask": "0.0810", - "open_interest": "9845.0", - "volume": "2708.42", - "strike": "2000.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2900", - "ask": "0.2965", - "open_interest": "105.0", - "volume": "0.0", - "strike": "2200.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0245", + "ask": "0.0255", + "open_interest": "1681", + "volume": "4164.52", + "strike": "2600", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1060", - "ask": "0.1095", - "open_interest": "3198.0", - "volume": "549.96", - "strike": "2200.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.501528", + "iv_ask": "0.5092379", + "inverse": true }, { - "bid": "0.2505", - "ask": "0.2550", - "open_interest": "36.0", - "volume": "0.0", - "strike": "2400.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.021", + "ask": "0.022", + "open_interest": "706", + "volume": "47.9", + "strike": "2650", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1395", - "ask": "0.1435", - "open_interest": "1947.0", - "volume": "0.0", - "strike": "2400.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5009859", + "iv_ask": "0.5092619", + "inverse": true }, { - "bid": "0.2320", - "ask": "0.2365", - "open_interest": "23.0", - "volume": "669.88", - "strike": "2500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.018", + "ask": "0.019", + "open_interest": "2300", + "volume": "587.71", + "strike": "2700", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1580", - "ask": "0.1625", - "open_interest": "2767.0", - "volume": "836.69", - "strike": "2500.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5009078", + "iv_ask": "0.5098347", + "inverse": true }, { - "bid": "0.2145", - "ask": "0.2190", - "open_interest": "61.0", - "volume": "31550.33", - "strike": "2600.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0155", + "ask": "0.0165", + "open_interest": "138", + "volume": "0", + "strike": "2750", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5018813", + "iv_ask": "0.5115344", + "inverse": true }, { - "bid": "0.1780", - "ask": "0.1825", - "open_interest": "8624.0", - "volume": "0.0", - "strike": "2600.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1840", - "ask": "0.1880", - "open_interest": "562.0", - "volume": "90868.82", - "strike": "2800.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0135", + "ask": "0.0145", + "open_interest": "5776", + "volume": "0", + "strike": "2800", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5046547", + "iv_ask": "0.5150816", + "inverse": true }, { - "bid": "0.2210", - "ask": "0.2255", - "open_interest": "1295.0", - "volume": "0.0", - "strike": "2800.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.01", + "ask": "0.011", + "open_interest": "1386", + "volume": "24.52", + "strike": "2900", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5069915", + "iv_ask": "0.519377", + "inverse": true }, { - "bid": "0.1575", - "ask": "0.1615", - "open_interest": "397.0", - "volume": "0.0", - "strike": "3000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "1407", + "volume": "512.56", + "strike": "3000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5110555", + "iv_ask": "0.5258152", + "inverse": true }, - { - "bid": "0.2665", - "ask": "0.2760", - "open_interest": "6484.0", - "volume": "0.0", - "strike": "3000.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + { + "bid": "0.006", + "ask": "0.0065", + "open_interest": "700", + "volume": "51.24", + "strike": "3100", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5218068", + "iv_ask": "0.5305488", + "inverse": true }, { - "bid": "0.1345", - "ask": "0.1385", - "open_interest": "1116.0", - "volume": "0.0", - "strike": "3200.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0046", + "ask": "0.0049", + "open_interest": "3875", + "volume": "0", + "strike": "3200", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5271592", + "iv_ask": "0.5335063", + "inverse": true }, { - "bid": "0.3165", - "ask": "0.3295", - "open_interest": "1436.0", - "volume": "0.0", - "strike": "3200.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.003", + "ask": "0.0033", + "open_interest": "1585", + "volume": "13.25", + "strike": "3400", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.545704", + "iv_ask": "0.5543935", + "inverse": true }, { - "bid": "0.1155", - "ask": "0.1190", - "open_interest": "3707.0", - "volume": "0.0", - "strike": "3400.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.002", + "ask": "0.0022", + "open_interest": "521", + "volume": "0", + "strike": "3600", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5627004", + "iv_ask": "0.5706662", + "inverse": true }, { - "bid": "0.3645", - "ask": "0.3915", - "open_interest": "1084.0", - "volume": "1983.02", - "strike": "3400.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0014", + "ask": "0.0016", + "open_interest": "668", + "volume": "0", + "strike": "3800", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.580564", + "iv_ask": "0.591091", + "inverse": true }, { - "bid": "0.1070", - "ask": "0.1100", - "open_interest": "10484.0", - "volume": "1623.79", - "strike": "3500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0009", + "ask": "0.0012", + "open_interest": "8641", + "volume": "3.62", + "strike": "4000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5895746", + "iv_ask": "0.6108455", + "inverse": true }, { - "bid": "0.3925", - "ask": "0.4200", - "open_interest": "908.0", - "volume": "0.0", - "strike": "3500.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0005", + "ask": "0.0009", + "open_interest": "1130", + "volume": "0", + "strike": "4200", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5878241", + "iv_ask": "0.6279168", + "inverse": true }, { - "bid": "0.0990", - "ask": "0.1025", - "open_interest": "952.0", - "volume": "5604.54", - "strike": "3600.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0006", + "ask": "0.0007", + "open_interest": "761", + "volume": "0", + "strike": "4400", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6345173", + "iv_ask": "0.6453587", + "inverse": true }, { - "bid": "0.4215", - "ask": "0.4500", - "open_interest": "608.0", - "volume": "5830.71", - "strike": "3600.0000", + "bid": "2141.25", + "ask": "2141.5", + "open_interest": "61466233", + "volume": "1675130", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "forward" }, { - "bid": "0.0850", - "ask": "0.0880", - "open_interest": "774.0", - "volume": "1302.33", - "strike": "3800.0000", + "bid": "0.006", + "ask": "0.007", + "open_interest": "6792", + "volume": "13.84", + "strike": "1000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.7729307", + "iv_ask": "0.7976245", + "inverse": true }, { - "bid": "0.4825", - "ask": "0.5110", - "open_interest": "1001.0", - "volume": "0.0", - "strike": "3800.0000", + "bid": "0.0115", + "ask": "0.0125", + "open_interest": "11195", + "volume": "128.97", + "strike": "1200", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.7063138", + "iv_ask": "0.7212723", + "inverse": true }, { - "bid": "0.0735", - "ask": "0.0765", - "open_interest": "2737.0", - "volume": "2039.32", - "strike": "4000.0000", + "bid": "0.0205", + "ask": "0.0215", + "open_interest": "2247", + "volume": "0", + "strike": "1400", "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.648459", + "iv_ask": "0.6582983", + "inverse": true }, { - "bid": "0.5425", - "ask": "0.5740", - "open_interest": "173.0", - "volume": "0.0", - "strike": "4000.0000", + "bid": "0.0275", + "ask": "0.0285", + "open_interest": "9374", + "volume": "3244.24", + "strike": "1500", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6280565", + "iv_ask": "0.6362094", + "inverse": true }, { - "bid": "0.0635", - "ask": "0.0665", - "open_interest": "808.0", - "volume": "0.0", - "strike": "4200.0000", + "bid": "0.036", + "ask": "0.0375", + "open_interest": "3440", + "volume": "767.76", + "strike": "1600", "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6074609", + "iv_ask": "0.6178414", + "inverse": true }, { - "bid": "0.6065", - "ask": "0.6385", - "open_interest": "527.0", - "volume": "0.0", - "strike": "4200.0000", + "bid": "0.047", + "ask": "0.0485", + "open_interest": "1639", + "volume": "0", + "strike": "1700", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5917157", + "iv_ask": "0.6007305", + "inverse": true }, { - "bid": "0.0550", - "ask": "0.0580", - "open_interest": "3169.0", - "volume": "290.12", - "strike": "4400.0000", + "bid": "0.061", + "ask": "0.062", + "open_interest": "3679", + "volume": "13865.65", + "strike": "1800", "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5808918", + "iv_ask": "0.586236", + "inverse": true }, { - "bid": "0.6720", - "ask": "0.7055", - "open_interest": "281.0", - "volume": "0.0", - "strike": "4400.0000", + "bid": "0.077", + "ask": "0.0785", + "open_interest": "3609", + "volume": "334.43", + "strike": "1900", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5680346", + "iv_ask": "0.5753462", + "inverse": true }, { - "bid": "0.0515", - "ask": "0.0540", - "open_interest": "7978.0", - "volume": "411.36", - "strike": "4500.0000", + "bid": "0.0965", + "ask": "0.098", + "open_interest": "13628", + "volume": "0", + "strike": "2000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5599858", + "iv_ask": "0.5668179", + "inverse": true }, { - "bid": "0.7050", - "ask": "0.7395", - "open_interest": "6.0", - "volume": "0.0", - "strike": "4500.0000", + "bid": "0.119", + "ask": "0.1205", + "open_interest": "3247", + "volume": "2010.72", + "strike": "2100", "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5536079", + "iv_ask": "0.5601455", + "inverse": true }, { - "bid": "0.0480", - "ask": "0.0505", - "open_interest": "2103.0", - "volume": "0.0", - "strike": "4600.0000", + "bid": "0.1165", + "ask": "0.118", + "open_interest": "3464", + "volume": "0", + "strike": "2200", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5465174", + "iv_ask": "0.5529136", + "inverse": true }, { - "bid": "0.7390", - "ask": "0.7690", - "open_interest": "39.0", - "volume": "0.0", - "strike": "4600.0000", + "bid": "0.098", + "ask": "0.0995", + "open_interest": "2400", + "volume": "0", + "strike": "2300", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5426376", + "iv_ask": "0.5490261", + "inverse": true }, { - "bid": "0.0420", - "ask": "0.0445", - "open_interest": "838.0", - "volume": "0.0", - "strike": "4800.0000", + "bid": "0.082", + "ask": "0.083", + "open_interest": "3795", + "volume": "2139.24", + "strike": "2400", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5393378", + "iv_ask": "0.5436726", + "inverse": true }, { - "bid": "0.8055", - "ask": "0.8425", - "open_interest": "50.0", - "volume": "0.0", - "strike": "4800.0000", + "bid": "0.0685", + "ask": "0.0695", + "open_interest": "3610", + "volume": "0", + "strike": "2500", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5375009", + "iv_ask": "0.5419861", + "inverse": true }, { - "bid": "0.0370", - "ask": "0.0390", - "open_interest": "3704.0", - "volume": "618.41", - "strike": "5000.0000", + "bid": "0.0565", + "ask": "0.0575", + "open_interest": "901", + "volume": "0", + "strike": "2600", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.533579", + "iv_ask": "0.5382963", + "inverse": true }, { - "bid": "0.8740", - "ask": "0.9075", - "open_interest": "1.0", - "volume": "0.0", - "strike": "5000.0000", + "bid": "0.047", + "ask": "0.048", + "open_interest": "4378", + "volume": "0", + "strike": "2700", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5332688", + "iv_ask": "0.5382867", + "inverse": true }, { - "bid": "0.0325", - "ask": "0.0345", - "open_interest": "1227.0", - "volume": "89.67", - "strike": "5200.0000", + "bid": "0.0385", + "ask": "0.04", + "open_interest": "4658", + "volume": "709.17", + "strike": "2800", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5303505", + "iv_ask": "0.5384613", + "inverse": true }, { - "bid": "0.9435", - "ask": "0.9775", - "open_interest": "3.0", - "volume": "0.0", - "strike": "5200.0000", + "bid": "0.032", + "ask": "0.0335", + "open_interest": "847", + "volume": "436.44", + "strike": "2900", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5312178", + "iv_ask": "0.5400166", + "inverse": true }, { - "bid": "0.0285", - "ask": "0.0310", - "open_interest": "654.0", - "volume": "0.0", - "strike": "5400.0000", + "bid": "0.0265", + "ask": "0.028", + "open_interest": "12969", + "volume": "19240.46", + "strike": "3000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5316631", + "iv_ask": "0.5412916", + "inverse": true }, { - "bid": "1.0135", - "ask": "1.0485", - "open_interest": "4.0", - "volume": "0.0", - "strike": "5400.0000", + "bid": "0.022", + "ask": "0.0235", + "open_interest": "1514", + "volume": "1175.31", + "strike": "3100", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.532715", + "iv_ask": "0.54331", + "inverse": true }, { - "bid": "0.0270", - "ask": "0.0290", - "open_interest": "1582.0", - "volume": "0.0", - "strike": "5500.0000", + "bid": "0.0185", + "ask": "0.0195", + "open_interest": "7332", + "volume": "44.96", + "strike": "3200", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5357009", + "iv_ask": "0.5435163", + "inverse": true }, { - "bid": "1.0485", - "ask": "1.0840", - "open_interest": "1.0", - "volume": "0.0", - "strike": "5500.0000", + "bid": "0.0155", + "ask": "0.0165", + "open_interest": "16784", + "volume": "74.88", + "strike": "3300", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5379423", + "iv_ask": "0.5466011", + "inverse": true }, { - "bid": "0.0255", - "ask": "0.0275", - "open_interest": "1433.0", - "volume": "0.0", - "strike": "5600.0000", + "bid": "0.013", + "ask": "0.014", + "open_interest": "6600", + "volume": "220.32", + "strike": "3400", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5401509", + "iv_ask": "0.5497736", + "inverse": true }, { - "bid": "0.0225", - "ask": "0.0245", - "open_interest": "4908.0", - "volume": "0.0", - "strike": "5800.0000", + "bid": "0.011", + "ask": "0.012", + "open_interest": "13304", + "volume": "24.6", + "strike": "3500", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5432431", + "iv_ask": "0.5539222", + "inverse": true }, { - "bid": "0.0205", - "ask": "0.0220", - "open_interest": "2308.0", - "volume": "0.0", - "strike": "6000.0000", + "bid": "0.009", + "ask": "0.0105", + "open_interest": "2399", + "volume": "44.82", + "strike": "3600", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5422601", + "iv_ask": "0.5601402", + "inverse": true }, { - "bid": "0.0180", - "ask": "0.0200", - "open_interest": "1754.0", - "volume": "0.0", - "strike": "6200.0000", + "bid": "0.0065", + "ask": "0.0075", + "open_interest": "1604", + "volume": "28.72", + "strike": "3800", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5483802", + "iv_ask": "0.5633361", + "inverse": true }, { - "bid": "0.0165", - "ask": "0.0180", - "open_interest": "1129.0", - "volume": "0.0", - "strike": "6400.0000", + "bid": "0.005", + "ask": "0.006", + "open_interest": "12096", + "volume": "12.84", + "strike": "4000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5593478", + "iv_ask": "0.5772925", + "inverse": true }, { - "bid": "0.0155", - "ask": "0.0175", - "open_interest": "1057.0", - "volume": "0.0", - "strike": "6500.0000", + "bid": "0.0037", + "ask": "0.0043", + "open_interest": "2339", + "volume": "8.51", + "strike": "4200", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5651866", + "iv_ask": "0.5787662", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0165", - "open_interest": "828.0", - "volume": "0.0", - "strike": "6600.0000", + "bid": "0.0029", + "ask": "0.0034", + "open_interest": "4414", + "volume": "0", + "strike": "4400", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5748154", + "iv_ask": "0.5884599", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0150", - "open_interest": "756.0", - "volume": "0.0", - "strike": "6800.0000", + "bid": "0.0025", + "ask": "0.003", + "open_interest": "8560", + "volume": "32.08", + "strike": "4500", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.576961", + "iv_ask": "0.5921213", + "inverse": true }, { - "bid": "0.0120", - "ask": "0.0140", - "open_interest": "1165.0", - "volume": "0.0", - "strike": "7000.0000", + "bid": "0.0022", + "ask": "0.0027", + "open_interest": "3051", + "volume": "0", + "strike": "4600", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5805351", + "iv_ask": "0.5971678", + "inverse": true }, { - "bid": "0.0110", - "ask": "0.0130", - "open_interest": "594.0", - "volume": "0.0", - "strike": "7200.0000", + "bid": "0.0017", + "ask": "0.0022", + "open_interest": "1809", + "volume": "0", + "strike": "4800", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5867671", + "iv_ask": "0.6067807", + "inverse": true }, { - "bid": "0.0105", - "ask": "0.0120", - "open_interest": "735.0", - "volume": "155.06", - "strike": "7400.0000", + "bid": "0.0015", + "ask": "0.0018", + "open_interest": "3853", + "volume": "0", + "strike": "5000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6017274", + "iv_ask": "0.6155559", + "inverse": true }, { - "bid": "0.0100", - "ask": "0.0115", - "open_interest": "788.0", - "volume": "0.0", - "strike": "7500.0000", + "bid": "0.0011", + "ask": "0.0016", + "open_interest": "1598", + "volume": "0", + "strike": "5200", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6022607", + "iv_ask": "0.629629", + "inverse": true }, { - "bid": "0.0080", - "ask": "0.0095", - "open_interest": "1160.0", - "volume": "1745.22", - "strike": "8000.0000", + "bid": "0.0008", + "ask": "0.0013", + "open_interest": "1174", + "volume": "0", + "strike": "5400", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6020513", + "iv_ask": "0.6357591", + "inverse": true }, { - "bid": "0.0065", - "ask": "0.0080", - "open_interest": "1256.0", - "volume": "0.0", - "strike": "8500.0000", + "bid": "0.0007", + "ask": "0.0012", + "open_interest": "1487", + "volume": "0", + "strike": "5500", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6035237", + "iv_ask": "0.6402875", + "inverse": true }, { - "bid": "0.0055", - "ask": "0.0070", - "open_interest": "1533.0", - "volume": "0.0", - "strike": "9000.0000", + "bid": "0.0006", + "ask": "0.0012", + "open_interest": "1878", + "volume": "11.73", + "strike": "5600", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6036121", + "iv_ask": "0.6504761", + "inverse": true }, { - "bid": "0.0041", - "ask": "0.0050", - "open_interest": "1583.0", - "volume": "979.95", - "strike": "10000.0000", + "bid": "0.0006", + "ask": "0.001", + "open_interest": "4884", + "volume": "0", + "strike": "5800", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6223255", + "iv_ask": "0.6567333", + "inverse": true }, { - "bid": "0.0035", - "ask": "0.0039", - "open_interest": "2666.0", - "volume": "0.0", - "strike": "11000.0000", + "bid": "0.0005", + "ask": "0.0009", + "open_interest": "3264", + "volume": "0", + "strike": "6000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.628857", + "iv_ask": "0.6677812", + "inverse": true }, { - "bid": "0.0024", - "ask": "0.0031", - "open_interest": "1348.0", - "volume": "0.0", - "strike": "12000.0000", + "bid": "0.0004", + "ask": "0.0008", + "open_interest": "2025", + "volume": "0", + "strike": "6200", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.632339", + "iv_ask": "0.6771633", + "inverse": true }, { - "bid": "0.0019", - "ask": "0.0025", - "open_interest": "1664.0", - "volume": "0.0", - "strike": "13000.0000", + "bid": "0.0004", + "ask": "0.0007", + "open_interest": "1915", + "volume": "0", + "strike": "6400", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6485274", + "iv_ask": "0.6847523", + "inverse": true }, { - "bid": "0.0014", - "ask": "0.0020", - "open_interest": "1168.0", - "volume": "0.0", - "strike": "14000.0000", + "bid": "0.0003", + "ask": "0.0007", + "open_interest": "1334", + "volume": "0", + "strike": "6500", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6394638", + "iv_ask": "0.6929517", + "inverse": true }, { - "bid": "0.0011", - "ask": "0.0017", - "open_interest": "831.0", - "volume": "0.0", - "strike": "15000.0000", + "bid": "0.0003", + "ask": "0.0006", + "open_interest": "1420", + "volume": "0", + "strike": "6600", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6470546", + "iv_ask": "0.6903349", + "inverse": true }, { - "bid": "0.0009", - "ask": "0.0012", - "open_interest": "3210.0", - "volume": "0.0", - "strike": "16000.0000", + "bid": "0.0002", + "ask": "0.0006", + "open_interest": "1467", + "volume": "0", + "strike": "6800", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6392119", + "iv_ask": "0.7058581", + "inverse": true }, { - "bid": "4.8520", - "ask": "5.0155", - "open_interest": "30.0", - "volume": "0.0", - "strike": "16000.0000", + "bid": "0.0002", + "ask": "0.0005", + "open_interest": "2039", + "volume": "0", + "strike": "7000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.6531505", + "iv_ask": "0.7083764", + "inverse": true }, { - "bid": "2725.25", - "ask": "2727.25", - "open_interest": "6370628", - "volume": "1321880.0", + "bid": "2160", + "ask": "2160.5", + "open_interest": "29083389", + "volume": "754779", "maturity": "2026-12-25T08:00:00Z", "security_type": "forward" }, { - "bid": "0.5195", - "ask": "0.5315", - "open_interest": "10.0", - "volume": "14001.87", - "strike": "1400.0000", + "bid": "0.008", + "ask": "0.009", + "open_interest": "1361", + "volume": "804.5", + "strike": "800", "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.7945755", + "iv_ask": "0.8146921", + "inverse": true }, { - "bid": "0.0370", - "ask": "0.0405", - "open_interest": "1067.0", - "volume": "488.15", - "strike": "1400.0000", + "bid": "0.015", + "ask": "0.016", + "open_interest": "18980", + "volume": "130.15", + "strike": "1000", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.7338959", + "iv_ask": "0.7462375", + "inverse": true }, { - "bid": "0.0545", - "ask": "0.0580", - "open_interest": "87.0", - "volume": "0.0", - "strike": "1600.0000", + "bid": "0.0255", + "ask": "0.0265", + "open_interest": "2596", + "volume": "383.78", + "strike": "1200", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6826406", + "iv_ask": "0.6909914", + "inverse": true }, { - "bid": "0.0760", - "ask": "0.0800", - "open_interest": "271.0", - "volume": "0.0", - "strike": "1800.0000", + "bid": "0.042", + "ask": "0.043", + "open_interest": "10731", + "volume": "79690.2", + "strike": "1400", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6476807", + "iv_ask": "0.6537289", + "inverse": true }, { - "bid": "0.3645", - "ask": "0.3790", - "open_interest": "84.0", - "volume": "0.0", - "strike": "2000.0000", + "bid": "0.0525", + "ask": "0.054", + "open_interest": "3131", + "volume": "1090.83", + "strike": "1500", "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6318968", + "iv_ask": "0.639842", + "inverse": true }, { - "bid": "0.1025", - "ask": "0.1065", - "open_interest": "1337.0", - "volume": "11678.26", - "strike": "2000.0000", + "bid": "0.0655", + "ask": "0.067", + "open_interest": "4606", + "volume": "14030.87", + "strike": "1600", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.62109", + "iv_ask": "0.6281672", + "inverse": true }, { - "bid": "0.1335", - "ask": "0.1385", - "open_interest": "96.0", - "volume": "6584.22", - "strike": "2200.0000", + "bid": "0.08", + "ask": "0.082", + "open_interest": "16450", + "volume": "37730.74", + "strike": "1700", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6093218", + "iv_ask": "0.6178828", + "inverse": true }, { - "bid": "0.2835", - "ask": "0.2995", - "open_interest": "538.0", - "volume": "0.0", - "strike": "2400.0000", + "bid": "0.097", + "ask": "0.099", + "open_interest": "3857", + "volume": "0", + "strike": "1800", "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6006469", + "iv_ask": "0.6085412", + "inverse": true }, { - "bid": "0.1695", - "ask": "0.1745", - "open_interest": "939.0", - "volume": "107315.86", - "strike": "2400.0000", + "bid": "0.117", + "ask": "0.1185", + "open_interest": "2673", + "volume": "0", + "strike": "1900", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5962189", + "iv_ask": "0.6017638", + "inverse": true }, { - "bid": "0.2670", - "ask": "0.2835", - "open_interest": "3.0", - "volume": "783.61", - "strike": "2500.0000", + "bid": "0.138", + "ask": "0.1405", + "open_interest": "6813", + "volume": "0", + "strike": "2000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "option_type": "put", + "security_type": "option", + "iv_bid": "0.588404", + "iv_ask": "0.5971883", + "inverse": true }, { - "bid": "0.1890", - "ask": "0.1945", - "open_interest": "260.0", - "volume": "0.0", - "strike": "2500.0000", + "bid": "0.1625", + "ask": "0.1645", + "open_interest": "1926", + "volume": "0", + "strike": "2100", "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5862439", + "iv_ask": "0.5930151", + "inverse": true }, { - "bid": "0.2560", - "ask": "0.2625", - "open_interest": "64.0", - "volume": "45237.74", - "strike": "2600.0000", + "bid": "0.17", + "ask": "0.1725", + "open_interest": "50826", + "volume": "0", + "strike": "2200", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5790226", + "iv_ask": "0.5872761", + "inverse": true }, { - "bid": "0.2095", - "ask": "0.2150", - "open_interest": "615.0", - "volume": "5599.48", - "strike": "2600.0000", + "bid": "0.1515", + "ask": "0.154", + "open_interest": "1964", + "volume": "1646.38", + "strike": "2300", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5756262", + "iv_ask": "0.5837668", + "inverse": true }, { - "bid": "0.2265", - "ask": "0.2320", - "open_interest": "332.0", - "volume": "162390.14", - "strike": "2800.0000", + "bid": "0.135", + "ask": "0.1375", + "open_interest": "12377", + "volume": "35878.39", + "strike": "2400", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5732938", + "iv_ask": "0.5814046", + "inverse": true }, { - "bid": "0.2530", - "ask": "0.2590", - "open_interest": "1932.0", - "volume": "6361.06", - "strike": "2800.0000", + "bid": "0.12", + "ask": "0.1225", + "open_interest": "21353", + "volume": "0", + "strike": "2500", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5707483", + "iv_ask": "0.578903", + "inverse": true }, { - "bid": "0.2005", - "ask": "0.2055", - "open_interest": "605.0", - "volume": "1179.5", - "strike": "3000.0000", + "bid": "0.107", + "ask": "0.109", + "open_interest": "1458", + "volume": "0", + "strike": "2600", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5700075", + "iv_ask": "0.5766196", + "inverse": true }, { - "bid": "0.2915", - "ask": "0.3105", - "open_interest": "696.0", - "volume": "765.67", - "strike": "3000.0000", + "bid": "0.095", + "ask": "0.097", + "open_interest": "1566", + "volume": "35906.25", + "strike": "2700", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5681783", + "iv_ask": "0.5749294", + "inverse": true }, { - "bid": "0.1770", - "ask": "0.1825", - "open_interest": "673.0", - "volume": "51633.27", - "strike": "3200.0000", + "bid": "0.0845", + "ask": "0.0865", + "open_interest": "3779", + "volume": "0", + "strike": "2800", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5673101", + "iv_ask": "0.574246", + "inverse": true }, { - "bid": "0.3410", - "ask": "0.3640", - "open_interest": "209.0", - "volume": "10301.53", - "strike": "3200.0000", + "bid": "0.075", + "ask": "0.077", + "open_interest": "347", + "volume": "0", + "strike": "2900", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5660836", + "iv_ask": "0.5732523", + "inverse": true }, { - "bid": "0.1570", - "ask": "0.1620", - "open_interest": "751.0", - "volume": "14029.57", - "strike": "3400.0000", + "bid": "0.067", + "ask": "0.0685", + "open_interest": "3033", + "volume": "1308.65", + "strike": "3000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5667078", + "iv_ask": "0.5722898", + "inverse": true }, { - "bid": "0.3935", - "ask": "0.4175", - "open_interest": "34.0", - "volume": "28891.61", - "strike": "3400.0000", + "bid": "0.0595", + "ask": "0.061", + "open_interest": "1250", + "volume": "0", + "strike": "3100", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5659009", + "iv_ask": "0.5717257", + "inverse": true }, { - "bid": "0.1390", - "ask": "0.1445", - "open_interest": "687.0", - "volume": "0.0", - "strike": "3600.0000", + "bid": "0.053", + "ask": "0.0545", + "open_interest": "67659", + "volume": "5617.39", + "strike": "3200", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5658704", + "iv_ask": "0.571968", + "inverse": true }, { - "bid": "0.4480", - "ask": "0.4735", - "open_interest": "92.0", - "volume": "29370.19", - "strike": "3600.0000", + "bid": "0.0475", + "ask": "0.049", + "open_interest": "1315", + "volume": "0", + "strike": "3300", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.567085", + "iv_ask": "0.5734785", + "inverse": true }, { - "bid": "0.1235", - "ask": "0.1290", - "open_interest": "321.0", - "volume": "0.0", - "strike": "3800.0000", + "bid": "0.0425", + "ask": "0.044", + "open_interest": "11271", + "volume": "0", + "strike": "3400", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5678254", + "iv_ask": "0.5745518", + "inverse": true }, { - "bid": "0.5050", - "ask": "0.5325", - "open_interest": "36.0", - "volume": "0.0", - "strike": "3800.0000", + "bid": "0.038", + "ask": "0.0395", + "open_interest": "23299", + "volume": "0", + "strike": "3500", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5683342", + "iv_ask": "0.5754312", + "inverse": true }, { - "bid": "0.1120", - "ask": "0.1140", - "open_interest": "4003.0", - "volume": "353734.29", - "strike": "4000.0000", + "bid": "0.034", + "ask": "0.0355", + "open_interest": "1734", + "volume": "0", + "strike": "3600", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5688766", + "iv_ask": "0.5763805", + "inverse": true }, { - "bid": "0.5640", - "ask": "0.5930", - "open_interest": "226.0", - "volume": "0.0", - "strike": "4000.0000", + "bid": "0.0275", + "ask": "0.029", + "open_interest": "2264", + "volume": "0", + "strike": "3800", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5712907", + "iv_ask": "0.5796956", + "inverse": true }, { - "bid": "0.0990", - "ask": "0.1035", - "open_interest": "435.0", - "volume": "65657.7", - "strike": "4200.0000", + "bid": "0.0225", + "ask": "0.0235", + "open_interest": "16570", + "volume": "1008.95", + "strike": "4000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5747596", + "iv_ask": "0.5810737", + "inverse": true }, { - "bid": "0.6250", - "ask": "0.6550", - "open_interest": "60.0", - "volume": "0.0", - "strike": "4200.0000", + "bid": "0.018", + "ask": "0.0195", + "open_interest": "1747", + "volume": "0", + "strike": "4200", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5745246", + "iv_ask": "0.5852541", + "inverse": true }, { - "bid": "0.0885", - "ask": "0.0930", - "open_interest": "277.0", - "volume": "58929.81", - "strike": "4400.0000", + "bid": "0.015", + "ask": "0.016", + "open_interest": "1880", + "volume": "65.95", + "strike": "4400", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5791185", + "iv_ask": "0.587201", + "inverse": true }, { - "bid": "0.0840", - "ask": "0.0885", - "open_interest": "37.0", - "volume": "7340.47", - "strike": "4500.0000", + "bid": "0.0135", + "ask": "0.015", + "open_interest": "1487", + "volume": "59.57", + "strike": "4500", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.579414", + "iv_ask": "0.5922468", + "inverse": true }, { - "bid": "0.0795", - "ask": "0.0840", - "open_interest": "186.0", - "volume": "0.0", - "strike": "4600.0000", + "bid": "0.0125", + "ask": "0.0135", + "open_interest": "8781", + "volume": "171.74", + "strike": "4600", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5829142", + "iv_ask": "0.5920095", + "inverse": true }, { - "bid": "0.0720", - "ask": "0.0760", - "open_interest": "175.0", - "volume": "0.0", - "strike": "4800.0000", + "bid": "0.0105", + "ask": "0.0115", + "open_interest": "1974", + "volume": "48.02", + "strike": "4800", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5869198", + "iv_ask": "0.597131", + "inverse": true }, { - "bid": "0.8155", - "ask": "0.8500", - "open_interest": "25.0", - "volume": "0.0", - "strike": "4800.0000", + "bid": "0.0085", + "ask": "0.0095", + "open_interest": "3576", + "volume": "38.35", + "strike": "5000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5864419", + "iv_ask": "0.5981591", + "inverse": true }, { - "bid": "0.0650", - "ask": "0.0690", - "open_interest": "2453.0", - "volume": "43834.3", - "strike": "5000.0000", + "bid": "0.0075", + "ask": "0.0085", + "open_interest": "8537", + "volume": "17.02", + "strike": "5200", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5942999", + "iv_ask": "0.6071286", + "inverse": true }, { - "bid": "0.0590", - "ask": "0.0625", - "open_interest": "132.0", - "volume": "0.0", - "strike": "5200.0000", + "bid": "0.006", + "ask": "0.0065", + "open_interest": "1536", + "volume": "0", + "strike": "5500", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6011605", + "iv_ask": "0.6088364", + "inverse": true }, { - "bid": "0.0510", - "ask": "0.0545", - "open_interest": "906.0", - "volume": "7477.65", - "strike": "5500.0000", + "bid": "0.0041", + "ask": "0.0048", + "open_interest": "10719", + "volume": "0", + "strike": "6000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6091383", + "iv_ask": "0.623092", + "inverse": true }, { - "bid": "0.0405", - "ask": "0.0440", - "open_interest": "3130.0", - "volume": "483.5", - "strike": "6000.0000", + "bid": "0.0032", + "ask": "0.0036", + "open_interest": "1972", + "volume": "0", + "strike": "6500", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6254197", + "iv_ask": "0.6353199", + "inverse": true }, { - "bid": "0.0330", - "ask": "0.0360", - "open_interest": "677.0", - "volume": "386.84", - "strike": "6500.0000", + "bid": "0.0022", + "ask": "0.0027", + "open_interest": "2889", + "volume": "24.5", + "strike": "7000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6287991", + "iv_ask": "0.6448487", + "inverse": true }, { - "bid": "0.0270", - "ask": "0.0300", - "open_interest": "1606.0", - "volume": "0.0", - "strike": "7000.0000", + "bid": "0.0015", + "ask": "0.0018", + "open_interest": "2476", + "volume": "0", + "strike": "8000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6571531", + "iv_ask": "0.6706568", + "inverse": true }, { - "bid": "0.0185", - "ask": "0.0210", - "open_interest": "1134.0", - "volume": "279.34", - "strike": "8000.0000", + "bid": "0.001", + "ask": "0.0013", + "open_interest": "1916", + "volume": "0", + "strike": "9000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6763852", + "iv_ask": "0.6948657", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0160", - "open_interest": "1369.0", - "volume": "18148.43", - "strike": "9000.0000", + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "1688", + "volume": "0", + "strike": "10000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6725556", + "iv_ask": "0.6935471", + "inverse": true }, { - "bid": "0.0100", - "ask": "0.0120", - "open_interest": "1205.0", - "volume": "1085.31", - "strike": "10000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "2181.75", + "ask": "2182.75", + "open_interest": "8510750", + "volume": "568965", + "maturity": "2027-03-26T08:00:00Z", + "security_type": "forward" + }, + { + "bid": "0.0245", + "ask": "0.0255", + "open_interest": "4438", + "volume": "52.52", + "strike": "1000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.7138243", + "iv_ask": "0.7223943", + "inverse": true + }, + { + "bid": "0.061", + "ask": "0.063", + "open_interest": "2206", + "volume": "1459.39", + "strike": "1400", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.646589", + "iv_ask": "0.655977", + "inverse": true + }, + { + "bid": "0.0745", + "ask": "0.0765", + "open_interest": "1287", + "volume": "162.48", + "strike": "1500", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.636517", + "iv_ask": "0.6449409", + "inverse": true + }, + { + "bid": "0.09", + "ask": "0.092", + "open_interest": "902", + "volume": "0", + "strike": "1600", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6285263", + "iv_ask": "0.6361975", + "inverse": true + }, + { + "bid": "0.107", + "ask": "0.1095", + "open_interest": "1155", + "volume": "0", + "strike": "1700", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.620378", + "iv_ask": "0.6292343", + "inverse": true + }, + { + "bid": "0.127", + "ask": "0.129", + "open_interest": "1279", + "volume": "0", + "strike": "1800", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6171413", + "iv_ask": "0.623768", + "inverse": true + }, + { + "bid": "0.148", + "ask": "0.1505", + "open_interest": "698", + "volume": "0", + "strike": "1900", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6118249", + "iv_ask": "0.6196657", + "inverse": true + }, + { + "bid": "0.1705", + "ask": "0.1735", + "open_interest": "973", + "volume": "0", + "strike": "2000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6063969", + "iv_ask": "0.6153975", + "inverse": true + }, + { + "bid": "0.195", + "ask": "0.1985", + "open_interest": "340", + "volume": "414.24", + "strike": "2100", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6024715", + "iv_ask": "0.6126137", + "inverse": true + }, + { + "bid": "0.2135", + "ask": "0.2165", + "open_interest": "1447", + "volume": "1845.09", + "strike": "2200", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5961066", + "iv_ask": "0.6045711", + "inverse": true }, { - "bid": "0.0075", - "ask": "0.0095", - "open_interest": "346.0", - "volume": "0.0", - "strike": "11000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.196", + "ask": "0.1985", + "open_interest": "167", + "volume": "0", + "strike": "2300", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5947617", + "iv_ask": "0.6016878", + "inverse": true + }, + { + "bid": "0.1795", + "ask": "0.182", + "open_interest": "211", + "volume": "0", + "strike": "2400", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5924796", + "iv_ask": "0.5993279", + "inverse": true + }, + { + "bid": "0.1645", + "ask": "0.167", + "open_interest": "457", + "volume": "49467.79", + "strike": "2500", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.590875", + "iv_ask": "0.5976893", + "inverse": true + }, + { + "bid": "0.1505", + "ask": "0.153", + "open_interest": "804", + "volume": "0", + "strike": "2600", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.588801", + "iv_ask": "0.5956201", + "inverse": true + }, + { + "bid": "0.138", + "ask": "0.1405", + "open_interest": "650", + "volume": "589.36", + "strike": "2700", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5878419", + "iv_ask": "0.5947001", + "inverse": true + }, + { + "bid": "0.127", + "ask": "0.1285", + "open_interest": "448", + "volume": "275.55", + "strike": "2800", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5882395", + "iv_ask": "0.5923968", + "inverse": true + }, + { + "bid": "0.1165", + "ask": "0.118", + "open_interest": "903", + "volume": "0", + "strike": "2900", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5874531", + "iv_ask": "0.5916702", + "inverse": true + }, + { + "bid": "0.1065", + "ask": "0.109", + "open_interest": "608", + "volume": "11743.45", + "strike": "3000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5856363", + "iv_ask": "0.5927907", + "inverse": true + }, + { + "bid": "0.098", + "ask": "0.1", + "open_interest": "355", + "volume": "21056.11", + "strike": "3100", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5858469", + "iv_ask": "0.5916921", + "inverse": true + }, + { + "bid": "0.09", + "ask": "0.092", + "open_interest": "299", + "volume": "0", + "strike": "3200", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5854157", + "iv_ask": "0.5914024", + "inverse": true + }, + { + "bid": "0.083", + "ask": "0.085", + "open_interest": "406", + "volume": "0", + "strike": "3300", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5860171", + "iv_ask": "0.5921597", + "inverse": true + }, + { + "bid": "0.0765", + "ask": "0.078", + "open_interest": "42", + "volume": "166.61", + "strike": "3400", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5863307", + "iv_ask": "0.5910724", + "inverse": true + }, + { + "bid": "0.0705", + "ask": "0.072", + "open_interest": "408", + "volume": "1218.95", + "strike": "3500", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5864985", + "iv_ask": "0.5913863", + "inverse": true + }, + { + "bid": "0.065", + "ask": "0.0665", + "open_interest": "786", + "volume": "140.59", + "strike": "3600", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5866652", + "iv_ask": "0.5917126", + "inverse": true + }, + { + "bid": "0.06", + "ask": "0.062", + "open_interest": "490", + "volume": "130.06", + "strike": "3700", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5869811", + "iv_ask": "0.5939316", + "inverse": true + }, + { + "bid": "0.0555", + "ask": "0.057", + "open_interest": "759", + "volume": "0", + "strike": "3800", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.587605", + "iv_ask": "0.5930073", + "inverse": true + }, + { + "bid": "0.0475", + "ask": "0.049", + "open_interest": "1290", + "volume": "0", + "strike": "4000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5885202", + "iv_ask": "0.5943306", + "inverse": true + }, + { + "bid": "0.041", + "ask": "0.0425", + "open_interest": "1643", + "volume": "88.77", + "strike": "4200", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5904635", + "iv_ask": "0.5967217", + "inverse": true + }, + { + "bid": "0.0355", + "ask": "0.0365", + "open_interest": "848", + "volume": "78.05", + "strike": "4400", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5923637", + "iv_ask": "0.5968813", + "inverse": true + }, + { + "bid": "0.033", + "ask": "0.0345", + "open_interest": "1452", + "volume": "0", + "strike": "4500", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5929603", + "iv_ask": "0.599992", + "inverse": true + }, + { + "bid": "0.0305", + "ask": "0.032", + "open_interest": "506", + "volume": "0", + "strike": "4600", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5925813", + "iv_ask": "0.5999234", + "inverse": true + }, + { + "bid": "0.027", + "ask": "0.028", + "open_interest": "581", + "volume": "0", + "strike": "4800", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5967907", + "iv_ask": "0.6020745", + "inverse": true + }, + { + "bid": "0.0235", + "ask": "0.025", + "open_interest": "803", + "volume": "0", + "strike": "5000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.598008", + "iv_ask": "0.6065738", + "inverse": true + }, + { + "bid": "0.017", + "ask": "0.0185", + "open_interest": "1124", + "volume": "230.97", + "strike": "5500", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.6024288", + "iv_ask": "0.6128944", + "inverse": true + }, + { + "bid": "0.0125", + "ask": "0.0135", + "open_interest": "1779", + "volume": "27.71", + "strike": "6000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.6065562", + "iv_ask": "0.6151545", + "inverse": true } ] } \ No newline at end of file diff --git a/docs/examples/index.md b/docs/examples/index.md new file mode 100644 index 00000000..6e881bc7 --- /dev/null +++ b/docs/examples/index.md @@ -0,0 +1,32 @@ +# Interactive Examples + +Interactive notebooks for exploring quantflow tools and models. + +Each example is a [marimo](https://marimo.io) notebook served as a live application. +You can run the code, adjust parameters, and see results update in real time. + +!!! warning "Work in progress" + These notebooks are not always stable and may fail to load or produce unexpected results. + We are actively working on improving their reliability. + If you have experience with marimo and would like to help, contributions are very welcome via [GitHub](https://github.com/quantmind/quantflow). + +## Stochastic Processes + +| Example | Description | +|---|---| +| [Gaussian Sampling](gaussian-sampling) | Sample the Gaussian Ornstein-Uhlenbeck (Vasicek) process for different mean-reversion speeds and path counts | +| [Poisson Sampling](poisson-sampling) | Compare Monte Carlo simulation of the Poisson process against the analytical PDF | +| [Double Exponential Sampling](double-exponential-sampling) | Explore the Asymmetric Laplace distribution with adjustable asymmetry parameter | + +## Time Series Analysis + +| Example | Description | +|---|---| +| [Hurst Exponent](hurst) | Estimate the Hurst exponent to classify a time series as trending, mean-reverting, or random | +| [Supersmoother](supersmoother) | Apply the Supersmoother and EWMA filters to financial time series | + +## Volatility and Options + +| Example | Description | +|---|---| +| [Volatility Surface](volatility-surface) | Build and visualise an implied volatility surface from live Deribit ETH/USD options data | diff --git a/docs/glossary.md b/docs/glossary.md index 04880f3d..a848a0c0 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -43,6 +43,19 @@ of a real-valued random variable $x$ is the function given by where ${\mathbb P}_x$ is the distrubution measure of $x$. +## Discount Factor + +The discount factor $D\left(\tau\right)$ is the present value of one unit of currency paid at [time to maturity](#time-to-maturity-ttm) $\tau$. +It is equal to the price of a zero-coupon bond maturing at $\tau$: a contract that pays exactly 1 at maturity with no intermediate cashflows. + +\begin{equation} + D\left(\tau\right) = e^{-r \tau} +\end{equation} + +where $r$ is the continuously compounded risk-free rate. + +Under a zero interest rate assumption, $D\left(\tau\right) = 1\ \ \ \forall\ \tau$. + ## Feller Condition The Feller condition is a parameter constraint on a square-root diffusion process @@ -71,6 +84,16 @@ condition holds. The `feller_enforce` flag (default `True`) that imposes this as a hard inequality constraint during optimisation. +## Forwards + +The forward price $F$ of an asset at maturity $\tau$ is the price agreed upon today for delivery of the asset at time $\tau$. It is given by the ratio of two discount factors: one for the asset $D_a(\tau)$ and one for the quote $D_q(\tau)$. + +\begin{equation} +F(\tau) = S \cdot \frac{D_a(\tau)}{D_q(\tau)} +\end{equation} + +See [Forwards and Discount Factors](theory/forwards.md) for more details. + ## Forward Space Forward space is the unit-free convention in which option prices are @@ -172,21 +195,26 @@ The [probability density function](https://en.wikipedia.org/wiki/Probability_den ## Put-Call Parity Put-call parity is a no-arbitrage relationship between the prices of European call -and put options with the same strike $K$ and maturity. Denoting forward-space prices -$c = C/F$ and $p = P/F$ (see [Black Pricing](api/options/black.md)), the relationship -reads: +and put options with the same strike $K$ and time to maturity. \begin{equation} - c - p = 1 - \frac{K}{F} = 1 - e^k + C - P = D_q \left(F - K\right) \end{equation} -where $k$ is the [log-strike](#log-strike). -In quoting currency terms, multiplying through by $F$: +where $D_q$ is the [discount factor](#discount-factor) of the quoting asset (generally a currency) +at maturity and $F$ is the forward price +of the underlying asset at maturity. + +Denoting forward-space prices +$c = C/(D_q\ F)$ and $p = P/(D_q\ F)$ (see [Black Pricing](api/options/black.md)), the relationship +reads: \begin{equation} - C - P = F - K + c - p = 1 - \frac{K}{F} = 1 - e^k \end{equation} +where $k$ is the [log-strike](#log-strike). + ## Time To Maturity (TTM) Time to maturity is the time remaining until an option or forward contract expires, diff --git a/docs/theory/forwards.md b/docs/theory/forwards.md new file mode 100644 index 00000000..ff0558ad --- /dev/null +++ b/docs/theory/forwards.md @@ -0,0 +1,68 @@ +# Forwards and Discount Factors + +## Discount Factors + +A [discount factor](../glossary.md#discount-factor) $D(\tau)$ is the present value of +one unit of currency delivered at time $\tau$. + +In quantflow, discount factors are provided by a +[YieldCurve][quantflow.rates.yield_curve.YieldCurve]. Different implementations capture +different term structures: a flat zero-rate curve, a fitted +[Nelson-Siegel][quantflow.rates.nelson_siegel.NelsonSiegel] curve, or any custom term +structure. + +## Forward Price + +The forward price of an asset at maturity $\tau$ is defined under the assumption that +two discount factors are available: one for the asset $D_a(\tau)$ and one for the +quote $D_q(\tau)$. + +\begin{equation} +F(\tau) = S \cdot \frac{D_a(\tau)}{D_q(\tau)} +\end{equation} + +where $S$ is the current spot price. + +For an asset that pays no dividends and has no carry costs, the discount factor +for the asset is constant and equal to one. In this case +the forward price is simply given by the discount factor for the quote: + +\begin{equation} +F(\tau) = \frac{S}{D_q(\tau)} +\end{equation} + +When the quote is cash, the forward price is the spot price compounded at the risk-free rate, +which means that forward prices are typically higher than the spot price. + +## Put-Call Parity + +The Put call parity is a fundamental relationship between the prices of European call and put options with the same strike and maturity. +It states that the difference between the call price $C$ and the put price $P$ is equal to the discounted difference between the forward price $F$ and the strike price $K$: + +\begin{equation} +C - P = S \cdot D_a - D_q \cdot K +\end{equation} + +Dividing by the Spot price + +\begin{equation} +\frac{C - P}{S} = D_a - \frac{D_q}{S} \cdot K +\end{equation} + +This is linear in $K$, with slope $-D_q / S$ and intercept $D_a$. + +Fitting a linear regression across multiple strikes at the same maturity therefore +identifies both discount factors simultaneously: $D_q$ from the slope and $D_a$ from +the intercept. + +### Inverse Options + +For inverse options, prices are quoted in units of the underlying asset, which acts as +the quote. The relevant discount factor is therefore $D_a$. Put-call parity becomes: + +\begin{equation} +c - p = D_a \left(1 - \frac{K}{F}\right) = D_a - \frac{D_q}{S} \cdot K +\end{equation} + +This is again linear in $K$, with intercept $D_a$ and slope $-D_q / S$, exactly the same as for regular options. +The same regression therefore identifies both discount factors as before. diff --git a/docs/theory/option_pricing.md b/docs/theory/option_pricing.md index fb6884c0..30dfba04 100644 --- a/docs/theory/option_pricing.md +++ b/docs/theory/option_pricing.md @@ -1,24 +1,31 @@ # Option Pricing -We use characteristic function inversion to price European call options on an underlying $S_t = S_0 e^{s_t}$, where $S_0$ is the spot price at time 0. We assume zero interest rates, so the forward equals the spot. The log-return $s_t = x_t - c_t$ is constructed from a driving process $x_t$ and a deterministic [convexity correction](convexity_correction.md) $c_t$ that enforces the martingale condition ${\mathbb E}[e^{s_t}] = 1$. +We use characteristic function inversion to price European call options on an underlying $S_t = F_t e^{s_t}$, where $F_t$ is the forward price at time $t$. +The log-return $s_t = x_t - c_t$ is constructed from a driving process $x_t$ and a deterministic [convexity correction](convexity_correction.md) $c_t$ +that enforces the martingale condition ${\mathbb E}[e^{s_t}] = 1$. ## Call Option -The price $C$ of a call option with strike $K$ is defined as +The price $C$ of a call option with expiry $\tau$ and strike $K$ is defined as \begin{equation} \begin{aligned} -C &= S_0 c_k \\ -k &= \ln\frac{K}{S_0} \\ +C &= D_\tau F_\tau c_k \\ +k &= \ln\frac{K}{F_\tau} \\ c_k &= {\mathbb E}\left[\left(e^{s_t} - e^k\right)^+\right] = \int_{-\infty}^\infty \left(e^s - e^k\right)^+ f_{s_t}(s)\, ds \end{aligned} \label{call-price} \end{equation} -$k$ is the [log-strike](../glossary.md#log-strike) and $f_{s_t}$ is the probability density function of $s_t$. The call price is the discounted expected payoff under the risk-neutral measure, which simplifies to the undiscounted expected payoff when interest rates are zero. +$k$ is the [log-strike](../glossary.md#log-strike) with respect to the forward $F_\tau$ and $f_{s_t}$ is the probability density function of $s_t$. +$D_\tau$ is the [discount factor](../glossary#discount-factor) to time $\tau$, which is 1 under a zero interest rate assumption. -All three methods share this starting point. They all express $c_k$ via the characteristic function $\Phi_{s_t}$, but differ in how the integration contour is chosen, how the payoff is handled, and the discretisation strategy. +## Fourier Inversion Methods + +The key insight is that while the density $f_{s_t}$ may not have a closed form, its [characteristic function](../glossary.md#characteristic-function) $\Phi_{s_t}$ is available analytically for a wide class of stochastic processes. The integral in $\eqref{call-price}$ can therefore be evaluated by inverting $\Phi_{s_t}$ numerically. + +Quantflow implements three Fourier inversion approaches: [Carr and Madan (1999)](../bibliography.md#carr_madan), [Lewis (2001)](../bibliography.md#lewis), and the [COS method](../bibliography.md#cos) (Fang and Oosterlee, 2008). All three share the same starting point and express $c_k$ via $\Phi_{s_t}$, but differ in how the integration contour is chosen, how the payoff is handled, and the discretisation strategy. ## Carr & Madan diff --git a/docs/tutorials/heston_calibration.md b/docs/tutorials/heston_calibration.md new file mode 100644 index 00000000..df3140c7 --- /dev/null +++ b/docs/tutorials/heston_calibration.md @@ -0,0 +1,152 @@ +# Heston Volatility Model + +## Calibrating the Heston Model + +[HestonCalibration][quantflow.options.calibration.heston.HestonCalibration] fits the +five Heston parameters ($v_0$, $\theta$, $\kappa$, $\sigma$, $\rho$) to the implied +volatility surface using a two-stage optimisation: + +1. **L-BFGS-B** minimises the scalar cost function (sum of squared weighted price + residuals) to reach a good basin of attraction. +2. **Trust-region reflective** (`least_squares` with `method="trf"`) refines the + solution on the residual vector with tight tolerances and enforces parameter bounds. + +Residuals are computed as `weight * (model_call_price - mid_call_price)` where +`mid_call_price` is the average of the bid and ask call prices. + +The weight is $\min(e^{w \cdot m^2}, w_\text{max})$ controlled by +`moneyness_weight` (the coefficient $w$) and `max_cost_weight` (the cap +$w_\text{max}$), with $m = \log(K/F)/\sqrt{T}$ the standardised moneyness. +The quadratic exponent matches the gaussian shape of $1/\nu$ (inverse vega), +so a positive `moneyness_weight` puts wing residuals on the same footing as +ATM ones. The cap prevents a single deep-wing option from dominating the +loss. + +A penalty for violating the Feller condition ($2\kappa\theta \geq \sigma^2$) +is added during stage 1 to keep the variance process well-behaved. + +```python +--8<-- "docs/examples/vol_surface_heston_calibration.py" +``` + +### Output + +--8<-- "docs/examples/output/vol_surface_heston_calibration.out" + +### Calibration Options + +The `moneyness_weight` parameter up-weights far-from-the-money options via +$e^{w \cdot m^2}$ where $m = \log(K/F)/\sqrt{T}$ is the standardised +moneyness. The result is capped at `max_cost_weight` (default 10) so a +single deep-wing option cannot dominate the loss. + +### Plotting the Calibrated Smile + +Use [plot_maturities()][quantflow.options.calibration.base.VolModelCalibration.plot_maturities] +to produce a Plotly figure overlaying market bid/ask implied vols against the model smile +for all maturities at once: + +```python +fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) +fig.write_image("heston_calibrated_smile.png", width=1200) +``` + +The x axis is [moneyness](../glossary.md#moneyness). + +![Heston calibrated smile](../assets/examples/heston_calibrated_smile.png) + +### Model Limitations at Short Maturities + +Inspecting the calibrated smiles across all maturities reveals a systematic pattern: +the Heston model fits long-dated options reasonably well but struggles with short-term +maturities, where the market smile is steeper than the model can reproduce. + +This is a fundamental structural limitation, not a numerical issue. The Heston model +generates an implied volatility smile through two mechanisms: the correlation $\rho$ +between spot and variance (which creates skew) and the volatility-of-variance $\sigma$ +(which inflates the wings). Both effects accumulate diffusively over time. For a maturity +$T$, the smile roughly scales as $\sigma \sqrt{T}$, so as $T \to 0$ the distribution +collapses toward a Gaussian and the smile flattens. + +More precisely, the Heston characteristic function at short maturities satisfies: + +\begin{equation} +\log \phi(u, T) \approx i u \mu T - \tfrac{1}{2} u^2 v_0 T + O(T^2) +\end{equation} + +which is the characteristic function of a Gaussian with variance $v_0 T$. The higher +cumulants that produce skew and excess kurtosis are all $O(T^2)$ or smaller, so they +vanish faster than the Gaussian term as $T \to 0$. + +In practice this means the Heston model essentially reduces to Black-Scholes for +near-expiry options. The market, however, exhibits pronounced short-term skew driven by +jump risk and the market microstructure of short-dated hedging demand. A diffusion-only +model cannot reproduce this behaviour regardless of how its parameters are tuned. + +The natural extension is to add a jump component to the dynamics, which contributes +a term of order $O(T)$ to the cumulants and restores the short-term smile. This is +the motivation for the Heston jump-diffusion model described in the next section. + +## Calibrating the Heston Jump-Diffusion Model + +[HestonJCalibration][quantflow.options.calibration.heston.HestonJCalibration] extends the +Heston calibration with a compound Poisson jump component via the +[HestonJ][quantflow.sp.heston.HestonJ] model. Jumps are drawn from a +[DoubleExponential][quantflow.utils.distributions.DoubleExponential] distribution, +which captures asymmetric jump behaviour common in equity and crypto markets. + +```python +--8<-- "docs/examples/vol_surface_hestonj_calibration.py" +``` + +--8<-- "docs/examples/output/vol_surface_hestonj_calibration.out" + +### Plotting the Calibrated Smile + +```python +fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) +fig.write_image("hestonj_calibrated_smile.png", width=1200) +``` + +![HestonJ calibrated smile](../assets/examples/hestonj_calibrated_smile.png) + +### Remaining Limitations at Short Maturities + +Adding jumps improves the short-term smile significantly compared to plain Heston, but +the fit at the nearest maturities is still imperfect. Several structural reasons combine: + +**Jump parameters are global.** The compound Poisson component has a single intensity +$\lambda$, jump variance, and asymmetry shared across all maturities. Increasing +$\lambda$ to steepen the short-term smile simultaneously distorts the long-term smile, +so the optimizer settles on a compromise. + +**Long maturities dominate the cost function.** They have more liquid strikes and +therefore more data points. The optimizer minimizes total squared residuals across the +whole surface, so short maturities — with fewer strikes — are outvoted and their fit is +systematically sacrificed. + +**The jump distribution is not rich enough.** The short-term smile in crypto is driven +by large, rare, asymmetric events. A [DoubleExponential][quantflow.utils.distributions.DoubleExponential] +with fixed parameters cannot simultaneously match the wing curvature at short and long +maturities. + +The natural next step is a rough volatility model (for example rough Heston with Hurst +parameter $H < \tfrac{1}{2}$). Because the variance process has long memory and does not +behave diffusively at short time scales, rough models produce a steep short-term skew +without requiring jumps, and the skew decays as a power law $T^H$ rather than the +$T^{1/2}$ rate of classical stochastic volatility. + +### Parameter Reference + +The calibrated parameter vector for the jump-diffusion model is: + +| Parameter | Description | +|---|---| +| `vol` | Initial volatility ($\sqrt{v_0}$) | +| `theta` | Long-run volatility ($\sqrt{\theta}$) | +| `kappa` | Mean reversion speed | +| `sigma` | Volatility of variance | +| `rho` | Spot-variance correlation | +| `jump intensity` | Jump arrival rate (jumps per year) | +| `jump variance` | Variance of a single jump | +| `jump asymmetry` | Asymmetry of the jump distribution ([DoubleExponential][quantflow.utils.distributions.DoubleExponential]) | diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index 0b129bb1..ff01f8e6 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -5,6 +5,7 @@ Step-by-step guides for common quantflow workflows. | Tutorial | Description | |---|---| | [Option Pricing](option_pricing.md) | Price a European option with the Black-Scholes and Heston-jump-diffusion models | -| [Volatility Surface](volatility_surface.md) | Fetch live option data, build an implied volatility surface, and calibrate Heston and jump-diffusion models | +| [Volatility Surface](volatility_surface.md) | Fetch live option data, build an implied volatility surface, and extract forwards and discount factors from option prices | +| [Heston Volatility Model](heston_calibration.md) | Calibrate the Heston and Heston-jump-diffusion models to an implied volatility surface | | [SPX Volatility Surface](spx_vol_surface.md) | Build a 3D implied volatility surface for the S&P 500 from a Yahoo Finance option chain | | [BNS Volatility Model](bns_calibration.md) | Calibrate the Barndorff-Nielsen and Shephard stochastic-volatility model to an implied volatility surface | diff --git a/docs/tutorials/volatility_surface.md b/docs/tutorials/volatility_surface.md index b9eb2c9d..2249623b 100644 --- a/docs/tutorials/volatility_surface.md +++ b/docs/tutorials/volatility_surface.md @@ -1,8 +1,8 @@ # Volatility Surface -This tutorial covers the full workflow for building and calibrating an implied volatility -surface: fetching option quotes from Deribit, inspecting the surface inputs, and -calibrating the Heston and Heston-jump-diffusion models. +This tutorial covers the full workflow for building an implied volatility surface: +fetching option quotes from Deribit, extracting implied forwards and discount factors +from option prices, and inspecting the surface inputs. ## Fetching Data from Deribit @@ -98,153 +98,34 @@ inputs = surface.inputs(converged=True) # VolSurface -> VolSurfaceInputs surface2 = surface_from_inputs(inputs) # VolSurfaceInputs -> VolSurface ``` -## Calibrating the Heston Model - -[HestonCalibration][quantflow.options.calibration.heston.HestonCalibration] fits the -five Heston parameters ($v_0$, $\theta$, $\kappa$, $\sigma$, $\rho$) to the implied -volatility surface using a two-stage optimisation: - -1. **L-BFGS-B** minimises the scalar cost function (sum of squared weighted price - residuals) to reach a good basin of attraction. -2. **Trust-region reflective** (`least_squares` with `method="trf"`) refines the - solution on the residual vector with tight tolerances and enforces parameter bounds. - -Residuals are computed as `weight * (model_call_price - mid_call_price)` where -`mid_call_price` is the average of the bid and ask call prices. - -The weight is $\min(e^{w \cdot m^2}, w_\text{max})$ controlled by -`moneyness_weight` (the coefficient $w$) and `max_cost_weight` (the cap -$w_\text{max}$), with $m = \log(K/F)/\sqrt{T}$ the standardised moneyness. -The quadratic exponent matches the gaussian shape of $1/\nu$ (inverse vega), -so a positive `moneyness_weight` puts wing residuals on the same footing as -ATM ones. The cap prevents a single deep-wing option from dominating the -loss. - -A penalty for violating the Feller condition ($2\kappa\theta \geq \sigma^2$) -is added during stage 1 to keep the variance process well-behaved. - -```python ---8<-- "docs/examples/vol_surface_heston_calibration.py" -``` - -### Output - ---8<-- "docs/examples/output/vol_surface_heston_calibration.out" - -### Calibration Options - -The `moneyness_weight` parameter up-weights far-from-the-money options via -$e^{w \cdot m^2}$ where $m = \log(K/F)/\sqrt{T}$ is the standardised -moneyness. The result is capped at `max_cost_weight` (default 10) so a -single deep-wing option cannot dominate the loss. - -### Plotting the Calibrated Smile - -Use [plot_maturities()][quantflow.options.calibration.base.VolModelCalibration.plot_maturities] -to produce a Plotly figure overlaying market bid/ask implied vols against the model smile -for all maturities at once: - -```python -fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) -fig.write_image("heston_calibrated_smile.png", width=1200) -``` - -The x axis is [moneyness](../glossary.md#moneyness). - -![Heston calibrated smile](../assets/examples/heston_calibrated_smile.png) - -### Model Limitations at Short Maturities - -Inspecting the calibrated smiles across all maturities reveals a systematic pattern: -the Heston model fits long-dated options reasonably well but struggles with short-term -maturities, where the market smile is steeper than the model can reproduce. - -This is a fundamental structural limitation, not a numerical issue. The Heston model -generates an implied volatility smile through two mechanisms: the correlation $\rho$ -between spot and variance (which creates skew) and the volatility-of-variance $\sigma$ -(which inflates the wings). Both effects accumulate diffusively over time. For a maturity -$T$, the smile roughly scales as $\sigma \sqrt{T}$, so as $T \to 0$ the distribution -collapses toward a Gaussian and the smile flattens. - -More precisely, the Heston characteristic function at short maturities satisfies: - -\begin{equation} -\log \phi(u, T) \approx i u \mu T - \tfrac{1}{2} u^2 v_0 T + O(T^2) -\end{equation} - -which is the characteristic function of a Gaussian with variance $v_0 T$. The higher -cumulants that produce skew and excess kurtosis are all $O(T^2)$ or smaller, so they -vanish faster than the Gaussian term as $T \to 0$. - -In practice this means the Heston model essentially reduces to Black-Scholes for -near-expiry options. The market, however, exhibits pronounced short-term skew driven by -jump risk and the market microstructure of short-dated hedging demand. A diffusion-only -model cannot reproduce this behaviour regardless of how its parameters are tuned. - -The natural extension is to add a jump component to the dynamics, which contributes -a term of order $O(T)$ to the cumulants and restores the short-term smile. This is -the motivation for the Heston jump-diffusion model described in the next section. - -## Calibrating the Heston Jump-Diffusion Model - -[HestonJCalibration][quantflow.options.calibration.heston.HestonJCalibration] extends the -Heston calibration with a compound Poisson jump component via the -[HestonJ][quantflow.sp.heston.HestonJ] model. Jumps are drawn from a -[DoubleExponential][quantflow.utils.distributions.DoubleExponential] distribution, -which captures asymmetric jump behaviour common in equity and crypto markets. - -```python ---8<-- "docs/examples/vol_surface_hestonj_calibration.py" -``` - ---8<-- "docs/examples/output/vol_surface_hestonj_calibration.out" - -### Plotting the Calibrated Smile - -```python -fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) -fig.write_image("hestonj_calibrated_smile.png", width=1200) -``` - -![HestonJ calibrated smile](../assets/examples/hestonj_calibrated_smile.png) - -### Remaining Limitations at Short Maturities - -Adding jumps improves the short-term smile significantly compared to plain Heston, but -the fit at the nearest maturities is still imperfect. Several structural reasons combine: - -**Jump parameters are global.** The compound Poisson component has a single intensity -$\lambda$, jump variance, and asymmetry shared across all maturities. Increasing -$\lambda$ to steepen the short-term smile simultaneously distorts the long-term smile, -so the optimizer settles on a compromise. - -**Long maturities dominate the cost function.** They have more liquid strikes and -therefore more data points. The optimizer minimizes total squared residuals across the -whole surface, so short maturities — with fewer strikes — are outvoted and their fit is -systematically sacrificed. - -**The jump distribution is not rich enough.** The short-term smile in crypto is driven -by large, rare, asymmetric events. A [DoubleExponential][quantflow.utils.distributions.DoubleExponential] -with fixed parameters cannot simultaneously match the wing curvature at short and long -maturities. - -The natural next step is a rough volatility model (for example rough Heston with Hurst -parameter $H < \tfrac{1}{2}$). Because the variance process has long memory and does not -behave diffusively at short time scales, rough models produce a steep short-term skew -without requiring jumps, and the skew decays as a power law $T^H$ rather than the -$T^{1/2}$ rate of classical stochastic volatility. - -### Parameter Reference - -The calibrated parameter vector for the jump-diffusion model is: - -| Parameter | Description | -|---|---| -| `vol` | Initial volatility ($\sqrt{v_0}$) | -| `theta` | Long-run volatility ($\sqrt{\theta}$) | -| `kappa` | Mean reversion speed | -| `sigma` | Volatility of variance | -| `rho` | Spot-variance correlation | -| `jump intensity` | Jump arrival rate (jumps per year) | -| `jump variance` | Variance of a single jump | -| `jump asymmetry` | Asymmetry of the jump distribution ([DoubleExponential][quantflow.utils.distributions.DoubleExponential]) | +## Extracting Forwards and Discount Factors + +Pricing an option requires two market inputs beyond the option price itself: the forward +price $F$ of the underlying at expiry, and the discount factor $D$ for that maturity. + +In liquid markets these quantities are directly observable. Futures and forward contracts +give $F$ outright, and interest rate swaps or government bond strips give $D$. In many +option markets, however, neither is quoted directly. Crypto options on Deribit are a +clear example: there is no liquid term structure of interest rates and the forward for +each expiry must be inferred from the options themselves. + +Even when forwards are available, the discount factor used to value options may differ +from the rate implied by the forward-spot basis. For equity options the carry includes +dividends and repo costs that are not captured by a simple interest rate curve. For +crypto inverse options the discount factor reflects funding in the underlying asset +rather than in dollars. + +For these reasons, quantflow can extract $D_q$ and $D_a$ directly from the market prices +of options using put-call parity. The +[calibrate_curves][quantflow.options.surface.GenericVolSurfaceLoader.calibrate_curves] +method supports three modes: + +- **Both curves**: pass a [YieldCurve][quantflow.rates.yield_curve.YieldCurve] type for + both `quote_curve` and `asset_curve`. A single OLS regression per maturity identifies + $D_q$ and $D_a$ simultaneously from the slope and intercept. +- **Asset curve only**: pass a type for `asset_curve` and leave `quote_curve` as `None`. + The existing `quote_curve` on the loader is treated as known and $D_a$ is computed + analytically from each put-call pair using the known $D_q$. +- **Quote curve only**: pass a type for `quote_curve` and leave `asset_curve` as `None`. + The same simultaneous OLS is run but only the quote discount factors are used to fit + the curve. diff --git a/mkdocs.yml b/mkdocs.yml index 564efbef..815743a3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -74,6 +74,7 @@ nav: - Black-Scholes: api/options/black.md - Calibration: api/options/calibration.md - Deep IV Factor Model: api/options/divfm.md + - Put-Call Parity: api/options/parity.md - Pricer: api/options/pricer.md - SVI Smile: api/options/svi.md - Volatility Surface: api/options/vol_surface.md @@ -99,6 +100,8 @@ nav: - Rates: - api/rates/index.md - Interest Rate: api/rates/interest_rate.md + - Nelson Siegel Curve: api/rates/nelson_siegel.md + - Options Discounting: api/rates/options.md - Yield Curve: api/rates/yield_curve.md - Utilities: - api/utils/index.md @@ -111,6 +114,7 @@ nav: - tutorials/index.md - BNS Volatility Model: tutorials/bns_calibration.md - CIR Process: tutorials/cir.md + - Heston Volatility Model: tutorials/heston_calibration.md - Option Pricing: tutorials/option_pricing.md - Pricing Method Comparison: tutorials/pricing_method_comparison.md - SPX Volatility Surface: tutorials/spx_vol_surface.md @@ -119,22 +123,18 @@ nav: - theory/index.md - Characteristic Function: theory/characteristic.md - Convexity Correction: theory/convexity_correction.md + - Forwards and Discount Factors: theory/forwards.md - Inversion: theory/inversion.md - Lévy Process: theory/levy.md - Option Pricing: theory/option_pricing.md - - Examples: - - Gaussian Sampling: examples/gaussian-sampling - - Poisson Sampling: examples/poisson-sampling - - Double Exponential Sampling: examples/double-exponential-sampling - - Hurst: examples/hurst - - Supersmoother: examples/supersmoother - - Volatility Surface: examples/volatility-surface + - Live Examples: https://quantflow.quantmind.com/examples/ - MCP Server: mcp.md - Glossary: glossary.md - Contributing: contributing.md - Bibliography: bibliography.md - Release Notes: release-notes.md markdown_extensions: + - admonition - attr_list - tables - pymdownx.arithmatex: diff --git a/app/heston_divfm_fit.py b/notebooks/heston_divfm_fit.py similarity index 100% rename from app/heston_divfm_fit.py rename to notebooks/heston_divfm_fit.py diff --git a/pyproject.toml b/pyproject.toml index 3ad9c49b..029baf22 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,6 @@ book = [ "altair>=6.0.0", "autodocsumm>=0.2.14", "duckdb>=1.4.4", - "fastapi>=0.129.0", "marimo>=0.19.7", "plotly>=6.2.0", "sympy>=1.12", @@ -75,6 +74,7 @@ dev = [ "types-python-dateutil>=2.9.0.20251115", ] docs = [ + "fastapi>=0.129.0", "griffe-pydantic>=1.1.0", "griffe-typingdoc>=0.2.7", "kaleido>=1.2.0", @@ -122,8 +122,13 @@ exclude_also = [ [tool.isort] profile = "black" +skip_glob = [ "app/frontend/*" ] + +[tool.black] +extend-exclude = "/app/frontend/" [tool.ruff] +exclude = [ "app/frontend" ] lint.select = [ "E", "F" ] line-length = 88 @@ -134,7 +139,9 @@ path = "quantflow/__init__.py" # strict = true disallow_untyped_calls = true disallow_untyped_defs = true +exclude = [ "^app/frontend/" ] warn_no_return = true +disable_error_code = [ "prop-decorator" ] [[tool.mypy.overrides]] module = [ @@ -145,6 +152,7 @@ module = [ "pandas.*", "plotly.*", "scipy.*", + "statsmodels.*", ] ignore_missing_imports = true disallow_untyped_defs = false diff --git a/quantflow/data/deribit.py b/quantflow/data/deribit.py index 40f98c5e..b358797b 100644 --- a/quantflow/data/deribit.py +++ b/quantflow/data/deribit.py @@ -14,6 +14,8 @@ from quantflow.options.inputs import DefaultVolSecurity, OptionType from quantflow.options.surface import VolSurfaceLoader +from quantflow.rates.yield_curve import NoDiscount +from quantflow.utils.dates import utcnow from quantflow.utils.numbers import ( Number, round_to_step, @@ -125,6 +127,10 @@ async def volatility_surface_loader( self, currency: Annotated[str, Doc("Currency")], *, + ref_date: Annotated[ + datetime | None, + Doc("Reference date for the yield curves; defaults to now"), + ] = None, inverse: Annotated[ bool, Doc( @@ -139,16 +145,16 @@ async def volatility_surface_loader( exclude_volume: Annotated[ Number | None, Doc("Exclude options with volume below this threshold") ] = None, - use_perp: Annotated[ - bool, Doc("Whether to use perpetual as futures proxies") - ] = False, ) -> VolSurfaceLoader: """Create a [VolSurfaceLoader][quantflow.options.surface.VolSurfaceLoader] for a given crypto-currency""" + ref = ref_date or utcnow() loader = VolSurfaceLoader( asset=currency, exclude_open_interest=to_decimal_or_none(exclude_open_interest), exclude_volume=to_decimal_or_none(exclude_volume), + quote_curve=NoDiscount(ref_date=ref), + asset_curve=NoDiscount(ref_date=ref), ) if inverse: futures = await self.get_book_summary_by_currency( @@ -168,24 +174,9 @@ async def volatility_surface_loader( instruments = await self.get_instruments(currency="usdc", base=currency) instrument_map = {i["instrument_name"]: i for i in instruments} min_tick_size = Decimal("inf") - perp_bid_ask: tuple[Any, Any] | None = None - for entry in futures: - name = entry["instrument_name"] - if (meta := instrument_map.get(name)) is None: - continue - if ( - meta["settlement_period"] == "perpetual" - and (bid_ := entry["bid_price"]) - and (ask_ := entry["ask_price"]) - ): - perp_bid_ask = (bid_, ask_) - break - for entry in futures: bid_ = entry["bid_price"] ask_ = entry["ask_price"] - if not (bid_ and ask_) and use_perp and perp_bid_ask is not None: - bid_, ask_ = perp_bid_ask if bid_ and ask_: name = entry["instrument_name"] if (meta := instrument_map.get(name)) is None: diff --git a/quantflow/data/yahoo.py b/quantflow/data/yahoo.py index 302d9a04..adf50e3f 100644 --- a/quantflow/data/yahoo.py +++ b/quantflow/data/yahoo.py @@ -3,7 +3,8 @@ import gzip import json from dataclasses import dataclass, field -from datetime import timezone +from datetime import date, datetime, timezone +from enum import StrEnum from pathlib import Path import pandas as pd @@ -12,6 +13,8 @@ from quantflow.options.inputs import DefaultVolSecurity, OptionType from quantflow.options.surface import VolSurfaceLoader +from quantflow.rates.yield_curve import NoDiscount +from quantflow.utils.dates import as_utc, utcnow from quantflow.utils.numbers import to_decimal @@ -19,13 +22,22 @@ class Yahoo(HttpxClient): """Yahoo Finance API client - Minimal client for fetching option chains used to build volatility surfaces. + Minimal client for fetching historical prices and option chains. - ## Example + ## Examples + + Fetch daily prices for a symbol: ```python from quantflow.data.yahoo import Yahoo + async with Yahoo() as yahoo: + df = await yahoo.prices("AAPL", range="1y") + ``` + + Build a volatility surface from the option chain: + + ```python async with Yahoo() as yahoo: loader = await yahoo.volatility_surface_loader("AAPL") surface = loader.surface() @@ -47,6 +59,21 @@ class Yahoo(HttpxClient): ) _crumb: str | None = None + class freq(StrEnum): + """Yahoo Finance chart intervals""" + + one_min = "1m" + two_min = "2m" + five_min = "5m" + fifteen_min = "15m" + thirty_min = "30m" + one_hour = "1h" + one_day = "1d" + five_day = "5d" + one_week = "1wk" + one_month = "1mo" + three_month = "3mo" + async def option_chain( self, symbol: Annotated[str, Doc("Underlying ticker symbol")], @@ -60,6 +87,10 @@ async def volatility_surface_loader( self, symbol: Annotated[str, Doc("Underlying ticker symbol")], *, + ref_date: Annotated[ + datetime | None, + Doc("Reference date for the yield curves; defaults to now"), + ] = None, exclude_volume: Annotated[ int | None, Doc("Drop contracts with volume at or below this threshold") ] = None, @@ -73,6 +104,7 @@ async def volatility_surface_loader( [loader_from_chain][quantflow.data.yahoo.Yahoo.loader_from_chain].""" return self.loader_from_chain( await self.option_chain(symbol), + ref_date=ref_date, exclude_volume=exclude_volume, exclude_open_interest=exclude_open_interest, ) @@ -82,6 +114,10 @@ def loader_from_chain( cls, chain: Annotated[dict, Doc("Yahoo option chain payload")], *, + ref_date: Annotated[ + datetime | None, + Doc("Reference date for the yield curves; defaults to now"), + ] = None, exclude_volume: Annotated[ int | None, Doc("Drop contracts with volume at or below this threshold") ] = None, @@ -98,12 +134,15 @@ def loader_from_chain( by Yahoo, so they are recovered from put-call parity by the loader. """ symbol = chain.get("underlyingSymbol", "") + ref = ref_date or utcnow() loader = VolSurfaceLoader( asset=symbol, exclude_volume=to_decimal(exclude_volume) if exclude_volume else None, exclude_open_interest=( to_decimal(exclude_open_interest) if exclude_open_interest else None ), + quote_curve=NoDiscount(ref_date=ref), + asset_curve=NoDiscount(ref_date=ref), ) quote = chain.get("quote") or {} bid = quote.get("bid") or quote.get("regularMarketPrice") @@ -142,6 +181,60 @@ def loader_from_chain( ) return loader + async def prices( + self, + symbol: Annotated[str, Doc("Ticker symbol")], + *, + interval: Annotated[ + str | freq, Doc("Bar interval — use Yahoo.freq members or a raw string") + ] = freq.one_day, + from_date: Annotated[date | None, Doc("Start date (inclusive)")] = None, + to_date: Annotated[date | None, Doc("End date (inclusive)")] = None, + range: Annotated[ + str | None, + Doc( + "Shorthand period when dates are omitted: '1mo', '3mo', '6mo', " + "'1y', '2y', '5y', 'ytd', 'max', etc." + ), + ] = None, + ) -> pd.DataFrame: + """Historical OHLCV prices for `symbol`. + + Returns a DataFrame with columns `timestamp`, `open`, `high`, `low`, + `close`, `volume`, and `adj_close` (when available). + + Pass `from_date` / `to_date` for a specific window, or `range` for a + shorthand period. When neither is given Yahoo defaults to one month. + """ + params: dict = {"interval": str(interval)} + if from_date: + params["period1"] = int(as_utc(from_date).timestamp()) + if to_date: + params["period2"] = int(as_utc(to_date).timestamp()) + if range and not from_date and not to_date: + params["range"] = range + data = await self.get( + f"https://query2.finance.yahoo.com/v8/finance/chart/{symbol}", + params=params, + ) + result = data["chart"]["result"][0] + timestamps = result.get("timestamps") or result.get("timestamp", []) + quote = result["indicators"]["quote"][0] + adj = result["indicators"].get("adjclose", [{}])[0] + df = pd.DataFrame( + { + "timestamp": pd.to_datetime(timestamps, unit="s", utc=True), + "open": quote.get("open"), + "high": quote.get("high"), + "low": quote.get("low"), + "close": quote.get("close"), + "volume": quote.get("volume"), + } + ) + if "adjclose" in adj: + df["adj_close"] = adj["adjclose"] + return df + async def save_fixture( self, symbol: Annotated[str, Doc("Underlying ticker symbol")], diff --git a/quantflow/options/bs.py b/quantflow/options/bs.py index cf2df1c4..363a741f 100644 --- a/quantflow/options/bs.py +++ b/quantflow/options/bs.py @@ -165,13 +165,13 @@ def black_price( ), ], ) -> FloatArray: - r"""Calculate the Black call/put option prices in forward terms + r"""Calculate the undiscounted Black call/put option prices in forward terms from the following params $$ \begin{align} - c &= \frac{C}{F} = N(d1) - e^k N(d2) \\ - p &= \frac{P}{F} = -N(-d1) + e^k N(-d2) \\ + c &= \frac{C}{D_\tau F_\tau} = N(d1) - e^k N(d2) \\ + p &= \frac{P}{D_\tau F_\tau} = -N(-d1) + e^k N(-d2) \\ d1 &= \frac{-k + \frac{\sigma^2 t}{2}}{\sigma \sqrt{t}} \\ d2 &= d1 - \sigma \sqrt{t} \end{align} @@ -180,7 +180,8 @@ def black_price( The results are option prices divided by the forward price also known as option prices in forward terms. These are non-dimensional prices that can be easily converted to actual option prices by multiplying with the - forward price of the underlying asset. + forward price of the underlying asset at time to maturity $\tau$ + and a suitable discount factor if interest rates are non-zero. """ sig2 = sigma * sigma * ttm sig = np.sqrt(sig2) diff --git a/quantflow/options/inputs.py b/quantflow/options/inputs.py index 9c4bb913..fbaf2da4 100644 --- a/quantflow/options/inputs.py +++ b/quantflow/options/inputs.py @@ -6,6 +6,7 @@ from pydantic import BaseModel, Field +from quantflow.rates import AnyYieldCurve from quantflow.utils.numbers import ZERO, DecimalNumber P = TypeVar("P") @@ -44,11 +45,14 @@ class VolSecurityType(enum.StrEnum): class VolSurfaceSecurity(BaseModel): + """Base class for Volatility Surface Securities""" + def vol_surface_type(self) -> VolSecurityType: raise NotImplementedError("vol_surface_type must be implemented by subclasses") @classmethod def forward(cls) -> Self: + """Create a forward security for the volatility surface""" raise NotImplementedError("forward_input must be implemented by subclasses") @@ -141,7 +145,8 @@ class VolSurfaceInputs(BaseModel): """Class representing the inputs for a volatility surface""" asset: str = Field(description="Underlying asset of the volatility surface") - ref_date: datetime = Field(description="Reference date for the volatility surface") + asset_curve: AnyYieldCurve = Field(description="Asset yield curve") + quote_curve: AnyYieldCurve = Field(description="Quote yield curve") inputs: list[ForwardInput | SpotInput | OptionInput] = Field( description="List of inputs for the volatility surface" ) diff --git a/quantflow/options/parity.py b/quantflow/options/parity.py new file mode 100644 index 00000000..ebdad7ee --- /dev/null +++ b/quantflow/options/parity.py @@ -0,0 +1,152 @@ +from __future__ import annotations + +from decimal import Decimal +from typing import Any, Self + +import numpy as np +from pydantic import BaseModel, Field +from scipy.optimize import lsq_linear + +from quantflow.utils.numbers import ZERO, Number, to_decimal +from quantflow.utils.price import Price +from quantflow.utils.types import FloatArray + + +class DiscountPair(BaseModel, frozen=True): + asset_discount: float = Field( + description="Discount factor for the underlying asset" + ) + quote_discount: float = Field(description="Discount factor for the option quote") + + +class PutCallParity(BaseModel, frozen=True): + """A matched put-call parity at a single strike, + used for discount curve calibration.""" + + strike: Decimal = Field(description="Strike price") + call: Price = Field(description="Call option bid/ask prices") + put: Price = Field(description="Put option bid/ask prices") + inverse: bool = Field(default=False, description="Whether the option is inverse") + + @property + def bid(self) -> Decimal: + """Lower bound of the call-put price difference""" + return self.call.bid - self.put.ask + + @property + def ask(self) -> Decimal: + """Upper bound of the call-put price difference""" + return self.call.ask - self.put.bid + + @property + def mid(self) -> Decimal: + """Midpoint of the call-put price difference""" + return (self.bid + self.ask) / 2 + + @property + def spread(self) -> Decimal: + """Bid-ask spread of the call-put price difference""" + return self.ask - self.bid + + +class PutCallParities(BaseModel, frozen=True): + """A collection of put-call parities for a given maturity""" + + parities: list[PutCallParity] = Field(description="List of put-call parities") + spot: Decimal = Field(ge=ZERO, description="Spot price of the underlying asset") + ttm: Decimal = Field(gt=ZERO, description="Time to maturity in years") + inverse: bool = Field(default=False, description="Whether the options are inverse") + + @classmethod + def from_parities( + cls, parities: list[PutCallParity], spot: Number, ttm: Number + ) -> Self: + inverse = any(p.inverse for p in parities) + return cls( + parities=parities, + spot=to_decimal(spot), + ttm=to_decimal(ttm), + inverse=inverse, + ) + + def regressand(self) -> FloatArray: + """Calculate the regressand for put-call parity regression. + + For direct options, the regressand is (C - P) / S, while for inverse + options it is simply c - p. + """ + scale = self.spot if not self.inverse else Decimal(1) + return np.asarray([float(p.mid / scale) for p in self.parities]) + + def regressor(self) -> FloatArray: + """Calculate the regressor for put-call parity regression, + which is the strike price divided by the spot price. + """ + return np.asarray([float(p.strike / self.spot) for p in self.parities]) + + def fit_discounts( + self, + dq: float | None = None, + da: float | None = None, + min_rate_q: float = 0.0, + min_rate_a: float = 0.0, + ) -> DiscountPair | None: + """Return the fitted discount factors, or None if the result is invalid. + + Both direct and inverse options satisfy the same normalized equation + y = Da - (Dq/S) * K, where y = mid/S for direct and y = mid for inverse. + + When both known values are None a full OLS is run via constrained least squares. + When one is provided the other is solved analytically as the mean over pairs. + Discount factors are bounded by D <= exp(-min_rate * ttm), so min_rate=0 + enforces D <= 1 (non-negative rates). + """ + if not self.parities: + return None + ys = self.regressand() + xs = self.regressor() + ttm = float(self.ttm) + max_dq = float(np.exp(-min_rate_q * ttm)) + max_da = float(np.exp(-min_rate_a * ttm)) + if dq is not None: + if da is not None: + return DiscountPair(asset_discount=da, quote_discount=dq) + da = float(np.mean(ys + dq * xs)) + elif da is not None: + dq = float(np.mean((da - ys) / xs)) + else: + A = np.column_stack([np.ones(len(xs)), -xs]) + result = lsq_linear(A, ys, bounds=([0, 0], [max_da, max_dq])) + da, dq = float(result.x[0]), float(result.x[1]) + if not (0 < dq <= max_dq and 0 < da <= max_da): + return None + return DiscountPair(asset_discount=da, quote_discount=dq) + + def plot( + self, + dq: float | None = None, + da: float | None = None, + min_rate_q: float = 0.0, + min_rate_a: float = 0.0, + ) -> Any: + """Plot the normalized put-call parity data and the fitted regression line.""" + from quantflow.utils.plot import check_plotly + + check_plotly() + import plotly.graph_objects as go + + xs = self.regressor() + ys = self.regressand() + discounts = self.fit_discounts( + dq=dq, da=da, min_rate_q=min_rate_q, min_rate_a=min_rate_a + ) + fig = go.Figure() + fig.add_trace( + go.Scatter(x=xs, y=ys, mode="markers", name="market", marker_size=10) + ) + if discounts is not None: + x_range = np.linspace(xs.min(), xs.max(), 100) + y_fit = discounts.asset_discount - discounts.quote_discount * x_range + fig.add_trace(go.Scatter(x=x_range, y=y_fit, mode="lines", name="fit")) + y_label = "c - p" if self.inverse else "(C - P) / S" + return fig.update_layout(xaxis_title="K / S", yaxis_title=y_label) diff --git a/quantflow/options/pricer.py b/quantflow/options/pricer.py index d36e818a..31ae237b 100644 --- a/quantflow/options/pricer.py +++ b/quantflow/options/pricer.py @@ -77,7 +77,7 @@ def parity(self) -> float: and put price for the same strike and maturity""" return 1.0 - float(np.exp(self.log_strike)) - @computed_field # type: ignore [prop-decorator] + @computed_field @property def black(self) -> BlackSensitivities: """Calculate the Black price for the option using the price as time value and diff --git a/quantflow/options/surface.py b/quantflow/options/surface.py index c6f02933..82e581d1 100644 --- a/quantflow/options/surface.py +++ b/quantflow/options/surface.py @@ -1,11 +1,10 @@ from __future__ import annotations import enum -import math import warnings from datetime import datetime, timedelta from decimal import Decimal -from typing import Any, Generic, Iterator, NamedTuple, Self, TypeVar +from typing import Any, Generic, Iterator, NamedTuple, Self, TypeVar, cast import numpy as np import pandas as pd @@ -13,20 +12,27 @@ from pydantic import BaseModel, Field from typing_extensions import Annotated, Doc -from quantflow.rates.interest_rate import Rate +from quantflow.rates import ( + AnyYieldCurve, + NoDiscount, + Rate, + YieldCurve, + YieldCurveCalibration, +) +from quantflow.rates.options import OptionsDiscountingCalibration from quantflow.utils import plot from quantflow.utils.dates import utcnow from quantflow.utils.numbers import ( ZERO, DecimalNumber, Number, - Rounding, normalize_decimal, round_to_step, sigfig, to_decimal, to_decimal_or_none, ) +from quantflow.utils.price import Price from quantflow.utils.types import FloatArray from .bs import black_price, implied_black_volatility @@ -42,6 +48,7 @@ VolSurfaceInputs, VolSurfaceSecurity, ) +from .parity import PutCallParities, PutCallParity from .svi import SVI INITIAL_VOL = 0.5 @@ -71,44 +78,26 @@ class OptionSelection(enum.Enum): """Select all options regardless of their moneyness""" -class Price(BaseModel, Generic[S]): +class SecurityPrice(Price, Generic[S]): """Represents the bid/ask price of a security, which can be a spot price, forward price or option price """ security: S = Field(description="The underlying security of the price") - bid: DecimalNumber = Field(description="Bid price") - ask: DecimalNumber = Field(description="Ask price") - - @property - def mid(self) -> Decimal: - """Calculate the mid price by averaging the bid and ask prices""" - return (self.bid + self.ask) / 2 - - @property - def spread(self) -> Decimal: - """Calculate the bid-ask spread""" - return self.ask - self.bid - - @property - def bp_spread(self) -> Decimal: - """Bid-ask spread in basis points, calculated as spread divided by mid - price and multiplied by 10000""" - mid = self.mid - if mid > ZERO: - return round(10000 * self.spread / mid, 2) - else: - return Decimal("inf") - - -class SpotPrice(Price[S]): - """Represents the spot bid/ask price of an underlying asset""" - open_interest: DecimalNumber = Field( default=ZERO, description="Open interest of the spot price" ) volume: DecimalNumber = Field(default=ZERO, description="Total volume traded") + def is_valid(self) -> bool: + """Check if the forward price is valid, which means that the bid and ask + are positive and the bid is less than or equal to the ask""" + return self.bid > ZERO and self.ask > ZERO and super().is_valid() + + +class SpotPrice(SecurityPrice[S]): + """Represents the spot bid/ask price of an underlying asset""" + def inputs(self) -> SpotInput: return SpotInput( bid=self.bid, @@ -117,16 +106,20 @@ def inputs(self) -> SpotInput: volume=self.volume, ) + def _implied_forward(self, maturity: datetime, price: Decimal) -> FwdPrice[S]: + return FwdPrice( + security=self.security.forward(), + maturity=maturity, + bid=price, + ask=price, + ) -class FwdPrice(Price[S]): + +class FwdPrice(SecurityPrice[S]): """Represents the forward bid/ask price of an underlying asset at a specific maturity""" maturity: datetime = Field(description="Maturity date of the forward price") - open_interest: DecimalNumber = Field( - default=ZERO, description="Open interest of the forward price" - ) - volume: DecimalNumber = Field(default=ZERO, description="Total volume traded") def inputs(self) -> ForwardInput: return ForwardInput( @@ -137,118 +130,6 @@ def inputs(self) -> ForwardInput: volume=self.volume, ) - def is_valid(self) -> bool: - """Check if the forward price is valid, which means that the bid and ask - are positive and the bid is less than or equal to the ask""" - return self.bid > ZERO and self.ask > ZERO and self.bid <= self.ask - - -class ImpliedFwdPrice(FwdPrice[S]): - """Represents the implied forward price of an underlying asset at a specific - maturity, extracted from option prices via put-call parity""" - - strike: DecimalNumber = Field( - description="Strike price of the options used to extract the forward price" - ) - - def moneyness(self, ttm: float) -> float: - """Moneyness of the implied forward""" - return math.log(float(self.strike / self.mid)) / math.sqrt(ttm) - - @classmethod - def aggregate( - cls, - implied_forwards: Annotated[ - list[Self], Doc("Implied forward prices from put-call parity") - ], - ttm: Annotated[float, Doc("Time to maturity in years")], - default: Annotated[ - FwdPrice[S] | None, - Doc("Market forward (e.g. from futures) used as fallback or for blending"), - ] = None, - previous_forward: Annotated[ - Decimal | None, - Doc( - "Anchor forward for proximity weighting, " - "typically the previous maturity" - ), - ] = None, - tick_size: Annotated[ - Decimal | None, Doc("Tick size for rounding the implied forward bid/ask") - ] = None, - ) -> FwdPrice[S] | None: - r"""Aggregate implied forward prices extracted from put-call parity into a - single best-estimate forward price. - - **Selection**: valid implied forwards are sorted by bid-ask spread in basis - points and the tightest 5 are retained as candidates. Let $c$ denote the - tightest bp spread among the candidates. - - **Default priority**: if a default forward is provided and its bp spread is - tighter than $c$, it is returned immediately as the most reliable price. - - **Default inclusion**: if the default's bp spread is wider than $c$ but - narrower than the worst candidate, it is appended to the candidate pool - and weighted on equal footing with the implied forwards. - - **Weighting**: each candidate $i$ receives weight - - \begin{equation} - w_i = w^{\text{spread}}_i \cdot w^{\text{proximity}}_i - \end{equation} - - where the spread weight is a Gaussian on the normalised distance from the - best spread $c$ and the proximity weight, applied only when - `previous_forward` is provided. - The result is the weighted average of the candidate mid prices, with the - bid/ask spread computed as the weighted average of candidate spreads. - When `tick_size` is provided the output bid is rounded down and the ask - is rounded up to the nearest tick. - """ - forwards: list[FwdPrice[S]] = [f for f in implied_forwards if f.is_valid()] - if not forwards: - return default - forwards = sorted(forwards, key=lambda f: f.bp_spread)[:5] - best_bp_spread = forwards[0].bp_spread - if ( - default is not None - and default.is_valid() - and default.bp_spread < best_bp_spread - ): - return default - weights = 0.0 - values = 0.0 - spreads = 0.0 - worse_bp_spread = forwards[-1].bp_spread - if ( - default is not None - and default.is_valid() - and default.bp_spread < worse_bp_spread - ): - forwards.append(default) - for forward in forwards: - s = (forward.bp_spread - best_bp_spread) / best_bp_spread - weight = math.exp(-s * s) - if previous_forward is not None: - d = (forward.mid - previous_forward) / previous_forward - weight *= math.exp(-d * d) - weights += weight - values += weight * float(forward.mid) - spreads += weight * float(forward.spread) - mid = to_decimal(values / weights) - spread = to_decimal(spreads / weights) - bid = mid - spread / 2 - ask = mid + spread / 2 - if tick_size is not None: - bid = round_to_step(bid, tick_size, Rounding.DOWN) - ask = round_to_step(ask, tick_size, Rounding.UP) - return FwdPrice( - security=forwards[0].security.forward(), - bid=bid, - ask=ask, - maturity=forwards[0].maturity, - ) - class OptionMetadata(BaseModel): """Represents the metadata of an option, including its strike, type, maturity, @@ -467,6 +348,53 @@ def info_dict(self) -> dict[str, Any]: volume=float(self.volume), ) + def info(self) -> OptionInfo: + """Return a structured [OptionInfo][quantflow.options.surface.OptionInfo] + representation of this option price""" + return OptionInfo( + strike=self.strike, + forward=self.forward, + maturity=self.maturity, + log_strike=to_decimal(self.log_strike), + moneyness=to_decimal(self.log_strike / np.sqrt(self.ttm)), + ttm=to_decimal(self.ttm), + implied_vol=to_decimal(self.implied_vol), + price=self.price_in_forward_space, + price_bp=self.price_bp, + price_quote=self.price_in_quote, + option_type=self.option_type, + side=self.side, + open_interest=self.open_interest, + volume=self.volume, + ) + + +class OptionInfo(BaseModel): + """Structured representation of an option price with all computed fields""" + + strike: DecimalNumber = Field(description="Strike price of the option") + forward: DecimalNumber = Field( + description="Forward price of the underlying at maturity" + ) + maturity: datetime = Field(description="Maturity date of the option") + log_strike: DecimalNumber = Field( + description="Log strike, calculated as log(strike/forward)" + ) + moneyness: DecimalNumber = Field( + description="Standardised moneyness, log(K/F) / sqrt(T)" + ) + ttm: DecimalNumber = Field(description="Time to maturity in years") + implied_vol: DecimalNumber = Field(description="Black implied volatility") + price: DecimalNumber = Field( + description="Option price as a fraction of the forward price" + ) + price_bp: DecimalNumber = Field(description="Option price in basis points") + price_quote: DecimalNumber = Field(description="Option price in quote currency") + option_type: OptionType = Field(description="Option type (call or put)") + side: Side = Field(description="Market side (bid or ask)") + open_interest: DecimalNumber = Field(description="Open interest") + volume: DecimalNumber = Field(description="Volume traded") + class OptionArrays(NamedTuple): """Represents the option data in array form for efficient calculations @@ -513,6 +441,10 @@ def spread(self) -> Decimal: """Calculate the bid-ask spread""" return self.ask.price - self.bid.price + def price(self) -> Price: + """Convert the option prices to a Price object""" + return Price(bid=self.bid.price, ask=self.ask.price) + def iv_bid_ask_spread(self) -> float: """Calculate the bid-ask spread of the implied volatility""" return self.ask.implied_vol - self.bid.implied_vol @@ -583,61 +515,16 @@ class Strike(BaseModel, Generic[S]): default=None, description="Put option prices for the strike" ) - def implied_forward( - self, - tick_size: Annotated[ - Decimal | None, Doc("Tick size for rounding the implied forward bid/ask") - ] = None, - ) -> ImpliedFwdPrice[S] | None: - r"""Extract the implied forward price from put-call parity. - - Requires both a call and a put at this strike. Uses bid/ask prices - to construct the bid/ask of the implied forward. When `tick_size` is - provided, bid is rounded down and ask is rounded up to the nearest tick. - - For inverse options (prices quoted in the underlying currency) - put-call parity reads - - \begin{equation} - F = \frac{K}{1 - c + p} - \end{equation} - - For non-inverse options (prices quoted in the quote currency) - - \begin{equation} - F = K + C - P - \end{equation} - - Returns None when the strike does not have both a call and a put, - or when the denominator is non-positive (arbitrage condition violated). - """ + def put_call_parity(self) -> PutCallParity | None: + """Return a [PutCallParity][quantflow.rates.calibrator.PutCallParity] for this + strike, or None if either the call or the put are not available.""" if self.call is None or self.put is None: return None - cp_bid = self.call.bid.price - self.put.ask.price - cp_ask = self.call.ask.price - self.put.bid.price - if self.call.meta.inverse: - d_bid = 1 - cp_bid - d_ask = 1 - cp_ask - if d_bid <= ZERO or d_ask <= ZERO: - return None - bid = self.strike / d_bid - ask = self.strike / d_ask - else: - bid = self.strike + cp_bid - ask = self.strike + cp_ask - if bid <= ZERO or ask <= ZERO: - return None - if bid > ask: - return None - if tick_size is not None: - bid = round_to_step(bid, tick_size, Rounding.DOWN) - ask = round_to_step(ask, tick_size, Rounding.UP) - return ImpliedFwdPrice( - security=self.call.security.forward(), + return PutCallParity( strike=self.strike, - maturity=self.call.meta.maturity, - bid=bid, - ask=ask, + call=self.call.price(), + put=self.put.price(), + inverse=self.call.meta.inverse, ) def options_iter( @@ -745,33 +632,23 @@ def ttm(self, ref_date: datetime) -> float: """Time to maturity in years""" return self.day_counter.dcf(ref_date, self.maturity) - def forward_rate(self, ref_date: datetime, spot: SpotPrice[S]) -> Rate: - """Compute the implied continuous rate from spot and forward mid""" - return Rate.from_spot_and_forward( - spot.mid, - self.forward.mid, - ref_date, - self.maturity, - day_counter=self.day_counter, - ) - - def forward_spread_fraction(self) -> Decimal: - """Bid-ask spread of the forward as a fraction of its mid price""" - mid = self.forward.mid - if mid <= ZERO: - return Decimal("Inf") - return (self.forward.ask - self.forward.bid) / mid - - def info_dict(self, ref_date: datetime, spot: SpotPrice[S]) -> dict: + def info_dict( + self, + ref_date: datetime, + spot: Decimal, + implied_forward: Decimal, + ) -> dict: """Return a dictionary with information about the cross section""" + ttm = self.ttm(ref_date) return dict( maturity=self.maturity, - ttm=self.ttm(ref_date), + ttm=ttm, forward=self.forward.mid, + implied_forward=implied_forward, + forward_basis=implied_forward - self.forward.mid, + rate=Rate.from_number(float((implied_forward / spot).ln()) / ttm).rate, bid_ask_spread=self.forward.spread, - basis=self.forward.mid - spot.mid, - rate_percent=self.forward_rate(ref_date, spot).percent, - fwd_spread_pct=round(100 * self.forward_spread_fraction(), 4), + basis=implied_forward - spot, open_interest=self.forward.open_interest, volume=self.forward.volume, ) @@ -781,6 +658,7 @@ def option_prices( ref_date: Annotated[ datetime, Doc("Reference date for time to maturity calculation") ], + forward: Annotated[Decimal, Doc("Forward price of the underlying asset")], *, select: Annotated[ OptionSelection, Doc("Option selection method") @@ -795,7 +673,7 @@ def option_prices( """Iterator over option prices in the cross section""" for s in self.strikes: yield from s.option_prices( - self.forward.mid, + forward, self.ttm(ref_date), select=select, initial_vol=initial_vol, @@ -918,7 +796,66 @@ def disable_outliers( break -class VolSurface(BaseModel, Generic[S]): +class ForwardPricer(BaseModel, Generic[S]): + """Base class for forward/discount factor pricers""" + + asset: str = Field( + default="", + description="Name of the underlying asset", + ) + spot: SpotPrice[S] | None = Field( + default=None, + description="Spot price of the underlying asset", + ) + quote_curve: AnyYieldCurve = Field( + default_factory=NoDiscount, + description="Discount curve for the quote", + ) + asset_curve: AnyYieldCurve = Field( + default_factory=NoDiscount, + description="Discount curve for the asset", + ) + tick_size_forwards: DecimalNumber | None = Field( + default=None, + description="Tick size for rounding forward and spot prices - optional", + ) + tick_size_options: DecimalNumber | None = Field( + default=None, description="Tick size for rounding option prices - optional" + ) + day_counter: DayCounter = Field( + default=default_day_counter, + description=( + "Day counter for time to maturity calculations, " + "by default it uses Act/Act" + ), + ) + + @property + def ref_date(self) -> datetime: + """Reference date for the volatility surface, taken as the earliest maturity + or the provided ref_date if it's earlier""" + return min(self.quote_curve.ref_date, self.asset_curve.ref_date) + + def spot_price(self) -> Decimal: + """Get the spot price if it exists""" + if self.spot is None: + raise ValueError("No spot price provided") + return self.spot.mid + + def forward(self, maturity: datetime) -> Decimal: + """Calculate the implied forward for a given maturity""" + ttm = self.day_counter.dcf(self.ref_date, maturity) + df_quote = to_decimal(float(self.quote_curve.discount_factor(ttm))) + df_asset = to_decimal(float(self.asset_curve.discount_factor(ttm))) + forward_rate = self.spot_price() * df_asset / df_quote + return ( + round_to_step(forward_rate, self.tick_size_forwards) + if self.tick_size_forwards + else forward_rate + ) + + +class VolSurface(ForwardPricer[S]): """Represents a volatility surface, which captures the implied volatility of an option for different strikes and maturities. @@ -944,31 +881,14 @@ class VolSurface(BaseModel, Generic[S]): future volatility. """ - ref_date: datetime = Field(description="Reference date for the volatility surface") - asset: str = Field(description="Underlying asset of the volatility surface") - spot: SpotPrice[S] = Field(description="Spot price of the underlying asset") maturities: tuple[VolCrossSection[S], ...] = Field( + default=(), description=( "Sorted tuple of " "[VolCrossSection][quantflow.options.surface.VolCrossSection], " "each containing the forward price and option prices for that maturity" - ) - ) - day_counter: DayCounter = Field( - default=default_day_counter, - description=( - "Day counter for time to maturity calculations, " - "by default it uses Act/Act" ), ) - tick_size_forwards: DecimalNumber | None = Field( - default=None, - description="Tick size for rounding forward and spot prices - optional", - ) - tick_size_options: DecimalNumber | None = Field( - default=None, - description="Tick size for rounding option prices - optional", - ) def securities( self, @@ -989,7 +909,8 @@ def securities( ] = False, ) -> Iterator[SpotPrice[S] | FwdPrice[S] | OptionPrices[S]]: """Iterator over securities in the volatility surface""" - yield self.spot + if self.spot is not None: + yield self.spot if index is not None: yield from self.maturities[index].securities( select=select, converged=converged @@ -1020,7 +941,8 @@ def inputs( [VolSurfaceInputs][quantflow.options.inputs.VolSurfaceInputs] instance""" return VolSurfaceInputs( asset=self.asset, - ref_date=self.ref_date, + asset_curve=self.asset_curve, + quote_curve=self.quote_curve, inputs=list( s.inputs() for s in self.securities( @@ -1031,8 +953,10 @@ def inputs( def term_structure(self) -> pd.DataFrame: """Return the term structure of the volatility surface as a DataFrame""" + spot = self.spot_price() return pd.DataFrame( - cross.info_dict(self.ref_date, self.spot) for cross in self.maturities + cross.info_dict(self.ref_date, spot, self.forward(cross.maturity)) + for cross in self.maturities ) def trim(self, num_maturities: int) -> Self: @@ -1064,16 +988,19 @@ def option_prices( ) -> Iterator[OptionPrice]: """Iterator over selected option prices in the surface""" if index is not None: - yield from self.maturities[index].option_prices( + cross = self.maturities[index] + yield from cross.option_prices( self.ref_date, + self.forward(cross.maturity), select=select, initial_vol=initial_vol, converged=converged, ) else: - for maturity in self.maturities: - yield from maturity.option_prices( + for cross in self.maturities: + yield from cross.option_prices( self.ref_date, + self.forward(cross.maturity), select=select, initial_vol=initial_vol, converged=converged, @@ -1371,45 +1298,13 @@ def add_option( else: self.strikes[strike].put = option - def cross_section( - self, - ref_date: Annotated[ - datetime | None, Doc("Reference date for the volatility surface") - ] = None, - previous_forward: Annotated[ - Decimal | None, - Doc( - "Previous forward price for the volatility surface " - "Usaed by the implied forward calculation to replace missing " - "or unreliable forwards" - ), - ] = None, - tick_size: Annotated[ - Decimal | None, - Doc("Tick size for rounding implied forward bid/ask prices"), - ] = None, - ) -> VolCrossSection[S] | None: + def _cross_section(self, forward: FwdPrice[S]) -> VolCrossSection[S] | None: strikes = [] - implied_forwards = [] for strike in sorted(self.strikes): sk = self.strikes[strike] if sk.call is None and sk.put is None: continue - if implied_forward := sk.implied_forward(tick_size=tick_size): - implied_forwards.append(implied_forward) strikes.append(sk) - forward = self.forward - if implied_forwards: - ttm = self.day_counter.dcf(ref_date or utcnow(), self.maturity) - forward = ImpliedFwdPrice.aggregate( - implied_forwards, - ttm, - default=self.forward, - previous_forward=previous_forward, - tick_size=tick_size, - ) - if forward is None or not forward.is_valid(): - return None return ( VolCrossSection( maturity=self.maturity, @@ -1421,8 +1316,36 @@ def cross_section( else None ) + def put_call_parities( + self, + spot: Annotated[Decimal, Doc("Spot price of the underlying asset")], + *, + ref_date: Annotated[ + datetime | None, Doc("Reference date for time to maturity calculation") + ] = None, + max_pairs: Annotated[ + int, Doc("Maximum number of put-call pairs to consider") + ] = 10, + ) -> PutCallParities: + """Return a list of the most liquid + [PutCallParity][quantflow.options.parity.PutCallParities] + from a cross-section loader. + + Liquidity is determined by the bid-ask spread of the put-call parity price. + """ + ttm = self.day_counter.dcf(ref_date or utcnow(), self.maturity) + parities = sorted( + ( + p + for sk in self.strikes.values() + if (p := sk.put_call_parity()) is not None + ), + key=lambda p: p.spread, + )[:max_pairs] + return PutCallParities.from_parities(parities, spot, ttm) -class GenericVolSurfaceLoader(BaseModel, Generic[S], arbitrary_types_allowed=True): + +class GenericVolSurfaceLoader(ForwardPricer[S], arbitrary_types_allowed=True): """Helper class to build a volatility surface from a list of securities Use this class to add spot, forward and option securities with their prices @@ -1430,30 +1353,12 @@ class GenericVolSurfaceLoader(BaseModel, Generic[S], arbitrary_types_allowed=Tru from the provided data. """ - asset: str = Field(default="", description="Name of the underlying asset") - spot: SpotPrice[S] | None = Field( - default=None, description="Spot price of the underlying asset" - ) maturities: dict[datetime, VolCrossSectionLoader[S]] = Field( default_factory=dict, description=( "Dictionary of maturities and their corresponding cross section loaders" ), ) - day_counter: DayCounter = Field( - default=default_day_counter, - description=( - "Day counter for time to maturity calculations " - "by default it uses Act/Act" - ), - ) - tick_size_forwards: DecimalNumber | None = Field( - default=None, - description="Tick size for rounding forward and spot prices - optional", - ) - tick_size_options: DecimalNumber | None = Field( - default=None, description="Tick size for rounding option prices - optional" - ) exclude_open_interest: DecimalNumber | None = Field( default=None, description="Exclude options with open interest at or below this value", @@ -1463,7 +1368,8 @@ class GenericVolSurfaceLoader(BaseModel, Generic[S], arbitrary_types_allowed=Tru ) def get_or_create_maturity( - self, maturity: Annotated[datetime, Doc("Maturity date for the options")] + self, + maturity: Annotated[datetime, Doc("Maturity date for the options")], ) -> VolCrossSectionLoader[S]: """Get or create a [VolCrossSectionLoader][quantflow.options.surface.VolCrossSectionLoader] @@ -1548,36 +1454,153 @@ def add_option( inverse=inverse, ) - def surface( - self, - ref_date: Annotated[ - datetime | None, Doc("Reference date for the volatility surface") - ] = None, - ) -> VolSurface[S]: + def surface(self) -> VolSurface[S]: """Build a volatility surface from the provided data""" - if not self.spot or self.spot.mid == ZERO: - raise ValueError("No spot price provided") maturities = [] - ref_date = ref_date or utcnow() - previous_forward = self.spot.mid + spot = self.spot + if spot is None: + raise ValueError("No spot price provided") for maturity in sorted(self.maturities): - if section := self.maturities[maturity].cross_section( - ref_date=ref_date, - previous_forward=previous_forward, - tick_size=self.tick_size_forwards, - ): - previous_forward = section.forward.mid + loader = self.maturities[maturity] + forward = loader.forward + if forward is None: + implied_forward_price = self.forward(maturity) + forward = spot._implied_forward(maturity, implied_forward_price) + if section := loader._cross_section(forward): maturities.append(section) return VolSurface( asset=self.asset, - ref_date=ref_date, spot=self.spot, maturities=tuple(maturities), day_counter=self.day_counter, + quote_curve=self.quote_curve.model_copy(), + asset_curve=self.asset_curve.model_copy(), tick_size_forwards=self.tick_size_forwards, tick_size_options=self.tick_size_options, ) + def calibrate_curves( + self, + *, + quote_curve: Annotated[ + type[YieldCurve] | YieldCurve | None, + Doc( + "YieldCurve type or instance to fit the quote currency discount " + "curve $D_q$ from option prices. " + "When None the current quote_curve is unchanged." + ), + ] = None, + asset_curve: Annotated[ + type[YieldCurve] | YieldCurve | None, + Doc( + "YieldCurve type or instance to fit the asset discount curve $D_a$ " + "from option prices. " + "When None the current asset_curve is unchanged." + ), + ] = None, + min_rate_q: Annotated[ + float, + Doc( + "Minimum continuously compounded quote rate." + " Default 0 enforces non-negative quote rates." + ), + ] = 0.0, + min_rate_a: Annotated[ + float, + Doc( + "Minimum continuously compounded asset rate." + " Set negative to allow positive asset carry." + ), + ] = 0.0, + max_pairs: Annotated[ + int, Doc("Maximum number of put-call pairs to use per maturity") + ] = 10, + ) -> None: + """Calibrate the quote and/or asset discount curves from option prices. + + Three modes are supported: + + Both curves: pass a curve type or instance for both curves. + A single OLS regression per maturity identifies $D_q$ and $D_a$ simultaneously. + + Asset only: pass a curve type or instance for `asset_curve`, leave + `quote_curve` as None. + The existing `quote_curve` is treated as known and $D_a$ is solved analytically. + + Quote only: pass a curve type or instance for `quote_curve`, leave + `asset_curve` as None. + The existing `asset_curve` is treated as known and $D_q$ is solved analytically. + """ + ttm, cp, strikes = self.collect_put_call_parities(max_pairs=max_pairs) + asset_curve_input = ( + self._curve_calibrator(asset_curve) if asset_curve else self.asset_curve + ) + quote_curve_input = ( + self._curve_calibrator(quote_curve) if quote_curve else self.quote_curve + ) + calibration = OptionsDiscountingCalibration( + asset_curve=asset_curve_input, + quote_curve=quote_curve_input, + ttm=ttm, + cp=cp, + strikes=strikes, + ) + calibrated_asset_curve, calibrated_quote_curve = calibration.calibrate() + self.asset_curve = cast(AnyYieldCurve, calibrated_asset_curve) + self.quote_curve = cast(AnyYieldCurve, calibrated_quote_curve) + + def _curve_calibrator( + self, + curve_type: type[YieldCurve] | YieldCurve, + ) -> YieldCurveCalibration: + curve = ( + curve_type(ref_date=self.ref_date) + if isinstance(curve_type, type) + else curve_type + ) + calibrator = curve.calibrator() + if calibrator is None: + raise ValueError(f"{type(curve).__name__} does not support calibration") + return calibrator + + def collect_put_call_parities( + self, + *, + max_pairs: Annotated[ + int, Doc("Maximum number of put-call pairs to use per maturity") + ] = 10, + ) -> tuple[FloatArray, FloatArray, FloatArray]: + """Collect per-maturity continuously compounded rates from put-call parity.""" + if not self.spot or self.spot.mid == ZERO: + raise ValueError("No spot price provided") + spot = self.spot.mid + ttms: list[FloatArray] = [] + cp: list[FloatArray] = [] + strikes: list[FloatArray] = [] + ref_date = self.ref_date + for maturity, section in sorted(self.maturities.items()): + ttm = self.day_counter.dcf(ref_date, maturity) + if ttm <= 0: + continue + parities = section.put_call_parities( + spot, + ref_date=ref_date, + max_pairs=max_pairs, + ) + regressand = parities.regressand() + if not regressand.size: + continue + ttms.append(np.full(regressand.shape, ttm, dtype=float)) + cp.append(regressand) + strikes.append(parities.regressor()) + if not cp: + raise ValueError("No put-call parity pairs available") + return ( + np.concatenate(ttms), + np.concatenate(cp), + np.concatenate(strikes), + ) + class VolSurfaceLoader(GenericVolSurfaceLoader[DefaultVolSecurity]): """Helper class to build a volatility surface from a list of securities @@ -1630,7 +1653,11 @@ def surface_from_inputs( """Helper function to build a volatility surface from a [VolSurfaceInputs][quantflow.options.inputs.VolSurfaceInputs] instance """ - loader = VolSurfaceLoader() + loader = VolSurfaceLoader( + asset=inputs.asset, + quote_curve=inputs.quote_curve, + asset_curve=inputs.asset_curve, + ) for input in inputs.inputs: loader.add(input) - return loader.surface(ref_date=inputs.ref_date) + return loader.surface() diff --git a/quantflow/rates/__init__.py b/quantflow/rates/__init__.py index e69de29b..5d83b577 100644 --- a/quantflow/rates/__init__.py +++ b/quantflow/rates/__init__.py @@ -0,0 +1,26 @@ +from typing import Annotated, Union + +from pydantic import Field + +from .interest_rate import Rate +from .nelson_siegel import NelsonSiegel +from .options import YieldCurveCalibration +from .vasicek import VasicekCurve +from .yield_curve import NoDiscount, YieldCurve + +__all__ = [ + "YieldCurve", + "YieldCurveCalibration", + "NoDiscount", + "NelsonSiegel", + "VasicekCurve", + "AnyYieldCurve", + "Rate", +] + +AnyYieldCurve = Annotated[ + Union[NoDiscount, NelsonSiegel, VasicekCurve], + Field(discriminator="curve_type"), +] + +YieldCurve.register_curve_types(NoDiscount, NelsonSiegel, VasicekCurve) diff --git a/quantflow/rates/interest_rate.py b/quantflow/rates/interest_rate.py index c083a287..e5888691 100644 --- a/quantflow/rates/interest_rate.py +++ b/quantflow/rates/interest_rate.py @@ -24,6 +24,15 @@ class Rate(BaseModel, arbitrary_types_allowed=True): default=DayCounter.ACTACT, description="Day count convention to use when calculating time to maturity", ) + ttm: float = Field( + default=0.0, + ge=0.0, + description=( + "Time to maturity for the rate, used to calculate discount factors. " + "Expressed in years. when 0 it is a spot rate, when > 0 " + "it is a forward rate." + ), + ) frequency: Period | None = Field( default=None, description=( diff --git a/quantflow/rates/nelson_siegel.py b/quantflow/rates/nelson_siegel.py index fceb18b8..f32d564d 100644 --- a/quantflow/rates/nelson_siegel.py +++ b/quantflow/rates/nelson_siegel.py @@ -1,15 +1,17 @@ from __future__ import annotations from decimal import Decimal +from typing import Literal import numpy as np from numpy.typing import ArrayLike from pydantic import Field -from scipy.optimize import minimize_scalar -from typing_extensions import Annotated, Doc +from scipy.optimize import Bounds, minimize_scalar +from typing_extensions import Annotated, Doc, Self -from quantflow.utils.numbers import ONE, Number, to_decimal +from quantflow.utils.types import FloatArray, FloatArrayLike, maybe_float +from .options import YieldCurveCalibration from .yield_curve import YieldCurve @@ -30,21 +32,30 @@ class NelsonSiegel(YieldCurve): $\beta_3$ is the curvature parameter and $\lambda$ is the decay factor. """ - beta1: Decimal = Field(..., description="Level parameter") - beta2: Decimal = Field(..., description="Slope parameter") - beta3: Decimal = Field(..., description="Curvature parameter") - lambda_: Decimal = Field(..., description="Decay factor") - - def instanteous_forward_rate(self, ttm: Number) -> Decimal: - ttmd = to_decimal(ttm) - if ttmd <= 0: - return self.beta1 + self.beta2 - else: - tt = ttmd * self.lambda_ - et = (-tt).exp() - return self.beta1 + self.beta2 * et + self.beta3 * tt * et - - def discount_factor(self, ttm: Number) -> Decimal: + curve_type: Literal["nelson_siegel"] = "nelson_siegel" + beta1: Decimal = Field(default=Decimal(0), description="Level parameter") + beta2: Decimal = Field(default=Decimal(0), description="Slope parameter") + beta3: Decimal = Field(default=Decimal(0), description="Curvature parameter") + lambda_: Decimal = Field(default=Decimal(1), description="Decay factor") + + def calibrator(self) -> NelsonSiegelCalibration: + """Return a [NelsonSiegelCalibration][..NelsonSiegelCalibration] wrapping + this curve.""" + return NelsonSiegelCalibration(yield_curve=self) + + def instanteous_forward_rate(self, ttm: FloatArrayLike) -> FloatArrayLike: + b1, b2, b3, lam = ( + float(self.beta1), + float(self.beta2), + float(self.beta3), + float(self.lambda_), + ) + ttm_ = np.maximum(np.asarray(ttm, dtype=float), 0.0) + lt = lam * ttm_ + et = np.exp(-lt) + return maybe_float(b1 + b2 * et + b3 * lt * et) + + def discount_factor(self, ttm: FloatArrayLike) -> FloatArrayLike: r"""Calculate the discount factor for a given time to maturity. The discount factor is calculated using the formula: @@ -57,47 +68,90 @@ def discount_factor(self, ttm: Number) -> Decimal: - e^{-\lambda \tau}\right) \end{align*} """ - ttmd = to_decimal(ttm) - if ttmd <= 0: - return ONE - else: - tt = ttmd * self.lambda_ - et = (-tt).exp() - ett = (1 - et) / tt - zero_coupon_rate = self.beta1 + self.beta2 * ett + self.beta3 * (ett - et) - return (-zero_coupon_rate * ttmd).exp() + ttma = np.maximum(np.asarray(ttm, dtype=float), 0.0) + tt = ttma * float(self.lambda_) + et = np.exp(-tt) + with np.errstate(divide="ignore", invalid="ignore"): + ett = np.where(tt > 1e-10, (1 - et) / tt, 1.0) + zero_coupon_rate = ( + float(self.beta1) + float(self.beta2) * ett + float(self.beta3) * (ett - et) + ) + df = np.exp(-zero_coupon_rate * ttma) + return maybe_float(df) + + def jacobian(self, ttm: FloatArrayLike) -> FloatArray: + r"""Analytical Jacobian of discount factors w.r.t. params. + + Params order: $[\beta_1, \beta_2, \beta_3, \lambda]$. Shape: (len(ttm), 4). + """ + b2, b3, lam = float(self.beta2), float(self.beta3), float(self.lambda_) + ttma = np.maximum(np.asarray(ttm, dtype=float), 0.0) + lt = lam * ttma + et = np.exp(-lt) + with np.errstate(divide="ignore", invalid="ignore"): + ett = np.where(lt > 1e-10, (1.0 - et) / lt, 1.0 - lt / 2.0) + a_term = ttma * ett + b_term = a_term - ttma * et + zero_rate = float(self.beta1) + b2 * ett + b3 * (ett - et) + df = np.exp(-zero_rate * ttma) + with np.errstate(divide="ignore", invalid="ignore"): + da_dlam = np.where(lam > 1e-10, ttma * et / lam - a_term / lam, 0.0) + db_dlam = da_dlam + ttma**2 * et + return np.column_stack( + [ + -ttma * df, + -a_term * df, + -b_term * df, + -df * (b2 * da_dlam + b3 * db_dlam), + ] + ) @classmethod - def fit( + def calibrate( cls, ttm: Annotated[ ArrayLike, Doc("times to maturity in years (1-D, length >= 3)"), ], rates: Annotated[ - ArrayLike, Doc("observed zero-coupon rates, same length as ttm") + ArrayLike, Doc("observed continuously compounded rates, same length as ttm") ], lambda_bounds: Annotated[ tuple[float, float], Doc("search bounds for the decay parameter $\\lambda$"), ] = (0.01, 10.0), - ) -> NelsonSiegel: - r"""Fit a Nelson-Siegel curve to observed zero-coupon rates. + ) -> Self: + r"""Fit a Nelson-Siegel curve to observed continuously compounded rates. Uses a profile OLS approach: for each candidate $\lambda$ the betas are solved exactly via least squares, so only a 1-D scalar minimisation over $\lambda$ is needed. + + Observations whose rates deviate by more than 3 robust standard deviations + (MAD-scaled) from the median are excluded before fitting, making the result + robust to a small number of bad parity observations. """ ttm_arr = np.asarray(ttm, dtype=float) rates_arr = np.asarray(rates, dtype=float) + mask = _mad_filter(rates_arr) + fit_ttm = ttm_arr[mask] if mask.sum() >= 3 else ttm_arr + fit_rates = rates_arr[mask] if mask.sum() >= 3 else rates_arr + # Grid search to avoid local minima, then refine with bounded minimisation + lo, hi = lambda_bounds + grid = np.linspace(lo, hi, 50) + rss_values = [_rss(lam, fit_ttm, fit_rates) for lam in grid] + best_idx = int(np.argmin(rss_values)) + # Refine around the best grid point + refine_lo = grid[max(best_idx - 1, 0)] + refine_hi = grid[min(best_idx + 1, len(grid) - 1)] result = minimize_scalar( _rss, - bounds=lambda_bounds, + bounds=(refine_lo, refine_hi), method="bounded", - args=(ttm_arr, rates_arr), + args=(fit_ttm, fit_rates), ) lam: float = result.x - b1, b2, b3 = _ols_betas(ttm_arr, rates_arr, lam) + b1, b2, b3 = _ols_betas(fit_ttm, fit_rates, lam) return cls( beta1=Decimal(str(round(b1, 10))), beta2=Decimal(str(round(b2, 10))), @@ -106,6 +160,59 @@ def fit( ) +class NelsonSiegelCalibration(YieldCurveCalibration[NelsonSiegel]): + """Calibration wrapper for a Nelson-Siegel yield curve.""" + + beta_bounds: tuple[float, float] = Field( + default=(-0.5, 0.5), + description="Lower and upper bounds for beta parameters", + ) + lambda_bounds: tuple[float, float] = Field( + default=(0.01, 10.0), + description="Lower and upper bounds for the decay parameter", + ) + + def get_params(self) -> FloatArray: + ns = self.yield_curve + return np.array( + [float(ns.beta1), float(ns.beta2), float(ns.beta3), float(ns.lambda_)] + ) + + def set_params(self, params: FloatArray) -> None: + b1, b2, b3, lam = params + self.yield_curve.beta1 = Decimal(str(round(float(b1), 10))) + self.yield_curve.beta2 = Decimal(str(round(float(b2), 10))) + self.yield_curve.beta3 = Decimal(str(round(float(b3), 10))) + self.yield_curve.lambda_ = Decimal(str(round(float(lam), 10))) + + def get_bounds(self) -> Bounds: + lo, hi = self.beta_bounds + lam_lo, lam_hi = self.lambda_bounds + return Bounds([lo, lo, lo, lam_lo], [hi, hi, hi, lam_hi]) + + def calibrate( + self, + ttm: Annotated[ArrayLike, Doc("Times to maturity in years.")], + target: Annotated[ + ArrayLike, Doc("Target discount factors, same length as ttm.") + ], + ) -> NelsonSiegel: + """Fit the curve using the fast profile-OLS solver. + + Drop times to maturity <= 1 day (if any) before fitting, as these are often + dominated by noise and can cause instability in the fit. + """ + ttm_ = np.asarray(ttm, dtype=float) + mask = ttm_ >= 1 / 365 + rates = -np.log(np.asarray(target, dtype=float)[mask]) / ttm_[mask] + ns = NelsonSiegel.calibrate(ttm_[mask], rates, lambda_bounds=self.lambda_bounds) + self.yield_curve.beta1 = ns.beta1 + self.yield_curve.beta2 = ns.beta2 + self.yield_curve.beta3 = ns.beta3 + self.yield_curve.lambda_ = ns.lambda_ + return self.yield_curve + + def _design_matrix(ttm: np.ndarray, lam: float) -> np.ndarray: lt = lam * ttm with np.errstate(divide="ignore", invalid="ignore"): @@ -121,3 +228,11 @@ def _ols_betas(ttm: np.ndarray, rates: np.ndarray, lam: float) -> np.ndarray: def _rss(lam: float, ttm: np.ndarray, rates: np.ndarray) -> float: residuals = rates - _design_matrix(ttm, lam) @ _ols_betas(ttm, rates, lam) return float(np.dot(residuals, residuals)) + + +def _mad_filter(rates: np.ndarray, k: float = 3.0) -> np.ndarray: + """Boolean mask: True for observations within k standard deviations (MAD-scaled).""" + med = np.median(rates) + mad = np.median(np.abs(rates - med)) + scale = max(mad / 0.6745, 1e-12) + return np.abs(rates - med) <= k * scale diff --git a/quantflow/rates/options.py b/quantflow/rates/options.py new file mode 100644 index 00000000..c7f50796 --- /dev/null +++ b/quantflow/rates/options.py @@ -0,0 +1,183 @@ +from __future__ import annotations + +from abc import abstractmethod +from dataclasses import dataclass +from typing import TYPE_CHECKING, Generic, TypeVar + +import numpy as np +from numpy.typing import ArrayLike +from pydantic import BaseModel, Field +from scipy.optimize import Bounds, least_squares +from typing_extensions import Annotated, Doc + +from quantflow.utils.types import FloatArray + +if TYPE_CHECKING: + from .yield_curve import YieldCurve + + +Y = TypeVar("Y", bound="YieldCurve") + + +class YieldCurveCalibration(BaseModel, Generic[Y]): + yield_curve: Y = Field(..., description="Yield curve to be calibrated") + + @abstractmethod + def get_params(self) -> FloatArray: + """Current model parameters as a flat array (starting point for fit)""" + + @abstractmethod + def set_params(self, params: FloatArray) -> None: + """Update the yield curve from a flat parameter array""" + + @abstractmethod + def get_bounds(self) -> Bounds: + """Parameter bounds for the optimiser""" + + def __call__(self, ttm: FloatArray) -> FloatArray: + """Discount factors for the given TTMs evaluated at current params. + + Called inside the optimiser hot loop: must not construct a new + yield curve instance on every call. + """ + return np.asarray(self.yield_curve.discount_factor(ttm), dtype=float) + + def calibrate( + self, + ttm: Annotated[ArrayLike, Doc("Times to maturity in years.")], + target: Annotated[ + ArrayLike, Doc("Target discount factors, same length as ttm.") + ], + ) -> Y: + """Fit the yield curve to target discount factors via least squares.""" + ttm_ = np.asarray(ttm, dtype=float) + target_ = np.asarray(target, dtype=float) + has_jacobian = self.yield_curve.jacobian(ttm_) is not None + + def residuals(params: np.ndarray) -> np.ndarray: + self.set_params(params) + return self(ttm_) - target_ + + def jac(params: np.ndarray) -> FloatArray: + self.set_params(params) + return self.yield_curve.jacobian(ttm_) # type: ignore[return-value] + + result = least_squares( + residuals, + self.get_params(), + jac=jac if has_jacobian else "2-point", + bounds=self.get_bounds(), + method="trf", + ) + self.set_params(result.x) + return self.yield_curve + + +@dataclass +class OptionsDiscountingCalibration: + """Calibrate yield curves from option price parity data. + + The input data consists of arrays of call-put parity values, strikes, and times + to maturity for a set of options on the same underlying. The calibration can be + done jointly for both the asset and quote curves, or separately for one curve with + the other fixed. + """ + + asset_curve: Annotated[ + YieldCurve | YieldCurveCalibration, + Doc( + "Yield curve for the underlying asset. An instance is treated as fixed; " + "a YieldCurveCalibration will be calibrated from the parity data." + ), + ] + quote_curve: Annotated[ + YieldCurve | YieldCurveCalibration, + Doc( + "Yield curve for the quote asset. An instance is treated as fixed; " + "a YieldCurveCalibration will be calibrated from the parity data." + ), + ] + cp: Annotated[FloatArray, Doc("(Call - Put) / Spot for each option pair")] + strikes: Annotated[ + FloatArray, Doc("Strike / Spot for each option pair, same length as cp") + ] + ttm: Annotated[ + FloatArray, + Doc("Time to maturity in years for each option pair, same length as cp"), + ] + + def calibrate(self) -> tuple[YieldCurve, YieldCurve]: + if isinstance(self.asset_curve, YieldCurveCalibration): + if isinstance(self.quote_curve, YieldCurveCalibration): + return self.joint_calibration(self.asset_curve, self.quote_curve) + else: + return self.asset_calibration(self.asset_curve, self.quote_curve) + elif isinstance(self.quote_curve, YieldCurveCalibration): + return self.quote_calibration(self.asset_curve, self.quote_curve) + else: + return self.asset_curve, self.quote_curve + + def joint_calibration( + self, + asset_cal: YieldCurveCalibration, + quote_cal: YieldCurveCalibration, + ) -> tuple[YieldCurve, YieldCurve]: + """Calibrate both curves jointly from all parity observations.""" + pa = asset_cal.get_params() + pq = quote_cal.get_params() + has_jacobian = ( + asset_cal.yield_curve.jacobian(self.ttm) is not None + and quote_cal.yield_curve.jacobian(self.ttm) is not None + ) + n_a = len(pa) + bounds = Bounds( + np.concatenate([asset_cal.get_bounds().lb, quote_cal.get_bounds().lb]), + np.concatenate([asset_cal.get_bounds().ub, quote_cal.get_bounds().ub]), + ) + + def residuals(params: np.ndarray) -> np.ndarray: + asset_cal.set_params(params[:n_a]) + quote_cal.set_params(params[n_a:]) + da = asset_cal(self.ttm) + dq = quote_cal(self.ttm) + return self.cp - da + dq * self.strikes + + def jac(params: np.ndarray) -> FloatArray: + asset_cal.set_params(params[:n_a]) + quote_cal.set_params(params[n_a:]) + ja = asset_cal.yield_curve.jacobian(self.ttm) + jq = quote_cal.yield_curve.jacobian(self.ttm) + if ja is None or jq is None: # pragma: no cover + raise TypeError("jacobian must not return None in joint calibration") + return np.hstack([-ja, jq * self.strikes[:, None]]) + + result = least_squares( + residuals, + np.concatenate([pa, pq]), + jac=jac if has_jacobian else "2-point", + bounds=bounds, + method="trf", + ) + asset_cal.set_params(result.x[:n_a]) + quote_cal.set_params(result.x[n_a:]) + return asset_cal.yield_curve, quote_cal.yield_curve + + def asset_calibration( + self, + asset_cal: YieldCurveCalibration, + fixed_quote: YieldCurve, + ) -> tuple[YieldCurve, YieldCurve]: + """Calibrate only the asset curve; quote curve is fixed.""" + dq = np.asarray(fixed_quote.discount_factor(self.ttm), dtype=float) + target_da = self.cp + dq * self.strikes + return asset_cal.calibrate(self.ttm, target_da), fixed_quote + + def quote_calibration( + self, + fixed_asset: YieldCurve, + quote_cal: YieldCurveCalibration, + ) -> tuple[YieldCurve, YieldCurve]: + """Calibrate only the quote curve; asset curve is fixed.""" + da = np.asarray(fixed_asset.discount_factor(self.ttm), dtype=float) + target_dq = (da - self.cp) / self.strikes + return fixed_asset, quote_cal.calibrate(self.ttm, target_dq) diff --git a/quantflow/rates/vasicek.py b/quantflow/rates/vasicek.py new file mode 100644 index 00000000..676406e2 --- /dev/null +++ b/quantflow/rates/vasicek.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +from typing import Literal + +import numpy as np +from numpy.typing import ArrayLike +from pydantic import Field +from scipy.optimize import least_squares +from typing_extensions import Self + +from quantflow.sp.ou import Vasicek +from quantflow.sp.wiener import WienerProcess +from quantflow.utils.numbers import ZERO, DecimalNumber +from quantflow.utils.types import FloatArrayLike + +from .yield_curve import YieldCurve + + +class VasicekCurve(YieldCurve): + """Class representing a Vasicek yield curve""" + + curve_type: Literal["vasicek_curve"] = "vasicek_curve" + rate: DecimalNumber = Field(description=r"Initial value $x_0$") + kappa: DecimalNumber = Field(gt=ZERO, description=r"Mean reversion speed $\kappa$") + theta: DecimalNumber = Field(description=r"Mean level $\theta$") + sigma: DecimalNumber = Field(ge=ZERO, description=r"Volatility $\sigma$") + + def process(self) -> Vasicek: + return Vasicek( + rate=float(self.rate), + kappa=float(self.kappa), + theta=float(self.theta), + bdlp=WienerProcess(sigma=float(self.sigma)), + ) + + def instanteous_forward_rate(self, ttm: FloatArrayLike) -> FloatArrayLike: + r"""Calculate the instantaneous forward rate.""" + arr = np.asarray(ttm, dtype=float) + ttma = np.maximum(arr, 0.0) + kappa = float(self.kappa) + theta = float(self.theta) + sigma = float(self.sigma) + rate = float(self.rate) + s2 = sigma * sigma + et = np.exp(-kappa * ttma) + b = (1.0 - et) / kappa + fwd = rate * et + theta * (1.0 - et) - s2 / (2.0 * kappa) * b * et + return fwd if fwd.ndim > 0 else float(fwd) + + def discount_factor(self, ttm: FloatArrayLike) -> FloatArrayLike: + r"""Calculate the discount factor for a given time to maturity.""" + arr = np.asarray(ttm, dtype=float) + ttma = np.maximum(arr, 0.0) + kappa = float(self.kappa) + theta = float(self.theta) + sigma = float(self.sigma) + rate = float(self.rate) + s2 = sigma * sigma + b = (1.0 - np.exp(-kappa * ttma)) / kappa + a = (theta - s2 / (2.0 * kappa * kappa)) * (b - ttma) + s2 * b * b / ( + 4.0 * kappa + ) + df = np.exp(a - rate * b) + return df if df.ndim > 0 else float(df) + + @classmethod + def calibrate(cls, ttm: ArrayLike, rates: ArrayLike) -> Self: + """Fit the Vasicek curve to continuously compounded rates via least squares.""" + ttm_arr = np.asarray(ttm, dtype=float) + rates_arr = np.asarray(rates, dtype=float) + + def residuals(params: np.ndarray) -> np.ndarray: + curve = cls( + rate=params[0], kappa=params[1], theta=params[2], sigma=params[3] + ) + df = np.asarray(curve.discount_factor(ttm_arr), dtype=float) + fitted = -np.log(df) / ttm_arr + return fitted - rates_arr + + x0 = np.array([rates_arr[0], 1.0, rates_arr[-1], 0.01]) + result = least_squares( + residuals, x0, bounds=([-1.0, 1e-4, -1.0, 0.0], [1.0, 50.0, 1.0, 1.0]) + ) + r, k, th, s = result.x + return cls(rate=r, kappa=k, theta=th, sigma=s) diff --git a/quantflow/rates/yield_curve.py b/quantflow/rates/yield_curve.py index 29d292e6..e0a83280 100644 --- a/quantflow/rates/yield_curve.py +++ b/quantflow/rates/yield_curve.py @@ -1,15 +1,44 @@ +from __future__ import annotations + from abc import ABC, abstractmethod -from decimal import Decimal +from datetime import datetime +from typing import TYPE_CHECKING, Any, Literal + +import numpy as np +from numpy.typing import ArrayLike +from pydantic import BaseModel, Field +from typing_extensions import Annotated, Doc, Self + +from quantflow.utils import plot +from quantflow.utils.dates import utcnow +from quantflow.utils.text import snake_case +from quantflow.utils.types import FloatArray, FloatArrayLike, maybe_float + +if TYPE_CHECKING: + from .options import YieldCurveCalibration + -from pydantic import BaseModel +_CURVE_TYPES: dict[str, type[YieldCurve]] = {} +_TYPES_TO_NAMES: dict[type[YieldCurve], str] = {} class YieldCurve(BaseModel, ABC, extra="forbid"): """Abstract base class for yield curves""" + ref_date: datetime = Field( + default_factory=utcnow, + description="Reference date for the yield curve", + ) + curve_type: str = Field( + default="unknown", + description=( + "Type of the yield curve, used for serialization" " and discrimination" + ), + ) + @abstractmethod - def instanteous_forward_rate(self, ttm: float) -> Decimal: - r"""Calculate the instantaneous forward rate for a given time to maturity + def instanteous_forward_rate(self, ttm: FloatArrayLike) -> FloatArrayLike: + r"""Calculate the instantaneous forward rate for a given time to maturity. The instantaneous forward rate is related to discount factor by the following formula: @@ -19,11 +48,14 @@ def instanteous_forward_rate(self, ttm: float) -> Decimal: \end{equation} where $D(\tau)$ is the discount factor for a given time to maturity $\tau$. + + Accepts a scalar float or a float array. Returns a scalar float for scalar + input and a numpy float array for array input. """ @abstractmethod - def discount_factor(self, ttm: float) -> Decimal: - r"""Calculate the discount factor for a given time to maturity + def discount_factor(self, ttm: FloatArrayLike) -> FloatArrayLike: + r"""Calculate the discount factor for a given time to maturity. The discount factor is related to the instantaneous forward rate by the following formula: @@ -34,4 +66,109 @@ def discount_factor(self, ttm: float) -> Decimal: where $f(\tau)$ is the instantaneous forward rate for a given time to maturity $\tau$. + + Accepts a scalar float or a float array. Returns a scalar float for scalar + input and a numpy float array for array input. + """ + + @classmethod + @abstractmethod + def calibrate( + cls, + ttm: Annotated[ArrayLike, Doc("Times to maturity in years.")], + rates: Annotated[ + ArrayLike, + Doc( + "Continuously compounded rates, same length as ttm (e.g. 0.05 for 5%)." + ), + ], + ) -> Self: + """Fit the yield curve to continuously compounded rates.""" + + def calibrator(self) -> YieldCurveCalibration | None: + """Return a calibration wrapper for this curve, or None if not available.""" + return None + + def jacobian( + self, ttm: Annotated[FloatArrayLike, Doc("Times to maturity in years.")] + ) -> FloatArray | None: + """Analytical Jacobian of discount factors w.r.t. model parameters. + + Returns None if no analytical Jacobian is available (default). + Shape when not None: (len(ttm), n_params). + """ + return None + + def continuously_compounded_rate( + self, ttm: Annotated[ArrayLike, Doc("Time to maturity in years")] + ) -> FloatArrayLike: + r"""Calculate the continuously compounded rate for a given time to maturity. + + The continuously compounded rate is related to the discount factor + by the following formula: + + \begin{equation} + r(\tau) = -\frac{\ln D(\tau)}{\tau} + \end{equation} + + where $D(\tau)$ is the discount factor for a given time to maturity $\tau$. + + Accepts a scalar float or a float array. Returns a scalar float for scalar + input and a numpy float array for array input. + """ + ttm_ = np.asarray(ttm, dtype=float) + df = np.asarray(self.discount_factor(ttm_), dtype=float) + result = np.where( + ttm_ <= 0, self.instanteous_forward_rate(0.0), -np.log(df) / ttm_ + ) + return maybe_float(result) + + def plot( + self, + ttm_max: Annotated[float, Doc("Maximum time to maturity in years")] = 10.0, + n: Annotated[int, Doc("Number of points to evaluate")] = 200, + **kwargs: Any, + ) -> Any: + """Plot the continuously compounded rate vs time to maturity. + + Requires plotly to be installed. """ + return plot.plot_yield_curve(self, ttm_max=ttm_max, n=n, **kwargs) + + @classmethod + def register_curve_types(cls, *curve_classes: type[YieldCurve]) -> None: + """Register a yield curve subclass for deserialization.""" + for curve_cls in curve_classes: + name = snake_case(curve_cls.__name__) + if current_type := _CURVE_TYPES.pop(name, None): + _TYPES_TO_NAMES.pop(current_type, None) + _CURVE_TYPES[name] = curve_cls + _TYPES_TO_NAMES[curve_cls] = name + + @classmethod + def curve_types(cls) -> tuple[str, ...]: + """Return the registered curve types.""" + return tuple(sorted(_CURVE_TYPES)) + + @classmethod + def get_curve_class(cls, curve_type: str) -> type[YieldCurve] | None: + """Get the yield curve class for a given curve type.""" + return _CURVE_TYPES.get(curve_type) + + +class NoDiscount(YieldCurve): + """Flat yield curve with zero rates (discount factor is always 1).""" + + curve_type: Literal["no_discount"] = "no_discount" + + def instanteous_forward_rate(self, ttm: FloatArrayLike) -> FloatArrayLike: + arr = np.asarray(ttm, dtype=float) + return np.zeros_like(arr) if arr.ndim > 0 else 0.0 + + def discount_factor(self, ttm: FloatArrayLike) -> FloatArrayLike: + arr = np.asarray(ttm, dtype=float) + return np.ones_like(arr) if arr.ndim > 0 else 1.0 + + @classmethod + def calibrate(cls, ttm: ArrayLike, rates: ArrayLike) -> Self: + return cls() diff --git a/quantflow/utils/plot.py b/quantflow/utils/plot.py index 8e8eb88c..17357db5 100644 --- a/quantflow/utils/plot.py +++ b/quantflow/utils/plot.py @@ -1,12 +1,16 @@ import os -from typing import Any +from typing import TYPE_CHECKING, Any +import numpy as np import pandas as pd from scipy.stats import norm from .marginal import Marginal1D from .types import FloatArray +if TYPE_CHECKING: + from quantflow.rates.yield_curve import YieldCurve + PLOTLY_THEME = os.environ.get("PLOTLY_THEME", "plotly_dark") try: @@ -214,6 +218,28 @@ def plot3d( return fig +def plot_yield_curve( + curve: "YieldCurve", + ttm_max: float = 10.0, + n: int = 200, + **kwargs: Any, +) -> Any: + check_plotly() + ttms = np.linspace(0.0, ttm_max, n) + rates = [float(curve.continuously_compounded_rate(t)) for t in ttms] + df = pd.DataFrame({"ttm": ttms, "rate": rates}) + return px.line( + df, + x="ttm", + y="rate", + labels={ + "ttm": "time to maturity (years)", + "rate": "continuously compounded rate", + }, + **kwargs, + ) + + def candlestick_plot(df: pd.DataFrame, slider: bool = True) -> Any: fig = go.Figure( data=go.Candlestick( diff --git a/quantflow/utils/price.py b/quantflow/utils/price.py new file mode 100644 index 00000000..d7d02b4d --- /dev/null +++ b/quantflow/utils/price.py @@ -0,0 +1,37 @@ +from pydantic import BaseModel, Field + +from .numbers import ZERO, Decimal, DecimalNumber + + +class Price(BaseModel): + """Represents the bid/ask price of a security, + which can be a spot price, forward price or option price + """ + + bid: DecimalNumber = Field(description="Bid price") + ask: DecimalNumber = Field(description="Ask price") + + @property + def mid(self) -> Decimal: + """Calculate the mid price by averaging the bid and ask prices""" + return (self.bid + self.ask) / 2 + + @property + def spread(self) -> Decimal: + """Calculate the bid-ask spread""" + return self.ask - self.bid + + @property + def bp_spread(self) -> Decimal: + """Bid-ask spread in basis points, calculated as spread divided by mid + price and multiplied by 10000""" + mid = self.mid + if mid > ZERO: + return round(10000 * self.spread / mid, 2) + else: + return Decimal("inf") + + def is_valid(self) -> bool: + """Check if the price is valid, which means the bid is less than + or equal to the ask""" + return self.bid <= self.ask diff --git a/quantflow/utils/text.py b/quantflow/utils/text.py new file mode 100644 index 00000000..7c16c904 --- /dev/null +++ b/quantflow/utils/text.py @@ -0,0 +1,23 @@ +""" +Adapted from humps + +https://github.com/nficano/humps +""" + +import re + +ACRONYM_RE = re.compile(r"([A-Z\d]+)(?=[A-Z\d]|$)") +SPLIT_RE = re.compile(r"([\-_]*(?<=[^0-9])(?=[A-Z])[^A-Z]*[\-_]*)") + + +def snake_case(string: str) -> str: + """Convert a string into snake case.""" + return _separate_words(_fix_abbreviations(string)).lower() + + +def _fix_abbreviations(string: str) -> str: + return ACRONYM_RE.sub(lambda m: m.group(0).title(), string) + + +def _separate_words(string: str, separator: str = "_") -> str: + return separator.join(s for s in SPLIT_RE.split(string) if s) diff --git a/quantflow/utils/types.py b/quantflow/utils/types.py index 2e1ac95f..076a1932 100644 --- a/quantflow/utils/types.py +++ b/quantflow/utils/types.py @@ -32,6 +32,10 @@ def as_float(num: NumberType | None = None) -> float: return float(0 if num is None else num) +def maybe_float(array: FloatArray) -> FloatArrayLike: + return array if array.ndim > 0 else float(array) + + def as_array(n: Vector) -> np.ndarray: """Convert an input into an array""" if isinstance(n, int): diff --git a/quantflow_tests/test_data_deribit.py b/quantflow_tests/test_data_deribit.py index 01c8a995..0509e0d7 100644 --- a/quantflow_tests/test_data_deribit.py +++ b/quantflow_tests/test_data_deribit.py @@ -54,8 +54,8 @@ async def test_loader_loads_known_options( deribit_cli: Deribit, ref_date: datetime ) -> None: """Options present in both book summary and instruments are loaded.""" - loader = await deribit_cli.volatility_surface_loader("btc") - surface = loader.surface(ref_date=ref_date) + loader = await deribit_cli.volatility_surface_loader("btc", ref_date=ref_date) + surface = loader.surface() # fixture has 2 strikes (70000 C+P, 75000 C) all on one maturity total_strikes = sum(len(m.strikes) for m in surface.maturities) assert total_strikes == 2 @@ -68,8 +68,8 @@ async def test_loader_skips_option_missing_from_instruments( ghost = "BTC-10APR26-67500-P" assert any(o["instrument_name"] == ghost for o in options) - loader = await deribit_cli.volatility_surface_loader("btc") - surface = loader.surface(ref_date=ref_date) + loader = await deribit_cli.volatility_surface_loader("btc", ref_date=ref_date) + surface = loader.surface() all_strikes = { strike.strike for mat in surface.maturities for strike in mat.strikes } @@ -82,6 +82,6 @@ async def test_loader_skips_future_missing_from_instruments( """Futures absent from the instruments list are silently skipped.""" assert any(f["instrument_name"] == "BTC-GHOST-26" for f in futures) - loader = await deribit_cli.volatility_surface_loader("btc") - surface = loader.surface(ref_date=ref_date) + loader = await deribit_cli.volatility_surface_loader("btc", ref_date=ref_date) + surface = loader.surface() assert surface is not None diff --git a/quantflow_tests/test_data_yahoo.py b/quantflow_tests/test_data_yahoo.py index d3ee18ae..c958fe04 100644 --- a/quantflow_tests/test_data_yahoo.py +++ b/quantflow_tests/test_data_yahoo.py @@ -32,6 +32,7 @@ async def test_loader_builds_surface(yahoo_cli: Yahoo, spx_chain: dict) -> None: surface = loader.surface() assert surface.asset == "^SPX" assert len(surface.maturities) == len(spx_chain["options"]) + assert surface.spot is not None assert surface.spot.mid > 0 diff --git a/quantflow_tests/test_implied_fwd.py b/quantflow_tests/test_implied_fwd.py deleted file mode 100644 index fbb71cdf..00000000 --- a/quantflow_tests/test_implied_fwd.py +++ /dev/null @@ -1,175 +0,0 @@ -"""Tests for ImpliedFwdPrice.aggregate""" - -from __future__ import annotations - -from datetime import datetime, timezone -from decimal import Decimal - -import pytest -from hypothesis import given -from hypothesis import strategies as st - -from quantflow.options.inputs import DefaultVolSecurity -from quantflow.options.surface import FwdPrice, ImpliedFwdPrice - -MATURITY = datetime(2026, 12, 31, tzinfo=timezone.utc) - - -def make_implied( - mid: float, spread_bp: float, strike: float | None = None -) -> ImpliedFwdPrice: - mid_d = Decimal(str(round(mid, 6))) - half_spread = Decimal(str(round(mid * spread_bp / 20000, 8))) - return ImpliedFwdPrice( - security=DefaultVolSecurity.forward(), - bid=mid_d - half_spread, - ask=mid_d + half_spread, - strike=Decimal(str(round(strike if strike is not None else mid, 6))), - maturity=MATURITY, - ) - - -def make_fwd(mid: float, spread_bp: float) -> FwdPrice: - mid_d = Decimal(str(round(mid, 6))) - half_spread = Decimal(str(round(mid * spread_bp / 20000, 8))) - return FwdPrice( - security=DefaultVolSecurity.forward(), - bid=mid_d - half_spread, - ask=mid_d + half_spread, - maturity=MATURITY, - ) - - -def test_aggregate_empty_no_default_returns_none() -> None: - assert ImpliedFwdPrice.aggregate([], ttm=1.0) is None - - -def test_aggregate_empty_with_default_returns_default() -> None: - default = make_fwd(100, 20) - assert ImpliedFwdPrice.aggregate([], ttm=1.0, default=default) is default - - -def make_implied_market( - theoretical_forward: float, - mid_fraction: float, - spread_multiplier: float, - strike_fraction: float, -) -> ImpliedFwdPrice: - """Implied forward whose spread scales with distance from theoretical_forward.""" - mid = theoretical_forward * mid_fraction - spread_bp = max( - 1.0, - abs(mid - theoretical_forward) - / theoretical_forward - * 10000 - * spread_multiplier, - ) - return make_implied(mid, spread_bp, strike=theoretical_forward * strike_fraction) - - -def test_aggregate_all_invalid_returns_default() -> None: - invalid = ImpliedFwdPrice( - security=DefaultVolSecurity.forward(), - bid=Decimal("101"), - ask=Decimal("99"), # bid > ask - strike=Decimal("100"), - maturity=MATURITY, - ) - default = make_fwd(100, 20) - assert ImpliedFwdPrice.aggregate([invalid], ttm=1.0, default=default) is default - - -@given( - theoretical_forward=st.floats( - min_value=100.0, max_value=100_000.0, allow_nan=False, allow_infinity=False - ), - anchor=st.floats( - min_value=0.9, max_value=0.99, allow_nan=False, allow_infinity=False - ), - mid_fractions=st.lists( - st.floats( - min_value=0.95, max_value=1.05, allow_nan=False, allow_infinity=False - ), - min_size=2, - max_size=8, - ), - spread_multipliers=st.lists( - st.floats(min_value=0.5, max_value=3.0, allow_nan=False, allow_infinity=False), - min_size=2, - max_size=8, - ), - strike_fractions=st.lists( - st.floats(min_value=0.8, max_value=1.2, allow_nan=False, allow_infinity=False), - min_size=2, - max_size=8, - ), - ttm=st.floats(min_value=0.1, max_value=2.0, allow_nan=False, allow_infinity=False), -) -def test_aggregate_with_previous_forward( - theoretical_forward: float, - anchor: float, - mid_fractions: list[float], - spread_multipliers: list[float], - strike_fractions: list[float], - ttm: float, -) -> None: - previous_forward = Decimal(str(round(theoretical_forward * anchor, 4))) - n = min(len(mid_fractions), len(spread_multipliers), len(strike_fractions)) - forwards = [ - make_implied_market( - theoretical_forward, - mid_fractions[i], - spread_multipliers[i], - strike_fractions[i], - ) - for i in range(n) - ] - result = ImpliedFwdPrice.aggregate( - forwards, ttm=ttm, previous_forward=previous_forward - ) - assert result is not None - assert result.is_valid() - mids = [float(f.mid) for f in forwards if f.is_valid()] - assert min(mids) - 1e-4 <= float(result.mid) <= max(mids) + 1e-4 - - -def test_aggregate_implied_tighter_than_default_uses_implied() -> None: - # implied forwards (5 bp) are tighter than the default (20 bp) - # the default is not included in the candidate pool, result comes from implied - forwards = [make_implied(100, 5), make_implied(100, 5)] - default = make_fwd(100, 20) - result = ImpliedFwdPrice.aggregate(forwards, ttm=1.0, default=default) - assert result is not None - assert result is not default - assert float(result.mid) == pytest.approx(100.0, rel=1e-3) - - -def test_aggregate_previous_forward_pulls_result_toward_anchor() -> None: - # two forwards: one at 90 (the anchor), one at 110, same tight spread - # without previous_forward: result ≈ 100 (equal weights) - # with previous_forward=90: forward at 90 gets proximity_weight=1, - # forward at 110 is penalised → result pulled below 100 - fwd_at_anchor = make_implied(90, 5) - fwd_above = make_implied(110, 5) - previous_forward = Decimal("90") - - result_without = ImpliedFwdPrice.aggregate([fwd_at_anchor, fwd_above], ttm=1.0) - result_with = ImpliedFwdPrice.aggregate( - [fwd_at_anchor, fwd_above], ttm=1.0, previous_forward=previous_forward - ) - assert result_without is not None - assert result_with is not None - assert float(result_with.mid) < float(result_without.mid) - - -def test_aggregate_outlier_with_wide_spread_does_not_move_result() -> None: - # three tight forwards near 100, one outlier far away with enormous spread - tight = [make_implied(100, 5) for _ in range(3)] - outlier = make_implied(200, 500) - result_without_outlier = ImpliedFwdPrice.aggregate(tight, ttm=1.0) - result_with_outlier = ImpliedFwdPrice.aggregate(tight + [outlier], ttm=1.0) - assert result_without_outlier is not None - assert result_with_outlier is not None - assert ( - abs(float(result_with_outlier.mid) - float(result_without_outlier.mid)) < 0.01 - ) diff --git a/quantflow_tests/test_nelson_siegel.py b/quantflow_tests/test_nelson_siegel.py new file mode 100644 index 00000000..014a32fa --- /dev/null +++ b/quantflow_tests/test_nelson_siegel.py @@ -0,0 +1,198 @@ +from __future__ import annotations + +import math +from decimal import Decimal + +import numpy as np +import pytest + +from quantflow.rates.nelson_siegel import NelsonSiegel + + +def _flat_curve(level: float = 0.05) -> NelsonSiegel: + return NelsonSiegel( + beta1=Decimal(str(level)), + beta2=Decimal("0"), + beta3=Decimal("0"), + lambda_=Decimal("1"), + ) + + +def _true_curve() -> NelsonSiegel: + return NelsonSiegel( + beta1=Decimal("0.04"), + beta2=Decimal("-0.02"), + beta3=Decimal("0.03"), + lambda_=Decimal("1.5"), + ) + + +# --------------------------------------------------------------------------- +# Discount factor and forward rate +# --------------------------------------------------------------------------- + + +def test_flat_curve_discount_factor_one_year() -> None: + ns = _flat_curve(0.05) + assert float(ns.discount_factor(1.0)) == pytest.approx(math.exp(-0.05), rel=1e-5) + + +def test_flat_curve_discount_factor_two_year() -> None: + ns = _flat_curve(0.04) + assert float(ns.discount_factor(2.0)) == pytest.approx(math.exp(-0.08), rel=1e-5) + + +def test_discount_factor_zero_ttm() -> None: + assert _flat_curve(0.05).discount_factor(0) == Decimal("1") + + +def test_discount_factor_negative_ttm() -> None: + assert _flat_curve(0.05).discount_factor(-1) == Decimal("1") + + +def test_discount_factor_increases_with_lower_rate() -> None: + ttm = 1.0 + assert float(_flat_curve(0.02).discount_factor(ttm)) > float( + _flat_curve(0.08).discount_factor(ttm) + ) + + +def test_discount_factor_decreases_with_ttm() -> None: + ns = _flat_curve(0.05) + assert float(ns.discount_factor(1.0)) > float(ns.discount_factor(5.0)) + + +def test_instantaneous_forward_rate_at_zero() -> None: + ns = NelsonSiegel( + beta1=Decimal("0.04"), + beta2=Decimal("0.02"), + beta3=Decimal("0.01"), + lambda_=Decimal("1"), + ) + assert float(ns.instanteous_forward_rate(0)) == pytest.approx(0.06, rel=1e-6) + + +def test_instantaneous_forward_rate_large_ttm() -> None: + ns = NelsonSiegel( + beta1=Decimal("0.04"), + beta2=Decimal("0.02"), + beta3=Decimal("0.01"), + lambda_=Decimal("1"), + ) + assert float(ns.instanteous_forward_rate(100)) == pytest.approx(0.04, abs=1e-5) + + +def test_consistency_forward_and_discount() -> None: + ns = NelsonSiegel( + beta1=Decimal("0.04"), + beta2=Decimal("0.015"), + beta3=Decimal("0.008"), + lambda_=Decimal("2"), + ) + ttm, h = 1.5, 1e-5 + numerical = -( + math.log(float(ns.discount_factor(ttm + h))) + - math.log(float(ns.discount_factor(ttm - h))) + ) / (2 * h) + assert numerical == pytest.approx(float(ns.instanteous_forward_rate(ttm)), rel=1e-4) + + +# --------------------------------------------------------------------------- +# Jacobian +# --------------------------------------------------------------------------- + + +def test_jacobian_shape() -> None: + ns = _true_curve() + ttm = np.array([0.5, 1.0, 2.0, 5.0, 10.0]) + J = ns.jacobian(ttm) + assert J.shape == (len(ttm), 4) + + +def test_jacobian_matches_finite_differences() -> None: + ns = _true_curve() + ttm = np.array([0.25, 0.5, 1.0, 2.0, 5.0, 10.0]) + h = 1e-5 + params = [ns.beta1, ns.beta2, ns.beta3, ns.lambda_] + fields = ["beta1", "beta2", "beta3", "lambda_"] + J_analytical = ns.jacobian(ttm) + J_numerical = np.zeros_like(J_analytical) + for i, (field, p) in enumerate(zip(fields, params)): + ns_fwd = ns.model_copy(update={field: Decimal(str(float(p) + h))}) + ns_bwd = ns.model_copy(update={field: Decimal(str(float(p) - h))}) + df_fwd = np.array([float(ns_fwd.discount_factor(t)) for t in ttm]) + df_bwd = np.array([float(ns_bwd.discount_factor(t)) for t in ttm]) + J_numerical[:, i] = (df_fwd - df_bwd) / (2 * h) + np.testing.assert_allclose(J_analytical, J_numerical, rtol=1e-4) + + +# --------------------------------------------------------------------------- +# calibrate — clean data +# --------------------------------------------------------------------------- + + +def test_calibrate_recovers_curve_noiseless() -> None: + ns_true = _true_curve() + ttm = np.linspace(0.25, 10.0, 20) + rates = -np.log([float(ns_true.discount_factor(t)) for t in ttm]) / ttm + ns_fit = NelsonSiegel.calibrate(ttm, rates) + for t in [1.0, 2.0, 5.0]: + assert float(ns_fit.discount_factor(t)) == pytest.approx( + float(ns_true.discount_factor(t)), rel=1e-4 + ) + + +def test_calibrate_flat_curve() -> None: + ttm = np.array([0.5, 1.0, 2.0, 5.0, 10.0]) + rates = np.full_like(ttm, 0.05) + ns = NelsonSiegel.calibrate(ttm, rates) + for t in ttm: + assert float(ns.discount_factor(t)) == pytest.approx( + math.exp(-0.05 * t), rel=1e-4 + ) + + +# --------------------------------------------------------------------------- +# calibrate — robustness +# --------------------------------------------------------------------------- + +# Crypto-realistic TTM grid: short maturities out to ~2 years +_CRYPTO_TTMS = np.array([1 / 52, 2 / 52, 1 / 12, 2 / 12, 3 / 12, 6 / 12, 1.0, 2.0]) + + +def _true_rates(ns: NelsonSiegel, ttm: np.ndarray) -> np.ndarray: + return -np.log([float(ns.discount_factor(t)) for t in ttm]) / ttm + + +def _df_rmse(ns_fit: NelsonSiegel, ns_true: NelsonSiegel, ttm: np.ndarray) -> float: + fitted = np.array([float(ns_fit.discount_factor(t)) for t in ttm]) + true = np.array([float(ns_true.discount_factor(t)) for t in ttm]) + return float(np.sqrt(np.mean((fitted - true) ** 2))) + + +def test_calibrate_crypto_ttms_noiseless() -> None: + ns_true = _true_curve() + rates = _true_rates(ns_true, _CRYPTO_TTMS) + ns_fit = NelsonSiegel.calibrate(_CRYPTO_TTMS, rates) + assert _df_rmse(ns_fit, ns_true, _CRYPTO_TTMS) < 1e-4 + + +def test_calibrate_with_gaussian_noise() -> None: + rng = np.random.default_rng(42) + ns_true = _true_curve() + rates = _true_rates(ns_true, _CRYPTO_TTMS) + noisy = rates + rng.normal(0, 0.002, size=len(rates)) + ns_fit = NelsonSiegel.calibrate(_CRYPTO_TTMS, noisy) + assert _df_rmse(ns_fit, ns_true, _CRYPTO_TTMS) < 0.005 + + +def test_calibrate_robust_to_outliers() -> None: + """Two extreme outlier rates must not corrupt the fit materially.""" + rng = np.random.default_rng(0) + ns_true = _true_curve() + rates = _true_rates(ns_true, _CRYPTO_TTMS).copy() + # inject two bad observations — 5× the true rate + outlier_idx = rng.choice(len(rates), size=2, replace=False) + rates[outlier_idx] *= 5.0 + ns_fit = NelsonSiegel.calibrate(_CRYPTO_TTMS, rates) + assert _df_rmse(ns_fit, ns_true, _CRYPTO_TTMS) < 0.01 diff --git a/quantflow_tests/test_non_inverse_surface.py b/quantflow_tests/test_non_inverse_surface.py index 309ba983..6689b09a 100644 --- a/quantflow_tests/test_non_inverse_surface.py +++ b/quantflow_tests/test_non_inverse_surface.py @@ -17,6 +17,7 @@ from quantflow.options.bs import black_price from quantflow.options.inputs import DefaultVolSecurity, OptionType from quantflow.options.surface import VolSurfaceLoader +from quantflow.rates.yield_curve import NoDiscount REF_DATE = datetime(2026, 1, 1, tzinfo=timezone.utc) MATURITY = datetime(2026, 7, 2, tzinfo=timezone.utc) # roughly 0.5y @@ -34,7 +35,11 @@ def _black_mid_usd(strike: float, call_put: int, ttm: float) -> Decimal: def _build_loader(ttm: float) -> VolSurfaceLoader: - loader = VolSurfaceLoader(asset="TEST") + loader = VolSurfaceLoader( + asset="TEST", + quote_curve=NoDiscount(ref_date=REF_DATE), + asset_curve=NoDiscount(ref_date=REF_DATE), + ) loader.add_spot( DefaultVolSecurity.spot(), bid=Decimal(str(FORWARD)), @@ -61,7 +66,7 @@ def _build_loader(ttm: float) -> VolSurfaceLoader: def test_loader_recovers_forward_via_parity() -> None: """With matched call/put prices the implied forward equals the true forward.""" loader = _build_loader(ttm=0.5) - surface = loader.surface(ref_date=REF_DATE) + surface = loader.surface() cross = surface.maturities[0] assert float(cross.forward.mid) == pytest.approx(FORWARD, rel=1e-6) @@ -69,12 +74,12 @@ def test_loader_recovers_forward_via_parity() -> None: def test_bs_recovers_input_volatility() -> None: """`bs()` inverts the synthetic non-inverse prices back to the input sigma.""" loader = _build_loader(ttm=0.5) - surface = loader.surface(ref_date=REF_DATE) + surface = loader.surface() ttm = surface.maturities[0].ttm(surface.ref_date) # rebuild prices at the actual ttm so the inversion is not biased by the # slight day-count drift from our nominal 0.5y target. loader = _build_loader(ttm=ttm) - surface = loader.surface(ref_date=REF_DATE) + surface = loader.surface() surface.bs() options = list(surface.option_prices(converged=True)) assert options, "expected converged options on the synthetic surface" @@ -85,10 +90,10 @@ def test_bs_recovers_input_volatility() -> None: def test_non_inverse_price_in_forward_space_matches_black() -> None: """`price_in_forward_space` is the Black forward-space price.""" loader = _build_loader(ttm=0.5) - surface = loader.surface(ref_date=REF_DATE) + surface = loader.surface() ttm = surface.maturities[0].ttm(surface.ref_date) loader = _build_loader(ttm=ttm) - surface = loader.surface(ref_date=REF_DATE) + surface = loader.surface() for option in surface.option_prices(): log_strike = float(option.log_strike) call_put = 1 if option.option_type.is_call() else -1 diff --git a/quantflow_tests/test_options.py b/quantflow_tests/test_options.py index f685cfc5..400b148d 100644 --- a/quantflow_tests/test_options.py +++ b/quantflow_tests/test_options.py @@ -95,10 +95,11 @@ def test_term_structure(vol_surface: VolSurface) -> None: "maturity", "ttm", "forward", + "implied_forward", + "forward_basis", + "rate", "bid_ask_spread", "basis", - "rate_percent", - "fwd_spread_pct", "open_interest", "volume", ] diff --git a/quantflow_tests/test_rates.py b/quantflow_tests/test_rates.py index 0b947bbf..652c1ceb 100644 --- a/quantflow_tests/test_rates.py +++ b/quantflow_tests/test_rates.py @@ -4,22 +4,15 @@ from datetime import datetime, timezone from decimal import Decimal -import numpy as np import pytest from quantflow.rates.interest_rate import Rate -from quantflow.rates.nelson_siegel import NelsonSiegel REF_DATE = datetime(2024, 1, 1, tzinfo=timezone.utc) ONE_YEAR = datetime(2025, 1, 1, tzinfo=timezone.utc) TWO_YEARS = datetime(2026, 1, 1, tzinfo=timezone.utc) -# --------------------------------------------------------------------------- -# Rate -# --------------------------------------------------------------------------- - - def test_rate_from_number_stores_rate() -> None: r = Rate.from_number(0.05) assert float(r.rate) == pytest.approx(0.05, rel=1e-6) @@ -94,127 +87,3 @@ def test_from_spot_and_forward_expired_returns_zero_rate() -> None: forward = Decimal("105") r = Rate.from_spot_and_forward(spot, forward, ONE_YEAR, REF_DATE) assert r.rate == Decimal("0") - - -# --------------------------------------------------------------------------- -# NelsonSiegel -# --------------------------------------------------------------------------- - - -def _flat_curve(level: float = 0.05) -> NelsonSiegel: - """Flat curve: beta2=beta3=0, so yield = beta1 for all maturities.""" - return NelsonSiegel( - beta1=Decimal(str(level)), - beta2=Decimal("0"), - beta3=Decimal("0"), - lambda_=Decimal("1"), - ) - - -def test_nelson_siegel_flat_curve_discount_factor() -> None: - ns = _flat_curve(0.05) - ttm = 1.0 - df = ns.discount_factor(ttm) - expected = math.exp(-0.05 * ttm) - assert float(df) == pytest.approx(expected, rel=1e-5) - - -def test_nelson_siegel_flat_curve_two_year() -> None: - ns = _flat_curve(0.04) - df = ns.discount_factor(2.0) - expected = math.exp(-0.04 * 2.0) - assert float(df) == pytest.approx(expected, rel=1e-5) - - -def test_nelson_siegel_discount_factor_zero_ttm() -> None: - ns = _flat_curve(0.05) - assert ns.discount_factor(0) == Decimal("1") - - -def test_nelson_siegel_discount_factor_negative_ttm() -> None: - ns = _flat_curve(0.05) - assert ns.discount_factor(-1) == Decimal("1") - - -def test_nelson_siegel_instantaneous_forward_rate_at_zero() -> None: - ns = NelsonSiegel( - beta1=Decimal("0.04"), - beta2=Decimal("0.02"), - beta3=Decimal("0.01"), - lambda_=Decimal("1"), - ) - # at ttm=0: f(0) = beta1 + beta2 - fr = ns.instanteous_forward_rate(0) - assert float(fr) == pytest.approx(0.06, rel=1e-6) - - -def test_nelson_siegel_instantaneous_forward_rate_large_ttm() -> None: - ns = NelsonSiegel( - beta1=Decimal("0.04"), - beta2=Decimal("0.02"), - beta3=Decimal("0.01"), - lambda_=Decimal("1"), - ) - # as ttm -> inf, e^{-ttm/lambda} -> 0, so f -> beta1 - fr = ns.instanteous_forward_rate(100) - assert float(fr) == pytest.approx(0.04, abs=1e-5) - - -def test_nelson_siegel_discount_factor_increases_with_rate() -> None: - # higher rate => smaller discount factor - ns_low = _flat_curve(0.02) - ns_high = _flat_curve(0.08) - ttm = 1.0 - assert float(ns_low.discount_factor(ttm)) > float(ns_high.discount_factor(ttm)) - - -def test_nelson_siegel_discount_factor_decreases_with_ttm() -> None: - ns = _flat_curve(0.05) - df1 = float(ns.discount_factor(1.0)) - df5 = float(ns.discount_factor(5.0)) - assert df1 > df5 - - -def test_nelson_siegel_fit_recovers_parameters() -> None: - ns_true = NelsonSiegel( - beta1=Decimal("0.04"), - beta2=Decimal("-0.02"), - beta3=Decimal("0.03"), - lambda_=Decimal("1.5"), - ) - ttm = np.linspace(0.25, 10.0, 20) - rates = np.array([float(ns_true.discount_factor(t)) for t in ttm]) - # convert discount factors back to zero rates for fitting - zero_rates = -np.log(rates) / ttm - ns_fit = NelsonSiegel.fit(ttm, zero_rates) - for t in [1.0, 2.0, 5.0]: - assert float(ns_fit.discount_factor(t)) == pytest.approx( - float(ns_true.discount_factor(t)), rel=1e-4 - ) - - -def test_nelson_siegel_fit_flat_curve() -> None: - ttm = np.array([0.5, 1.0, 2.0, 5.0, 10.0]) - rates = np.full_like(ttm, 0.05) - ns = NelsonSiegel.fit(ttm, rates) - for t in ttm: - assert float(ns.discount_factor(t)) == pytest.approx( - math.exp(-0.05 * t), rel=1e-4 - ) - - -def test_nelson_siegel_consistency_forward_and_discount() -> None: - """Numerical check: f(tau) ≈ -d ln D / d tau.""" - ns = NelsonSiegel( - beta1=Decimal("0.04"), - beta2=Decimal("0.015"), - beta3=Decimal("0.008"), - lambda_=Decimal("2"), - ) - ttm = 1.5 - h = 1e-5 - df_plus = float(ns.discount_factor(ttm + h)) - df_minus = float(ns.discount_factor(ttm - h)) - numerical_fwd = -(math.log(df_plus) - math.log(df_minus)) / (2 * h) - analytic_fwd = float(ns.instanteous_forward_rate(ttm)) - assert numerical_fwd == pytest.approx(analytic_fwd, rel=1e-4) diff --git a/uv.lock b/uv.lock index 34ba55af..fa818ec2 100644 --- a/uv.lock +++ b/uv.lock @@ -15,7 +15,7 @@ resolution-markers = [ [[package]] name = "aio-fluid" -version = "2.2.4" +version = "2.2.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fastapi" }, @@ -26,9 +26,9 @@ dependencies = [ { name = "uvicorn" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/26/62910eb224a511879384ef76de80b4debda20a86a777154f7d6286e65ef8/aio_fluid-2.2.4.tar.gz", hash = "sha256:fd28442a0e139a0af0d7ad6fab542e7342ac3b41f2ebd1cb924b0c3d649398d8", size = 432813, upload-time = "2026-04-30T13:59:39.718Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/bd/6cdaccadf4420c33ff14e19bb4bb438972f277724344f18b2d2e2b4fdb6d/aio_fluid-2.2.6.tar.gz", hash = "sha256:b761ecefc065c786f8f110b164aa68ef54b65e4d7d5b271576c0e7601bc973d5", size = 760678, upload-time = "2026-05-12T19:03:46.541Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/17/afec86cb6ce0f9a00970db29b7b2c277347bbcfcef2ca7f68d8e104128ba/aio_fluid-2.2.4-py3-none-any.whl", hash = "sha256:5ba5060e0cfff88349224396ca6294039413c453312e0ec78be5496ea6dbc46b", size = 66843, upload-time = "2026-04-30T13:59:38.518Z" }, + { url = "https://files.pythonhosted.org/packages/d9/4e/bf1e42031be775bca007419cd5ddd4c4fd2c227a577096eee95b32ff2492/aio_fluid-2.2.6-py3-none-any.whl", hash = "sha256:4f83861edcc3e93a91024cc2ceff3cddf7580f3859bd1783b096361a17be5279", size = 67836, upload-time = "2026-05-12T19:03:45.404Z" }, ] [package.optional-dependencies] @@ -41,11 +41,11 @@ http = [ [[package]] name = "aiohappyeyeballs" -version = "2.6.1" +version = "2.6.2" 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, upload-time = "2025-03-12T01:42:48.764Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c6/61a2d7b7572279226bb2e7f61d7a19ca7c90da0329c93fa0d560cbf288d8/aiohappyeyeballs-2.6.2.tar.gz", hash = "sha256:e202810ee718bd01fc6ef49e8ea53d023d5cb6b581076d7925aa499fa55dbe64", size = 22591, upload-time = "2026-05-20T15:12:24.631Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl", hash = "sha256:4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4", size = 15062, upload-time = "2026-05-20T15:12:23.328Z" }, ] [[package]] @@ -231,6 +231,46 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/d0/7b958df957e4827837b590944008f0b28078f552b451f7407b4b3d54f574/asciichartpy-1.5.25-py2.py3-none-any.whl", hash = "sha256:33c417a3c8ef7d0a11b98eb9ea6dd9b2c1b17559e539b207a17d26d4302d0258", size = 7228, upload-time = "2020-08-17T02:07:16.386Z" }, ] +[[package]] +name = "ast-serialize" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, + { url = "https://files.pythonhosted.org/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, + { url = "https://files.pythonhosted.org/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, + { url = "https://files.pythonhosted.org/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, + { url = "https://files.pythonhosted.org/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, + { url = "https://files.pythonhosted.org/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, + { url = "https://files.pythonhosted.org/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, + { url = "https://files.pythonhosted.org/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, + { url = "https://files.pythonhosted.org/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, + { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, + { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, + { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, + { url = "https://files.pythonhosted.org/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, +] + [[package]] name = "async-timeout" version = "5.0.1" @@ -286,7 +326,7 @@ wheels = [ [[package]] name = "black" -version = "26.3.1" +version = "26.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -296,29 +336,29 @@ dependencies = [ { name = "platformdirs" }, { name = "pytokens" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", size = 666155, upload-time = "2026-03-12T03:36:03.593Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/57/5f11c92861f9c92eb9dddf515530bc2d06db843e44bdcf1c83c1427824bc/black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff", size = 1851987, upload-time = "2026-03-12T03:40:06.248Z" }, - { url = "https://files.pythonhosted.org/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c", size = 1689499, upload-time = "2026-03-12T03:40:07.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5", size = 1754369, upload-time = "2026-03-12T03:40:09.279Z" }, - { url = "https://files.pythonhosted.org/packages/e3/09/61e91881ca291f150cfc9eb7ba19473c2e59df28859a11a88248b5cbbc4d/black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e", size = 1413613, upload-time = "2026-03-12T03:40:10.943Z" }, - { url = "https://files.pythonhosted.org/packages/16/73/544f23891b22e7efe4d8f812371ab85b57f6a01b2fc45e3ba2e52ba985b8/black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5", size = 1219719, upload-time = "2026-03-12T03:40:12.597Z" }, - { url = "https://files.pythonhosted.org/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1", size = 1895920, upload-time = "2026-03-12T03:40:13.921Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", size = 1718499, upload-time = "2026-03-12T03:40:15.239Z" }, - { url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", size = 1794994, upload-time = "2026-03-12T03:40:17.124Z" }, - { url = "https://files.pythonhosted.org/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983", size = 1420867, upload-time = "2026-03-12T03:40:18.83Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb", size = 1230124, upload-time = "2026-03-12T03:40:20.425Z" }, - { url = "https://files.pythonhosted.org/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54", size = 1895034, upload-time = "2026-03-12T03:40:21.813Z" }, - { url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", size = 1718503, upload-time = "2026-03-12T03:40:23.666Z" }, - { url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", size = 1793557, upload-time = "2026-03-12T03:40:25.497Z" }, - { url = "https://files.pythonhosted.org/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839", size = 1422766, upload-time = "2026-03-12T03:40:27.14Z" }, - { url = "https://files.pythonhosted.org/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2", size = 1232140, upload-time = "2026-03-12T03:40:28.882Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78", size = 1889234, upload-time = "2026-03-12T03:40:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568", size = 1720522, upload-time = "2026-03-12T03:40:32.346Z" }, - { url = "https://files.pythonhosted.org/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f", size = 1787824, upload-time = "2026-03-12T03:40:33.636Z" }, - { url = "https://files.pythonhosted.org/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c", size = 1445855, upload-time = "2026-03-12T03:40:35.442Z" }, - { url = "https://files.pythonhosted.org/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1", size = 1258109, upload-time = "2026-03-12T03:40:36.832Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", size = 207542, upload-time = "2026-03-12T03:36:01.668Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, + { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, + { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, + { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, + { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, + { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, + { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, ] [[package]] @@ -343,11 +383,11 @@ holidays = [ [[package]] name = "certifi" -version = "2026.4.22" +version = "2026.5.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, ] [[package]] @@ -525,14 +565,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.3" +version = "8.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" }, ] [[package]] @@ -546,101 +586,101 @@ wheels = [ [[package]] name = "coverage" -version = "7.13.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, - { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, - { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, - { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, - { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, - { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, - { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, - { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, - { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, - { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, - { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, - { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, - { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, - { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, - { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, - { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, - { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, - { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, - { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, - { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, - { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, - { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, - { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, - { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, - { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, - { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, - { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, - { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, - { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, - { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, - { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, - { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, - { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, - { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, - { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, - { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, - { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, - { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, - { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, - { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, - { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, - { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, - { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, - { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, - { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, - { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, - { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, - { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, - { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, - { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, - { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, - { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, - { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, - { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, - { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, - { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, - { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, +version = "7.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" }, + { url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" }, + { url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" }, + { url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" }, + { url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" }, + { url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" }, + { url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" }, + { url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" }, + { url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" }, + { url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" }, + { url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" }, + { url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" }, + { url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" }, + { url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" }, + { url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" }, + { url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" }, + { url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" }, + { url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" }, + { url = "https://files.pythonhosted.org/packages/6b/76/b7c66ee3c66e1b0f9d894c8125983aa0c03fb2336f2fd16559f9c966157f/coverage-7.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f2bbb8254370eb4c628ff3d6fa8a7f74ddc40565394d4f7ab791d1fe568e37ef", size = 219990, upload-time = "2026-05-10T18:00:38.887Z" }, + { url = "https://files.pythonhosted.org/packages/b3/af/e567cbad5ba69c013a50146dfa886dc7193361fda77521f51274ff620e1b/coverage-7.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23b81107f46d3f21d0cbce30664fcec0f5d9f585638a67081750f99738f6bf66", size = 220365, upload-time = "2026-05-10T18:00:40.864Z" }, + { url = "https://files.pythonhosted.org/packages/44/6f/9ad575d505b4d805b254febc8a5b338a2efe278f8786e56ff1cb8413f9c3/coverage-7.14.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:22a7e06a5f11a757cdfe79018e9095f9f69ae283c5cd8123774c788deec8717b", size = 251363, upload-time = "2026-05-10T18:00:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5f/b5370068b2f57787454592ed7dcd1002f0f1703b7db1fa30f6a325a4ca6e/coverage-7.14.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9d1aa57a1dc8e05bdc42e81c5d671d849577aeedf279f4c449d6d286f9ed88ca", size = 253961, upload-time = "2026-05-10T18:00:44.079Z" }, + { url = "https://files.pythonhosted.org/packages/29/1e/51adf17738976e8f2b85ddef7b7aa12a0838b056c92f175941d8862767c1/coverage-7.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c1a51bcfddf645b3bb7ec333d9e94393a8e94f55642380fa8a9a5a9e636cb7", size = 255193, upload-time = "2026-05-10T18:00:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7b/5bfd7ac1df3b881c2ac7a5cbc99c7609e6296c402f5ef587cd81c6f355b3/coverage-7.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a841fae2fadcae4f438d43b6ccc4aac2ad609f47cdb6cfdce60cbb3fe5ca7bc2", size = 257326, upload-time = "2026-05-10T18:00:47.173Z" }, + { url = "https://files.pythonhosted.org/packages/7d/38/1d37d316b174fad3843a1d76dbdfe4398771c9ecd0515935dd9ece9cd627/coverage-7.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c79d2319cabef1fe8e86df73371126931550804738f78ad7d31e3aad85a67367", size = 251582, upload-time = "2026-05-10T18:00:49.152Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/746704f95980ba220214e1a41e18cec5aea80a898eaa53c51bf2d645ff36/coverage-7.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b23b0c6f0b1db6ad769b7050c8b641c0bf215ded26c1816955b17b7f26edfa9", size = 253325, upload-time = "2026-05-10T18:00:51.252Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b9/bbe87206d9687b192352f893797825b5f5b15ecd3aa9c68fbff0c074d77b/coverage-7.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:55d3089079ce181a4566b1065ab28d2575eb76d8ac8f81f4fcda2bf037fee087", size = 251291, upload-time = "2026-05-10T18:00:52.816Z" }, + { url = "https://files.pythonhosted.org/packages/46/57/b8cdb12ac0d73ef0243218bd5e22c9df8f92edab8018213a86aec67c5324/coverage-7.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:49c005cba1e2f9677fb2845dcdf9a2e72a52a17d63e8231aaaae35d9f50215ef", size = 255448, upload-time = "2026-05-10T18:00:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d4/5002019538b2036ce3c84340f54d2fd5100d55b0a6b0894eee56128d03c7/coverage-7.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9117377b823daa28aa8635fbb08cda1cd6be3d7143257345459559aeef852d52", size = 251110, upload-time = "2026-05-10T18:00:56.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/20c5009477660f084e6ed60bc02a91894b8e234e617e86ecfd9aaf78e27b/coverage-7.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b79d646cf46d5cf9a9f40281d4441df5849e445726e369006d2b117710b33fe", size = 252885, upload-time = "2026-05-10T18:00:57.967Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ab/3cf6427ac9c1f1db747dbb1ce71dde47984876d4c2cfd018a3fef0a78d4d/coverage-7.14.0-cp313-cp313-win32.whl", hash = "sha256:fb609b3658479e33f9516d46f1a89dbb9b6c261366e3a11844a96ec487533dae", size = 222539, upload-time = "2026-05-10T18:00:59.581Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b8/9228523e80321c2cb4880d1f589bc0171f2f71432c35118ad04dc01decce/coverage-7.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0773d8329cf32b6fd222e4b52622c61fe8d503eb966cfc8d3c3c10c96266d50e", size = 223344, upload-time = "2026-05-10T18:01:01.531Z" }, + { url = "https://files.pythonhosted.org/packages/a3/99/118daa192f95e3a6cb2740100fbf8797cda1734b4134ef0b5d501a7fa8f3/coverage-7.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:b4e26a0f1b696faf283bffe5b8569e44e336c582439df5d53281ab89ee0cba96", size = 221966, upload-time = "2026-05-10T18:01:03.16Z" }, + { url = "https://files.pythonhosted.org/packages/e6/f1/a46cc0c013be170216253184a32366d7cbdb9252feaec866b05c2d12a894/coverage-7.14.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:953f521ca9445300397e65fda3dca58b2dbd68fee983777420b57ac3c77e9f90", size = 220679, upload-time = "2026-05-10T18:01:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/64/8c/9c30a3d311a34177fa432995be7fbfc64477d8bac5630bd38055b1c9b424/coverage-7.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:98af83fd65ae24b1fdd03aaead967a9f523bcd2f1aab2d4f3ffda65bb568a6f1", size = 221033, upload-time = "2026-05-10T18:01:07.002Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/3fb5e06c3badefd0c1b47e2044fdca67f8220a4ec2e7fcfb476aa0a67c6c/coverage-7.14.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:668b92e6958c4db7cf92e81caac328dfbbdbb215db2850ad28f0cbe1eea0bfbd", size = 262333, upload-time = "2026-05-10T18:01:08.903Z" }, + { url = "https://files.pythonhosted.org/packages/a8/e6/fbc322325c7294d3e22c1ad6b79e45d0806b25228c8e5842aed6d8169aa7/coverage-7.14.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9fbd898551762dea00d3fef2b1c4f99afd2c6a3ff952ea07d60a9bd5ed4f34bc", size = 264410, upload-time = "2026-05-10T18:01:10.531Z" }, + { url = "https://files.pythonhosted.org/packages/08/92/c497b264bec1673c47cc77e26f760fcda4654cabf1f39546d1a23a3b8c35/coverage-7.14.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68af363c07ecd8d4b7d4043d85cb376d7d227eceb54e5323ee45da73dbd3e426", size = 266836, upload-time = "2026-05-10T18:01:12.19Z" }, + { url = "https://files.pythonhosted.org/packages/78/fc/045da320987f401af5d2815d351e8aa799aec859f60e29f445e3089eeedb/coverage-7.14.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e57054a583da8ac55edf24117ea4c9133032cfc4cf72aa2d48c1e5d4b52f899", size = 267974, upload-time = "2026-05-10T18:01:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ae/227b1e379497fb7a4fc3286e620f80c8a1e7cec66d45695a01639eb1af65/coverage-7.14.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3499459bbcdd51a65b64c35ab7ed2764eaf3cba826e0df3f1d7fe2e102b70b", size = 261578, upload-time = "2026-05-10T18:01:15.564Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f5/3570342900f2acea31d33ff1590c5d8bac1a8e1a2e1c6d34a5d5e61de681/coverage-7.14.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:45899ec2138a4346ed34d601dedf5076fb74edf2d1dd9dc76a78e82397edee90", size = 264394, upload-time = "2026-05-10T18:01:17.607Z" }, + { url = "https://files.pythonhosted.org/packages/16/29/de1bbc01c935b28f89b1dc3db85b011c055e843a8e5e3b83141c3f80af7f/coverage-7.14.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8767486808c436f05b23ab98eb963fb29185e32a9357a166971685cb3459900f", size = 262022, upload-time = "2026-05-10T18:01:19.304Z" }, + { url = "https://files.pythonhosted.org/packages/35/95/f53890b0bf2fc10ab168e05d38869215e73ca24c4cb521c3bb0eb62fe16b/coverage-7.14.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a3b5ddfd6aa7ddad53ee3edb231e88a2151507a43229b7d71b953916deca127d", size = 265732, upload-time = "2026-05-10T18:01:21.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ea/c919e259081dd2bdf0e43b87209709ba7ec2e4117c2a7f5185379c43463c/coverage-7.14.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:63df0fe568e698e1045792399f8ab6da3a6c2dce3182813fb92afa2641087b47", size = 260921, upload-time = "2026-05-10T18:01:23.533Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2c/c2831889705a81dc5d1c6ca12e4d8e9b95dfc146d153488a6c0ea685d28e/coverage-7.14.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:827d6397dbd95144939b18f89edf31f63e1f99633e8d5f32f22ba8bdda567477", size = 263109, upload-time = "2026-05-10T18:01:25.165Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a9/2fcae5003cac3d63fe344d2166243c2756935f48420863c5272b240d550b/coverage-7.14.0-cp313-cp313t-win32.whl", hash = "sha256:7bf43e000d24012599b879791cff41589af90674722421ef11b11a5431920bab", size = 223212, upload-time = "2026-05-10T18:01:27.157Z" }, + { url = "https://files.pythonhosted.org/packages/3f/bb/18e94d7b14b9b398164197114a587a04ab7c9fdbe1d237eef57311c5e883/coverage-7.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3f5549365af25d770e06b1f8f5682d9a5637d06eb494db91c6fa75d3950cc917", size = 224272, upload-time = "2026-05-10T18:01:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/db/56/4f14fad782b035c81c4ffd09159e7103d42bb1d93ac8496d04b90a11b7da/coverage-7.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6d160217ec6fe890f16ad3a9531761589443749e448f91986c972714fad361c8", size = 222530, upload-time = "2026-05-10T18:01:31.151Z" }, + { url = "https://files.pythonhosted.org/packages/1c/18/b9a6586d73992807c26f9a5f274131be3d76b56b18a82b9392e2a25d2e45/coverage-7.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aed9fa983514ca032790f3fe0d1c0e42ca7e16b42432af1706b50a9a46bef5d", size = 220036, upload-time = "2026-05-10T18:01:33.057Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9b/4165a1d56ddc302a0e2d518fd9d412a4fd0b57562618c78c5f21c57194f5/coverage-7.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba3b8390db29296dbbf49e91b6fe08f990743a90c8f447ba4c2ffc29670dfa63", size = 220368, upload-time = "2026-05-10T18:01:34.705Z" }, + { url = "https://files.pythonhosted.org/packages/69/aa/c12e52a5ba148d9995229d557e3be6e554fe469addc0e9241b2f0956d8ea/coverage-7.14.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3a5d8e876dfa2f102e970b183863d6dedd023d3c0eeca1fe7a9787bc5f28b212", size = 251417, upload-time = "2026-05-10T18:01:36.949Z" }, + { url = "https://files.pythonhosted.org/packages/d7/51/ec641c26e6dca1b25a7d2035ba6ecb7c884ef1a100a9e42fbe4ce4405139/coverage-7.14.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ebb8f4614a3787d567e610bbfdf96a4798dd69a1afb1bd8ad228d4111fe6ff3", size = 253924, upload-time = "2026-05-10T18:01:38.985Z" }, + { url = "https://files.pythonhosted.org/packages/33/c4/59c3de0bd1b538824173fd518fed51c1ce740ca5ed68e74545983f4053a9/coverage-7.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9bf47223dd8db3d4c4b2e443b02bace480d428f0822c3f991600448a176c97", size = 255269, upload-time = "2026-05-10T18:01:40.957Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a9/36dfa153a62040296f6e7febfdb20a5720622f6ef5a81a41e8237b9a5344/coverage-7.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3485a836550b303d006d57cc06e3d5afaabc642c77050b7c985a97b13e3776b8", size = 257583, upload-time = "2026-05-10T18:01:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/26/7b/cc2c048d4114d9ab1c2409e9ee365e5ae10736df6dffcfc9444effa6c708/coverage-7.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e7e88110bae996d199d1693ca8ec3fd52441d426401ae963437598667b4c5eb", size = 251434, upload-time = "2026-05-10T18:01:44.537Z" }, + { url = "https://files.pythonhosted.org/packages/ee/df/6770eaa576e604575e9a78055313250faef5faa84bd6f71a39fece519c43/coverage-7.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15228a6800ce7bdf1b74800595e56db7138cecb338fdbf044806e10dcf182dfe", size = 253280, upload-time = "2026-05-10T18:01:46.175Z" }, + { url = "https://files.pythonhosted.org/packages/ad/9e/1c0264514a3f98259a6d64765a397b2c8373e3ba59ee722a4802d3ec0c61/coverage-7.14.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d26ac7f5398bafc5b57421ad994e8a4749e8a7a0e62d05ec7d53014d5963bfa", size = 251241, upload-time = "2026-05-10T18:01:48.732Z" }, + { url = "https://files.pythonhosted.org/packages/64/16/4efdf3e3c4079cdbf0ece56a2fea872df9e8a3e15a13a0af4400e1075944/coverage-7.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb73254ff43c911c967a899e1359bc5049b4b115d6e8fbdde4937d0a2246cd5", size = 255516, upload-time = "2026-05-10T18:01:50.819Z" }, + { url = "https://files.pythonhosted.org/packages/93/69/b1de96346603881b3d1bc8d6447c83200e1c9700ffbaff926ba01ff5724c/coverage-7.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:454a380af72c6adada298ed270d38c7a391288198dbfb8467f786f588751a90c", size = 251059, upload-time = "2026-05-10T18:01:52.773Z" }, + { url = "https://files.pythonhosted.org/packages/a4/66/2881853e0363a5e0a724d1103e53650795367471b6afb234f8b49e713bc6/coverage-7.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:65c86fb646d2bd2972e96bd1a8b45817ed907cee68655d6295fe7ec031d04cca", size = 252716, upload-time = "2026-05-10T18:01:54.506Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/0d3305d002c41dcde873dbe456491e663dc55152ca526b630b5c47efd62f/coverage-7.14.0-cp314-cp314-win32.whl", hash = "sha256:6a6516b02a6101398e19a3f44820f69bab2590697f7def4331f668b14adaf828", size = 222788, upload-time = "2026-05-10T18:01:56.487Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/6e1b8f52fdc3184b47dc5037f5070d83a3d11042db1594b02d2a44d786c8/coverage-7.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:45e0f79d8351fa76e256716df91eab12890d32678b9590df7ae1042e4bd4cf5d", size = 223600, upload-time = "2026-05-10T18:01:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/00/70/a18c408e674bc26281cadaedc7351f929bd2094e191e4b15271c30b084cc/coverage-7.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:4b899594a8b2d81e5cc064a0d7f9cac2081fed91049456cae7676787e41549c9", size = 222168, upload-time = "2026-05-10T18:02:00.411Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/2681f071d238b62aff8dfc2ab44fc24cfdb38d1c01f391a80522ff5d3a16/coverage-7.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f580f8c80acd94ac72e863efe2cab791d8c38d153e0b463b92dfa000d5c84cd1", size = 220766, upload-time = "2026-05-10T18:02:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/c987babafd9207ffa1995e1ef1f9b26762cf4963aa768a66b6f0501e4616/coverage-7.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a2bd259c442cd43c49b30fbafc51776eb19ea396faf159d26a83e6a0a5f13b0c", size = 221035, upload-time = "2026-05-10T18:02:04.017Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e9/d6a5ac3b333088143d6fc877d398a9a674dc03124a2f776e131f03864823/coverage-7.14.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a706b908dfa85538863504c624b237a3cc34232bf403c057414ebfdb3b4d9f84", size = 262405, upload-time = "2026-05-10T18:02:05.915Z" }, + { url = "https://files.pythonhosted.org/packages/38/b1/e70838d29a7c08e22d44398a46db90815bbcbf28de06992bd9210d1a8d8e/coverage-7.14.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7333cd944ee4393b9b3d3c1b598c936d4fc8d70573a4c7dacfec5590dd50e436", size = 264530, upload-time = "2026-05-10T18:02:07.582Z" }, + { url = "https://files.pythonhosted.org/packages/6b/73/5c31ef97763288d03d9995152b96d5475b527c63d91c84b01caea894b83a/coverage-7.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f162bc9a15b82d947b02651b0c7e1609d6f7a8735ca330cfadec8481dd97d5a", size = 266932, upload-time = "2026-05-10T18:02:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/e1/76/dd56d80f29c5f05b4d76f7e7c6d47cafacae017189c75c5759d24f9ff0cc/coverage-7.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:362cb78e01a5dc82009d88004cf60f2e6b6d6fcbfdec05b05af73b0abf40118f", size = 268062, upload-time = "2026-05-10T18:02:11.399Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c7/27ba85cd5b95614f159ff93ebff1901584a8d192e2e5e24c4943a7453f59/coverage-7.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:acebd068fca5512c3a6fde9c045f901613478781a73f0e82b307b214daef23fb", size = 261504, upload-time = "2026-05-10T18:02:13.257Z" }, + { url = "https://files.pythonhosted.org/packages/13/2e/e8149f60ab5d5684c6eee881bdf34b127115cddbb958b196768dd9d63473/coverage-7.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:29fe3da551dface75deb2ccbf87b6b66e2e7ef38f6d89050b428be94afff3490", size = 264398, upload-time = "2026-05-10T18:02:15.063Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7f/1261b025285323225f4b4abffa5a643649dfd67e25ddca7ebcbdea3b7cb3/coverage-7.14.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b4cc4fce8672fffcb09b0eafc167b396b3ba53c4a7230f54b7aaffbf6c835fa9", size = 262000, upload-time = "2026-05-10T18:02:16.756Z" }, + { url = "https://files.pythonhosted.org/packages/d3/dc/829c54f60b9d08389439c00f813c752781c496fc5788c78d8006db4b4f2b/coverage-7.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5d4a51aad8ba8bdcd2b8bd8f03d4aca19693fa2327a3470e4718a25b03481020", size = 265732, upload-time = "2026-05-10T18:02:18.817Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b0/70bd1419941652fa062689cba9c3eeafb8f5e6fbb890bce41c3bdda5dbd6/coverage-7.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9f323af3e1e4f68b60b7b247e37b8515563a61375518fa59de1af48ba28a3db6", size = 260847, upload-time = "2026-05-10T18:02:20.528Z" }, + { url = "https://files.pythonhosted.org/packages/f2/73/be40b2390656c654d35ea0015ea7ba3d945769cf80790ad5e0bb2d56d2ba/coverage-7.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1a0abc7342ea9711c469dd8b821c6c311e6bc6aac1442e5fbd6b27fae0a8f3db", size = 263166, upload-time = "2026-05-10T18:02:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/29/55/4a643f712fcf7cf2881f8ec1e0ccb7b164aff3108f69b51801246c8799f2/coverage-7.14.0-cp314-cp314t-win32.whl", hash = "sha256:a9f864ef57b7172e2db87a096642dd51e179e085ab6b2c371c29e885f65c8fb2", size = 223573, upload-time = "2026-05-10T18:02:24.11Z" }, + { url = "https://files.pythonhosted.org/packages/27/96/3acae5da0953be042c0b4dea6d6789d2f080701c77b88e44d5bd41b9219b/coverage-7.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:29943e552fdc08e082eb51400fb2f58e118a83b5542bd06531214e084399b644", size = 224680, upload-time = "2026-05-10T18:02:25.896Z" }, + { url = "https://files.pythonhosted.org/packages/93/3d/6ab5d2dd8325d838737c6f8d83d62eb6230e0d70b87b51b57bbfd08fa767/coverage-7.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:742a73ea621953b012f2c4c2219b512180dd84489acf5b1596b0aafc55b9100b", size = 222703, upload-time = "2026-05-10T18:02:27.822Z" }, + { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, ] [package.optional-dependencies] @@ -650,61 +690,61 @@ toml = [ [[package]] name = "cryptography" -version = "47.0.0" +version = "48.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", hash = "sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb", size = 830863, upload-time = "2026-04-24T19:54:57.056Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/98/40dfe932134bdcae4f6ab5927c87488754bf9eb79297d7e0070b78dd58e9/cryptography-47.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:160ad728f128972d362e714054f6ba0067cab7fb350c5202a9ae8ae4ce3ef1a0", size = 7912214, upload-time = "2026-04-24T19:53:03.864Z" }, - { url = "https://files.pythonhosted.org/packages/34/c6/2733531243fba725f58611b918056b277692f1033373dcc8bd01af1c05d4/cryptography-47.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b9a8943e359b7615db1a3ba587994618e094ff3d6fa5a390c73d079ce18b3973", size = 4644617, upload-time = "2026-04-24T19:53:06.909Z" }, - { url = "https://files.pythonhosted.org/packages/00/e3/b27be1a670a9b87f855d211cf0e1174a5d721216b7616bd52d8581d912ed/cryptography-47.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5c15764f261394b22aef6b00252f5195f46f2ca300bec57149474e2538b31f8", size = 4668186, upload-time = "2026-04-24T19:53:09.053Z" }, - { url = "https://files.pythonhosted.org/packages/81/b9/8443cfe5d17d482d348cee7048acf502bb89a51b6382f06240fd290d4ca3/cryptography-47.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9c59ab0e0fa3a180a5a9c59f3a5abe3ef90d474bc56d7fadfbe80359491b615b", size = 4651244, upload-time = "2026-04-24T19:53:11.217Z" }, - { url = "https://files.pythonhosted.org/packages/5d/5e/13ed0cdd0eb88ba159d6dd5ebfece8cb901dbcf1ae5ac4072e28b55d3153/cryptography-47.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:34b4358b925a5ea3e14384ca781a2c0ef7ac219b57bb9eacc4457078e2b19f92", size = 5252906, upload-time = "2026-04-24T19:53:13.532Z" }, - { url = "https://files.pythonhosted.org/packages/64/16/ed058e1df0f33d440217cd120d41d5dda9dd215a80b8187f68483185af82/cryptography-47.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0024b87d47ae2399165a6bfb20d24888881eeab83ae2566d62467c5ff0030ce7", size = 4701842, upload-time = "2026-04-24T19:53:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/02/e0/3d30986b30fdbd9e969abbdf8ba00ed0618615144341faeb57f395a084fe/cryptography-47.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:1e47422b5557bb82d3fff997e8d92cff4e28b9789576984f08c248d2b3535d93", size = 4289313, upload-time = "2026-04-24T19:53:17.755Z" }, - { url = "https://files.pythonhosted.org/packages/df/fd/32db38e3ad0cb331f0691cb4c7a8a6f176f679124dee746b3af6633db4d9/cryptography-47.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6f29f36582e6151d9686235e586dd35bb67491f024767d10b842e520dc6a07ac", size = 4650964, upload-time = "2026-04-24T19:53:20.062Z" }, - { url = "https://files.pythonhosted.org/packages/86/53/5395d944dfd48cb1f67917f533c609c34347185ef15eb4308024c876f274/cryptography-47.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a9b761f012a943b7de0e828843c5688d0de94a0578d44d6c85a1bae32f87791f", size = 5207817, upload-time = "2026-04-24T19:53:22.498Z" }, - { url = "https://files.pythonhosted.org/packages/34/4f/e5711b28e1901f7d480a2b1b688b645aa4c77c73f10731ed17e7f7db3f0d/cryptography-47.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4e1de79e047e25d6e9f8cea71c86b4a53aced64134f0f003bbcbf3655fd172c8", size = 4701544, upload-time = "2026-04-24T19:53:24.356Z" }, - { url = "https://files.pythonhosted.org/packages/22/22/c8ddc25de3010fc8da447648f5a092c40e7a8fadf01dd6d255d9c0b9373d/cryptography-47.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef6b3634087f18d2155b1e8ce264e5345a753da2c5fa9815e7d41315c90f8318", size = 4783536, upload-time = "2026-04-24T19:53:26.665Z" }, - { url = "https://files.pythonhosted.org/packages/66/b6/d4a68f4ea999c6d89e8498579cba1c5fcba4276284de7773b17e4fa69293/cryptography-47.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:11dbb9f50a0f1bb9757b3d8c27c1101780efb8f0bdecfb12439c22a74d64c001", size = 4926106, upload-time = "2026-04-24T19:53:28.686Z" }, - { url = "https://files.pythonhosted.org/packages/54/ed/5f524db1fade9c013aa618e1c99c6ed05e8ffc9ceee6cda22fed22dda3f4/cryptography-47.0.0-cp311-abi3-win32.whl", hash = "sha256:7fda2f02c9015db3f42bb8a22324a454516ed10a8c29ca6ece6cdbb5efe2a203", size = 3258581, upload-time = "2026-04-24T19:53:31.058Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dc/1b901990b174786569029f67542b3edf72ac068b6c3c8683c17e6a2f5363/cryptography-47.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:f5c3296dab66202f1b18a91fa266be93d6aa0c2806ea3d67762c69f60adc71aa", size = 3775309, upload-time = "2026-04-24T19:53:33.054Z" }, - { url = "https://files.pythonhosted.org/packages/14/88/7aa18ad9c11bc87689affa5ce4368d884b517502d75739d475fc6f4a03c7/cryptography-47.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:be12cb6a204f77ed968bcefe68086eb061695b540a3dd05edac507a3111b25f0", size = 7904299, upload-time = "2026-04-24T19:53:35.003Z" }, - { url = "https://files.pythonhosted.org/packages/07/55/c18f75724544872f234678fdedc871391722cb34a2aee19faa9f63100bb2/cryptography-47.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2ebd84adf0728c039a3be2700289378e1c164afc6748df1a5ed456767bef9ba7", size = 4631180, upload-time = "2026-04-24T19:53:37.517Z" }, - { url = "https://files.pythonhosted.org/packages/ee/65/31a5cc0eaca99cec5bafffe155d407115d96136bb161e8b49e0ef73f09a7/cryptography-47.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f68d6fbc7fbbcfb0939fea72c3b96a9f9a6edfc0e1b1d29778a2066030418b1", size = 4653529, upload-time = "2026-04-24T19:53:39.775Z" }, - { url = "https://files.pythonhosted.org/packages/e5/bc/641c0519a495f3bfd0421b48d7cd325c4336578523ccd76ea322b6c29c7a/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:6651d32eff255423503aa276739da98c30f26c40cbeffcc6048e0d54ef704c0c", size = 4638570, upload-time = "2026-04-24T19:53:42.129Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f2/300327b0a47f6dc94dd8b71b57052aefe178bb51745073d73d80604f11ab/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3fb8fa48075fad7193f2e5496135c6a76ac4b2aa5a38433df0a539296b377829", size = 5238019, upload-time = "2026-04-24T19:53:44.577Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5a/5b5cf994391d4bf9d9c7efd4c66aabe4d95227256627f8fea6cff7dfadbd/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11438c7518132d95f354fa01a4aa2f806d172a061a7bed18cf18cbdacdb204d7", size = 4686832, upload-time = "2026-04-24T19:53:47.015Z" }, - { url = "https://files.pythonhosted.org/packages/dc/2c/ae950e28fd6475c852fc21a44db3e6b5bcc1261d1e370f2b6e42fa800fef/cryptography-47.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8c1a736bbb3288005796c3f7ccb9453360d7fed483b13b9f468aea5171432923", size = 4269301, upload-time = "2026-04-24T19:53:48.97Z" }, - { url = "https://files.pythonhosted.org/packages/67/fb/6a39782e150ffe5cc1b0018cb6ddc48bf7ca62b498d7539ffc8a758e977d/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:f1557695e5c2b86e204f6ce9470497848634100787935ab7adc5397c54abd7ab", size = 4638110, upload-time = "2026-04-24T19:53:51.011Z" }, - { url = "https://files.pythonhosted.org/packages/8e/d7/0b3c71090a76e5c203164a47688b697635ece006dcd2499ab3a4dbd3f0bd/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:f9a034b642b960767fb343766ae5ba6ad653f2e890ddd82955aef288ffea8736", size = 5194988, upload-time = "2026-04-24T19:53:52.962Z" }, - { url = "https://files.pythonhosted.org/packages/63/33/63a961498a9df51721ab578c5a2622661411fc520e00bd83b0cc64eb20c4/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b1c76fca783aa7698eb21eb14f9c4aa09452248ee54a627d125025a43f83e7a7", size = 4686563, upload-time = "2026-04-24T19:53:55.274Z" }, - { url = "https://files.pythonhosted.org/packages/b7/bf/5ee5b145248f92250de86145d1c1d6edebbd57a7fe7caa4dedb5d4cf06a1/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4f7722c97826770bab8ae92959a2e7b20a5e9e9bf4deae68fd86c3ca457bab52", size = 4770094, upload-time = "2026-04-24T19:53:57.753Z" }, - { url = "https://files.pythonhosted.org/packages/92/43/21d220b2da5d517773894dacdcdb5c682c28d3fffce65548cb06e87d5501/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:09f6d7bf6724f8db8b32f11eccf23efc8e759924bc5603800335cf8859a3ddbd", size = 4913811, upload-time = "2026-04-24T19:54:00.236Z" }, - { url = "https://files.pythonhosted.org/packages/31/98/dc4ad376ac5f1a1a7d4a83f7b0c6f2bcad36b5d2d8f30aeb482d3a7d9582/cryptography-47.0.0-cp314-cp314t-win32.whl", hash = "sha256:6eebcaf0df1d21ce1f90605c9b432dd2c4f4ab665ac29a40d5e3fc68f51b5e63", size = 3237158, upload-time = "2026-04-24T19:54:02.606Z" }, - { url = "https://files.pythonhosted.org/packages/bc/da/97f62d18306b5133468bc3f8cc73a3111e8cdc8cf8d3e69474d6e5fd2d1b/cryptography-47.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:51c9313e90bd1690ec5a75ed047c27c0b8e6c570029712943d6116ef9a90620b", size = 3758706, upload-time = "2026-04-24T19:54:04.433Z" }, - { url = "https://files.pythonhosted.org/packages/e0/34/a4fae8ae7c3bc227460c9ae43f56abf1b911da0ec29e0ebac53bb0a4b6b7/cryptography-47.0.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:14432c8a9bcb37009784f9594a62fae211a2ae9543e96c92b2a8e4c3cd5cd0c4", size = 7904072, upload-time = "2026-04-24T19:54:06.411Z" }, - { url = "https://files.pythonhosted.org/packages/01/64/d7b1e54fdb69f22d24a64bb3e88dc718b31c7fb10ef0b9691a3cf7eeea6e/cryptography-47.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:07efe86201817e7d3c18781ca9770bc0db04e1e48c994be384e4602bc38f8f27", size = 4635767, upload-time = "2026-04-24T19:54:08.519Z" }, - { url = "https://files.pythonhosted.org/packages/8b/7b/cca826391fb2a94efdcdfe4631eb69306ee1cff0b22f664a412c90713877/cryptography-47.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b45761c6ec22b7c726d6a829558777e32d0f1c8be7c3f3480f9c912d5ee8a10", size = 4654350, upload-time = "2026-04-24T19:54:10.795Z" }, - { url = "https://files.pythonhosted.org/packages/4c/65/4b57bcc823f42a991627c51c2f68c9fd6eb1393c1756aac876cba2accae2/cryptography-47.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:edd4da498015da5b9f26d38d3bfc2e90257bfa9cbed1f6767c282a0025ae649b", size = 4643394, upload-time = "2026-04-24T19:54:13.275Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c4/2c5fbeea70adbbca2bbae865e1d605d6a4a7f8dbd9d33eaf69645087f06c/cryptography-47.0.0-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9af828c0d5a65c70ec729cd7495a4bf1a67ecb66417b8f02ff125ab8a6326a74", size = 5225777, upload-time = "2026-04-24T19:54:15.18Z" }, - { url = "https://files.pythonhosted.org/packages/7e/b8/ac57107ef32749d2b244e36069bb688792a363aaaa3acc9e3cf84c130315/cryptography-47.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:256d07c78a04d6b276f5df935a9923275f53bd1522f214447fdf365494e2d515", size = 4688771, upload-time = "2026-04-24T19:54:17.835Z" }, - { url = "https://files.pythonhosted.org/packages/56/fc/9f1de22ff8be99d991f240a46863c52d475404c408886c5a38d2b5c3bb26/cryptography-47.0.0-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:5d0e362ff51041b0c0d219cc7d6924d7b8996f57ce5712bdcef71eb3c65a59cc", size = 4270753, upload-time = "2026-04-24T19:54:19.963Z" }, - { url = "https://files.pythonhosted.org/packages/00/68/d70c852797aa68e8e48d12e5a87170c43f67bb4a59403627259dd57d15de/cryptography-47.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:1581aef4219f7ca2849d0250edaa3866212fb74bf5667284f46aa92f9e65c1ca", size = 4642911, upload-time = "2026-04-24T19:54:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/a5/51/661cbee74f594c5d97ff82d34f10d5551c085ca4668645f4606ebd22bd5d/cryptography-47.0.0-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a49a3eb5341b9503fa3000a9a0db033161db90d47285291f53c2a9d2cd1b7f76", size = 5181411, upload-time = "2026-04-24T19:54:24.376Z" }, - { url = "https://files.pythonhosted.org/packages/94/87/f2b6c374a82cf076cfa1416992ac8e8ec94d79facc37aec87c1a5cb72352/cryptography-47.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2207a498b03275d0051589e326b79d4cf59985c99031b05bb292ac52631c37fe", size = 4688262, upload-time = "2026-04-24T19:54:26.946Z" }, - { url = "https://files.pythonhosted.org/packages/14/e2/8b7462f4acf21ec509616f0245018bb197194ab0b65c2ea21a0bdd53c0eb/cryptography-47.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7a02675e2fabd0c0fc04c868b8781863cbf1967691543c22f5470500ff840b31", size = 4775506, upload-time = "2026-04-24T19:54:28.926Z" }, - { url = "https://files.pythonhosted.org/packages/70/75/158e494e4c08dc05e039da5bb48553826bd26c23930cf8d3cd5f21fa8921/cryptography-47.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80887c5cbd1774683cb126f0ab4184567f080071d5acf62205acb354b4b753b7", size = 4912060, upload-time = "2026-04-24T19:54:30.869Z" }, - { url = "https://files.pythonhosted.org/packages/06/bd/0a9d3edbf5eadbac926d7b9b3cd0c4be584eeeae4a003d24d9eda4affbbd/cryptography-47.0.0-cp38-abi3-win32.whl", hash = "sha256:ed67ea4e0cfb5faa5bc7ecb6e2b8838f3807a03758eec239d6c21c8769355310", size = 3248487, upload-time = "2026-04-24T19:54:33.494Z" }, - { url = "https://files.pythonhosted.org/packages/60/80/5681af756d0da3a599b7bdb586fac5a1540f1bcefd2717a20e611ddade45/cryptography-47.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:835d2d7f47cdc53b3224e90810fb1d36ca94ea29cc1801fb4c1bc43876735769", size = 3755737, upload-time = "2026-04-24T19:54:35.408Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a0/928c9ce0d120a40a81aa99e3ba383e87337b9ac9ef9f6db02e4d7822424d/cryptography-47.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f1207974a904e005f762869996cf620e9bf79ecb4622f148550bb48e0eb35a7", size = 3909893, upload-time = "2026-04-24T19:54:38.334Z" }, - { url = "https://files.pythonhosted.org/packages/81/75/d691e284750df5d9569f2b1ce4a00a71e1d79566da83b2b3e5549c84917f/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:1a405c08857258c11016777e11c02bacbe7ef596faf259305d282272a3a05cbe", size = 4587867, upload-time = "2026-04-24T19:54:40.619Z" }, - { url = "https://files.pythonhosted.org/packages/07/d6/1b90f1a4e453009730b4545286f0b39bb348d805c11181fc31544e4f9a65/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:20fdbe3e38fb67c385d233c89371fa27f9909f6ebca1cecc20c13518dae65475", size = 4627192, upload-time = "2026-04-24T19:54:42.849Z" }, - { url = "https://files.pythonhosted.org/packages/dc/53/cb358a80e9e359529f496870dd08c102aa8a4b5b9f9064f00f0d6ed5b527/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f7db373287273d8af1414cf95dc4118b13ffdc62be521997b0f2b270771fef50", size = 4587486, upload-time = "2026-04-24T19:54:44.908Z" }, - { url = "https://files.pythonhosted.org/packages/8b/57/aaa3d53876467a226f9a7a82fd14dd48058ad2de1948493442dfa16e2ffd/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9fe6b7c64926c765f9dff301f9c1b867febcda5768868ca084e18589113732ab", size = 4626327, upload-time = "2026-04-24T19:54:47.813Z" }, - { url = "https://files.pythonhosted.org/packages/ab/9c/51f28c3550276bcf35660703ba0ab829a90b88be8cd98a71ef23c2413913/cryptography-47.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cffbba3392df0fa8629bb7f43454ee2925059ee158e23c54620b9063912b86c8", size = 3698916, upload-time = "2026-04-24T19:54:49.782Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, + { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, + { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" }, + { url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, + { url = "https://files.pythonhosted.org/packages/be/d2/024b5e06be9d44cb021fb0e1a03d34d63989cf56a0fe62f3dfbab695b9b4/cryptography-48.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855", size = 3950391, upload-time = "2026-05-04T22:59:17.415Z" }, + { url = "https://files.pythonhosted.org/packages/bc/17/3861e17c56fa0fd37491a14a8673fdb77c57fc5693cafe745ea8b06dba75/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b", size = 4637126, upload-time = "2026-05-04T22:59:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0a/7e226dbff530f21480727eb764973a7bff2b912f8e15cd4f129e71b56d1d/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13", size = 4667270, upload-time = "2026-05-04T22:59:22.647Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f2/5a72274ca9f1b2a8b44a662ee0bf1b435909deb473d6f97bcd035bcdbc71/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb", size = 4636797, upload-time = "2026-05-04T22:59:24.912Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e1/48cedb2fe63626e91ded1edad159e2a4fb8b6906c4425eb7749673077ce7/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355", size = 4666800, upload-time = "2026-05-04T22:59:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ca/7e8365deec19afb2b2c7be7c1c0aa8f99633b54e90c570999acda93260fc/cryptography-48.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a", size = 3739536, upload-time = "2026-05-04T22:59:29.61Z" }, ] [[package]] @@ -712,7 +752,7 @@ name = "cuda-bindings" version = "12.9.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-pathfinder", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "cuda-pathfinder" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/1f/a5/e9d37c10f6c27c9c65d53c6cd6d9763e1df99c004780585fc2ad9041fbe3/cuda_bindings-12.9.6-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2662f59db67d9aeaf8959c593c91f600792c2970cf02cae2814387fc687b115a", size = 7090971, upload-time = "2026-03-11T14:47:29.526Z" }, @@ -747,37 +787,37 @@ wheels = [ [package.optional-dependencies] cublas = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] cudart = [ - { name = "nvidia-cuda-runtime-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] cufft = [ - { name = "nvidia-cufft-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] cufile = [ { name = "nvidia-cufile-cu12", marker = "sys_platform == 'linux'" }, ] cupti = [ - { name = "nvidia-cuda-cupti-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] curand = [ - { name = "nvidia-curand-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] cusolver = [ - { name = "nvidia-cusolver-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] cusparse = [ - { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] nvjitlink = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] nvrtc = [ - { name = "nvidia-cuda-nvrtc-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] nvtx = [ - { name = "nvidia-nvtx-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] [[package]] @@ -800,38 +840,38 @@ wheels = [ [[package]] name = "duckdb" -version = "1.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/66/744b4931b799a42f8cb9bc7a6f169e7b8e51195b62b246db407fd90bf15f/duckdb-1.5.2.tar.gz", hash = "sha256:638da0d5102b6cb6f7d47f83d0600708ac1d3cb46c5e9aaabc845f9ba4d69246", size = 18017166, upload-time = "2026-04-13T11:30:09.065Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/b0/d13e7e396d86c245290b3e93f692a2d27c2fe99f857aaf9205003c00c978/duckdb-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f69164b048e498b9e9140a24343108a5ae5f17bfb3485185f55fdf9b1aa924d", size = 30020978, upload-time = "2026-04-13T11:28:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/70/7b/ae1ec7f516394aa55501d1949af1f731be8d9d7433f0acc3f4632a0ba484/duckdb-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81fc4fbf0b5e25840b39ba2a10b78c6953c0314d5d0434191e7898f34ab1bba3", size = 15947821, upload-time = "2026-04-13T11:28:55.981Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a5/cae0105e01a85f85ead61723bb42dab14c2f8ec49f91e67a2372c02574a4/duckdb-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56d38b3c4e0ef2abb58898d0fd423933999ed535c45e75e9d9f72e1d5fed69b8", size = 14201656, upload-time = "2026-04-13T11:28:58.316Z" }, - { url = "https://files.pythonhosted.org/packages/50/db/46c57e8813ac33762bddc9545610ed648751c5b6a379abf2dc6035505ce4/duckdb-1.5.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:376856066c65ccd55fcb3a380bbe33a71ce089fc4623d229ffc6e82251afdb6d", size = 19285181, upload-time = "2026-04-13T11:29:01.041Z" }, - { url = "https://files.pythonhosted.org/packages/dc/a2/67694010693ec8c8c975e6991f48ef886d35ecbdaa2f287234882a403c21/duckdb-1.5.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c69907354ffee94ba8cf782daf0480dab7557f21ce27fffa6c0ea8f74ed4b8e2", size = 21394852, upload-time = "2026-04-13T11:29:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/52/9f/2b1618c5a93949a70dcf105293db7e27bb2b2cc4aeb1ff46b806f430ec81/duckdb-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:d9b4f5430bf4f05d4c0dc4c55c75def3a5af4be0343be20fa2bfc577343fbfc9", size = 13095526, upload-time = "2026-04-13T11:29:06.265Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e9/cb39e0d94a32f5333e819112fd01439a31f541f9c56a31b66f9bd209704b/duckdb-1.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:2323c1195c10fb2bb982fc0218c730b43d1b92a355d61e68e3c5f3ac9d44c34f", size = 13946215, upload-time = "2026-04-13T11:29:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/41/de/ebe66bbe78125fc610f4fd415447a65349d94245950f3b3dfb31d028af02/duckdb-1.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e6495b00cad16888384119842797c49316a96ae1cb132bb03856d980d95afee1", size = 30064950, upload-time = "2026-04-13T11:29:11.468Z" }, - { url = "https://files.pythonhosted.org/packages/2d/8a/3e25b5d03bcf1fb99d189912f8ce92b1db4f9c8778e1b1f55745973a855a/duckdb-1.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d72b8856b1839d35648f38301b058f6232f4d36b463fe4dc8f4d3fdff2df1a2e", size = 15969113, upload-time = "2026-04-13T11:29:14.139Z" }, - { url = "https://files.pythonhosted.org/packages/19/bb/58001f0815002b1a93431bf907f77854085c7d049b83d521814a07b9db0b/duckdb-1.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a1de4f4d454b8c97aec546c82003fc834d3422ce4bc6a19902f3462ef293bed", size = 14224774, upload-time = "2026-04-13T11:29:16.758Z" }, - { url = "https://files.pythonhosted.org/packages/d3/2f/a7f0de9509d1cef35608aeb382919041cdd70f58c173865c3da6a0d87979/duckdb-1.5.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce0b8141a10d37ecef729c45bc41d334854013f4389f1488bd6035c5579aaac1", size = 19313510, upload-time = "2026-04-13T11:29:19.574Z" }, - { url = "https://files.pythonhosted.org/packages/26/78/eb1e064ea8b9df3b87b167bfd7a407b2f615a4291e06cba756727adfa06c/duckdb-1.5.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99ef73a277c8921bc0a1f16dee38d924484251d9cfd20951748c20fcd5ed855", size = 21429692, upload-time = "2026-04-13T11:29:22.575Z" }, - { url = "https://files.pythonhosted.org/packages/5b/12/05b0c47d14839925c5e35b79081d918ca82e3f236bb724a6f58409dd5291/duckdb-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:8d599758b4e48bf12e18c9b960cf491d219f0c4972d19a45489c05cc5ab36f83", size = 13107594, upload-time = "2026-04-13T11:29:25.43Z" }, - { url = "https://files.pythonhosted.org/packages/0b/2c/80558a82b236e044330e84a154b96aacddb343316b479f3d49be03ea11cb/duckdb-1.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:fc85a5dbcbe6eccac1113c72370d1d3aacfdd49198d63950bdf7d8638a307f00", size = 13927537, upload-time = "2026-04-13T11:29:27.842Z" }, - { url = "https://files.pythonhosted.org/packages/98/f2/e3d742808f138d374be4bb516fade3d1f33749b813650810ab7885cdc363/duckdb-1.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4420b3f47027a7849d0e1815532007f377fa95ee5810b47ea717d35525c12f79", size = 30064879, upload-time = "2026-04-13T11:29:30.763Z" }, - { url = "https://files.pythonhosted.org/packages/72/0d/f3dc1cf97e1267ca15e4307d456f96ce583961f0703fd75e62b2ad8d64fa/duckdb-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bb42e6ed543902e14eae647850da24103a89f0bc2587dec5601b1c1f213bd2ed", size = 15969327, upload-time = "2026-04-13T11:29:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e0/d5418def53ae4e05a63075705ff44ed5af5a1a5932627eb2b600c5df1c93/duckdb-1.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:98c0535cd6d901f61a5ea3c2e26a1fd28482953d794deb183daf568e3aa5dda6", size = 14225107, upload-time = "2026-04-13T11:29:35.882Z" }, - { url = "https://files.pythonhosted.org/packages/16/a7/15aaa59dbecc35e9711980fcdbf525b32a52470b32d18ef678193a146213/duckdb-1.5.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:486c862bf7f163c0110b6d85b3e5c031d224a671cca468f12ebb1d3a348f6b39", size = 19313433, upload-time = "2026-04-13T11:29:38.367Z" }, - { url = "https://files.pythonhosted.org/packages/bd/21/d903cc63a5140c822b7b62b373a87dc557e60c29b321dfb435061c5e67cf/duckdb-1.5.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70631c847ca918ee710ec874241b00cf9d2e5be90762cbb2a0389f17823c08f7", size = 21429837, upload-time = "2026-04-13T11:29:41.135Z" }, - { url = "https://files.pythonhosted.org/packages/e3/0a/b770d1f60c70597302130d6247f418549b7094251a02348fbaf1c7e147ae/duckdb-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:52a21823f3fbb52f0f0e5425e20b07391ad882464b955879499b5ff0b45a376b", size = 13107699, upload-time = "2026-04-13T11:29:43.905Z" }, - { url = "https://files.pythonhosted.org/packages/d9/cf/e200fe431d700962d1a908d2ce89f53ccee1cc8db260174ae663ba09686b/duckdb-1.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:411ad438bd4140f189a10e7f515781335962c5d18bd07837dc6d202e3985253d", size = 13927646, upload-time = "2026-04-13T11:29:46.598Z" }, - { url = "https://files.pythonhosted.org/packages/83/a1/f6286c67726cc1ea60a6e3c0d9fbc66527dde24ae089a51bbe298b13ca78/duckdb-1.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6b0fe75c148000f060aa1a27b293cacc0ea08cc1cad724fbf2143d56070a3785", size = 30078598, upload-time = "2026-04-13T11:29:49.828Z" }, - { url = "https://files.pythonhosted.org/packages/de/6a/59febb02f21a4a5c6b0b0099ef7c965fdd5e61e4904cf813809bb792e35f/duckdb-1.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35579b8e3a064b5eaf15b0eafc558056a13f79a0a62e34cc4baf57119daecfec", size = 15975120, upload-time = "2026-04-13T11:29:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/09/70/ce750854d37bb5a45cccbb2c3cb04df4af56aea8fc30a2499bb643b4a9c0/duckdb-1.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea58ff5b0880593a280cf5511734b17711b32ee1f58b47d726e8600848358160", size = 14227762, upload-time = "2026-04-13T11:29:55.564Z" }, - { url = "https://files.pythonhosted.org/packages/28/dc/ad45ac3c0b6c4687dc649e8f6cf01af1c8b0443932a39b2abb4ebcb3babd/duckdb-1.5.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef461bca07313412dc09961c4a4757a851f56b95ac01c58fac6007632b7b94f2", size = 19315668, upload-time = "2026-04-13T11:29:58.427Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b1/1464f468d2e5813f5808de95df9d3113a645a5bfa2ffcaecbc542ddae272/duckdb-1.5.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be37680ddb380015cb37318e378c53511c45c4f0d8fac5599d22b7d092b9217a", size = 21434056, upload-time = "2026-04-13T11:30:01.238Z" }, - { url = "https://files.pythonhosted.org/packages/ce/32/6673607e024722473fa7aafdd29c0e3dd231dd528f6cd8b5797fbeeb229d/duckdb-1.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:0b291786014df1133f8f18b9df4d004484613146e858d71a21791e0fcca16cf4", size = 13633667, upload-time = "2026-04-13T11:30:04.05Z" }, - { url = "https://files.pythonhosted.org/packages/7a/e3/9d34173ec068631faea3ea6e73050700729363e7e33306a9a3218e5cdc61/duckdb-1.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:c9f3e0b71b8a50fccfb42794899285d9d318ce2503782b9dd54868e5ecd0ad31", size = 14402513, upload-time = "2026-04-13T11:30:06.609Z" }, +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/00/d579dcb2a536b6ea3a2563cdad6844f77d81a9b2d4b22a858097f2468acf/duckdb-1.5.3.tar.gz", hash = "sha256:df39428eb130faa35ae96fd35245bdeae6ecf43936250b116b5fead568eb9f16", size = 18026640, upload-time = "2026-05-20T11:55:31.901Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/fc/a8a89c6c73f31c2b58c6abbc2f543e0b736042dd5ef7cc1784c24ec31428/duckdb-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:341a2672e2551ba51c95c1898f0ade983e76675e79038ccb16342c3d6cfb82d7", size = 32583465, upload-time = "2026-05-20T11:54:13.132Z" }, + { url = "https://files.pythonhosted.org/packages/63/f1/3423a2f523dd034e505d4a5dd8e210ae577212e152598dc13b6a5e736e1b/duckdb-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c9e8fa408705081160ede7ead238d16e73a36b8561b700f2bf2d650ae48e7b92", size = 17278520, upload-time = "2026-05-20T11:54:16.368Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1a/7bf5ba1b7ea520557e6b2dbee1c85abab016bdac0c1779d9d0ef76c87300/duckdb-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70a18f932cf6d87bd0e554613657a515c1443a1724aacfc7ec5137dd28698b03", size = 15424794, upload-time = "2026-05-20T11:54:19.891Z" }, + { url = "https://files.pythonhosted.org/packages/ad/16/ce4b1e386e45fab0268edbf1b85bace20e9437589e9edb2bd5f9a226fa44/duckdb-1.5.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e80eb4d0fb59869cb2c7d7ef494c07fb92014fe8e77d96c170cd1ebc1488a708", size = 19306666, upload-time = "2026-05-20T11:54:22.77Z" }, + { url = "https://files.pythonhosted.org/packages/99/1f/651f8453f26931e8061b7e27b3090f868868185814ecb9216d0bd71ec8ef/duckdb-1.5.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3248b49cd835ea322574bc6aac0ae7a83be85547f49d4f5f5777cb380ee6627f", size = 21418306, upload-time = "2026-05-20T11:54:25.616Z" }, + { url = "https://files.pythonhosted.org/packages/bc/64/e1ffebf010b1631a6fef8d1508f46d4eab3e97c18729af986bb796fa8452/duckdb-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:f4eff89c12c3a362efa012262e57b7b4ab904a7f79bad9178fe365510077abe8", size = 13101423, upload-time = "2026-05-20T11:54:28.107Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/b1d4e34f9658cc0e13d7aae581ab82643f50a548d5aee8767f0c587cc3a4/duckdb-1.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:75d13308c9da3ee431d1e72b8ab720aa74a1b3e9159d4124cb62435924496334", size = 13951740, upload-time = "2026-05-20T11:54:30.886Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/2e34929b16c8d544ef664fad8f7f3a2a9db05746aae1e7c8c4ee3a8b23e4/duckdb-1.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ff11a457258148337ef9a392148a8cdbd1069b6c27c21958816c7b67fe6c542d", size = 32626494, upload-time = "2026-05-20T11:54:33.738Z" }, + { url = "https://files.pythonhosted.org/packages/3a/53/3af681793d03771365ae3e2215331151c196a3ac8193f613344840694671/duckdb-1.5.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fd25f533cb1b6b2c84cc767a9a9bab7769bb1aa44571a2a0bfc91ac3e4a38ac", size = 17301121, upload-time = "2026-05-20T11:54:36.928Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/c80af1eac2ab5d35fc2c372ef0a84668842e549fbbf7799277b3fccf3e39/duckdb-1.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10960400ed60cdf0fe05bab2086fa8eb733889cb0ceca18d07ff9a00c0e0be7b", size = 15449283, upload-time = "2026-05-20T11:54:39.777Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9a/c63af233c9f761bf5178a5210437e1bc6bcb30fa8a9073de6398cfb12c03/duckdb-1.5.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5f18e7561403054433706c187589e86629a7af09a7efc23a06a8b308e6acc68", size = 19332762, upload-time = "2026-05-20T11:54:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/21/cc/2d77af4fff86012f334ef82e6d54a995a86c8745e58074f1218ed7d25171/duckdb-1.5.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fb7516255a8764545e30f7efacea408cc847764a3027b3b0b3e7d1a7bebbc5c", size = 21453290, upload-time = "2026-05-20T11:54:45.272Z" }, + { url = "https://files.pythonhosted.org/packages/8d/5e/9bc4817a98feb4dab83e56f2245cd3a30d00ee646d4dec7926464e2b3f28/duckdb-1.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8001eccbc28be244dfd04d708526f34ddd6460b47a8aeb5d0e39d6f7f9e3fe15", size = 13118308, upload-time = "2026-05-20T11:54:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/81/35/e3f32e4e53e2450ddb1db8312a17d1ce455d60cc4941b6ad2cfc908794b0/duckdb-1.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:6d2835e39bb6af73891f73c0f8d4324f98afe00d0b00c6d34b2a582c2256cbb0", size = 13927187, upload-time = "2026-05-20T11:54:50.584Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/a528eb09d8be51954c485864bd06753e616939a080cbc3dd4417e8c94a57/duckdb-1.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e75a6122c12579a99848517f6f00a4e342aebda3590c30fe9b5cc5f39d5e6afc", size = 32626254, upload-time = "2026-05-20T11:54:53.65Z" }, + { url = "https://files.pythonhosted.org/packages/ec/3c/1534c0a6db347c05eb7d0f6ecfb7aefbe74cbff398e4892a8fd1903a20e8/duckdb-1.5.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fd3963c1cb9d9567777f4a898a9dbe388a2fe9724681801b1e7d6d93eecf1b76", size = 17300917, upload-time = "2026-05-20T11:54:56.628Z" }, + { url = "https://files.pythonhosted.org/packages/23/fa/beafb91e6e152d2161c4a9cbc472334c87607eb61ad7104b5a7fa8d8d7b1/duckdb-1.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3d5db8c0b55e072cf437948ebb5d7e23d7b9d03d905fa5f9145583e65aa447f7", size = 15449411, upload-time = "2026-05-20T11:54:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/50/0a/49b6fe04e2fcd63729eb607dadd44818dde77342a4f5ce086c6c92f1dd4d/duckdb-1.5.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ce80aed7a538422129a57eaca9141e3afb51f8bf562b1908b1576c9725b5b22", size = 19333120, upload-time = "2026-05-20T11:55:01.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/4c/0907c3f76adb9dd90e67610b31e0304a35814e65c4c41a354a262c09b885/duckdb-1.5.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787df63824f07bf18022dbc3b8ca4b2bfab0ebe616464f55c6e8cd0f59ea762e", size = 21453266, upload-time = "2026-05-20T11:55:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/6d/9c/d2f23a7803ddbbd9413f7572ecf66a15120ed5ced7ce5c73e698c1406b76/duckdb-1.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:bb5bb5dcdd09d62ee60f0ddbbef918e71cce304ffe28428b1131949d39ffaabf", size = 13118640, upload-time = "2026-05-20T11:55:07.389Z" }, + { url = "https://files.pythonhosted.org/packages/27/d5/7ba2316415bcdab6edd765bbbe35c2ca8a3800f2fe695cd70e3cdb997f09/duckdb-1.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:2fa17ecdd5d3db122836cb71bb93601c2106a3be883c17dffddc02fbf3fa7888", size = 13926409, upload-time = "2026-05-20T11:55:10.166Z" }, + { url = "https://files.pythonhosted.org/packages/a5/c2/d4b6f8a5e4d3bc25773be6da76a99d9661ebbf3552c007c460d2dd59dbf8/duckdb-1.5.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4bfa9a4dadf71e83e2c4eaca2f9421c82a54defecc1b0b4c0be95e2389dec4fe", size = 32636685, upload-time = "2026-05-20T11:55:13.158Z" }, + { url = "https://files.pythonhosted.org/packages/42/58/e835c8298979d29db7a62cb5acc29e9b57aeaca7cdde2fcd3ac980f5cb18/duckdb-1.5.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aea7baf67ad7e1829ac76f67d7dcbd7fb1f57c3eb179d55ac30952df4709ae30", size = 17308134, upload-time = "2026-05-20T11:55:16.194Z" }, + { url = "https://files.pythonhosted.org/packages/c9/46/617b51363f5613418c8b224b3cce16b58e6dde80904566bec232579c1d4e/duckdb-1.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b0b4f088a65d77e1217ce5d7eff889e63fedc44281200d899ff47c84d8ff836", size = 15449891, upload-time = "2026-05-20T11:55:18.687Z" }, + { url = "https://files.pythonhosted.org/packages/b3/72/354146656e8d9ba3853d3a5ee80a481b8c5f70edfc3d5ae80a8c4479c967/duckdb-1.5.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe8d0c1f6a120aa03fa6e0d03897c71a1842e6cf7afd31d181348391f7108fe1", size = 19338499, upload-time = "2026-05-20T11:55:21.34Z" }, + { url = "https://files.pythonhosted.org/packages/56/8f/65fc623b51448f2bfba1a9ec6ab3debb4664c0876c0113a5e782600b53ac/duckdb-1.5.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0405eae18ec6e8210a471c97dbfe87a7e4d605274b7fe572a1f276e92158f13", size = 21455828, upload-time = "2026-05-20T11:55:23.847Z" }, + { url = "https://files.pythonhosted.org/packages/2b/db/d0274cbe9f5fe219f77c0bdf900ac77103569e83c102a4225ce04cbc607d/duckdb-1.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:33ae08b3e818d7613d8936744b67718c2062c2f530376895bfd89efb51b81538", size = 13640011, upload-time = "2026-05-20T11:55:26.276Z" }, + { url = "https://files.pythonhosted.org/packages/07/5d/8f1899b8bef291caf953992fcd6c24df9f29387a35645e58c2504a5ca473/duckdb-1.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:746433e49bbc667b4df283153415fbe37e9083e0eff6c3cd6e54de7536869cd4", size = 14411554, upload-time = "2026-05-20T11:55:29.037Z" }, ] [[package]] @@ -975,15 +1015,15 @@ wheels = [ [[package]] name = "genai-prices" -version = "0.0.57" +version = "0.0.61" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/be/30/11f3d683cf3b1d9612475ad8bfffe3423ce9f50fc617733109033e73a038/genai_prices-0.0.57.tar.gz", hash = "sha256:6e101e9c53975557ceffa237b0995787d81fe75aac12410f2898504188bcad89", size = 66555, upload-time = "2026-04-21T13:42:52.554Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/71/0c76010eec75f4b3623d521044785c0977c14adabe1cac72b004349567fb/genai_prices-0.0.61.tar.gz", hash = "sha256:4b3bcfd49f174c05831b09f9ee36557d3648569e2f594af6c24b72031b3f0e52", size = 67806, upload-time = "2026-05-19T17:01:36.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/fe/d0095040c120d97cb63d055224ecd4e913dc5655315c203c8e83bf13aa86/genai_prices-0.0.57-py3-none-any.whl", hash = "sha256:14e50fb69cdc5a06ddb2a6df5a7fe06741b9e44304ce3f1728f56abdf1856cca", size = 69654, upload-time = "2026-04-21T13:42:51.236Z" }, + { url = "https://files.pythonhosted.org/packages/de/ec/b08dc2e834ca00fd8dfedcb17ae2e920667adaad617b45e32b7a3b146f24/genai_prices-0.0.61-py3-none-any.whl", hash = "sha256:d77142f61c13e69909ac19c8e44fd315fd65f3afd714e8d55e914fab0eaf47a2", size = 70853, upload-time = "2026-05-19T17:01:37.858Z" }, ] [[package]] @@ -1000,15 +1040,15 @@ wheels = [ [[package]] name = "google-auth" -version = "2.50.0" +version = "2.53.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyasn1-modules" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/18/238d7021d151bdab868f23433817b027dd759135202f4dfce0670d1230ca/google_auth-2.50.0.tar.gz", hash = "sha256:f35eafb191195328e8ce10a7883970877e7aeb49c2bfaa54aa0e394316d353d0", size = 336523, upload-time = "2026-04-30T21:19:29.659Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/ad/ff781329bbbdc0974a098d996e89c9e1f7024262f9e3eec442fbb9ad1ac6/google_auth-2.53.0.tar.gz", hash = "sha256:e7e6aa16f6bee7b2b264830fd04f08087a1d5a836df516251a5d15327b246c9c", size = 335844, upload-time = "2026-05-15T20:53:07.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/cf/4880c2137c14280b2f59975cdf12cc442bc0ae1f9ea473a26eaa0c146786/google_auth-2.50.0-py3-none-any.whl", hash = "sha256:04382175e28b94f49694977f0a792688b59a668def1499e9d8de996dc9ce5b15", size = 246495, upload-time = "2026-04-30T21:19:27.664Z" }, + { url = "https://files.pythonhosted.org/packages/4a/c9/db44165ba7c581268c6d46017ef63339110378305062830104fc7fa144cb/google_auth-2.53.0-py3-none-any.whl", hash = "sha256:6e7449917c599b35126a99ec268ec6880301f2fea41dce198fe8fd83ff642b68", size = 246071, upload-time = "2026-05-15T20:53:05.609Z" }, ] [package.optional-dependencies] @@ -1018,7 +1058,7 @@ requests = [ [[package]] name = "google-genai" -version = "1.74.0" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1032,9 +1072,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/c8/4a8f1de0a3268d526a345b8c74456b3e1e6ffd200982626326cf7ca83e5b/google_genai-1.74.0.tar.gz", hash = "sha256:c4c473cebdeb6e5adbb0639326de66a3a85a2209e0d32de7d66bf05c698abae8", size = 536772, upload-time = "2026-04-29T22:16:35.881Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/08/c7f3a6f49bb6674891ce6fb9e9eeeb7a7522cb51f3422afff5d5a59bf347/google_genai-2.5.0.tar.gz", hash = "sha256:643d8158a718eecb8d14d4155ed973f43034f8ae757ac922fb6b093dd374e2af", size = 552293, upload-time = "2026-05-20T18:59:00.473Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/2b/539c328b66f7bfef2df869371a1789361228e5a7694ba02a642608367b46/google_genai-1.74.0-py3-none-any.whl", hash = "sha256:87d0b311c67d4b2a0ca741e9fc6891330c29defae81d46d8db41079aa1a3d80a", size = 790433, upload-time = "2026-04-29T22:16:33.979Z" }, + { url = "https://files.pythonhosted.org/packages/52/a7/b90fcd62461d74e08ded24e8265af5d2e53c0fd2dcc309a14687fdf2077a/google_genai-2.5.0-py3-none-any.whl", hash = "sha256:bba50cdb3a14cb3dea7b3e43a8f23b50191fd77bd19097df98b051ce1a619352", size = 818214, upload-time = "2026-05-20T18:58:58.435Z" }, ] [[package]] @@ -1164,14 +1204,14 @@ wheels = [ [[package]] name = "holidays" -version = "0.96" +version = "0.97" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/dd/068cb4636a3cb433251e7d018d145f1a8c3c57c6fb0452d022561a35c46a/holidays-0.96.tar.gz", hash = "sha256:9d4d15bc28fa690969b82f07a1d6571aa14d4073cc98802510c08dfe3b1f2d25", size = 906699, upload-time = "2026-05-04T17:37:21.258Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/61/058f3f05dd318b9d9546df513f8f6611557919e5360cd608a3ce7c7500d4/holidays-0.97.tar.gz", hash = "sha256:8fe491270bd4aeed6f9584d459d5df506a414727ba76fdd9ebd6323def606935", size = 911304, upload-time = "2026-05-18T19:48:19.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/a2/05cbe4e2309a08a09bbfab04d3d37d687b5852abf7d037fea19313d2eb60/holidays-0.96-py3-none-any.whl", hash = "sha256:9d4f06603090304584f685b2f3d9f4289eb5c52b83fca472f922cb83cc3fb93f", size = 1473213, upload-time = "2026-05-04T17:37:18.933Z" }, + { url = "https://files.pythonhosted.org/packages/b9/54/7947b0cba0c91b81801da793ea2d273aab5bdd5484a5ba6c2d3863110f07/holidays-0.97-py3-none-any.whl", hash = "sha256:0bcd55e64abddce2f9aa9224d68afe87acdd7eac7c2aef251b0ef7986bb5220b", size = 1479247, upload-time = "2026-05-18T19:48:16.881Z" }, ] [[package]] @@ -1213,23 +1253,23 @@ wheels = [ [[package]] name = "hypothesis" -version = "6.152.4" +version = "6.152.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/c7/3147bd903d6b18324a016d43a259cf5b4bb4545e1ead6773dc8a0374e70a/hypothesis-6.152.4.tar.gz", hash = "sha256:31c8f9ce619716f543e2710b489b1633c833586641d9e6c94cee03f109a5afc4", size = 466444, upload-time = "2026-04-27T20:18:37.594Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/fb/a5651eb0cd03ecee644e8f4d8cd2027b40a08bf1488f46201e794aebe9b5/hypothesis-6.152.9.tar.gz", hash = "sha256:de4711d69ce3a18009047c3b44882810fd0c0348c1558e920a4b0d2c45f59e1e", size = 472009, upload-time = "2026-05-19T17:10:19.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/89/0f50dd0d92e8a7dffc24f69ab910ff81db89b2f082ba42682bd57695e4d2/hypothesis-6.152.4-py3-none-any.whl", hash = "sha256:e730fd93c7578182efadc7f90b3c5437ee4d55edf738930eb5043c81ac1d97e8", size = 532145, upload-time = "2026-04-27T20:18:35.043Z" }, + { url = "https://files.pythonhosted.org/packages/79/d9/40ef7ed22f0c45c2316467edb9afb8fc172cd089cb329c0ee6da6b74416c/hypothesis-6.152.9-py3-none-any.whl", hash = "sha256:9c4fdccb1eac0b12ec740c12290d0e6a0bea3526a3f0bf812b7643bb563c2d8b", size = 538148, upload-time = "2026-05-19T17:10:16.131Z" }, ] [[package]] name = "idna" -version = "3.13" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -1241,18 +1281,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, ] -[[package]] -name = "importlib-metadata" -version = "8.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, -] - [[package]] name = "inflection" version = "0.5.1" @@ -1315,92 +1343,92 @@ wheels = [ [[package]] name = "jiter" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/1f/198ae537fccb7080a0ed655eb56abf64a92f79489dfbf79f40fa34225bcd/jiter-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7e791e247b8044512e070bd1f3633dc08350d32776d2d6e7473309d0edf256a2", size = 316896, upload-time = "2026-04-10T14:26:01.986Z" }, - { url = "https://files.pythonhosted.org/packages/cf/34/da67cff3fce964a36d03c3e365fb0f8726ade2a6cfd4d3c70107e216ead6/jiter-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71527ce13fd5a0c4e40ad37331f8c547177dbb2dd0a93e5278b6a5eecf748804", size = 321085, upload-time = "2026-04-10T14:26:03.364Z" }, - { url = "https://files.pythonhosted.org/packages/ed/36/4c72e67180d4e71a4f5dcf7886d0840e83c49ab11788172177a77570326e/jiter-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c4a7ab56f746014874f2c525584c0daca1dec37f66fd707ecef3b7e5c2228c", size = 347393, upload-time = "2026-04-10T14:26:05.314Z" }, - { url = "https://files.pythonhosted.org/packages/bc/db/9b39e09ceafa9878235c0fc29e3e3f9b12a4c6a98ea3085b998cadf3accc/jiter-0.14.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:376e9dafff914253bb9d46cdc5f7965607fbe7feb0a491c34e35f92b2770702e", size = 372937, upload-time = "2026-04-10T14:26:06.884Z" }, - { url = "https://files.pythonhosted.org/packages/b0/96/0dcba1d7a82c1b720774b48ef239376addbaf30df24c34742ac4a57b67b2/jiter-0.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23ad2a7a9da1935575c820428dd8d2490ce4d23189691ce33da1fc0a58e14e1c", size = 463646, upload-time = "2026-04-10T14:26:08.345Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e3/f61b71543e746e6b8b805e7755814fc242715c16f1dba58e1cbccb8032c2/jiter-0.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54b3ddf5786bc7732d293bba3411ac637ecfa200a39983166d1df86a59a43c9f", size = 380225, upload-time = "2026-04-10T14:26:10.161Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5e/0ddeb7096aca099114abe36c4921016e8d251e6f35f5890240b31f1f60ae/jiter-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c001d5a646c2a50dc055dd526dad5d5245969e8234d2b1131d0451e81f3a373", size = 358682, upload-time = "2026-04-10T14:26:11.574Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d1/fe0c46cd7fda9cad8f1ff9ad217dc61f1e4280b21052ec6dfe88c1446ef2/jiter-0.14.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:834bb5bdabca2e91592a03d373838a8d0a1b8bbde7077ae6913fd2fc51812d00", size = 359973, upload-time = "2026-04-10T14:26:13.316Z" }, - { url = "https://files.pythonhosted.org/packages/ac/21/f5317f91729b501019184771c80d60abd89907009e7bfa6c7e348c5bdd44/jiter-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4e9178be60e229b1b2b0710f61b9e24d1f4f8556985a83ff4c4f95920eea7314", size = 397568, upload-time = "2026-04-10T14:26:15.212Z" }, - { url = "https://files.pythonhosted.org/packages/e9/05/79d8f33fb2bf168db0df5c9cd16fe440a8ada57e929d3677b22712c2568f/jiter-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7e4ccff04ec03614e62c613e976a3a5860dc9714ce8266f44328bdc8b1cab2c", size = 522535, upload-time = "2026-04-10T14:26:16.956Z" }, - { url = "https://files.pythonhosted.org/packages/5c/00/d1e3ff3d2a465e67f08507d74bafb2dcd29eba91dc939820e39e8dea38b8/jiter-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69539d936fb5d55caf6ecd33e2e884de083ff0ea28579780d56c4403094bb8d9", size = 556709, upload-time = "2026-04-10T14:26:18.5Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/bbb2189f62ace8d95e869aa4c84c9946616f301e2d02895a6f20dcc3bba3/jiter-0.14.0-cp311-cp311-win32.whl", hash = "sha256:4927d09b3e572787cc5e0a5318601448e1ab9391bcef95677f5840c2d00eaa6d", size = 208660, upload-time = "2026-04-10T14:26:20.511Z" }, - { url = "https://files.pythonhosted.org/packages/b8/86/c500b53dcbf08575f5963e536ebd757a1f7c568272ba5d180b212c9a87fb/jiter-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:42d6ed359ac49eb922fdd565f209c57340aa06d589c84c8413e42a0f9ae1b842", size = 204659, upload-time = "2026-04-10T14:26:22.152Z" }, - { url = "https://files.pythonhosted.org/packages/75/4a/a676249049d42cb29bef82233e4fe0524d414cbe3606c7a4b311193c2f77/jiter-0.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:6dd689f5f4a5a33747b28686e051095beb214fe28cfda5e9fe58a295a788f593", size = 194772, upload-time = "2026-04-10T14:26:23.458Z" }, - { url = "https://files.pythonhosted.org/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, - { url = "https://files.pythonhosted.org/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, - { url = "https://files.pythonhosted.org/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, - { url = "https://files.pythonhosted.org/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, - { url = "https://files.pythonhosted.org/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, - { url = "https://files.pythonhosted.org/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, - { url = "https://files.pythonhosted.org/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, - { url = "https://files.pythonhosted.org/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, - { url = "https://files.pythonhosted.org/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, - { url = "https://files.pythonhosted.org/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, - { url = "https://files.pythonhosted.org/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, - { url = "https://files.pythonhosted.org/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, - { url = "https://files.pythonhosted.org/packages/97/2a/09f70020898507a89279659a1afe3364d57fc1b2c89949081975d135f6f5/jiter-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af72f204cf4d44258e5b4c1745130ac45ddab0e71a06333b01de660ab4187a94", size = 315502, upload-time = "2026-04-10T14:26:47.697Z" }, - { url = "https://files.pythonhosted.org/packages/d6/be/080c96a45cd74f9fce5db4fd68510b88087fb37ffe2541ff73c12db92535/jiter-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b77da71f6e819be5fbcec11a453fde5b1d0267ef6ed487e2a392fd8e14e4e3a", size = 314870, upload-time = "2026-04-10T14:26:49.149Z" }, - { url = "https://files.pythonhosted.org/packages/7d/5e/2d0fee155826a968a832cc32438de5e2a193292c8721ca70d0b53e58245b/jiter-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f4ea612fe8b84b8b04e51d0e78029ecf3466348e25973f953de6e6a59aa4c1", size = 343406, upload-time = "2026-04-10T14:26:50.762Z" }, - { url = "https://files.pythonhosted.org/packages/70/af/bf9ee0d3a4f8dc0d679fc1337f874fe60cdbf841ebbb304b374e1c9aaceb/jiter-0.14.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62fe2451f8fcc0240261e6a4df18ecbcd58327857e61e625b2393ea3b468aac9", size = 369415, upload-time = "2026-04-10T14:26:52.188Z" }, - { url = "https://files.pythonhosted.org/packages/0f/83/8e8561eadba31f4d3948a5b712fb0447ec71c3560b57a855449e7b8ddc98/jiter-0.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6112f26f5afc75bcb475787d29da3aa92f9d09c7858f632f4be6ffe607be82e9", size = 461456, upload-time = "2026-04-10T14:26:53.611Z" }, - { url = "https://files.pythonhosted.org/packages/f6/c9/c5299e826a5fe6108d172b344033f61c69b1bb979dd8d9ddd4278a160971/jiter-0.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:215a6cb8fb7dc702aa35d475cc00ddc7f970e5c0b1417fb4b4ac5d82fa2a29db", size = 378488, upload-time = "2026-04-10T14:26:55.211Z" }, - { url = "https://files.pythonhosted.org/packages/5d/37/c16d9d15c0a471b8644b1abe3c82668092a707d9bedcf076f24ff2e380cd/jiter-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ab96a30fb3cb2c7e0cd33f7616c8860da5f5674438988a54ac717caccdbaa", size = 353242, upload-time = "2026-04-10T14:26:56.705Z" }, - { url = "https://files.pythonhosted.org/packages/58/ea/8050cb0dc654e728e1bfacbc0c640772f2181af5dedd13ae70145743a439/jiter-0.14.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3a99c1387b1f2928f799a9de899193484d66206a50e98233b6b088a7f0c1edb2", size = 356823, upload-time = "2026-04-10T14:26:58.281Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/cf71506d270e5f84d97326bf220e47aed9b95e9a4a060758fb07772170ab/jiter-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab18d11074485438695f8d34a1b6da61db9754248f96d51341956607a8f39985", size = 392564, upload-time = "2026-04-10T14:27:00.018Z" }, - { url = "https://files.pythonhosted.org/packages/b0/cc/8c6c74a3efb5bd671bfd14f51e8a73375464ca914b1551bc3b40e26ac2c9/jiter-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:801028dcfc26ac0895e4964cbc0fd62c73be9fd4a7d7b1aaf6e5790033a719b7", size = 520322, upload-time = "2026-04-10T14:27:01.664Z" }, - { url = "https://files.pythonhosted.org/packages/41/24/68d7b883ec959884ddf00d019b2e0e82ba81b167e1253684fa90519ce33c/jiter-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ad425b087aafb4a1c7e1e98a279200743b9aaf30c3e0ba723aec93f061bd9bc8", size = 552619, upload-time = "2026-04-10T14:27:03.316Z" }, - { url = "https://files.pythonhosted.org/packages/b6/89/b1a0985223bbf3150ff9e8f46f98fc9360c1de94f48abe271bbe1b465682/jiter-0.14.0-cp313-cp313-win32.whl", hash = "sha256:882bcb9b334318e233950b8be366fe5f92c86b66a7e449e76975dfd6d776a01f", size = 205699, upload-time = "2026-04-10T14:27:04.662Z" }, - { url = "https://files.pythonhosted.org/packages/4c/19/3f339a5a7f14a11730e67f6be34f9d5105751d547b615ef593fa122a5ded/jiter-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:9b8c571a5dba09b98bd3462b5a53f27209a5cbbe85670391692ede71974e979f", size = 201323, upload-time = "2026-04-10T14:27:06.139Z" }, - { url = "https://files.pythonhosted.org/packages/50/56/752dd89c84be0e022a8ea3720bcfa0a8431db79a962578544812ce061739/jiter-0.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:34f19dcc35cb1abe7c369b3756babf8c7f04595c0807a848df8f26ef8298ef92", size = 191099, upload-time = "2026-04-10T14:27:07.564Z" }, - { url = "https://files.pythonhosted.org/packages/91/28/292916f354f25a1fe8cf2c918d1415c699a4a659ae00be0430e1c5d9ffea/jiter-0.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e89bcd7d426a75bb4952c696b267075790d854a07aad4c9894551a82c5b574ab", size = 320880, upload-time = "2026-04-10T14:27:09.326Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c7/b002a7d8b8957ac3d469bd59c18ef4b1595a5216ae0de639a287b9816023/jiter-0.14.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b25beaa0d4447ea8c7ae0c18c688905d34840d7d0b937f2f7bdd52162c98a40", size = 346563, upload-time = "2026-04-10T14:27:11.287Z" }, - { url = "https://files.pythonhosted.org/packages/f9/3b/f8d07580d8706021d255a6356b8fab13ee4c869412995550ce6ed4ddf97d/jiter-0.14.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a8758dd413c51e3b7f6557cdc6921faf70b14106f45f969f091f5cda990ea", size = 357928, upload-time = "2026-04-10T14:27:12.729Z" }, - { url = "https://files.pythonhosted.org/packages/47/5b/ac1a974da29e35507230383110ffec59998b290a8732585d04e19a9eb5ba/jiter-0.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e1a7eead856a5038a8d291f1447176ab0b525c77a279a058121b5fccee257f6f", size = 203519, upload-time = "2026-04-10T14:27:14.125Z" }, - { url = "https://files.pythonhosted.org/packages/96/6d/9fc8433d667d2454271378a79747d8c76c10b51b482b454e6190e511f244/jiter-0.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e692633a12cda97e352fdcd1c4acc971b1c28707e1e33aeef782b0cbf051975", size = 190113, upload-time = "2026-04-10T14:27:16.638Z" }, - { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, - { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, - { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, - { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, - { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, - { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, - { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, - { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, - { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, - { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, - { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, - { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, - { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, - { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, - { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, - { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, - { url = "https://files.pythonhosted.org/packages/32/a1/ef34ca2cab2962598591636a1804b93645821201cc0095d4a93a9a329c9d/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a25ffa2dbbdf8721855612f6dca15c108224b12d0c4024d0ac3d7902132b4211", size = 311366, upload-time = "2026-04-10T14:28:27.943Z" }, - { url = "https://files.pythonhosted.org/packages/60/bb/520576a532a6b8a6f42747afed289c8448c879a34d7802fe2c832d4fd38f/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ac9cbaa86c10996b92bd12c91659b60f939f8e28fcfa6bc11a0e90a774ce95b", size = 309873, upload-time = "2026-04-10T14:28:29.688Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7c/c16db114ea1f2f532f198aa8dc39585026af45af362c69a0492f31bc4821/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:844e73b6c56b505e9e169234ea3bdea2ea43f769f847f47ac559ba1d2361ebea", size = 344816, upload-time = "2026-04-10T14:28:31.348Z" }, - { url = "https://files.pythonhosted.org/packages/99/8f/15e7741ff19e9bcd4d753f7ff22f988fd54592f134ca13701c13ea8c20e0/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52c076f187405fc21523c746c04399c9af8ece566077ed147b2126f2bcba577", size = 351445, upload-time = "2026-04-10T14:28:33.093Z" }, - { url = "https://files.pythonhosted.org/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, - { url = "https://files.pythonhosted.org/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, - { url = "https://files.pythonhosted.org/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/b5/55f06bb281d92fb3cc86d14e1def2bd908bb77693183e7cb1f5a3c388b0c/jiter-0.15.0.tar.gz", hash = "sha256:4251acc80e2b7c9b7b8823456ea0fceeb0734dac2df7636d3c711b38476b5a76", size = 166640, upload-time = "2026-05-19T10:09:48.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/13/daa722f5765c393576f466378f9dfd29d77c9bed939e0688f96afa3601ea/jiter-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0f862193b8696249d22ec433e85fd2ab0ad9596bc3e45e6c0bc55e8aeba97be2", size = 310899, upload-time = "2026-05-19T10:07:12.89Z" }, + { url = "https://files.pythonhosted.org/packages/7f/82/2d2551829b082f4b6d82b9f939b031fb808a10aab1ec0664f82e150bb9a2/jiter-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1303d4d68a9b051ea90502402063ecf3807da00ad2affa19ca1ae3b90b3c5f67", size = 314963, upload-time = "2026-05-19T10:07:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0a/8b1a51466f7fe9f31dbe4bc7e0ca848674f9825e0f737b929b97e8c60aa7/jiter-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:392b8ab019e5502d08aff85c6272209c24bc2cbe706ea82a56368f524236614a", size = 341730, upload-time = "2026-05-19T10:07:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/f6/2a/e71dea19822e2e404e83992a08c1d6b9b617bb944f28c9c2fbd85d02c91e/jiter-0.15.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:773b6eb282ce11ee19f05f6b2d4404fa308e5bbd353b0b80a0262caad6db2cd7", size = 366214, upload-time = "2026-05-19T10:07:17.259Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/97e1fa539d124a509a00ab7f669289d1c1d236ecabf12948a18f16c91082/jiter-0.15.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2c0c44d569ce0f2850f5c926f8caeb5f245fbc84475aeb36efccc2103e6dbd", size = 459527, upload-time = "2026-05-19T10:07:18.741Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7a/4a68d331aef8cf2e2393c14a3aacb635c62aa86071b0229899fb5baaa907/jiter-0.15.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:032396229564bca02440396bd327710719f724f5e7b7e9f7a8eb3faa4a2c2281", size = 375451, upload-time = "2026-05-19T10:07:20.208Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/1c445c2b6f0e30a274dc8082e0c3c7825411cce80d726bccd697c98cc8d3/jiter-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d37768fce7f88dd2a8c6091f2325dea27d30d30d5c6e7a1c0f0af77723b708", size = 349428, upload-time = "2026-05-19T10:07:22.372Z" }, + { url = "https://files.pythonhosted.org/packages/00/94/e20d38984fc17a636371bffd2ae0f698124fdc8e75ef969cd2da6ba7cea7/jiter-0.15.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:2c9cb907439d20bd0c7d7565ca01ee52234203208433749bae5b516907526928", size = 355405, upload-time = "2026-05-19T10:07:23.916Z" }, + { url = "https://files.pythonhosted.org/packages/94/fa/4d09f814779d0ea80a28ed8e4c6662ec9a4a8ecef0ac52190ebac6262d14/jiter-0.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9100ddbec09741cc66feb0fc6773f8bdbd0e3c345689368f260082ff85dcc0cd", size = 393688, upload-time = "2026-05-19T10:07:25.854Z" }, + { url = "https://files.pythonhosted.org/packages/54/9d/8eb5d4fb8bf7e93a75964a5da71a75c67c864baf7fa3f98598187b3c7e57/jiter-0.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ae1b0d82ac2d987f9ea512b1c9adfcc71a28de3dea3a6039b54d76cffda9901e", size = 520853, upload-time = "2026-05-19T10:07:27.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2c/5e07874e59e623a943a0acf1552a80d05b70f31b402287a8fc6d7ec634c7/jiter-0.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8020c99ec13a7db2b6f96cbe82ef4721c88b426a4892f27478044af0284615ef", size = 551016, upload-time = "2026-05-19T10:07:28.846Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/d2d34422143474cadc15b60d482b1c35683dbc5c63c24346ddd0df09bcaf/jiter-0.15.0-cp311-cp311-win32.whl", hash = "sha256:42bfb257930800cf43e7c62c832402c704ab60797c992faf88d20e903eac8f32", size = 209518, upload-time = "2026-05-19T10:07:30.431Z" }, + { url = "https://files.pythonhosted.org/packages/1d/7d/52778b930e5cc3e52a37d950b1c10494244308b4329b25a0ff0d88303a81/jiter-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:860a74063284a2ae9bfedd694f299cc2c68e2696c5f3d440cc9d18bb81b9dd04", size = 200565, upload-time = "2026-05-19T10:07:32.125Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4f/d9b4067feb69b3fa6eb0488e1b59e2ad5b463fe39f59e527eab2aca00bb0/jiter-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:37a10c377ce3a4a85f4a67f28b7afe093154cde77eaf248a72e856aa08b4d865", size = 195488, upload-time = "2026-05-19T10:07:33.846Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/4f6bddbcde3c71e56d0aa1337ec95950f3d27dd4153e25aadf0feac71751/jiter-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0e90a1c315a0226ec822d973817967f9223b7701546c8c2a7913e7ab0926294d", size = 308793, upload-time = "2026-05-19T10:07:35.25Z" }, + { url = "https://files.pythonhosted.org/packages/01/84/c01099b59a285a1ebba64ae93f62bfa036675340fd1b0045ae65890a0442/jiter-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8c9004af7c8d67cce7f1aae1026fb55607f4aa600710d08ede3a3ce4aeefe7e0", size = 309570, upload-time = "2026-05-19T10:07:36.919Z" }, + { url = "https://files.pythonhosted.org/packages/58/64/8fb7f9d45bb98190355454cd04dad8d8f27223d6bd52f83af07f637168a6/jiter-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c210f8b35dc6f30aafd4b4365ca89b9d1189f21ab49b8e68fa6322a847aef138", size = 336783, upload-time = "2026-05-19T10:07:38.694Z" }, + { url = "https://files.pythonhosted.org/packages/c3/b6/f5739011d009b3a30f6a53c5240979030ba29ae46a8c67e3a15759f7c37d/jiter-0.15.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f30bae8bc1c2d613e28e5af3e8cceb09b742f1c8a8a5f839fb67afaffc03b61", size = 363555, upload-time = "2026-05-19T10:07:40.832Z" }, + { url = "https://files.pythonhosted.org/packages/e5/12/98a9d9f766665e8a3b6252454e17cb0c464606a28cf2fa09399b003345fa/jiter-0.15.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e71b6d10cfc284c9bf36bd885e8d44c46f688ce50aa91b5edd90181dea687", size = 452255, upload-time = "2026-05-19T10:07:42.62Z" }, + { url = "https://files.pythonhosted.org/packages/e8/d5/60f972840f79c5e7544fce567c56f1e4e50468f996baba3e78d823dd62a6/jiter-0.15.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ab068bce62a45aa3e7367eceaffb5dde60b7eb853be8dece45132e3d0ff4879", size = 373559, upload-time = "2026-05-19T10:07:44.201Z" }, + { url = "https://files.pythonhosted.org/packages/ee/cf/d46ef1234ba335aabc2f013210db8e0821a22f5e644a2e9449df199ecc23/jiter-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa248c9eb220197d363f688818dac2fd4b2f0cd7d843ca7105d652034823427d", size = 346055, upload-time = "2026-05-19T10:07:46.005Z" }, + { url = "https://files.pythonhosted.org/packages/f0/63/4d2749d8d54d230bad9b3a6b0d00cc28c6ff6b2fdffc26a8ccf76cc5a974/jiter-0.15.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2a77aadd57cac1682e4401a72724d2796d89a4ba129b1a5812aa94ee480826eb", size = 351406, upload-time = "2026-05-19T10:07:47.855Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b9/9965b990035d8773328e0a8c8b457a87bf2b19f6c4126d9d99296be5d16a/jiter-0.15.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ae901f3a55bfafdde31d289590fa25e3245735a2b1e8c7cc15871710a002871", size = 389357, upload-time = "2026-05-19T10:07:49.665Z" }, + { url = "https://files.pythonhosted.org/packages/2d/55/9ddf903deda1413e87fed792f416b7123daee5b8efbad6a202a7421c36a5/jiter-0.15.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f0b271b462769543716f92d3a4f90527df6ef5ed05ee95ec4137f513e21e1b77", size = 517263, upload-time = "2026-05-19T10:07:51.537Z" }, + { url = "https://files.pythonhosted.org/packages/e8/76/a0c40ad064d3a20a4fde231e35d56e9a01ce82164278180e82d5daf85469/jiter-0.15.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2fb6a5d26af81fc0f00f9360a891e05cf755e149bba391c4d563adc54812973d", size = 548646, upload-time = "2026-05-19T10:07:53.196Z" }, + { url = "https://files.pythonhosted.org/packages/23/4f/eca9b954942916ba2f453891b8593ab444cd872396fe66a3936616f236f3/jiter-0.15.0-cp312-cp312-win32.whl", hash = "sha256:c2f6bb8b5216ab9e7873bc08b5d7bef2b8abbb578a3069bf1cd14a45d71d771d", size = 206427, upload-time = "2026-05-19T10:07:55.307Z" }, + { url = "https://files.pythonhosted.org/packages/95/bf/8ead82a87495149542748e828d153fd232a512a22c83b02c4815c1a9c7d8/jiter-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:40b2c7e92c44a84d748d21706c68dc6ff8161d80b59c99d774721a0d2317d7c7", size = 197300, upload-time = "2026-05-19T10:07:56.651Z" }, + { url = "https://files.pythonhosted.org/packages/f4/e4/9b8a78fb2d894471bc344e37f1949bdd784bd914d031dba0ba3a40c71dd7/jiter-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:cc0bc345cf2df9d1c00ac443f50d543c1ccfa8b0422cb85b1ab70d681c0b255b", size = 192702, upload-time = "2026-05-19T10:07:58.307Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f4/f708c900ecee41b2025ef8413d5351e5649eb2125c506f6720cc69b06f5c/jiter-0.15.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1c11465f97e2abf45a014b83b730222f8f1c5335e802c7055a67d50de6f1f4e3", size = 307829, upload-time = "2026-05-19T10:07:59.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/59/db537c0949e83668c38481d426b9f2fd5ab758c4ee53a811dd0a510626a0/jiter-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e7b1776f0797956c509e123d0952d10d293a9492dea9f288ab9570ec01d1a5", size = 308445, upload-time = "2026-05-19T10:08:01.184Z" }, + { url = "https://files.pythonhosted.org/packages/37/38/ea0e13b18c30ef951da0d47d39e7fa9edb82a93a62990ffbd7cea9b622d4/jiter-0.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:351a341c2105aa430b7047e30f1bf7975f6313b00165d3fc07be2edaf741f279", size = 336181, upload-time = "2026-05-19T10:08:02.688Z" }, + { url = "https://files.pythonhosted.org/packages/58/fc/2303901b16c4ba05865588990a420c0b4156270b44379c20931544a1d962/jiter-0.15.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ab395feec8d249ec4044e228e98a7033f043426a265df439dc3698823f0a4e4", size = 362985, upload-time = "2026-05-19T10:08:04.394Z" }, + { url = "https://files.pythonhosted.org/packages/5b/6f/11bace093c52e7d4d26c8e606ccd7ae8c972189622469ec0d9e28161e28b/jiter-0.15.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2a438005b6f22d0273413484d6094d7c2c5d10ec1b3a3bf128e0d1d3ba53258", size = 453292, upload-time = "2026-05-19T10:08:05.967Z" }, + { url = "https://files.pythonhosted.org/packages/22/db/987f2f086ca4d7a6582eb4ccd513f9b26b42d9e4243a087609a3137a8fc7/jiter-0.15.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f18f85e4218d1b40f000f42a92239a7a61a902cd42c65e6c360dbd17dcb20894", size = 373501, upload-time = "2026-05-19T10:08:07.857Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7c/89fbcabb2739b7a5b8dc959a1b6c5761f6484f5fed3486854b3c789bb1de/jiter-0.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1aa62e277fc1cbd80e6deacae6f4d983b41b3d7728e0645c5d741a6149bba45", size = 344683, upload-time = "2026-05-19T10:08:09.431Z" }, + { url = "https://files.pythonhosted.org/packages/30/6f/6cca7692e7dddfec6d8d76c54dc97f2af2a41df4ac0674b999df1f09a5f3/jiter-0.15.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:6550fa135c7deb8ead6af49ed7ff648532ea8334a1447fe34a36315ef79c5c29", size = 350892, upload-time = "2026-05-19T10:08:11.352Z" }, + { url = "https://files.pythonhosted.org/packages/39/14/0338d6190cb8e6d22e677ab1d4eabd4117f67cca70c54cd04b82ff64e068/jiter-0.15.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:066f8f33f18b2419cd8213b2436fa7fbc9c499f315971cfa3ce1f9820c001b1b", size = 388723, upload-time = "2026-05-19T10:08:12.912Z" }, + { url = "https://files.pythonhosted.org/packages/90/31/cc19f4a1bdb6afb09ce6a2f2615aa8d44d994eba0d8e6105ed1af920e736/jiter-0.15.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:75e8a04e91432dde9f1838373cf93d23726c79d3e908d319acf0e796f85592e7", size = 516648, upload-time = "2026-05-19T10:08:14.808Z" }, + { url = "https://files.pythonhosted.org/packages/49/9f/833c541512cd091b63c10c0381973dfe11bc7a503a818c16384417e0c81e/jiter-0.15.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a97261f1fccb8e50ecd2890a96e46efdc3f57c80a197324c6777827231eca712", size = 547382, upload-time = "2026-05-19T10:08:16.927Z" }, + { url = "https://files.pythonhosted.org/packages/d2/11/e7b70e91f90bc4477e8eee9e8a5f7cf3cb41b4525d6394dc98a714eb8f7f/jiter-0.15.0-cp313-cp313-win32.whl", hash = "sha256:c77496cb10bd7549690fbbab3e5ec05857b83e49276f4a9423a766ddd2afcd4c", size = 205845, upload-time = "2026-05-19T10:08:18.401Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/5c20d9ad6f02c493e4023e5d2d09e1c1f15fe2753c9102c544aff068a88e/jiter-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b15741f501469009ae0ae90b7147958a664a7dede40aa7ff174a8a4645f546d0", size = 196842, upload-time = "2026-05-19T10:08:20.131Z" }, + { url = "https://files.pythonhosted.org/packages/6b/11/1eb400ef248e8c925fd883fbe325daf5e42cd1b0d308539dd332bd4f7ffc/jiter-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d6a60072b44c3c2b797a7ddcbcbbf2b34ea3cfd4721580fbfd2a09d9d9b84ba", size = 192212, upload-time = "2026-05-19T10:08:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/8a/60/2fd8d7c79da8acf9b7b277c7616847773779356b92acfc9bb158452174da/jiter-0.15.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ef1fd24d9413f6209e00d3d5a453e67acfe004a25cc6c8e8484faed4311ab9e8", size = 315065, upload-time = "2026-05-19T10:08:23.218Z" }, + { url = "https://files.pythonhosted.org/packages/46/f4/008fb7d65e8ac2abf00811651a661e025c4ba80bbc6f378450384ddd3aed/jiter-0.15.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144f8e72cb53dab146347b91cceac01f5481237f2b93b4a339a1ee8f8878b67c", size = 339444, upload-time = "2026-05-19T10:08:24.701Z" }, + { url = "https://files.pythonhosted.org/packages/00/55/90b0c7b9c6896c0f2a591dd36d36b71d22e09674bfef178fa03ba3f81499/jiter-0.15.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553fcac2ef2cb990877f9fc0833b8b629a3e6a5670b6b5fd58219b41a653ddc4", size = 347779, upload-time = "2026-05-19T10:08:26.408Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/69666cec5000fd57734c118437394516c749ae8dbeea9fb66d6fef9c4775/jiter-0.15.0-cp313-cp313t-win_amd64.whl", hash = "sha256:774f93f65031856bf14ad9f59bdcab8b8cad501e5ceabd51ba3525f76937a25b", size = 200395, upload-time = "2026-05-19T10:08:28.055Z" }, + { url = "https://files.pythonhosted.org/packages/39/04/a6aa62cd27e8149b0d28df5561f10f6cceaf7935a9ccf3f1c5a05f9a0cd8/jiter-0.15.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f1e1754960f38ec40613a07e5e372df67acb3b890fb383b6fb3de3e49ddbf3c7", size = 190516, upload-time = "2026-05-19T10:08:29.35Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/079f350ebf7859d081de30aa890f9e3be68516f754f3ba32366ffff4dcee/jiter-0.15.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:ac0d9ddea4350974be7a221fc25895f251a8fee748c889bdced2141c0fec1a49", size = 308884, upload-time = "2026-05-19T10:08:31.667Z" }, + { url = "https://files.pythonhosted.org/packages/04/4e/a2c30a7f69b48c03b20935d647479106fe932f6e63f75faf53937197e05d/jiter-0.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:01a8222cf05ab1128e239421156c207949808acaaea2bdfd33130ae666786e86", size = 310028, upload-time = "2026-05-19T10:08:33.304Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/2e7cdfd3cf8ca967be38c48f5cf474d79f089efaf559a40f15984a77ae69/jiter-0.15.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:182226cbc930c9fab81bc2e41a4da672f89539906dadb05e75670ac07b94f71f", size = 337485, upload-time = "2026-05-19T10:08:35.259Z" }, + { url = "https://files.pythonhosted.org/packages/9b/11/15a1aa28b120b8ee5b4f1fb894c125046225f09847738bd64233d3b84883/jiter-0.15.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:71683c38c825452999b5717fcae07ea708e8c93003e808be4319c1b02e3d176e", size = 364223, upload-time = "2026-05-19T10:08:36.694Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/f442e8af5f3d0dcf47b39e83a0efd9ee45ea946aa6d04625dc3181eae3b6/jiter-0.15.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f2218e6a9e5c18bc10fe6d41ac189c442c88eacf11bad9f28ef95a9bef00e6", size = 456387, upload-time = "2026-05-19T10:08:38.143Z" }, + { url = "https://files.pythonhosted.org/packages/da/f4/37f2d2c9f64f49af7da652ed7532bb5a2372e588e6927c3fdd76f911db65/jiter-0.15.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5157de9f76eb4bc5ea74a1219366a25f945ad305641d74e04f59c54087091aa9", size = 374461, upload-time = "2026-05-19T10:08:39.869Z" }, + { url = "https://files.pythonhosted.org/packages/60/28/edcfbbbf0cb15436f36664a8908a0df47ab9006298d4cd937dc08ea932d6/jiter-0.15.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c5db5527c221249a876160663ab891ace358c17f7b9c93ec1478b7f0550e5c", size = 345924, upload-time = "2026-05-19T10:08:41.668Z" }, + { url = "https://files.pythonhosted.org/packages/47/13/89fba6398dab7f202b7278c4b4aac122399d2c0183971c4a57a3b7088df5/jiter-0.15.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:3e4540b8e74e4268811ac05db226a6a128ff572e7e0ce3f1163b693cadb184cd", size = 352283, upload-time = "2026-05-19T10:08:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/1b/da/0f6af8cef2c565a1ab44d970f268c43ccaa72707386ea6388e6fe2b6cd26/jiter-0.15.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:62ebd14e47e9aed9df4472afcb2663668ce4d74891cd54f86bf6e44029d6dc89", size = 389985, upload-time = "2026-05-19T10:08:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ec/b9cb7d6d29e24ee14910266157d2a279d7a8f60ee0df7fa840882976ba64/jiter-0.15.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0be6f5ad41a809f303f416d17cec92a7a725902fb9b4f3de3d19362ac0ef8554", size = 517695, upload-time = "2026-05-19T10:08:46.486Z" }, + { url = "https://files.pythonhosted.org/packages/64/5e/6d1bda880723aae0ad86b4b763f044362448efe31e3e819635d41cb03451/jiter-0.15.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:813dfbb17d65328bf86e5f0905dd277ba2265d3ca20556e86c0c7035b7182e5a", size = 548868, upload-time = "2026-05-19T10:08:48.026Z" }, + { url = "https://files.pythonhosted.org/packages/0c/72/7de501cf38dcacaf35098796f3a50e0f2e338baba18a58946c618544b809/jiter-0.15.0-cp314-cp314-win32.whl", hash = "sha256:50e51156192722a9c58db112837d3f8ef96fb3c5ecc14e95f409134b08b158ec", size = 206380, upload-time = "2026-05-19T10:08:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a9/e19addf4b0c1bdce52c6da12351e6bc42c340c45e7c09e2158e46d293ccc/jiter-0.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:30ce1a5d16b5641dc935d50ef775af6a0871e3d14ab05d6fc54dff371b78e558", size = 197687, upload-time = "2026-05-19T10:08:51.088Z" }, + { url = "https://files.pythonhosted.org/packages/f2/c9/776b1db01db25fc6c1d58d1979a37b0a9fe787e5f5b1d062d2eaacb77923/jiter-0.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:510c8b3c17a0ed9ac69850c0438dada3c9b82d9c4d589fcb62002a5a9cf3a866", size = 192571, upload-time = "2026-05-19T10:08:52.451Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f6/45bb4670bacf300fd2c7abadbfb3af376e5f1b6ae75fd9bc069891d15870/jiter-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7553333dd0930c104a5a0db8df72bf7219fe663d731383b576bb6ed6351c984d", size = 317151, upload-time = "2026-05-19T10:08:53.867Z" }, + { url = "https://files.pythonhosted.org/packages/d7/68/ed635ad5acd7b73e454283083bbb7c8205ad10e88b0d9d7d793b09fe8226/jiter-0.15.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2143ab06181d2b029eedcb6af3cebe95f11bbac62441781860f98ee9330a6a6", size = 341243, upload-time = "2026-05-19T10:08:55.383Z" }, + { url = "https://files.pythonhosted.org/packages/5d/db/3ff4176b817b8ea33879e71e13d8bc2b0d481a7ed3fe9e080f333d415c16/jiter-0.15.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eac374c5c975709b69c10f09afd199df74150172156ad10c8d4fd785b7da995", size = 363629, upload-time = "2026-05-19T10:08:56.928Z" }, + { url = "https://files.pythonhosted.org/packages/ab/24/5f8270e0ba9c883582f96f722f8a0b58015c7ce1f8c6d4571cf394e99b6b/jiter-0.15.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3b3b775e33d3bfaec9899edc526ae97b0da0bf9d071a46124ba419149a414f8", size = 456198, upload-time = "2026-05-19T10:08:58.618Z" }, + { url = "https://files.pythonhosted.org/packages/45/5b/76fc02b0b5c54c3d18c60653156e2f76fde1816f9b4722db68d6ee2c897e/jiter-0.15.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3071db3346334beae1360b46da4606da57bf3528c167b3c38533afaf9f2c5", size = 373710, upload-time = "2026-05-19T10:09:00.151Z" }, + { url = "https://files.pythonhosted.org/packages/c4/52/4310821b0ea9277994d3e1f49fc6a4b34e4800caebacb2c0af81da59a454/jiter-0.15.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6694a173ecabc12eb60efbc0b474464ead1951ff65cd8b1e72100715c64512b", size = 349901, upload-time = "2026-05-19T10:09:01.621Z" }, + { url = "https://files.pythonhosted.org/packages/93/fe/67648c35b3594fba8854ac64cc8a826d8bcd18324bbdb53d77697c60b6ef/jiter-0.15.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:a254e10b593624d230c365b6d616b22ca0ad65e63a16e6631c2b3466022e6ba8", size = 352438, upload-time = "2026-05-19T10:09:03.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/28/0a1879d07ad6b3e025a2750027363452ced93c2d16d1c9d4b153ffd51c91/jiter-0.15.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d8d2955167274e15d79a7a020afdd9b39c990eb80b2d89fca695d92dcfdd38ec", size = 388152, upload-time = "2026-05-19T10:09:04.741Z" }, + { url = "https://files.pythonhosted.org/packages/c1/78/46c6f6b56ba85c90021f4afd72ed42f691f8f84daacb5fe27277070e3858/jiter-0.15.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:acf4ee4d1fc55917239fe72972fb292dd773055d05eb040d36f4326e02cc2c0e", size = 517707, upload-time = "2026-05-19T10:09:06.231Z" }, + { url = "https://files.pythonhosted.org/packages/ca/cb/720662d4c88fcad606e826fef5424365527ba43ce4868a479aed8f8c507e/jiter-0.15.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:e7196e56f1cd69af1dbb07dff02dcfb260a50b45a82d409d92a06fedb32473b5", size = 548241, upload-time = "2026-05-19T10:09:08.093Z" }, + { url = "https://files.pythonhosted.org/packages/60/e3/935b8034fd143f21125c87d51404a9e0e1449186a494405721ff5d1d695e/jiter-0.15.0-cp314-cp314t-win32.whl", hash = "sha256:7f6163c0f10b055245f814dcc59f4818da60dfe72f3e72ab89fc24b6bd5e9c52", size = 207950, upload-time = "2026-05-19T10:09:09.616Z" }, + { url = "https://files.pythonhosted.org/packages/93/59/984fd9ece895953dad3e0880a650e766f5a2da2c5514f0eafdaaabbeb5f9/jiter-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:980c256edb05b78a111b99c4de3b1d32e31634b867fd1fc2cf726e7b7bba9854", size = 200055, upload-time = "2026-05-19T10:09:11.367Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a4/cf8d779feb133a27a2e3bc833bccb9e13aa332cdf820497ebf72c10ce8c3/jiter-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:66b1880df2d01e206e8339769d1c7c1753bcb653efd6289e203f6f24ebada0c0", size = 191244, upload-time = "2026-05-19T10:09:12.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/43/1fc62172aa98b50a7de9a25554060db510f85c89cfbed0dfe13e1907a139/jiter-0.15.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:411fa4dfa5a7ae3d11491027ffb9beadec3996010a986862db70d91abba1c750", size = 305585, upload-time = "2026-05-19T10:09:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c4/dd58fcd9e2df83666e5c1c1347bef58ce919cd8efc3ffa38aeea62ce493b/jiter-0.15.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:2b0074e2f56eb2dacca1689760fd2852a068f85a0547a157b82cb4cafeb6768b", size = 306936, upload-time = "2026-05-19T10:09:37.435Z" }, + { url = "https://files.pythonhosted.org/packages/39/86/b695e16f1180c07f43ea98e73ecd21cf63fa2e1b0c1103739013784d11ae/jiter-0.15.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:913d02d29c9606643418d9ccfc3b72492ab25a6bf7889934e09a3490f8d3438b", size = 342453, upload-time = "2026-05-19T10:09:39.294Z" }, + { url = "https://files.pythonhosted.org/packages/34/56/55d76614af37fe3f22a3347d1e410d2a15da581997cb2da499a625000bb5/jiter-0.15.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b15d3ec9b0449c40e85319bdb4caa8b77ab526e74f5532ed94bec15e2f66822c", size = 345606, upload-time = "2026-05-19T10:09:40.727Z" }, + { url = "https://files.pythonhosted.org/packages/73/38/505941b2b092fd5bbbd60a52a880db1173f1690ae6751bed3af1c9ddcb4e/jiter-0.15.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:631f13a3d04e97d4e083993b10f4b99530e3a10d953e2eb5e196b7dc7f812ce0", size = 303769, upload-time = "2026-05-19T10:09:42.203Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/a06692b29e77473f286e1ec1f426d3ca44d7b5843be8ad21d7a5f3fcdcc0/jiter-0.15.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:b6c0ffae686c39bf3737be60793783267628783ea42545632c10b291105aee45", size = 305128, upload-time = "2026-05-19T10:09:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/7270d7ad41d6061a25b950c6bf91d638bd9aacb113200a8c8d57a055fd67/jiter-0.15.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d54fb5b31dea401a41af3f8a7d2512e9b6a6a005491e6166c7e4ffab9639a9c", size = 340459, upload-time = "2026-05-19T10:09:45.452Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8d/302cb2057b7513327b4d575cff6b1d066ee6431a5357fc3f8867cd684406/jiter-0.15.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d5d6090cdc1b7c9e780dfb04949a990adb1e301a2fc0bbcee7de4638d33f9a", size = 344469, upload-time = "2026-05-19T10:09:46.864Z" }, ] [[package]] @@ -1447,84 +1475,84 @@ wheels = [ [[package]] name = "librt" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/6b/3d5c13fb3e3c4f43206c8f9dfed13778c2ed4f000bacaa0b7ce3c402a265/librt-0.9.0.tar.gz", hash = "sha256:a0951822531e7aee6e0dfb556b30d5ee36bbe234faf60c20a16c01be3530869d", size = 184368, upload-time = "2026-04-09T16:06:26.173Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/1e/2ec7afcebcf3efea593d13aee18bbcfdd3a243043d848ebf385055e9f636/librt-0.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90904fac73c478f4b83f4ed96c99c8208b75e6f9a8a1910548f69a00f1eaa671", size = 67155, upload-time = "2026-04-09T16:04:42.933Z" }, - { url = "https://files.pythonhosted.org/packages/18/77/72b85afd4435268338ad4ec6231b3da8c77363f212a0227c1ff3b45e4d35/librt-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:789fff71757facc0738e8d89e3b84e4f0251c1c975e85e81b152cdaca927cc2d", size = 69916, upload-time = "2026-04-09T16:04:44.042Z" }, - { url = "https://files.pythonhosted.org/packages/27/fb/948ea0204fbe2e78add6d46b48330e58d39897e425560674aee302dca81c/librt-0.9.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1bf465d1e5b0a27713862441f6467b5ab76385f4ecf8f1f3a44f8aa3c695b4b6", size = 199635, upload-time = "2026-04-09T16:04:45.5Z" }, - { url = "https://files.pythonhosted.org/packages/ac/cd/894a29e251b296a27957856804cfd21e93c194aa131de8bb8032021be07e/librt-0.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f819e0c6413e259a17a7c0d49f97f405abadd3c2a316a3b46c6440b7dbbedbb1", size = 211051, upload-time = "2026-04-09T16:04:47.016Z" }, - { url = "https://files.pythonhosted.org/packages/18/8f/dcaed0bc084a35f3721ff2d081158db569d2c57ea07d35623ddaca5cfc8e/librt-0.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0785c2fb4a81e1aece366aa3e2e039f4a4d7d21aaaded5227d7f3c703427882", size = 224031, upload-time = "2026-04-09T16:04:48.207Z" }, - { url = "https://files.pythonhosted.org/packages/03/44/88f6c1ed1132cd418601cc041fbd92fed28b3a09f39de81978e0822d13ff/librt-0.9.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80b25c7b570a86c03b5da69e665809deb39265476e8e21d96a9328f9762f9990", size = 218069, upload-time = "2026-04-09T16:04:50.025Z" }, - { url = "https://files.pythonhosted.org/packages/a3/90/7d02e981c2db12188d82b4410ff3e35bfdb844b26aecd02233626f46af2b/librt-0.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d4d16b608a1c43d7e33142099a75cd93af482dadce0bf82421e91cad077157f4", size = 224857, upload-time = "2026-04-09T16:04:51.684Z" }, - { url = "https://files.pythonhosted.org/packages/ef/c3/c77e706b7215ca32e928d47535cf13dbc3d25f096f84ddf8fbc06693e229/librt-0.9.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:194fc1a32e1e21fe809d38b5faea66cc65eaa00217c8901fbdb99866938adbdb", size = 219865, upload-time = "2026-04-09T16:04:52.949Z" }, - { url = "https://files.pythonhosted.org/packages/52/d1/32b0c1a0eb8461c70c11656c46a29f760b7c7edf3c36d6f102470c17170f/librt-0.9.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8c6bc1384d9738781cfd41d09ad7f6e8af13cfea2c75ece6bd6d2566cdea2076", size = 218451, upload-time = "2026-04-09T16:04:54.174Z" }, - { url = "https://files.pythonhosted.org/packages/74/d1/adfd0f9c44761b1d49b1bec66173389834c33ee2bd3c7fd2e2367f1942d4/librt-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cb151e52a044f06e54ac7f7b47adbfc89b5c8e2b63e1175a9d587c43e8942a", size = 241300, upload-time = "2026-04-09T16:04:55.452Z" }, - { url = "https://files.pythonhosted.org/packages/09/b0/9074b64407712f0003c27f5b1d7655d1438979155f049720e8a1abd9b1a1/librt-0.9.0-cp311-cp311-win32.whl", hash = "sha256:f100bfe2acf8a3689af9d0cc660d89f17286c9c795f9f18f7b62dd1a6b247ae6", size = 55668, upload-time = "2026-04-09T16:04:56.689Z" }, - { url = "https://files.pythonhosted.org/packages/24/19/40b77b77ce80b9389fb03971431b09b6b913911c38d412059e0b3e2a9ef2/librt-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:0b73e4266307e51c95e09c0750b7ec383c561d2e97d58e473f6f6a209952fbb8", size = 62976, upload-time = "2026-04-09T16:04:57.733Z" }, - { url = "https://files.pythonhosted.org/packages/70/9d/9fa7a64041e29035cb8c575af5f0e3840be1b97b4c4d9061e0713f171849/librt-0.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc5518873822d2faa8ebdd2c1a4d7c8ef47b01a058495ab7924cb65bdbf5fc9a", size = 53502, upload-time = "2026-04-09T16:04:58.806Z" }, - { url = "https://files.pythonhosted.org/packages/bf/90/89ddba8e1c20b0922783cd93ed8e64f34dc05ab59c38a9c7e313632e20ff/librt-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b3e3bc363f71bda1639a4ee593cb78f7fbfeacc73411ec0d4c92f00730010a4", size = 68332, upload-time = "2026-04-09T16:05:00.09Z" }, - { url = "https://files.pythonhosted.org/packages/a8/40/7aa4da1fb08bdeeb540cb07bfc8207cb32c5c41642f2594dbd0098a0662d/librt-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a09c2f5869649101738653a9b7ab70cf045a1105ac66cbb8f4055e61df78f2d", size = 70581, upload-time = "2026-04-09T16:05:01.213Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/73a2187e1031041e93b7e3a25aae37aa6f13b838c550f7e0f06f66766212/librt-0.9.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ca8e133d799c948db2ab1afc081c333a825b5540475164726dcbf73537e5c2f", size = 203984, upload-time = "2026-04-09T16:05:02.542Z" }, - { url = "https://files.pythonhosted.org/packages/5e/3d/23460d571e9cbddb405b017681df04c142fb1b04cbfce77c54b08e28b108/librt-0.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:603138ee838ee1583f1b960b62d5d0007845c5c423feb68e44648b1359014e27", size = 215762, upload-time = "2026-04-09T16:05:04.127Z" }, - { url = "https://files.pythonhosted.org/packages/de/1e/42dc7f8ab63e65b20640d058e63e97fd3e482c1edbda3570d813b4d0b927/librt-0.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4003f70c56a5addd6aa0897f200dd59afd3bf7bcd5b3cce46dd21f925743bc2", size = 230288, upload-time = "2026-04-09T16:05:05.883Z" }, - { url = "https://files.pythonhosted.org/packages/dc/08/ca812b6d8259ad9ece703397f8ad5c03af5b5fedfce64279693d3ce4087c/librt-0.9.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:78042f6facfd98ecb25e9829c7e37cce23363d9d7c83bc5f72702c5059eb082b", size = 224103, upload-time = "2026-04-09T16:05:07.148Z" }, - { url = "https://files.pythonhosted.org/packages/b6/3f/620490fb2fa66ffd44e7f900254bc110ebec8dac6c1b7514d64662570e6f/librt-0.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a361c9434a64d70a7dbb771d1de302c0cc9f13c0bffe1cf7e642152814b35265", size = 232122, upload-time = "2026-04-09T16:05:08.386Z" }, - { url = "https://files.pythonhosted.org/packages/e9/83/12864700a1b6a8be458cf5d05db209b0d8e94ae281e7ec261dbe616597b4/librt-0.9.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dd2c7e082b0b92e1baa4da28163a808672485617bc855cc22a2fd06978fa9084", size = 225045, upload-time = "2026-04-09T16:05:09.707Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1b/845d339c29dc7dbc87a2e992a1ba8d28d25d0e0372f9a0a2ecebde298186/librt-0.9.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7e6274fd33fc5b2a14d41c9119629d3ff395849d8bcbc80cf637d9e8d2034da8", size = 227372, upload-time = "2026-04-09T16:05:10.942Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fe/277985610269d926a64c606f761d58d3db67b956dbbf40024921e95e7fcb/librt-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5093043afb226ecfa1400120d1ebd4442b4f99977783e4f4f7248879009b227f", size = 248224, upload-time = "2026-04-09T16:05:12.254Z" }, - { url = "https://files.pythonhosted.org/packages/92/1b/ee486d244b8de6b8b5dbaefabe6bfdd4a72e08f6353edf7d16d27114da8d/librt-0.9.0-cp312-cp312-win32.whl", hash = "sha256:9edcc35d1cae9fd5320171b1a838c7da8a5c968af31e82ecc3dff30b4be0957f", size = 55986, upload-time = "2026-04-09T16:05:13.529Z" }, - { url = "https://files.pythonhosted.org/packages/89/7a/ba1737012308c17dc6d5516143b5dce9a2c7ba3474afd54e11f44a4d1ef3/librt-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc2917258e131ae5f958a4d872e07555b51cb7466a43433218061c74ef33745", size = 63260, upload-time = "2026-04-09T16:05:14.68Z" }, - { url = "https://files.pythonhosted.org/packages/36/e4/01752c113da15127f18f7bf11142f5640038f062407a611c059d0036c6aa/librt-0.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:90e6d5420fc8a300518d4d2288154ff45005e920425c22cbbfe8330f3f754bd9", size = 53694, upload-time = "2026-04-09T16:05:16.095Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d7/1b3e26fffde1452d82f5666164858a81c26ebe808e7ae8c9c88628981540/librt-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29b68cd9714531672db62cc54f6e8ff981900f824d13fa0e00749189e13778e", size = 68367, upload-time = "2026-04-09T16:05:17.243Z" }, - { url = "https://files.pythonhosted.org/packages/a5/5b/c61b043ad2e091fbe1f2d35d14795e545d0b56b03edaa390fa1dcee3d160/librt-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d5c8a5929ac325729f6119802070b561f4db793dffc45e9ac750992a4ed4d22", size = 70595, upload-time = "2026-04-09T16:05:18.471Z" }, - { url = "https://files.pythonhosted.org/packages/a3/22/2448471196d8a73370aa2f23445455dc42712c21404081fcd7a03b9e0749/librt-0.9.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:756775d25ec8345b837ab52effee3ad2f3b2dfd6bbee3e3f029c517bd5d8f05a", size = 204354, upload-time = "2026-04-09T16:05:19.593Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5e/39fc4b153c78cfd2c8a2dcb32700f2d41d2312aa1050513183be4540930d/librt-0.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b8f5d00b49818f4e2b1667db994488b045835e0ac16fe2f924f3871bd2b8ac5", size = 216238, upload-time = "2026-04-09T16:05:20.868Z" }, - { url = "https://files.pythonhosted.org/packages/d7/42/bc2d02d0fa7badfa63aa8d6dcd8793a9f7ef5a94396801684a51ed8d8287/librt-0.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c81aef782380f0f13ead670aae01825eb653b44b046aa0e5ebbb79f76ed4aa11", size = 230589, upload-time = "2026-04-09T16:05:22.305Z" }, - { url = "https://files.pythonhosted.org/packages/c8/7b/e2d95cc513866373692aa5edf98080d5602dd07cabfb9e5d2f70df2f25f7/librt-0.9.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66b58fed90a545328e80d575467244de3741e088c1af928f0b489ebec3ef3858", size = 224610, upload-time = "2026-04-09T16:05:23.647Z" }, - { url = "https://files.pythonhosted.org/packages/31/d5/6cec4607e998eaba57564d06a1295c21b0a0c8de76e4e74d699e627bd98c/librt-0.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e78fb7419e07d98c2af4b8567b72b3eaf8cb05caad642e9963465569c8b2d87e", size = 232558, upload-time = "2026-04-09T16:05:25.025Z" }, - { url = "https://files.pythonhosted.org/packages/95/8c/27f1d8d3aaf079d3eb26439bf0b32f1482340c3552e324f7db9dca858671/librt-0.9.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c3786f0f4490a5cd87f1ed6cefae833ad6b1060d52044ce0434a2e85893afd0", size = 225521, upload-time = "2026-04-09T16:05:26.311Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d8/1e0d43b1c329b416017619469b3c3801a25a6a4ef4a1c68332aeaa6f72ca/librt-0.9.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8494cfc61e03542f2d381e71804990b3931175a29b9278fdb4a5459948778dc2", size = 227789, upload-time = "2026-04-09T16:05:27.624Z" }, - { url = "https://files.pythonhosted.org/packages/2c/b4/d3d842e88610fcd4c8eec7067b0c23ef2d7d3bff31496eded6a83b0f99be/librt-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:07cf11f769831186eeac424376e6189f20ace4f7263e2134bdb9757340d84d4d", size = 248616, upload-time = "2026-04-09T16:05:29.181Z" }, - { url = "https://files.pythonhosted.org/packages/ec/28/527df8ad0d1eb6c8bdfa82fc190f1f7c4cca5a1b6d7b36aeabf95b52d74d/librt-0.9.0-cp313-cp313-win32.whl", hash = "sha256:850d6d03177e52700af605fd60db7f37dcb89782049a149674d1a9649c2138fd", size = 56039, upload-time = "2026-04-09T16:05:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/f3/a7/413652ad0d92273ee5e30c000fc494b361171177c83e57c060ecd3c21538/librt-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:a5af136bfba820d592f86c67affcef9b3ff4d4360ac3255e341e964489b48519", size = 63264, upload-time = "2026-04-09T16:05:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/a4/0a/92c244309b774e290ddb15e93363846ae7aa753d9586b8aad511c5e6145b/librt-0.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:4c4d0440a3a8e31d962340c3e1cc3fc9ee7febd34c8d8f770d06adb947779ea5", size = 53728, upload-time = "2026-04-09T16:05:33.31Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c1/184e539543f06ea2912f4b92a5ffaede4f9b392689e3f00acbf8134bee92/librt-0.9.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:3f05d145df35dca5056a8bc3838e940efebd893a54b3e19b2dda39ceaa299bcb", size = 67830, upload-time = "2026-04-09T16:05:34.517Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ad/23399bdcb7afca819acacdef31b37ee59de261bd66b503a7995c03c4b0dc/librt-0.9.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1c587494461ebd42229d0f1739f3aa34237dd9980623ecf1be8d3bcba79f4499", size = 70280, upload-time = "2026-04-09T16:05:35.649Z" }, - { url = "https://files.pythonhosted.org/packages/9f/0b/4542dc5a2b8772dbf92cafb9194701230157e73c14b017b6961a23598b03/librt-0.9.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0a2040f801406b93657a70b72fa12311063a319fee72ce98e1524da7200171f", size = 201925, upload-time = "2026-04-09T16:05:36.739Z" }, - { url = "https://files.pythonhosted.org/packages/31/d4/8ee7358b08fd0cfce051ef96695380f09b3c2c11b77c9bfbc367c921cce5/librt-0.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f38bc489037eca88d6ebefc9c4d41a4e07c8e8b4de5188a9e6d290273ad7ebb1", size = 212381, upload-time = "2026-04-09T16:05:38.043Z" }, - { url = "https://files.pythonhosted.org/packages/f2/94/a2025fe442abedf8b038038dab3dba942009ad42b38ea064a1a9e6094241/librt-0.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3fd278f5e6bf7c75ccd6d12344eb686cc020712683363b66f46ac79d37c799f", size = 227065, upload-time = "2026-04-09T16:05:39.394Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e9/b9fcf6afa909f957cfbbf918802f9dada1bd5d3c1da43d722fd6a310dc3f/librt-0.9.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fcbdf2a9ca24e87bbebb47f1fe34e531ef06f104f98c9ccfc953a3f3344c567a", size = 221333, upload-time = "2026-04-09T16:05:40.999Z" }, - { url = "https://files.pythonhosted.org/packages/ac/7c/ba54cd6aa6a3c8cd12757a6870e0c79a64b1e6327f5248dcff98423f4d43/librt-0.9.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e306d956cfa027fe041585f02a1602c32bfa6bb8ebea4899d373383295a6c62f", size = 229051, upload-time = "2026-04-09T16:05:42.605Z" }, - { url = "https://files.pythonhosted.org/packages/4b/4b/8cfdbad314c8677a0148bf0b70591d6d18587f9884d930276098a235461b/librt-0.9.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:465814ab157986acb9dfa5ccd7df944be5eefc0d08d31ec6e8d88bc71251d845", size = 222492, upload-time = "2026-04-09T16:05:43.842Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d1/2eda69563a1a88706808decdce035e4b32755dbfbb0d05e1a65db9547ed1/librt-0.9.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:703f4ae36d6240bfe24f542bac784c7e4194ec49c3ba5a994d02891649e2d85b", size = 223849, upload-time = "2026-04-09T16:05:45.054Z" }, - { url = "https://files.pythonhosted.org/packages/04/44/b2ed37df6be5b3d42cfe36318e0598e80843d5c6308dd63d0bf4e0ce5028/librt-0.9.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3be322a15ee5e70b93b7a59cfd074614f22cc8c9ff18bd27f474e79137ea8d3b", size = 245001, upload-time = "2026-04-09T16:05:46.34Z" }, - { url = "https://files.pythonhosted.org/packages/47/e7/617e412426df89169dd2a9ed0cc8752d5763336252c65dbf945199915119/librt-0.9.0-cp314-cp314-win32.whl", hash = "sha256:b8da9f8035bb417770b1e1610526d87ad4fc58a2804dc4d79c53f6d2cf5a6eb9", size = 51799, upload-time = "2026-04-09T16:05:47.738Z" }, - { url = "https://files.pythonhosted.org/packages/24/ed/c22ca4db0ca3cbc285e4d9206108746beda561a9792289c3c31281d7e9df/librt-0.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:b8bd70d5d816566a580d193326912f4a76ec2d28a97dc4cd4cc831c0af8e330e", size = 59165, upload-time = "2026-04-09T16:05:49.198Z" }, - { url = "https://files.pythonhosted.org/packages/24/56/875398fafa4cbc8f15b89366fc3287304ddd3314d861f182a4b87595ace0/librt-0.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:fc5758e2b7a56532dc33e3c544d78cbaa9ecf0a0f2a2da2df882c1d6b99a317f", size = 49292, upload-time = "2026-04-09T16:05:50.362Z" }, - { url = "https://files.pythonhosted.org/packages/4c/61/bc448ecbf9b2d69c5cff88fe41496b19ab2a1cbda0065e47d4d0d51c0867/librt-0.9.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f24b90b0e0c8cc9491fb1693ae91fe17cb7963153a1946395acdbdd5818429a4", size = 70175, upload-time = "2026-04-09T16:05:51.564Z" }, - { url = "https://files.pythonhosted.org/packages/60/f2/c47bb71069a73e2f04e70acbd196c1e5cc411578ac99039a224b98920fd4/librt-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fe56e80badb66fdcde06bef81bbaa5bfcf6fbd7aefb86222d9e369c38c6b228", size = 72951, upload-time = "2026-04-09T16:05:52.699Z" }, - { url = "https://files.pythonhosted.org/packages/29/19/0549df59060631732df758e8886d92088da5fdbedb35b80e4643664e8412/librt-0.9.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:527b5b820b47a09e09829051452bb0d1dd2122261254e2a6f674d12f1d793d54", size = 225864, upload-time = "2026-04-09T16:05:53.895Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f8/3b144396d302ac08e50f89e64452c38db84bc7b23f6c60479c5d3abd303c/librt-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d429bdd4ac0ab17c8e4a8af0ed2a7440b16eba474909ab357131018fe8c7e71", size = 241155, upload-time = "2026-04-09T16:05:55.191Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ce/ee67ec14581de4043e61d05786d2aed6c9b5338816b7859bcf07455c6a9f/librt-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7202bdcac47d3a708271c4304a474a8605a4a9a4a709e954bf2d3241140aa938", size = 252235, upload-time = "2026-04-09T16:05:56.549Z" }, - { url = "https://files.pythonhosted.org/packages/8a/fa/0ead15daa2b293a54101550b08d4bafe387b7d4a9fc6d2b985602bae69b6/librt-0.9.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0d620e74897f8c2613b3c4e2e9c1e422eb46d2ddd07df540784d44117836af3", size = 244963, upload-time = "2026-04-09T16:05:57.858Z" }, - { url = "https://files.pythonhosted.org/packages/29/68/9fbf9a9aa704ba87689e40017e720aced8d9a4d2b46b82451d8142f91ec9/librt-0.9.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d69fc39e627908f4c03297d5a88d9284b73f4d90b424461e32e8c2485e21c283", size = 257364, upload-time = "2026-04-09T16:05:59.686Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8d/9d60869f1b6716c762e45f66ed945b1e5dd649f7377684c3b176ae424648/librt-0.9.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c2640e23d2b7c98796f123ffd95cf2022c7777aa8a4a3b98b36c570d37e85eee", size = 247661, upload-time = "2026-04-09T16:06:00.938Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/a5c365093962310bfdb4f6af256f191085078ffb529b3f0cbebb5b33ebe2/librt-0.9.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:451daa98463b7695b0a30aa56bf637831ea559e7b8101ac2ef6382e8eb15e29c", size = 248238, upload-time = "2026-04-09T16:06:02.537Z" }, - { url = "https://files.pythonhosted.org/packages/a0/3c/2d34365177f412c9e19c0a29f969d70f5343f27634b76b765a54d8b27705/librt-0.9.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:928bd06eca2c2bbf4349e5b817f837509b0604342e65a502de1d50a7570afd15", size = 269457, upload-time = "2026-04-09T16:06:03.833Z" }, - { url = "https://files.pythonhosted.org/packages/bc/cd/de45b239ea3bdf626f982a00c14bfcf2e12d261c510ba7db62c5969a27cd/librt-0.9.0-cp314-cp314t-win32.whl", hash = "sha256:a9c63e04d003bc0fb6a03b348018b9a3002f98268200e22cc80f146beac5dc40", size = 52453, upload-time = "2026-04-09T16:06:05.229Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f9/bfb32ae428aa75c0c533915622176f0a17d6da7b72b5a3c6363685914f70/librt-0.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f162af66a2ed3f7d1d161a82ca584efd15acd9c1cff190a373458c32f7d42118", size = 60044, upload-time = "2026-04-09T16:06:06.398Z" }, - { url = "https://files.pythonhosted.org/packages/aa/47/7d70414bcdbb3bc1f458a8d10558f00bbfdb24e5a11740fc8197e12c3255/librt-0.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:a4b25c6c25cac5d0d9d6d6da855195b254e0021e513e0249f0e3b444dc6e0e61", size = 50009, upload-time = "2026-04-09T16:06:07.995Z" }, +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, + { url = "https://files.pythonhosted.org/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, + { url = "https://files.pythonhosted.org/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, + { url = "https://files.pythonhosted.org/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, + { url = "https://files.pythonhosted.org/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, + { url = "https://files.pythonhosted.org/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, + { url = "https://files.pythonhosted.org/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, + { url = "https://files.pythonhosted.org/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, + { url = "https://files.pythonhosted.org/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, + { url = "https://files.pythonhosted.org/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, + { url = "https://files.pythonhosted.org/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, + { url = "https://files.pythonhosted.org/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", size = 103470, upload-time = "2026-05-10T18:16:10.369Z" }, + { url = "https://files.pythonhosted.org/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, + { url = "https://files.pythonhosted.org/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, + { url = "https://files.pythonhosted.org/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", size = 101898, upload-time = "2026-05-10T18:16:26.649Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", size = 119812, upload-time = "2026-05-10T18:16:27.859Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", size = 103448, upload-time = "2026-05-10T18:16:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", size = 143345, upload-time = "2026-05-10T18:16:30.674Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", size = 143131, upload-time = "2026-05-10T18:16:32.037Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", size = 477024, upload-time = "2026-05-10T18:16:33.493Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", size = 474221, upload-time = "2026-05-10T18:16:34.864Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", size = 505174, upload-time = "2026-05-10T18:16:36.705Z" }, + { url = "https://files.pythonhosted.org/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", size = 497216, upload-time = "2026-05-10T18:16:38.418Z" }, + { url = "https://files.pythonhosted.org/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", size = 513921, upload-time = "2026-05-10T18:16:39.848Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", size = 520850, upload-time = "2026-05-10T18:16:41.471Z" }, + { url = "https://files.pythonhosted.org/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", size = 504237, upload-time = "2026-05-10T18:16:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", size = 546261, upload-time = "2026-05-10T18:16:44.408Z" }, + { url = "https://files.pythonhosted.org/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", size = 96965, upload-time = "2026-05-10T18:16:46.039Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", size = 115151, upload-time = "2026-05-10T18:16:47.133Z" }, + { url = "https://files.pythonhosted.org/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", size = 98850, upload-time = "2026-05-10T18:16:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", size = 151138, upload-time = "2026-05-10T18:16:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", size = 151976, upload-time = "2026-05-10T18:16:51.062Z" }, + { url = "https://files.pythonhosted.org/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", size = 557927, upload-time = "2026-05-10T18:16:52.632Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", size = 539698, upload-time = "2026-05-10T18:16:53.934Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", size = 577162, upload-time = "2026-05-10T18:16:55.589Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", size = 566494, upload-time = "2026-05-10T18:16:56.975Z" }, + { url = "https://files.pythonhosted.org/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", size = 596858, upload-time = "2026-05-10T18:16:58.374Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", size = 590318, upload-time = "2026-05-10T18:16:59.676Z" }, + { url = "https://files.pythonhosted.org/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", size = 575115, upload-time = "2026-05-10T18:17:01.007Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", size = 617918, upload-time = "2026-05-10T18:17:02.682Z" }, + { url = "https://files.pythonhosted.org/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", size = 103562, upload-time = "2026-05-10T18:17:03.99Z" }, + { url = "https://files.pythonhosted.org/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", size = 124327, upload-time = "2026-05-10T18:17:05.465Z" }, + { url = "https://files.pythonhosted.org/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", size = 102572, upload-time = "2026-05-10T18:17:06.809Z" }, ] [[package]] name = "logfire-api" -version = "4.32.1" +version = "4.33.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/1b/0c74ad85f977743ba4c589e46e0cb138d6a6e69487830f4e86ebbdb145a3/logfire_api-4.32.1.tar.gz", hash = "sha256:5e8714b2bb5fb5d1f4a4a833941e4ca711b75d2c1f98e76c5ad680fe6991af6a", size = 78788, upload-time = "2026-04-15T14:11:58.788Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/1a/c44eb3a02407aa739669822d19734e76e8751284b86cd99c73baca36998a/logfire_api-4.33.0.tar.gz", hash = "sha256:0a604f710e803db08a2ddc41e6152bf8d8a56b549f8856cbf82baa36bc7de2c9", size = 81483, upload-time = "2026-05-13T15:14:17.348Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/ab/d5adeab6253c7ecd5904fc5ef3265859f218610caf4e1e55efe9aff6ac49/logfire_api-4.32.1-py3-none-any.whl", hash = "sha256:4b4c27cf6e27e8e26ef4b22a77f2a2988dd1d07e2d24ee70673ef34b234fb8a5", size = 124394, upload-time = "2026-04-15T14:11:56.157Z" }, + { url = "https://files.pythonhosted.org/packages/d4/58/dc21672e0d5294668f4d35aaba4d839d031f096b4cf6802399c4b411b5fc/logfire_api-4.33.0-py3-none-any.whl", hash = "sha256:b992727bab71412b5a00f54453eec18e559232c83d7120cf5c6a9edd33fb0c4e", size = 128896, upload-time = "2026-05-13T15:14:14.322Z" }, ] [[package]] @@ -1628,7 +1656,7 @@ wheels = [ [[package]] name = "marimo" -version = "0.23.5" +version = "0.23.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1650,9 +1678,9 @@ dependencies = [ { name = "uvicorn" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/45/99/13a8947b4544b1b65ed279a550b2d2a57bbcb24fb6591020542f46dca86b/marimo-0.23.5.tar.gz", hash = "sha256:4eb4c7c12ea1c3e8f25e56a9365a4ae1b0b995faa2bd614c576fa0ea3e0c4cad", size = 38417181, upload-time = "2026-05-04T18:51:26.277Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/96/7f03859bfc88b9ee25f1562ad1e7e0284c442f2956eaf0f9c849836d378f/marimo-0.23.6.tar.gz", hash = "sha256:d63aeeee1e9ea7cac79bf2530daba915199153dce4d156fade7546474679d3ca", size = 38426356, upload-time = "2026-05-11T21:39:57.588Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/d1/f2300ce52c391c5e0fa86a6292e45cb419898626b2900c2c1b44a3ba7162/marimo-0.23.5-py3-none-any.whl", hash = "sha256:9cf039ba5a11a5a3035ed0a165d3f84e2d67a4046422925b77fde154062c5112", size = 38835716, upload-time = "2026-05-04T18:51:21.64Z" }, + { url = "https://files.pythonhosted.org/packages/44/a7/c19a6481dfe7762eb07a5bd0a7d7ae560a2ab5505a519bce159d0fd08beb/marimo-0.23.6-py3-none-any.whl", hash = "sha256:e8d19d875b0212600faa80eaaed0fd3f34dfb7b5241e630cf2b1cedd8dd14509", size = 38849553, upload-time = "2026-05-11T21:39:53.996Z" }, ] [[package]] @@ -1666,14 +1694,14 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "4.0.0" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] [[package]] @@ -1752,7 +1780,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.27.0" +version = "1.27.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1770,9 +1798,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/eb/c0cfc62075dc6e1ec1c64d352ae09ac051d9334311ed226f1f425312848a/mcp-1.27.0.tar.gz", hash = "sha256:d3dc35a7eec0d458c1da4976a48f982097ddaab87e278c5511d5a4a56e852b83", size = 607509, upload-time = "2026-04-02T14:48:08.88Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/83/d1efe7c2980d8a3afa476f4e3d42d53dd54c0ab94c27bee5d755b45c8b73/mcp-1.27.1.tar.gz", hash = "sha256:0f47e1820f8f8f941466b39749eb1d1839a04caddca2bc60e9d46e8a99914924", size = 608458, upload-time = "2026-05-08T16:50:12.601Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/46/f6b4ad632c67ef35209a66127e4bddc95759649dd595f71f13fba11bdf9a/mcp-1.27.0-py3-none-any.whl", hash = "sha256:5ce1fa81614958e267b21fb2aa34e0aea8e2c6ede60d52aba45fd47246b4d741", size = 215967, upload-time = "2026-04-02T14:48:07.24Z" }, + { url = "https://files.pythonhosted.org/packages/fd/73/42d9596facebdb533b7f0b86c1b0364ef350d1f8ba78b1052e8a58b48b65/mcp-1.27.1-py3-none-any.whl", hash = "sha256:1af3c4203b329430fde7a87b4fcb6392a041f5cb851fd68fc674016ab4e7c06f", size = 216260, upload-time = "2026-05-08T16:50:10.547Z" }, ] [[package]] @@ -2122,52 +2150,53 @@ wheels = [ [[package]] name = "mypy" -version = "1.20.2" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "ast-serialize" }, { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/af/e3d4b3e9ec91a0ff9aabfdb38692952acf49bbb899c2e4c29acb3a6da3ae/mypy-1.20.2.tar.gz", hash = "sha256:e8222c26daaafd9e8626dec58ae36029f82585890589576f769a650dd20fd665", size = 3817349, upload-time = "2026-04-21T17:12:28.473Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/4d/9ebeae211caccbdaddde7ed5e31dfcf57faac66be9b11deb1dc6526c8078/mypy-1.20.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4077797a273e56e8843d001e9dfe4ba10e33323d6ade647ff260e5cd97d9758c", size = 14371307, upload-time = "2026-04-21T17:08:56.442Z" }, - { url = "https://files.pythonhosted.org/packages/95/d7/93473d34b61f04fac1aecc01368485c89c5c4af7a4b9a0cab5d77d04b63f/mypy-1.20.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cdecf62abcc4292500d7858aeae87a1f8f1150f4c4dd08fb0b336ee79b2a6df3", size = 13258917, upload-time = "2026-04-21T17:05:50.978Z" }, - { url = "https://files.pythonhosted.org/packages/e2/30/3dd903e8bafb7b5f7bf87fcd58f8382086dea2aa19f0a7b357f21f63071b/mypy-1.20.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c566c3a88b6ece59b3d70f65bedef17304f48eb52ff040a6a18214e1917b3254", size = 13700516, upload-time = "2026-04-21T17:11:33.161Z" }, - { url = "https://files.pythonhosted.org/packages/07/05/c61a140aba4c729ac7bc99ae26fc627c78a6e08f5b9dd319244ea71a3d7e/mypy-1.20.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0deb80d062b2479f2c87ae568f89845afc71d11bc41b04179e58165fd9f31e98", size = 14562889, upload-time = "2026-04-21T17:05:27.674Z" }, - { url = "https://files.pythonhosted.org/packages/fd/87/da78243742ffa8a36d98c3010f0d829f93d5da4e6786f1a1a6f2ad616502/mypy-1.20.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bba9ad231e92a3e424b3e56b65aa17704993425bba97e302c832f9466bb85bac", size = 14803844, upload-time = "2026-04-21T17:10:06.2Z" }, - { url = "https://files.pythonhosted.org/packages/37/52/10a1ddf91b40f843943a3c6db51e2df59c9e237f29d355e95eaab427461f/mypy-1.20.2-cp311-cp311-win_amd64.whl", hash = "sha256:baf593f2765fa3a6b1ef95807dbaa3d25b594f6a52adcc506a6b9cb115e1be67", size = 10846300, upload-time = "2026-04-21T17:12:23.886Z" }, - { url = "https://files.pythonhosted.org/packages/20/02/f9a4415b664c53bd34d6709be59da303abcae986dc4ac847b402edb6fa1e/mypy-1.20.2-cp311-cp311-win_arm64.whl", hash = "sha256:20175a1c0f49863946ec20b7f63255768058ac4f07d2b9ded6a6b46cfb5a9100", size = 9779498, upload-time = "2026-04-21T17:09:23.695Z" }, - { url = "https://files.pythonhosted.org/packages/71/4e/7560e4528db9e9b147e4c0f22660466bf30a0a1fe3d63d1b9d3b0fd354ee/mypy-1.20.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4dbfcf869f6b0517f70cf0030ba6ea1d6645e132337a7d5204a18d8d5636c02b", size = 14539393, upload-time = "2026-04-21T17:07:12.52Z" }, - { url = "https://files.pythonhosted.org/packages/32/d9/34a5efed8124f5a9234f55ac6a4ced4201e2c5b81e1109c49ad23190ec8c/mypy-1.20.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b6481b228d072315b053210b01ac320e1be243dc17f9e5887ef167f23f5fae4", size = 13361642, upload-time = "2026-04-21T17:06:53.742Z" }, - { url = "https://files.pythonhosted.org/packages/d1/14/eb377acf78c03c92d566a1510cda8137348215b5335085ef662ab82ecd3a/mypy-1.20.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34397cdced6b90b836e38182076049fdb41424322e0b0728c946b0939ebdf9f6", size = 13740347, upload-time = "2026-04-21T17:12:04.73Z" }, - { url = "https://files.pythonhosted.org/packages/b9/94/7e4634a32b641aa1c112422eed1bbece61ee16205f674190e8b536f884de/mypy-1.20.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5da6976f20cae27059ea8d0c86e7cef3de720e04c4bb9ee18e3690fdb792066", size = 14734042, upload-time = "2026-04-21T17:07:43.16Z" }, - { url = "https://files.pythonhosted.org/packages/7a/f3/f7e62395cb7f434541b4491a01149a4439e28ace4c0c632bbf5431e92d1f/mypy-1.20.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56908d7e08318d39f85b1f0c6cfd47b0cac1a130da677630dac0de3e0623e102", size = 14964958, upload-time = "2026-04-21T17:11:00.665Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0d/47e3c3a0ec2a876e35aeac365df3cac7776c36bbd4ed18cc521e1b9d255b/mypy-1.20.2-cp312-cp312-win_amd64.whl", hash = "sha256:d52ad8d78522da1d308789df651ee5379088e77c76cb1994858d40a426b343b9", size = 10911340, upload-time = "2026-04-21T17:10:49.179Z" }, - { url = "https://files.pythonhosted.org/packages/d6/b2/6c852d72e0ea8b01f49da817fb52539993cde327e7d010e0103dc12d0dac/mypy-1.20.2-cp312-cp312-win_arm64.whl", hash = "sha256:785b08db19c9f214dc37d65f7c165d19a30fcecb48abfa30f31b01b5acaabb58", size = 9833947, upload-time = "2026-04-21T17:09:05.267Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c4/b93812d3a192c9bcf5df405bd2f30277cd0e48106a14d1023c7f6ed6e39b/mypy-1.20.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:edfbfca868cdd6bd8d974a60f8a3682f5565d3f5c99b327640cedd24c4264026", size = 14524670, upload-time = "2026-04-21T17:10:30.737Z" }, - { url = "https://files.pythonhosted.org/packages/f3/47/42c122501bff18eaf1e8f457f5c017933452d8acdc52918a9f59f6812955/mypy-1.20.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e2877a02380adfcdbc69071a0f74d6e9dbbf593c0dc9d174e1f223ffd5281943", size = 13336218, upload-time = "2026-04-21T17:08:44.069Z" }, - { url = "https://files.pythonhosted.org/packages/92/8f/75bbc92f41725fbd585fb17b440b1119b576105df1013622983e18640a93/mypy-1.20.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7488448de6007cd5177c6cea0517ac33b4c0f5ee9b5e9f2be51ce75511a85517", size = 13724906, upload-time = "2026-04-21T17:08:01.02Z" }, - { url = "https://files.pythonhosted.org/packages/a1/32/4c49da27a606167391ff0c39aa955707a00edc500572e562f7c36c08a71f/mypy-1.20.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb9c2fa06887e21d6a3a868762acb82aec34e2c6fd0174064f27c93ede68ad15", size = 14726046, upload-time = "2026-04-21T17:11:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/7f/fc/4e354a1bd70216359deb0c9c54847ee6b32ef78dfb09f5131ff99b494078/mypy-1.20.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d56a78b646f2e3daa865bc70cd5ec5a46c50045801ca8ff17a0c43abc97e3ee", size = 14955587, upload-time = "2026-04-21T17:12:16.033Z" }, - { url = "https://files.pythonhosted.org/packages/62/b2/c0f2056e9eb8f08c62cafd9715e4584b89132bdc832fcf85d27d07b5f3e5/mypy-1.20.2-cp313-cp313-win_amd64.whl", hash = "sha256:2a4102b03bb7481d9a91a6da8d174740c9c8c4401024684b9ca3b7cc5e49852f", size = 10922681, upload-time = "2026-04-21T17:06:35.842Z" }, - { url = "https://files.pythonhosted.org/packages/e5/14/065e333721f05de8ef683d0aa804c23026bcc287446b61cac657b902ccac/mypy-1.20.2-cp313-cp313-win_arm64.whl", hash = "sha256:a95a9248b0c6fd933a442c03c3b113c3b61320086b88e2c444676d3fd1ca3330", size = 9830560, upload-time = "2026-04-21T17:07:51.023Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d1/b4ec96b0ecc620a4443570c6e95c867903428cfcde4206518eafdd5880c3/mypy-1.20.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:419413398fe250aae057fd2fe50166b61077083c9b82754c341cf4fd73038f30", size = 14524561, upload-time = "2026-04-21T17:06:27.325Z" }, - { url = "https://files.pythonhosted.org/packages/3a/63/d2c2ff4fa66bc49477d32dfa26e8a167ba803ea6a69c5efb416036909d30/mypy-1.20.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e73c07f23009962885c197ccb9b41356a30cc0e5a1d0c2ea8fd8fb1362d7f924", size = 13363883, upload-time = "2026-04-21T17:11:11.239Z" }, - { url = "https://files.pythonhosted.org/packages/2a/56/983916806bf4eddeaaa2c9230903c3669c6718552a921154e1c5182c701f/mypy-1.20.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c64e5973df366b747646fc98da921f9d6eba9716d57d1db94a83c026a08e0fb", size = 13742945, upload-time = "2026-04-21T17:08:34.181Z" }, - { url = "https://files.pythonhosted.org/packages/19/65/0cd9285ab010ee8214c83d67c6b49417c40d86ce46f1aa109457b5a9b8d7/mypy-1.20.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a65aa591af023864fd08a97da9974e919452cfe19cb146c8a5dc692626445dc", size = 14706163, upload-time = "2026-04-21T17:05:15.51Z" }, - { url = "https://files.pythonhosted.org/packages/94/97/48ff3b297cafcc94d185243a9190836fb1b01c1b0918fff64e941e973cc9/mypy-1.20.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4fef51b01e638974a6e69885687e9bd40c8d1e09a6cd291cca0619625cf1f558", size = 14938677, upload-time = "2026-04-21T17:05:39.562Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a1/1b4233d255bdd0b38a1f284feeb1c143ca508c19184964e22f8d837ec851/mypy-1.20.2-cp314-cp314-win_amd64.whl", hash = "sha256:913485a03f1bcf5d279409a9d2b9ed565c151f61c09f29991e5faa14033da4c8", size = 11089322, upload-time = "2026-04-21T17:06:44.29Z" }, - { url = "https://files.pythonhosted.org/packages/78/c2/ce7ee2ba36aeb954ba50f18fa25d9c1188578654b97d02a66a15b6f09531/mypy-1.20.2-cp314-cp314-win_arm64.whl", hash = "sha256:c3bae4f855d965b5453784300c12ffc63a548304ac7f99e55d4dc7c898673aa3", size = 10017775, upload-time = "2026-04-21T17:07:20.732Z" }, - { url = "https://files.pythonhosted.org/packages/4e/a1/9d93a7d0b5859af0ead82b4888b46df6c8797e1bc5e1e262a08518c6d48e/mypy-1.20.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2de3dcea53babc1c3237a19002bc3d228ce1833278f093b8d619e06e7cc79609", size = 15549002, upload-time = "2026-04-21T17:08:23.107Z" }, - { url = "https://files.pythonhosted.org/packages/00/d2/09a6a10ee1bf0008f6c144d9676f2ca6a12512151b4e0ad0ff6c4fac5337/mypy-1.20.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:52b176444e2e5054dfcbcb8c75b0b719865c96247b37407184bbfca5c353f2c2", size = 14401942, upload-time = "2026-04-21T17:07:31.837Z" }, - { url = "https://files.pythonhosted.org/packages/57/da/9594b75c3c019e805250bed3583bdf4443ff9e6ef08f97e39ae308cb06f2/mypy-1.20.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:688c3312e5dadb573a2c69c82af3a298d43ecf9e6d264e0f95df960b5f6ac19c", size = 15041649, upload-time = "2026-04-21T17:09:34.653Z" }, - { url = "https://files.pythonhosted.org/packages/97/77/f75a65c278e6e8eba2071f7f5a90481891053ecc39878cc444634d892abe/mypy-1.20.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29752dbbf8cc53f89f6ac096d363314333045c257c9c75cbd189ca2de0455744", size = 15864588, upload-time = "2026-04-21T17:11:44.936Z" }, - { url = "https://files.pythonhosted.org/packages/d7/46/1a4e1c66e96c1a3246ddf5403d122ac9b0a8d2b7e65730b9d6533ba7a6d3/mypy-1.20.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:803203d2b6ea644982c644895c2f78b28d0e208bba7b27d9b921e0ec5eb207c6", size = 16093956, upload-time = "2026-04-21T17:10:17.683Z" }, - { url = "https://files.pythonhosted.org/packages/5a/2c/78a8851264dec38cd736ca5b8bc9380674df0dd0be7792f538916157716c/mypy-1.20.2-cp314-cp314t-win_amd64.whl", hash = "sha256:9bcb8aa397ff0093c824182fd76a935a9ba7ad097fcbef80ae89bf6c1731d8ec", size = 12568661, upload-time = "2026-04-21T17:11:54.473Z" }, - { url = "https://files.pythonhosted.org/packages/83/01/cd7318aa03493322ce275a0e14f4f52b8896335e4e79d4fb8153a7ad2b77/mypy-1.20.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e061b58443f1736f8a37c48978d7ab581636d6ab03e3d4f99e3fa90463bb9382", size = 10389240, upload-time = "2026-04-21T17:09:42.719Z" }, - { url = "https://files.pythonhosted.org/packages/28/9a/f23c163e25b11074188251b0b5a0342625fc1cdb6af604757174fa9acc9b/mypy-1.20.2-py3-none-any.whl", hash = "sha256:a94c5a76ab46c5e6257c7972b6c8cff0574201ca7dc05647e33e795d78680563", size = 2637314, upload-time = "2026-04-21T17:05:54.5Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, + { url = "https://files.pythonhosted.org/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, + { url = "https://files.pythonhosted.org/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, + { url = "https://files.pythonhosted.org/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, + { url = "https://files.pythonhosted.org/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, + { url = "https://files.pythonhosted.org/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", size = 10040684, upload-time = "2026-05-11T18:36:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, + { url = "https://files.pythonhosted.org/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, + { url = "https://files.pythonhosted.org/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", size = 11147435, upload-time = "2026-05-11T18:33:56.477Z" }, + { url = "https://files.pythonhosted.org/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", size = 10035052, upload-time = "2026-05-11T18:32:30.049Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", size = 14848422, upload-time = "2026-05-11T18:35:45.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", size = 13677374, upload-time = "2026-05-11T18:36:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", size = 14055743, upload-time = "2026-05-11T18:35:18.361Z" }, + { url = "https://files.pythonhosted.org/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", size = 15020937, upload-time = "2026-05-11T18:34:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", size = 15253371, upload-time = "2026-05-11T18:36:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", size = 11326429, upload-time = "2026-05-11T18:34:13.526Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", size = 10218799, upload-time = "2026-05-11T18:32:23.491Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", size = 15923458, upload-time = "2026-05-11T18:35:28.64Z" }, + { url = "https://files.pythonhosted.org/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", size = 14757697, upload-time = "2026-05-11T18:36:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", size = 15405638, upload-time = "2026-05-11T18:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", size = 16215852, upload-time = "2026-05-11T18:32:50.296Z" }, + { url = "https://files.pythonhosted.org/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", size = 16452695, upload-time = "2026-05-11T18:33:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", size = 12866622, upload-time = "2026-05-11T18:34:39.945Z" }, + { url = "https://files.pythonhosted.org/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", size = 10610798, upload-time = "2026-05-11T18:36:31.444Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, ] [[package]] @@ -2181,11 +2210,11 @@ wheels = [ [[package]] name = "narwhals" -version = "2.20.0" +version = "2.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/f3/257adc69a71011b4c8cda321b00f02c5bf1980ae38ffd05a58d9632d4de8/narwhals-2.20.0.tar.gz", hash = "sha256:c10994975fa7dc5a68c2cffcddbd5908fc8ebb2d463c5bab085309c0ee1f551e", size = 627848, upload-time = "2026-04-20T12:11:45.427Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/a0/6198c56d42ef2f3c6ed0c42ba30dbcefdc86a91262d7d449010770ae085b/narwhals-2.21.2.tar.gz", hash = "sha256:5c5b2d0b47aef7c73ea412cfcbcd467f2f2d5be73e3c2ab19d78f4a97718790a", size = 632176, upload-time = "2026-05-16T08:49:08.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/69/f24d3d1c38ad69e256138b4ec2452a8c7cf66be49dc214771ae99dd4f0a0/narwhals-2.20.0-py3-none-any.whl", hash = "sha256:16e750ea5507d4ba6e8d03455b5f93a535e0405976561baea235bca5dc9f475d", size = 449373, upload-time = "2026-04-20T12:11:43.596Z" }, + { url = "https://files.pythonhosted.org/packages/1d/77/928ea2e70641ca177a11140062cc5840d421795f2e82749d408d0cce900a/narwhals-2.21.2-py3-none-any.whl", hash = "sha256:7bb57c3700486039215455b9bf2d64261915cc0fd845cc30272d631df696b251", size = 451201, upload-time = "2026-05-16T08:49:05.536Z" }, ] [[package]] @@ -2199,81 +2228,81 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, - { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, - { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, - { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, - { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, - { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, - { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, - { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, - { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, - { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, - { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, - { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, - { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, - { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, - { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, - { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, - { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, - { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, - { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, - { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, - { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, - { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, - { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, - { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, - { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, - { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, - { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, - { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, - { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, - { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, - { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, - { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, - { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, - { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, - { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, - { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, - { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, - { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, - { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, - { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, - { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, - { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, - { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, - { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, - { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, - { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, - { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, - { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, - { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, - { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, - { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, - { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, - { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, - { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, - { url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" }, +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, ] [[package]] @@ -2321,7 +2350,7 @@ name = "nvidia-cudnn-cu12" version = "9.10.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { 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, upload-time = "2025-06-06T21:52:51.348Z" }, @@ -2333,7 +2362,7 @@ name = "nvidia-cufft-cu12" version = "11.3.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/1f/37/c50d2b2f2c07e146776389e3080f4faf70bcc4fa6e19d65bb54ca174ebc3/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d16079550df460376455cba121db6564089176d9bac9e4f360493ca4741b22a6", size = 200164144, upload-time = "2024-11-20T17:40:58.288Z" }, @@ -2367,9 +2396,9 @@ name = "nvidia-cusolver-cu12" version = "11.7.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "nvidia-cusparse-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/93/17/dbe1aa865e4fdc7b6d4d0dd308fdd5aaab60f939abfc0ea1954eac4fb113/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0ce237ef60acde1efc457335a2ddadfd7610b892d94efee7b776c64bb1cac9e0", size = 157833628, upload-time = "2024-10-01T17:05:05.591Z" }, @@ -2383,7 +2412,7 @@ name = "nvidia-cusparse-cu12" version = "12.5.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/eb/eb/6681efd0aa7df96b4f8067b3ce7246833dd36830bb4cec8896182773db7d/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d25b62fb18751758fe3c93a4a08eff08effedfe4edf1c6bb5afd0890fe88f887", size = 216451147, upload-time = "2024-11-20T17:44:18.055Z" }, @@ -2403,11 +2432,11 @@ wheels = [ [[package]] name = "nvidia-nccl-cu12" -version = "2.28.9" +version = "2.29.3" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/c4/120d2dfd92dff2c776d68f361ff8705fdea2ca64e20b612fab0fd3f581ac/nvidia_nccl_cu12-2.28.9-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:50a36e01c4a090b9f9c47d92cec54964de6b9fcb3362d0e19b8ffc6323c21b60", size = 296766525, upload-time = "2025-11-18T05:49:16.094Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4e/44dbb46b3d1b0ec61afda8e84837870f2f9ace33c564317d59b70bc19d3e/nvidia_nccl_cu12-2.28.9-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:485776daa8447da5da39681af455aa3b2c2586ddcf4af8772495e7c532c7e5ab", size = 296782137, upload-time = "2025-11-18T05:49:34.248Z" }, + { url = "https://files.pythonhosted.org/packages/28/cf/bcf8bb0c0030b1b9a345331f6281c37d2a8669758521eb93c382f6f87c8f/nvidia_nccl_cu12-2.29.3-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:6351b79dc7d2cc3d654ea1523616b9eeded71fe9c8da66b71eef9a5d1b2adad4", size = 289708535, upload-time = "2026-02-03T21:10:58.804Z" }, + { url = "https://files.pythonhosted.org/packages/31/5a/cac7d231f322b66caa16fd4b136ebc8e4b18b2805811c2d58dc47210cdea/nvidia_nccl_cu12-2.29.3-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:35ad42e7d5d722a83c36a3a478e281c20a5646383deaf1b9ed1a9ab7d61bed53", size = 289760316, upload-time = "2026-02-03T21:11:37.899Z" }, ] [[package]] @@ -2441,7 +2470,7 @@ wheels = [ [[package]] name = "openai" -version = "2.34.0" +version = "2.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2453,90 +2482,89 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/89/f1e78f5f828f4e97a6ebca8f45c6b35667da12b074ac490dc8362b882279/openai-2.34.0.tar.gz", hash = "sha256:828b4efcbb126352c2b5eb97d33ae890c92a71ab72511aefc1b7fe64aeccb07b", size = 759556, upload-time = "2026-05-04T17:34:08.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/32/50/5901f01ef14e6c27788beb91e54fef5d6204fb5fb9e97402fc8a14de2e32/openai-2.37.0.tar.gz", hash = "sha256:f4bc562cc5f3a43d40d678105572d9d44765f6e0f50c125f63055419b72f4bd9", size = 754706, upload-time = "2026-05-15T22:30:35.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/40/f090499f10514515081d09cb9da09f25b821eb20497e9423afe4f07b4ecf/openai-2.34.0-py3-none-any.whl", hash = "sha256:c996a71b1a210f3569844572ad4c609307e978515fb76877cf449b72596e549e", size = 1316535, upload-time = "2026-05-04T17:34:06.773Z" }, + { url = "https://files.pythonhosted.org/packages/ed/4c/bce61680d0699a78a405fd9a67989b175ba020590428831aab2ab1d2be7c/openai-2.37.0-py3-none-any.whl", hash = "sha256:814633888b8f3b1ffd6615697c6e4ef93632d08b7c2e28c8c5ef3556e5a10107", size = 1303238, upload-time = "2026-05-15T22:30:32.767Z" }, ] [[package]] name = "opentelemetry-api" -version = "1.41.1" +version = "1.42.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/fc/b7564cbef36601aef0d6c9bc01f7badb64be8e862c2e1c3c5c3b43b53e4f/opentelemetry_api-1.41.1.tar.gz", hash = "sha256:0ad1814d73b875f84494387dae86ce0b12c68556331ce6ce8fe789197c949621", size = 71416, upload-time = "2026-04-24T13:15:38.262Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/ca/25288069c399be6769159d9fb7b1190b603537d82aad2fa2746a0cc2c8c6/opentelemetry_api-1.42.0.tar.gz", hash = "sha256:ea84c893ad177791d138e0349d6ceebd8d3bf006440900400ce220008dafc372", size = 72300, upload-time = "2026-05-19T09:46:29.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/59/3e7118ed140f76b0982ba4321bdaed1997a0473f9720de2d10788a577033/opentelemetry_api-1.41.1-py3-none-any.whl", hash = "sha256:a22df900e75c76dc08440710e51f52f1aa6b451b429298896023e60db5b3139f", size = 69007, upload-time = "2026-04-24T13:15:15.662Z" }, + { url = "https://files.pythonhosted.org/packages/1b/0b/be5daf659b82b525338fde371dfcfab09b606a19bb5620c37076964710ec/opentelemetry_api-1.42.0-py3-none-any.whl", hash = "sha256:558d88f88192a973579910ef6f2c13db47a268d5ec2e53e83e50e74a39a02922", size = 61310, upload-time = "2026-05-19T09:46:06.561Z" }, ] [[package]] name = "orjson" -version = "3.11.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/1b/2024d06792d0779f9dbc51531b61c24f76c75b9f4ce05e6f3377a1814cea/orjson-3.11.8.tar.gz", hash = "sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e", size = 5603832, upload-time = "2026-03-31T16:16:27.878Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/41/5aa7fa3b0f4dc6b47dcafc3cea909299c37e40e9972feabc8b6a74e2730d/orjson-3.11.8-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34", size = 229229, upload-time = "2026-03-31T16:14:50.424Z" }, - { url = "https://files.pythonhosted.org/packages/0a/d7/57e7f2458e0a2c41694f39fc830030a13053a84f837a5b73423dca1f0938/orjson-3.11.8-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8", size = 128871, upload-time = "2026-03-31T16:14:51.888Z" }, - { url = "https://files.pythonhosted.org/packages/53/4a/e0fdb9430983e6c46e0299559275025075568aad5d21dd606faee3703924/orjson-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30491bc4f862aa15744b9738517454f1e46e56c972a2be87d70d727d5b2a8f8", size = 132104, upload-time = "2026-03-31T16:14:53.142Z" }, - { url = "https://files.pythonhosted.org/packages/08/4a/2025a60ff3f5c8522060cda46612d9b1efa653de66ed2908591d8d82f22d/orjson-3.11.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eda5b8b6be91d3f26efb7dc6e5e68ee805bc5617f65a328587b35255f138bf4", size = 130483, upload-time = "2026-03-31T16:14:54.605Z" }, - { url = "https://files.pythonhosted.org/packages/2d/3c/b9cde05bdc7b2385c66014e0620627da638d3d04e4954416ab48c31196c5/orjson-3.11.8-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee8db7bfb6fe03581bbab54d7c4124a6dd6a7f4273a38f7267197890f094675f", size = 135481, upload-time = "2026-03-31T16:14:55.901Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f2/a8238e7734de7cb589fed319857a8025d509c89dc52fdcc88f39c6d03d5a/orjson-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8b5231de76c528a46b57010bbd83fb51e056aa0220a372fd5065e978406f1c", size = 146819, upload-time = "2026-03-31T16:14:57.548Z" }, - { url = "https://files.pythonhosted.org/packages/db/10/dbf1e2a3cafea673b1b4350e371877b759060d6018a998643b7040e5de48/orjson-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58a4a208a6fbfdb7a7327b8f201c6014f189f721fd55d047cafc4157af1bc62a", size = 132846, upload-time = "2026-03-31T16:14:58.91Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fc/55e667ec9c85694038fcff00573d221b085d50777368ee3d77f38668bf3c/orjson-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c", size = 133580, upload-time = "2026-03-31T16:15:00.519Z" }, - { url = "https://files.pythonhosted.org/packages/7e/a6/c08c589a9aad0cb46c4831d17de212a2b6901f9d976814321ff8e69e8785/orjson-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0022bb50f90da04b009ce32c512dc1885910daa7cb10b7b0cba4505b16db82a8", size = 142042, upload-time = "2026-03-31T16:15:01.906Z" }, - { url = "https://files.pythonhosted.org/packages/5c/cc/2f78ea241d52b717d2efc38878615fe80425bf2beb6e68c984dde257a766/orjson-3.11.8-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ff51f9d657d1afb6f410cb435792ce4e1fe427aab23d2fcd727a2876e21d4cb6", size = 423845, upload-time = "2026-03-31T16:15:03.703Z" }, - { url = "https://files.pythonhosted.org/packages/70/07/c17dcf05dd8045457538428a983bf1f1127928df5bf328cb24d2b7cddacb/orjson-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6dbe9a97bdb4d8d9d5367b52a7c32549bba70b2739c58ef74a6964a6d05ae054", size = 147729, upload-time = "2026-03-31T16:15:05.203Z" }, - { url = "https://files.pythonhosted.org/packages/90/6c/0fb6e8a24e682e0958d71711ae6f39110e4b9cd8cab1357e2a89cb8e1951/orjson-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7", size = 136425, upload-time = "2026-03-31T16:15:07.052Z" }, - { url = "https://files.pythonhosted.org/packages/b2/35/4d3cc3a3d616035beb51b24a09bb872942dc452cf2df0c1d11ab35046d9f/orjson-3.11.8-cp311-cp311-win32.whl", hash = "sha256:0e32f7154299f42ae66f13488963269e5eccb8d588a65bc839ed986919fc9fac", size = 131870, upload-time = "2026-03-31T16:15:08.678Z" }, - { url = "https://files.pythonhosted.org/packages/13/26/9fe70f81d16b702f8c3a775e8731b50ad91d22dacd14c7599b60a0941cd1/orjson-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:25e0c672a2e32348d2eb33057b41e754091f2835f87222e4675b796b92264f06", size = 127440, upload-time = "2026-03-31T16:15:09.994Z" }, - { url = "https://files.pythonhosted.org/packages/e8/c6/b038339f4145efd2859c1ca53097a52c0bb9cbdd24f947ebe146da1ad067/orjson-3.11.8-cp311-cp311-win_arm64.whl", hash = "sha256:9185589c1f2a944c17e26c9925dcdbc2df061cc4a145395c57f0c51f9b5dbfcd", size = 127399, upload-time = "2026-03-31T16:15:11.412Z" }, - { url = "https://files.pythonhosted.org/packages/01/f6/8d58b32ab32d9215973a1688aebd098252ee8af1766c0e4e36e7831f0295/orjson-3.11.8-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f", size = 229233, upload-time = "2026-03-31T16:15:12.762Z" }, - { url = "https://files.pythonhosted.org/packages/a9/8b/2ffe35e71f6b92622e8ea4607bf33ecf7dfb51b3619dcfabfd36cbe2d0a5/orjson-3.11.8-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6", size = 128772, upload-time = "2026-03-31T16:15:14.237Z" }, - { url = "https://files.pythonhosted.org/packages/27/d2/1f8682ae50d5c6897a563cb96bc106da8c9cb5b7b6e81a52e4cc086679b9/orjson-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76070a76e9c5ae661e2d9848f216980d8d533e0f8143e6ed462807b242e3c5e8", size = 131946, upload-time = "2026-03-31T16:15:15.607Z" }, - { url = "https://files.pythonhosted.org/packages/52/4b/5500f76f0eece84226e0689cb48dcde081104c2fa6e2483d17ca13685ffb/orjson-3.11.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54153d21520a71a4c82a0dbb4523e468941d549d221dc173de0f019678cf3813", size = 130368, upload-time = "2026-03-31T16:15:17.066Z" }, - { url = "https://files.pythonhosted.org/packages/da/4e/58b927e08fbe9840e6c920d9e299b051ea667463b1f39a56e668669f8508/orjson-3.11.8-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:469ac2125611b7c5741a0b3798cd9e5786cbad6345f9f400c77212be89563bec", size = 135540, upload-time = "2026-03-31T16:15:18.404Z" }, - { url = "https://files.pythonhosted.org/packages/56/7c/ba7cb871cba1bcd5cd02ee34f98d894c6cea96353ad87466e5aef2429c60/orjson-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14778ffd0f6896aa613951a7fbf4690229aa7a543cb2bfbe9f358e08aafa9546", size = 146877, upload-time = "2026-03-31T16:15:19.833Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/eb9c25fc1386696c6a342cd361c306452c75e0b55e86ad602dd4827a7fd7/orjson-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea56a955056a6d6c550cf18b3348656a9d9a4f02e2d0c02cabf3c73f1055d506", size = 132837, upload-time = "2026-03-31T16:15:21.282Z" }, - { url = "https://files.pythonhosted.org/packages/37/87/5ddeb7fc1fbd9004aeccab08426f34c81a5b4c25c7061281862b015fce2b/orjson-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f", size = 133624, upload-time = "2026-03-31T16:15:22.641Z" }, - { url = "https://files.pythonhosted.org/packages/22/09/90048793db94ee4b2fcec4ac8e5ddb077367637d6650be896b3494b79bb7/orjson-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b48e274f8824567d74e2158199e269597edf00823a1b12b63d48462bbf5123e", size = 141904, upload-time = "2026-03-31T16:15:24.435Z" }, - { url = "https://files.pythonhosted.org/packages/c0/cf/eb284847487821a5d415e54149a6449ba9bfc5872ce63ab7be41b8ec401c/orjson-3.11.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3f262401086a3960586af06c054609365e98407151f5ea24a62893a40d80dbbb", size = 423742, upload-time = "2026-03-31T16:15:26.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/09/e12423d327071c851c13e76936f144a96adacfc037394dec35ac3fc8d1e8/orjson-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e8c6218b614badf8e229b697865df4301afa74b791b6c9ade01d19a9953a942", size = 147806, upload-time = "2026-03-31T16:15:27.909Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6d/37c2589ba864e582ffe7611643314785c6afb1f83c701654ef05daa8fcc7/orjson-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25", size = 136485, upload-time = "2026-03-31T16:15:29.749Z" }, - { url = "https://files.pythonhosted.org/packages/be/c9/135194a02ab76b04ed9a10f68624b7ebd238bbe55548878b11ff15a0f352/orjson-3.11.8-cp312-cp312-win32.whl", hash = "sha256:e0950ed1bcb9893f4293fd5c5a7ee10934fbf82c4101c70be360db23ce24b7d2", size = 131966, upload-time = "2026-03-31T16:15:31.687Z" }, - { url = "https://files.pythonhosted.org/packages/ed/9a/9796f8fbe3cf30ce9cb696748dbb535e5c87be4bf4fe2e9ca498ef1fa8cf/orjson-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:3cf17c141617b88ced4536b2135c552490f07799f6ad565948ea07bef0dcb9a6", size = 127441, upload-time = "2026-03-31T16:15:33.333Z" }, - { url = "https://files.pythonhosted.org/packages/cc/47/5aaf54524a7a4a0dd09dd778f3fa65dd2108290615b652e23d944152bc8e/orjson-3.11.8-cp312-cp312-win_arm64.whl", hash = "sha256:48854463b0572cc87dac7d981aa72ed8bf6deedc0511853dc76b8bbd5482d36d", size = 127364, upload-time = "2026-03-31T16:15:34.748Z" }, - { url = "https://files.pythonhosted.org/packages/66/7f/95fba509bb2305fab0073558f1e8c3a2ec4b2afe58ed9fcb7d3b8beafe94/orjson-3.11.8-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3f23426851d98478c8970da5991f84784a76682213cd50eb73a1da56b95239dc", size = 229180, upload-time = "2026-03-31T16:15:36.426Z" }, - { url = "https://files.pythonhosted.org/packages/f6/9d/b237215c743ca073697d759b5503abd2cb8a0d7b9c9e21f524bcf176ab66/orjson-3.11.8-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ebaed4cef74a045b83e23537b52ef19a367c7e3f536751e355a2a394f8648559", size = 128754, upload-time = "2026-03-31T16:15:38.049Z" }, - { url = "https://files.pythonhosted.org/packages/42/3d/27d65b6d11e63f133781425f132807aef793ed25075fec686fc8e46dd528/orjson-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97c8f5d3b62380b70c36ffacb2a356b7c6becec86099b177f73851ba095ef623", size = 131877, upload-time = "2026-03-31T16:15:39.484Z" }, - { url = "https://files.pythonhosted.org/packages/dd/cc/faee30cd8f00421999e40ef0eba7332e3a625ce91a58200a2f52c7fef235/orjson-3.11.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:436c4922968a619fb7fef1ccd4b8b3a76c13b67d607073914d675026e911a65c", size = 130361, upload-time = "2026-03-31T16:15:41.274Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/a6c55896197f97b6d4b4e7c7fd77e7235517c34f5d6ad5aadd43c54c6d7c/orjson-3.11.8-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ab359aff0436d80bfe8a23b46b5fea69f1e18aaf1760a709b4787f1318b317f", size = 135521, upload-time = "2026-03-31T16:15:42.758Z" }, - { url = "https://files.pythonhosted.org/packages/9c/7c/ca3a3525aa32ff636ebb1778e77e3587b016ab2edb1b618b36ba96f8f2c0/orjson-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f89b6d0b3a8d81e1929d3ab3d92bbc225688bd80a770c49432543928fe09ac55", size = 146862, upload-time = "2026-03-31T16:15:44.341Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0c/18a9d7f18b5edd37344d1fd5be17e94dc652c67826ab749c6e5948a78112/orjson-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c009e7a2ca9ad0ed1376ce20dd692146a5d9fe4310848904b6b4fee5c5c137", size = 132847, upload-time = "2026-03-31T16:15:46.368Z" }, - { url = "https://files.pythonhosted.org/packages/23/91/7e722f352ad67ca573cee44de2a58fb810d0f4eb4e33276c6a557979fd8a/orjson-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b895b781b3e395c067129d8551655642dfe9437273211d5404e87ac752b53", size = 133637, upload-time = "2026-03-31T16:15:48.123Z" }, - { url = "https://files.pythonhosted.org/packages/af/04/32845ce13ac5bd1046ddb02ac9432ba856cc35f6d74dde95864fe0ad5523/orjson-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88006eda83858a9fdf73985ce3804e885c2befb2f506c9a3723cdeb5a2880e3e", size = 141906, upload-time = "2026-03-31T16:15:49.626Z" }, - { url = "https://files.pythonhosted.org/packages/02/5e/c551387ddf2d7106d9039369862245c85738b828844d13b99ccb8d61fd06/orjson-3.11.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:55120759e61309af7fcf9e961c6f6af3dde5921cdb3ee863ef63fd9db126cae6", size = 423722, upload-time = "2026-03-31T16:15:51.176Z" }, - { url = "https://files.pythonhosted.org/packages/00/a3/ecfe62434096f8a794d4976728cb59bcfc4a643977f21c2040545d37eb4c/orjson-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:98bdc6cb889d19bed01de46e67574a2eab61f5cc6b768ed50e8ac68e9d6ffab6", size = 147801, upload-time = "2026-03-31T16:15:52.939Z" }, - { url = "https://files.pythonhosted.org/packages/18/6d/0dce10b9f6643fdc59d99333871a38fa5a769d8e2fc34a18e5d2bfdee900/orjson-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:708c95f925a43ab9f34625e45dcdadf09ec8a6e7b664a938f2f8d5650f6c090b", size = 136460, upload-time = "2026-03-31T16:15:54.431Z" }, - { url = "https://files.pythonhosted.org/packages/01/d6/6dde4f31842d87099238f1f07b459d24edc1a774d20687187443ab044191/orjson-3.11.8-cp313-cp313-win32.whl", hash = "sha256:01c4e5a6695dc09098f2e6468a251bc4671c50922d4d745aff1a0a33a0cf5b8d", size = 131956, upload-time = "2026-03-31T16:15:56.081Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f9/4e494a56e013db957fb77186b818b916d4695b8fa2aa612364974160e91b/orjson-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:c154a35dd1330707450bb4d4e7dd1f17fa6f42267a40c1e8a1daa5e13719b4b8", size = 127410, upload-time = "2026-03-31T16:15:57.54Z" }, - { url = "https://files.pythonhosted.org/packages/57/7f/803203d00d6edb6e9e7eef421d4e1adbb5ea973e40b3533f3cfd9aeb374e/orjson-3.11.8-cp313-cp313-win_arm64.whl", hash = "sha256:4861bde57f4d253ab041e374f44023460e60e71efaa121f3c5f0ed457c3a701e", size = 127338, upload-time = "2026-03-31T16:15:59.106Z" }, - { url = "https://files.pythonhosted.org/packages/6d/35/b01910c3d6b85dc882442afe5060cbf719c7d1fc85749294beda23d17873/orjson-3.11.8-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ec795530a73c269a55130498842aaa762e4a939f6ce481a7e986eeaa790e9da4", size = 229171, upload-time = "2026-03-31T16:16:00.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/56/c9ec97bd11240abef39b9e5d99a15462809c45f677420fd148a6c5e6295e/orjson-3.11.8-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c492a0e011c0f9066e9ceaa896fbc5b068c54d365fea5f3444b697ee01bc8625", size = 128746, upload-time = "2026-03-31T16:16:02.673Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e4/66d4f30a90de45e2f0cbd9623588e8ae71eef7679dbe2ae954ed6d66a41f/orjson-3.11.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:883206d55b1bd5f5679ad5e6ddd3d1a5e3cac5190482927fdb8c78fb699193b5", size = 131867, upload-time = "2026-03-31T16:16:04.342Z" }, - { url = "https://files.pythonhosted.org/packages/19/30/2a645fc9286b928675e43fa2a3a16fb7b6764aa78cc719dc82141e00f30b/orjson-3.11.8-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5774c1fdcc98b2259800b683b19599c133baeb11d60033e2095fd9d4667b82db", size = 124664, upload-time = "2026-03-31T16:16:05.837Z" }, - { url = "https://files.pythonhosted.org/packages/db/44/77b9a86d84a28d52ba3316d77737f6514e17118119ade3f91b639e859029/orjson-3.11.8-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7381c83dd3d4a6347e6635950aa448f54e7b8406a27c7ecb4a37e9f1ae08b", size = 129701, upload-time = "2026-03-31T16:16:07.407Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ea/eff3d9bfe47e9bc6969c9181c58d9f71237f923f9c86a2d2f490cd898c82/orjson-3.11.8-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14439063aebcb92401c11afc68ee4e407258d2752e62d748b6942dad20d2a70d", size = 141202, upload-time = "2026-03-31T16:16:09.48Z" }, - { url = "https://files.pythonhosted.org/packages/52/c8/90d4b4c60c84d62068d0cf9e4d8f0a4e05e76971d133ac0c60d818d4db20/orjson-3.11.8-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa72e71977bff96567b0f500fc5bfd2fdf915f34052c782a4c6ebbdaa97aa858", size = 127194, upload-time = "2026-03-31T16:16:11.02Z" }, - { url = "https://files.pythonhosted.org/packages/8d/c7/ea9e08d1f0ba981adffb629811148b44774d935171e7b3d780ae43c4c254/orjson-3.11.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7679bc2f01bb0d219758f1a5f87bb7c8a81c0a186824a393b366876b4948e14f", size = 133639, upload-time = "2026-03-31T16:16:13.434Z" }, - { url = "https://files.pythonhosted.org/packages/6c/8c/ddbbfd6ba59453c8fc7fe1d0e5983895864e264c37481b2a791db635f046/orjson-3.11.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:14f7b8fcb35ef403b42fa5ecfa4ed032332a91f3dc7368fbce4184d59e1eae0d", size = 141914, upload-time = "2026-03-31T16:16:14.955Z" }, - { url = "https://files.pythonhosted.org/packages/4e/31/dbfbefec9df060d34ef4962cd0afcb6fa7a9ec65884cb78f04a7859526c3/orjson-3.11.8-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c2bdf7b2facc80b5e34f48a2d557727d5c5c57a8a450de122ae81fa26a81c1bc", size = 423800, upload-time = "2026-03-31T16:16:16.594Z" }, - { url = "https://files.pythonhosted.org/packages/87/cf/f74e9ae9803d4ab46b163494adba636c6d7ea955af5cc23b8aaa94cfd528/orjson-3.11.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ccd7ba1b0605813a0715171d39ec4c314cb97a9c85893c2c5c0c3a3729df38bf", size = 147837, upload-time = "2026-03-31T16:16:18.585Z" }, - { url = "https://files.pythonhosted.org/packages/64/e6/9214f017b5db85e84e68602792f742e5dc5249e963503d1b356bee611e01/orjson-3.11.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbc8c9c02463fef4d3c53a9ba3336d05496ec8e1f1c53326a1e4acc11f5c600", size = 136441, upload-time = "2026-03-31T16:16:20.151Z" }, - { url = "https://files.pythonhosted.org/packages/24/dd/3590348818f58f837a75fb969b04cdf187ae197e14d60b5e5a794a38b79d/orjson-3.11.8-cp314-cp314-win32.whl", hash = "sha256:0b57f67710a8cd459e4e54eb96d5f77f3624eba0c661ba19a525807e42eccade", size = 131983, upload-time = "2026-03-31T16:16:21.823Z" }, - { url = "https://files.pythonhosted.org/packages/3f/0f/b6cb692116e05d058f31ceee819c70f097fa9167c82f67fabe7516289abc/orjson-3.11.8-cp314-cp314-win_amd64.whl", hash = "sha256:735e2262363dcbe05c35e3a8869898022af78f89dde9e256924dc02e99fe69ca", size = 127396, upload-time = "2026-03-31T16:16:23.685Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d1/facb5b5051fabb0ef9d26c6544d87ef19a939a9a001198655d0d891062dd/orjson-3.11.8-cp314-cp314-win_arm64.whl", hash = "sha256:6ccdea2c213cf9f3d9490cbd5d427693c870753df41e6cb375bd79bcbafc8817", size = 127330, upload-time = "2026-03-31T16:16:25.496Z" }, +version = "3.11.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/51/3fb9e65ae76ee97bd611869a503fa3fc0a6e81dd8b737cf3003f682df7ff/orjson-3.11.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f01c4818b3fc9b0da8e096722a84318071eaa118df35f6ed2344da0e73a5444f", size = 228522, upload-time = "2026-05-06T15:09:35.362Z" }, + { url = "https://files.pythonhosted.org/packages/16/fa/9d54b07cb3f3b0bfd57841478e42d7a0ece4a9f49f9907eecf5a45461687/orjson-3.11.9-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:3ebca4179031ee716ed076ffadc29428e900512f6fccee8614c9983157fcf19c", size = 128463, upload-time = "2026-05-06T15:09:37.063Z" }, + { url = "https://files.pythonhosted.org/packages/88/b1/6ceafc2eefd0a553e3be77ce6c49d107e772485d9568629376171c50e634/orjson-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48ee05097750de0ff69ed5b7bbcf0732182fd57a24043dcc2a1da780a5ead3a5", size = 132306, upload-time = "2026-05-06T15:09:38.299Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/f11311285324a40aab1e3031385c50b635a7cd0734fdaf60c7e89a696f60/orjson-3.11.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6082706765a95a6680d812e1daf1c0cfe8adec7831b3ff3b625693f3b461b1c", size = 127988, upload-time = "2026-05-06T15:09:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/9e/85/0ef63bcf1337f44031ce9b91b1919563f62a37527b3ea4368bb15a22e5d7/orjson-3.11.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:277fefe9d76ee17eb14debf399e3533d4d63b5f677a4d3719eb763536af1f4bd", size = 135188, upload-time = "2026-05-06T15:09:40.957Z" }, + { url = "https://files.pythonhosted.org/packages/05/94/b0d27090ea8a2095db3c2bd1b1c96f96f19bbb494d7fef33130e846e613d/orjson-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03db380e3780fa0015ed776a90f20e8e20bb11dde13b216ce19e5718e3dfba62", size = 145937, upload-time = "2026-05-06T15:09:42.249Z" }, + { url = "https://files.pythonhosted.org/packages/09/eb/75d50c29c05b8054013e221e598820a365c8e64065312e75e202ed880709/orjson-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33d7d766701847dc6729846362dc27895d2f2d2251264f9d10e7cb9878194877", size = 132758, upload-time = "2026-05-06T15:09:43.945Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/360686f39348aa88827cb6fbf7dc606fd41c831a35235e1abf1db8e3a9e6/orjson-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147302878da387104b66bb4a8b0227d1d487e976ce41a8501916161072ed87b1", size = 133971, upload-time = "2026-05-06T15:09:45.239Z" }, + { url = "https://files.pythonhosted.org/packages/0e/30/3178eb16f3221aeef068b6f1f1ebe05f656ea5c6dffe9f6c917329fe17a3/orjson-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3513550321f8c8c811a7c3297b8a630e82dc08e4c10216d07703c997776236cd", size = 141685, upload-time = "2026-05-06T15:09:46.858Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f1/ff2f19ed0225f9680fafa42febca3570dd59444ebf190980738d376214c2/orjson-3.11.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c5d001196b89fa9cf0a4ab79766cd835b991a166e4b621ba95089edc50c429ff", size = 415167, upload-time = "2026-05-06T15:09:48.312Z" }, + { url = "https://files.pythonhosted.org/packages/9b/61/863bddf0da6e9e586765414debd54b4e58db05f560902b6d00658cb88636/orjson-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:16969c9d369c98eb084889c6e4d2d39b77c7eb38ceccf8da2a9fff62ae908980", size = 147913, upload-time = "2026-05-06T15:09:49.733Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4081492586d75b073d60c5271a8d0f05a0955cabf1e34c8473f6fcd84235/orjson-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63e0efbc991250c0b3143488fa57d95affcabbfc63c99c48d625dd37779aafe2", size = 136959, upload-time = "2026-05-06T15:09:51.311Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bd/70b6ab193594d7abb875320c0a7c8335e846f28968c432c31042409c3c8d/orjson-3.11.9-cp311-cp311-win32.whl", hash = "sha256:14ed654580c1ed2bc217352ec82f91b047aef82951aa71c7f64e0dcb03c0e180", size = 131533, upload-time = "2026-05-06T15:09:52.637Z" }, + { url = "https://files.pythonhosted.org/packages/3f/17/1a1a228183d62d1b77e2c30d210f47dd4768b310ebe1607c63e3c0e3a71e/orjson-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:57ea77fb70a448ce87d18fca050193202a3da5e54598f6501ca5476fb66cfe02", size = 127106, upload-time = "2026-05-06T15:09:54.204Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/285de5fa296d09681ee9c546cd4a8aeb773b701cf343dc125994f4d52953/orjson-3.11.9-cp311-cp311-win_arm64.whl", hash = "sha256:19b72ed11572a2ee51a67a903afbe5af504f84ed6f529c0fe44b0ab3fb5cc697", size = 126848, upload-time = "2026-05-06T15:09:55.551Z" }, + { url = "https://files.pythonhosted.org/packages/16/6d/11867a3ffa3a3608d84a4de51ef4dd0896d6b5cc9132fbe1daf593e677bc/orjson-3.11.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9ef6fe90aadef185c7b128859f40beb24720b4ecea95379fc9000931179c3a49", size = 228515, upload-time = "2026-05-06T15:09:57.265Z" }, + { url = "https://files.pythonhosted.org/packages/24/75/05912954c8b288f34fcf5cd4b9b071cb4f6e77b9961e175e56ebb258089f/orjson-3.11.9-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e5c9b8f28e726e97d97696c826bc7bea5d71cecd63576dba92924a32c1961291", size = 128409, upload-time = "2026-05-06T15:09:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/ab/86/1c3a47df3bc8191ea9ac51603bbb872a95167a364320c269f2557911f406/orjson-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a473dbb4162108b27901492546f83c76fdcea3d0eadff00ae7a07e18dcce09", size = 132106, upload-time = "2026-05-06T15:10:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/d7/cf/b33b5f3e695ae7d63feef9d915c37cc3b8f465493dcd4f8e0b4c697a2366/orjson-3.11.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:011382e2a60fda9d46f1cdee31068cfc52ffe952b587d683ec0463002802a0f4", size = 127864, upload-time = "2026-05-06T15:10:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/31/6a/6cf69385a58208024fcb8c014e2141b8ce838aba6492b589f8acfff97fab/orjson-3.11.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2d3dc759490128c5c1711a53eeaa8ee1d437fd0038ffd2b6008abf46db3f882", size = 135213, upload-time = "2026-05-06T15:10:03.515Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f8/0b1bd3e8f2efcdd376af5c8cfd79eaf13f018080c0089c80ebd724e3c7fb/orjson-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8ea516b3726d190e1b4297e6f4e7a8650347ae053868a18163b4dd3641d1fff", size = 145994, upload-time = "2026-05-06T15:10:05.083Z" }, + { url = "https://files.pythonhosted.org/packages/f3/59/dab79f61044c529d2c81aecdc589b1f833a1c8dec11ba3b1c2498a02ca7e/orjson-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380cdce7ba24989af81d0a7013d0aaec5d0e2a21734c0e2681b1bc4f141957fe", size = 132744, upload-time = "2026-05-06T15:10:06.853Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a4/82b7a2fe5d8a67a59ed831b24d59a3d46ea7d207b66e1602d376541d94a6/orjson-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4fa4f0af7fa18951f7ab3fc2148e223af211bf03f59e1c6034ec3f97f21d61", size = 134014, upload-time = "2026-05-06T15:10:08.213Z" }, + { url = "https://files.pythonhosted.org/packages/50/c7/375e83a76851b73b2e39f3bcf0e5a19e2b89bad13e5bca97d0b293d27f24/orjson-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a8f5f8bc7ce7d59f08d9f99fa510c06496164a24cb5f3d34537dbd9ca30132e2", size = 141509, upload-time = "2026-05-06T15:10:09.595Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7c/49d5d82a3d3097f641f094f552131f1e2723b0b8cb0fa2874ab65ecfffa6/orjson-3.11.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4d7fde5501b944f83b3e665e1b31343ff6e154b15560a16b7130ea1e594a4206", size = 415127, upload-time = "2026-05-06T15:10:11.049Z" }, + { url = "https://files.pythonhosted.org/packages/3a/dc/7446c538590d55f455647e5f3c61fc33f7108714e7afcffa6a2a033f8350/orjson-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cde1a448023ba7d5bb4c01c5afb48894380b5e4956e0627266526587ef4e535f", size = 148025, upload-time = "2026-05-06T15:10:12.842Z" }, + { url = "https://files.pythonhosted.org/packages/df/e5/4d2d8af06f788329b4f78f8cc3679bb395392fcaa1e4d8d3c33e85308fa4/orjson-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e63adb0e1f1ed5d9e168f50a91ceb93ae6420731d222dc7da5c69409aa47aa", size = 136943, upload-time = "2026-05-06T15:10:14.405Z" }, + { url = "https://files.pythonhosted.org/packages/06/69/850264ccf6d80f6b174620d30a87f65c9b1490aba33fe6b62798e618cad3/orjson-3.11.9-cp312-cp312-win32.whl", hash = "sha256:2d057a602cdd19a0ad680417527c45b6961a095081c0f46fe0e03e304aac6470", size = 131606, upload-time = "2026-05-06T15:10:15.791Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/973a43fc9c55e20f2051e9830997649f669be0cb3ca52192087c0143f118/orjson-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:59e403b1cc5a676da8eaf31f6254801b7341b3e29efa85f92b48d272637e77be", size = 127101, upload-time = "2026-05-06T15:10:17.129Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ae/495470f0e4a18f73fa10b7f6b84b464ec4cc5291c4e0c7c2a6c400bef006/orjson-3.11.9-cp312-cp312-win_arm64.whl", hash = "sha256:9af678d6488357948f1f84c6cd1c1d397c014e1ae2f98ae082a44eb48f602624", size = 126736, upload-time = "2026-05-06T15:10:18.645Z" }, + { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" }, + { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" }, + { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" }, + { url = "https://files.pythonhosted.org/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217, upload-time = "2026-05-06T15:10:26.084Z" }, + { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" }, + { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" }, + { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" }, + { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" }, + { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031, upload-time = "2026-05-06T15:10:36.358Z" }, + { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" }, + { url = "https://files.pythonhosted.org/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613, upload-time = "2026-05-06T15:10:39.569Z" }, + { url = "https://files.pythonhosted.org/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086, upload-time = "2026-05-06T15:10:41.262Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696, upload-time = "2026-05-06T15:10:42.651Z" }, + { url = "https://files.pythonhosted.org/packages/8e/eb/5da01e356015aee6ecfa1187ced87aef51364e306f5e695dd52719bf0e78/orjson-3.11.9-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6ef1979adc4bc243523f1a2ba91418030a8e29b0a99cbe7e0e2d6807d4dce6e", size = 228465, upload-time = "2026-05-06T15:10:44.097Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/3e0e0c14c957133bcd855395c62b55ed4e3b0af23ffea11b032cb1dcbdb1/orjson-3.11.9-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:f36b7f32c7c0db4a719f1fc5824db4a9c6f8bd1a354debb91faf26ebf3a4c71e", size = 128364, upload-time = "2026-05-06T15:10:45.839Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5a/07d8aa117211a8ed7630bda80c8c0b14d04e0f8dcf99bcf49656e4a710eb/orjson-3.11.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08f4d8ebb44925c794e535b2bebc507cebf32209df81de22ae285fb0d8d66de0", size = 132063, upload-time = "2026-05-06T15:10:47.267Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ec/4acaf21483e18aa945be74a474c74b434f284b549f275a0a39b9f98956e9/orjson-3.11.9-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6cc7923789694fd58f001cbcac7e47abc13af4d560ebbfcf3b41a8b1a0748124", size = 122356, upload-time = "2026-05-06T15:10:48.765Z" }, + { url = "https://files.pythonhosted.org/packages/13/d8/5f0555e7638801323b7a75850f92e7dfa891bc84fe27a1ba4449170d1200/orjson-3.11.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea5c46eb2d3af39e806b986f4b09d5c2706a1f5afde3cbf7544ce6616127173c", size = 129592, upload-time = "2026-05-06T15:10:50.13Z" }, + { url = "https://files.pythonhosted.org/packages/b6/30/ed9860412a3603ceb3c5955bfd72d28b9d0e7ba6ed81add14f83d7114236/orjson-3.11.9-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5d89a2ed90731df3be64bab0aa44f78bff39fdc9d71c291f4a8023aa46425b7", size = 140491, upload-time = "2026-05-06T15:10:51.582Z" }, + { url = "https://files.pythonhosted.org/packages/d0/17/adc514dea7ac7c505527febf884934b815d34f0c7b8693c1a8b39c5c4a57/orjson-3.11.9-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25e4aed0312d292c09f61af25bba34e0b2c88546041472b09088c39a4d828af1", size = 127309, upload-time = "2026-05-06T15:10:53.329Z" }, + { url = "https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaea64f3f467d22e70eeed68bdccb3bc4f83f650446c4a03c59f2cba28a108db", size = 134030, upload-time = "2026-05-06T15:10:54.988Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7a/bc82a0bb25e9faaf92dc4d9ef002732efc09737706af83e346788641d4a7/orjson-3.11.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a028425d1b440c5d92a6be1e1a020739dfe67ea87d96c6dbe828c1b30041728b", size = 141482, upload-time = "2026-05-06T15:10:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/01/55/e69188b939f77d5d32a9833745ace31ea5ccae3ab613a1ec185d3cd2c4fb/orjson-3.11.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5b192c6cf397e4455b11523c5cf2b18ed084c1bbd61b6c0926344d2129481972", size = 415178, upload-time = "2026-05-06T15:10:58.446Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/b8a5a7ac527e80b9cb11d51e3f6689b709279183264b9ec5c7bc680bb8b5/orjson-3.11.9-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea407d4ccf5891d667d045fecae97a7a1e5e87b3b97f97ae1803c2e741130be0", size = 148089, upload-time = "2026-05-06T15:11:00.441Z" }, + { url = "https://files.pythonhosted.org/packages/97/4e/00503f64204bf859b37213a63927028f30fb6268cd8677fb0a5ad48155e1/orjson-3.11.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f63aaf97afd9f6dec5b1a68e1b8da12bfccb4cb9a9a65c3e0b6c847849e7586", size = 136921, upload-time = "2026-05-06T15:11:02.176Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ba/a23b82a0a8d0ed7bed4e5f5035aae751cad4ff6a1e8d2ecd14d8860f5929/orjson-3.11.9-cp314-cp314-win32.whl", hash = "sha256:e30ab17845bb9fa54ccf67fa4f9f5282652d54faa6d17452f47d0f369d038673", size = 131638, upload-time = "2026-05-06T15:11:03.696Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/0c6798456bade745c75c452342dabacce5798196483e77e643be1f53877d/orjson-3.11.9-cp314-cp314-win_amd64.whl", hash = "sha256:32ef5f4283a3be81913947d19608eacb7c6608026851123790cd9cc8982af34b", size = 127078, upload-time = "2026-05-06T15:11:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/16/21/5a3f1e8913103b703a436a5664238e5b965ec392b555fe68943ea3691e6b/orjson-3.11.9-cp314-cp314-win_arm64.whl", hash = "sha256:eebdbdeef0094e4f5aefa20dcd4eb2368ab5e7a3b4edea27f1e7b2892e009cf9", size = 126687, upload-time = "2026-05-06T15:11:06.602Z" }, ] [[package]] @@ -2559,62 +2587,62 @@ wheels = [ [[package]] name = "pandas" -version = "3.0.2" +version = "3.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a727a73cbdba2f7458dc82449e2315899d5140b449015d822f515749a46cbbe0", size = 10326926, upload-time = "2026-03-31T06:46:08.29Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbbd4aa20ca51e63b53bbde6a0fa4254b1aaabb74d2f542df7a7959feb1d760c", size = 9926987, upload-time = "2026-03-31T06:46:11.724Z" }, - { url = "https://files.pythonhosted.org/packages/52/77/9b1c2d6070b5dbe239a7bc889e21bfa58720793fb902d1e070695d87c6d0/pandas-3.0.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:339dda302bd8369dedeae979cb750e484d549b563c3f54f3922cb8ff4978c5eb", size = 10757067, upload-time = "2026-03-31T06:46:14.903Z" }, - { url = "https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61c2fd96d72b983a9891b2598f286befd4ad262161a609c92dc1652544b46b76", size = 11258787, upload-time = "2026-03-31T06:46:17.683Z" }, - { url = "https://files.pythonhosted.org/packages/90/e3/3f1126d43d3702ca8773871a81c9f15122a1f412342cc56284ffda5b1f70/pandas-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c934008c733b8bbea273ea308b73b3156f0181e5b72960790b09c18a2794fe1e", size = 11771616, upload-time = "2026-03-31T06:46:20.532Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cf/0f4e268e1f5062e44a6bda9f925806721cd4c95c2b808a4c82ebe914f96b/pandas-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:60a80bb4feacbef5e1447a3f82c33209c8b7e07f28d805cfd1fb951e5cb443aa", size = 12337623, upload-time = "2026-03-31T06:46:23.754Z" }, - { url = "https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed72cb3f45190874eb579c64fa92d9df74e98fd63e2be7f62bce5ace0ade61df", size = 9897372, upload-time = "2026-03-31T06:46:26.703Z" }, - { url = "https://files.pythonhosted.org/packages/8f/eb/781516b808a99ddf288143cec46b342b3016c3414d137da1fdc3290d8860/pandas-3.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f12b1a9e332c01e09510586f8ca9b108fd631fd656af82e452d7315ef6df5f9f", size = 9154922, upload-time = "2026-03-31T06:46:30.284Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b0/c20bd4d6d3f736e6bd6b55794e9cd0a617b858eaad27c8f410ea05d953b7/pandas-3.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:232a70ebb568c0c4d2db4584f338c1577d81e3af63292208d615907b698a0f18", size = 10347921, upload-time = "2026-03-31T06:46:33.36Z" }, - { url = "https://files.pythonhosted.org/packages/35/d0/4831af68ce30cc2d03c697bea8450e3225a835ef497d0d70f31b8cdde965/pandas-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:970762605cff1ca0d3f71ed4f3a769ea8f85fc8e6348f6e110b8fea7e6eb5a14", size = 9888127, upload-time = "2026-03-31T06:46:36.253Z" }, - { url = "https://files.pythonhosted.org/packages/61/a9/16ea9346e1fc4a96e2896242d9bc674764fb9049b0044c0132502f7a771e/pandas-3.0.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aff4e6f4d722e0652707d7bcb190c445fe58428500c6d16005b02401764b1b3d", size = 10399577, upload-time = "2026-03-31T06:46:39.224Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a8/3a61a721472959ab0ce865ef05d10b0d6bfe27ce8801c99f33d4fa996e65/pandas-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef8b27695c3d3dc78403c9a7d5e59a62d5464a7e1123b4e0042763f7104dc74f", size = 10880030, upload-time = "2026-03-31T06:46:42.412Z" }, - { url = "https://files.pythonhosted.org/packages/da/65/7225c0ea4d6ce9cb2160a7fb7f39804871049f016e74782e5dade4d14109/pandas-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f8d68083e49e16b84734eb1a4dcae4259a75c90fb6e2251ab9a00b61120c06ab", size = 11409468, upload-time = "2026-03-31T06:46:45.2Z" }, - { url = "https://files.pythonhosted.org/packages/fa/5b/46e7c76032639f2132359b5cf4c785dd8cf9aea5ea64699eac752f02b9db/pandas-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32cc41f310ebd4a296d93515fcac312216adfedb1894e879303987b8f1e2b97d", size = 11936381, upload-time = "2026-03-31T06:46:48.293Z" }, - { url = "https://files.pythonhosted.org/packages/7b/8b/721a9cff6fa6a91b162eb51019c6243b82b3226c71bb6c8ef4a9bd65cbc6/pandas-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:a4785e1d6547d8427c5208b748ae2efb64659a21bd82bf440d4262d02bfa02a4", size = 9744993, upload-time = "2026-03-31T06:46:51.488Z" }, - { url = "https://files.pythonhosted.org/packages/d5/18/7f0bd34ae27b28159aa80f2a6799f47fda34f7fb938a76e20c7b7fe3b200/pandas-3.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:08504503f7101300107ecdc8df73658e4347586db5cfdadabc1592e9d7e7a0fd", size = 9056118, upload-time = "2026-03-31T06:46:54.548Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105, upload-time = "2026-03-31T06:46:57.327Z" }, - { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088, upload-time = "2026-03-31T06:46:59.935Z" }, - { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066, upload-time = "2026-03-31T06:47:02.792Z" }, - { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780, upload-time = "2026-03-31T06:47:06.205Z" }, - { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181, upload-time = "2026-03-31T06:47:09.383Z" }, - { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899, upload-time = "2026-03-31T06:47:12.686Z" }, - { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574, upload-time = "2026-03-31T06:47:15.64Z" }, - { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156, upload-time = "2026-03-31T06:47:18.595Z" }, - { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238, upload-time = "2026-03-31T06:47:22.012Z" }, - { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520, upload-time = "2026-03-31T06:47:25.197Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154, upload-time = "2026-03-31T06:47:28.097Z" }, - { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449, upload-time = "2026-03-31T06:47:30.85Z" }, - { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475, upload-time = "2026-03-31T06:47:34.026Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568, upload-time = "2026-03-31T06:47:36.941Z" }, - { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652, upload-time = "2026-03-31T06:47:40.612Z" }, - { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084, upload-time = "2026-03-31T06:47:43.834Z" }, - { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146, upload-time = "2026-03-31T06:47:46.67Z" }, - { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081, upload-time = "2026-03-31T06:47:49.681Z" }, - { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535, upload-time = "2026-03-31T06:47:53.033Z" }, - { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992, upload-time = "2026-03-31T06:47:56.193Z" }, - { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257, upload-time = "2026-03-31T06:47:59.137Z" }, - { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893, upload-time = "2026-03-31T06:48:02.038Z" }, - { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644, upload-time = "2026-03-31T06:48:05.045Z" }, - { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246, upload-time = "2026-03-31T06:48:07.789Z" }, - { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801, upload-time = "2026-03-31T06:48:10.897Z" }, - { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643, upload-time = "2026-03-31T06:48:13.7Z" }, - { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641, upload-time = "2026-03-31T06:48:16.659Z" }, - { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993, upload-time = "2026-03-31T06:48:19.475Z" }, - { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274, upload-time = "2026-03-31T06:48:22.695Z" }, - { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530, upload-time = "2026-03-31T06:48:25.806Z" }, - { url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" }, + { url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, ] [[package]] @@ -2726,101 +2754,113 @@ wheels = [ [[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, upload-time = "2025-10-08T19:49:02.291Z" } -wheels = [ - { 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, upload-time = "2025-10-08T19:46:24.597Z" }, - { 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, upload-time = "2025-10-08T19:46:25.733Z" }, - { 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, upload-time = "2025-10-08T19:46:27.304Z" }, - { 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, upload-time = "2025-10-08T19:46:28.62Z" }, - { 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, upload-time = "2025-10-08T19:46:30.358Z" }, - { 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, upload-time = "2025-10-08T19:46:32.607Z" }, - { 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, upload-time = "2025-10-08T19:46:33.969Z" }, - { 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, upload-time = "2025-10-08T19:46:35.309Z" }, - { 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, upload-time = "2025-10-08T19:46:36.993Z" }, - { 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, upload-time = "2025-10-08T19:46:38.398Z" }, - { 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, upload-time = "2025-10-08T19:46:39.732Z" }, - { 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, upload-time = "2025-10-08T19:46:41.025Z" }, - { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, - { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, - { 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, upload-time = "2025-10-08T19:46:46.075Z" }, - { 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, upload-time = "2025-10-08T19:46:47.23Z" }, - { 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, upload-time = "2025-10-08T19:46:48.384Z" }, - { 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, upload-time = "2025-10-08T19:46:50.055Z" }, - { 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, upload-time = "2025-10-08T19:46:51.815Z" }, - { 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, upload-time = "2025-10-08T19:46:53.208Z" }, - { 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, upload-time = "2025-10-08T19:46:54.511Z" }, - { 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, upload-time = "2025-10-08T19:46:56.212Z" }, - { 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, upload-time = "2025-10-08T19:46:57.595Z" }, - { 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, upload-time = "2025-10-08T19:46:59.067Z" }, - { 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, upload-time = "2025-10-08T19:47:00.544Z" }, - { 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, upload-time = "2025-10-08T19:47:01.968Z" }, - { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, - { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, - { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, - { 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, upload-time = "2025-10-08T19:47:07.648Z" }, - { 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, upload-time = "2025-10-08T19:47:08.851Z" }, - { 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, upload-time = "2025-10-08T19:47:09.982Z" }, - { 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, upload-time = "2025-10-08T19:47:11.319Z" }, - { 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, upload-time = "2025-10-08T19:47:13.146Z" }, - { 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, upload-time = "2025-10-08T19:47:14.913Z" }, - { 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, upload-time = "2025-10-08T19:47:16.277Z" }, - { 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, upload-time = "2025-10-08T19:47:17.962Z" }, - { 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, upload-time = "2025-10-08T19:47:19.355Z" }, - { 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, upload-time = "2025-10-08T19:47:21.338Z" }, - { 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, upload-time = "2025-10-08T19:47:23.059Z" }, - { 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, upload-time = "2025-10-08T19:47:24.445Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, - { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, - { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, - { 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, upload-time = "2025-10-08T19:47:29.445Z" }, - { 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, upload-time = "2025-10-08T19:47:30.579Z" }, - { 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, upload-time = "2025-10-08T19:47:31.79Z" }, - { 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, upload-time = "2025-10-08T19:47:33.481Z" }, - { 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, upload-time = "2025-10-08T19:47:34.906Z" }, - { 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, upload-time = "2025-10-08T19:47:36.338Z" }, - { 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, upload-time = "2025-10-08T19:47:37.692Z" }, - { 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, upload-time = "2025-10-08T19:47:39.659Z" }, - { 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, upload-time = "2025-10-08T19:47:41.084Z" }, - { 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, upload-time = "2025-10-08T19:47:42.51Z" }, - { 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, upload-time = "2025-10-08T19:47:43.927Z" }, - { 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, upload-time = "2025-10-08T19:47:45.448Z" }, - { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, - { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, - { 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, upload-time = "2025-10-08T19:47:51.051Z" }, - { 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, upload-time = "2025-10-08T19:47:52.594Z" }, - { 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, upload-time = "2025-10-08T19:47:54.073Z" }, - { 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, upload-time = "2025-10-08T19:47:55.715Z" }, - { 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, upload-time = "2025-10-08T19:47:57.499Z" }, - { 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, upload-time = "2025-10-08T19:47:59.317Z" }, - { 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, upload-time = "2025-10-08T19:48:00.67Z" }, - { 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, upload-time = "2025-10-08T19:48:02.604Z" }, - { 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, upload-time = "2025-10-08T19:48:04.499Z" }, - { 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, upload-time = "2025-10-08T19:48:06.213Z" }, - { 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, upload-time = "2025-10-08T19:48:08.432Z" }, - { 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, upload-time = "2025-10-08T19:48:09.968Z" }, - { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, - { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, - { 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, upload-time = "2025-10-08T19:48:15.16Z" }, - { 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, upload-time = "2025-10-08T19:48:16.424Z" }, - { 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, upload-time = "2025-10-08T19:48:17.577Z" }, - { 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, upload-time = "2025-10-08T19:48:18.901Z" }, - { 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, upload-time = "2025-10-08T19:48:20.762Z" }, - { 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, upload-time = "2025-10-08T19:48:22.592Z" }, - { 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, upload-time = "2025-10-08T19:48:23.947Z" }, - { 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, upload-time = "2025-10-08T19:48:25.656Z" }, - { 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, upload-time = "2025-10-08T19:48:27.207Z" }, - { 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, upload-time = "2025-10-08T19:48:28.65Z" }, - { 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, upload-time = "2025-10-08T19:48:30.133Z" }, - { 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, upload-time = "2025-10-08T19:48:31.567Z" }, - { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/f1/8a8cc1c2c7e7934ab77e0163414f736fadbc0f5e8dd9673b952355ac175b/propcache-0.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78", size = 90744, upload-time = "2026-05-08T20:59:45.799Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f4/651b1225e976bd1a2ba5cfba0c29d096581c2636b437e3a9a7ab6276270a/propcache-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4840ab0ae0216d952f4b53dc6d0b992bfc2bedbfe360bdd9b548bc184c08959", size = 52033, upload-time = "2026-05-08T20:59:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/15/a8/8ede85d6aa1f79fc7dc2f8fd2c8d65920b8272c3892903c8a1affde48cfb/propcache-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7", size = 52754, upload-time = "2026-05-08T20:59:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/7d/fe/b3551b41bbc2f5b5bb088fc6920567cd43101253e68fbaa261339eb96fe1/propcache-0.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511", size = 57573, upload-time = "2026-05-08T20:59:50.778Z" }, + { url = "https://files.pythonhosted.org/packages/83/27/ab851ebd1b7172e3e161f5f8d39e315d54a91bea246f01f4d872d3376aef/propcache-0.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660", size = 60645, upload-time = "2026-05-08T20:59:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/466b3d18022e9897cbda9c735c493c5bd747d7a4c6f5ea1480b4cec434b6/propcache-0.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66", size = 61563, upload-time = "2026-05-08T20:59:53.866Z" }, + { url = "https://files.pythonhosted.org/packages/27/1b/16ab7f2cf2041da2f60d156ba64c2484eadf9168075b4ff43c3ef60045af/propcache-0.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b", size = 58888, upload-time = "2026-05-08T20:59:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/0a/67/bb777ffd907633563bf35fd859c4ce97b0512c32f4633cf5d1eb7c33512b/propcache-0.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67", size = 59253, upload-time = "2026-05-08T20:59:57.075Z" }, + { url = "https://files.pythonhosted.org/packages/b9/42/64f8d90b73fd9cdc1499b48057ff6d9cd2a98a25734c9bb62ecf07e87061/propcache-0.5.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f", size = 57558, upload-time = "2026-05-08T20:59:58.602Z" }, + { url = "https://files.pythonhosted.org/packages/eb/02/dba5bc03c9041f2092ea55a449caf5dfe68352c6654511b29ba0654ddb69/propcache-0.5.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c", size = 55007, upload-time = "2026-05-08T20:59:59.837Z" }, + { url = "https://files.pythonhosted.org/packages/14/c0/43f649c7aa2a77a3b100d84e9dea3a483120ecb608bfe36ce49eaff517fe/propcache-0.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0", size = 60355, upload-time = "2026-05-08T21:00:01.144Z" }, + { url = "https://files.pythonhosted.org/packages/83/c0/435dafd27f1cb4a495381dae60e25883ccfe4020bb72818e8184c1678092/propcache-0.5.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6", size = 59057, upload-time = "2026-05-08T21:00:02.401Z" }, + { url = "https://files.pythonhosted.org/packages/53/ae/6e292df9135d659944e96cb3389258e4a663e5b2b5f6c217ef0ddc8d2f73/propcache-0.5.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27", size = 61938, upload-time = "2026-05-08T21:00:03.638Z" }, + { url = "https://files.pythonhosted.org/packages/0b/42/314ebc50d8159055411fd6b0bda322ff510e4b1f7d2e4927940ad0f6af20/propcache-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f", size = 59731, upload-time = "2026-05-08T21:00:04.881Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9b/2da6dee38871c3c8772fabc2758325a5c9077d6d18c597737dc04dd884cd/propcache-0.5.2-cp311-cp311-win32.whl", hash = "sha256:cd416c1de191973c52ff1a12a57446bfc7642797b282d7caf2162d7d1b8aa9a0", size = 38966, upload-time = "2026-05-08T21:00:06.511Z" }, + { url = "https://files.pythonhosted.org/packages/42/4e/f17363fb58c0afe05b067361cb6d86ed2d29de6506779a27547c4d183075/propcache-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:44e488ef40dbb452700b2b1f8188934121f6648f52c295055662d2191959ff82", size = 42135, upload-time = "2026-05-08T21:00:08.088Z" }, + { url = "https://files.pythonhosted.org/packages/c6/eb/6af6685077d22e8b33358d3c548e3282706a0b3cd85044ffba4e5dd08e3b/propcache-0.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:54adaa85a22078d1e306304a40984dc5be99d599bf3dc0a24dc98f7daeab89ab", size = 38381, upload-time = "2026-05-08T21:00:09.692Z" }, + { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" }, + { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" }, + { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" }, + { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" }, + { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" }, + { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" }, + { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" }, + { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" }, + { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" }, + { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" }, + { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" }, + { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" }, + { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" }, + { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" }, + { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" }, + { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" }, + { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" }, + { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" }, + { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" }, + { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" }, + { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" }, + { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" }, + { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" }, + { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" }, + { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" }, + { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" }, + { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" }, + { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" }, + { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" }, + { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" }, + { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" }, + { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" }, + { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" }, + { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" }, + { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" }, + { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" }, + { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" }, + { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" }, + { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" }, + { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" }, + { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" }, + { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" }, + { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, ] [[package]] @@ -2965,7 +3005,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.13.3" +version = "2.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -2973,14 +3013,14 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, ] [[package]] name = "pydantic-ai-slim" -version = "1.89.1" +version = "1.100.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "genai-prices" }, @@ -2991,116 +3031,116 @@ dependencies = [ { name = "pydantic-graph" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/91/b2134056eb5debb7cb28e4efe7ca19fc5c7b2935e55b299a30ddad0d7746/pydantic_ai_slim-1.89.1.tar.gz", hash = "sha256:3ed967bff8dec992a907c1d1dabab2034a5f4aee75289de22e88b2ef9def8da6", size = 614728, upload-time = "2026-05-01T19:09:38.551Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/db/3eb296369e3001f82d7552060c3811307809954b7c7ec30499f383d3c87a/pydantic_ai_slim-1.100.0.tar.gz", hash = "sha256:cc755c7970b2e041764b9d2f74d50cbad3cf7989b14cdbf62d356f25eb2a1222", size = 726289, upload-time = "2026-05-21T04:04:59.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/14/d0f7c8f828c460a517531e0df7cfe9e20f4315da8357a9068caaf0193bbb/pydantic_ai_slim-1.89.1-py3-none-any.whl", hash = "sha256:9e7d615a0a3e48993d067901e596e85708e9c8d1f6bef96c20c340385028d465", size = 780314, upload-time = "2026-05-01T19:09:28.843Z" }, + { url = "https://files.pythonhosted.org/packages/49/a6/164b070c59f7c69e81cb5fd38225da24c4587a8fe629af49c72709182ffc/pydantic_ai_slim-1.100.0-py3-none-any.whl", hash = "sha256:422a721b7a7157daff749a6eec9a4ba2e3e7efc28ae5a2bdfe468529eaf81aaf", size = 901788, upload-time = "2026-05-21T04:04:49.147Z" }, ] [[package]] name = "pydantic-core" -version = "2.46.3" +version = "2.46.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a2/1ba90a83e85a3f94c796b184f3efde9c72f2830dcda493eea8d59ba78e6d/pydantic_core-2.46.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ab124d49d0459b2373ecf54118a45c28a1e6d4192a533fbc915e70f556feb8e5", size = 2106740, upload-time = "2026-04-20T14:41:20.932Z" }, - { url = "https://files.pythonhosted.org/packages/b6/f6/99ae893c89a0b9d3daec9f95487aa676709aa83f67643b3f0abaf4ab628a/pydantic_core-2.46.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cca67d52a5c7a16aed2b3999e719c4bcf644074eac304a5d3d62dd70ae7d4b2c", size = 1948293, upload-time = "2026-04-20T14:43:42.115Z" }, - { url = "https://files.pythonhosted.org/packages/3e/b8/2e8e636dc9e3f16c2e16bf0849e24be82c5ee82c603c65fc0326666328fc/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c024e08c0ba23e6fd68c771a521e9d6a792f2ebb0fa734296b36394dc30390e", size = 1973222, upload-time = "2026-04-20T14:41:57.841Z" }, - { url = "https://files.pythonhosted.org/packages/34/36/0e730beec4d83c5306f417afbd82ff237d9a21e83c5edf675f31ed84c1fe/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6645ce7eec4928e29a1e3b3d5c946621d105d3e79f0c9cddf07c2a9770949287", size = 2053852, upload-time = "2026-04-20T14:40:43.077Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f0/3071131f47e39136a17814576e0fada9168569f7f8c0e6ac4d1ede6a4958/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a712c7118e6c5ea96562f7b488435172abb94a3c53c22c9efc1412264a45cbbe", size = 2221134, upload-time = "2026-04-20T14:43:03.349Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a9/a2dc023eec5aa4b02a467874bad32e2446957d2adcab14e107eab502e978/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a868ef3ff206343579021c40faf3b1edc64b1cc508ff243a28b0a514ccb050", size = 2279785, upload-time = "2026-04-20T14:41:19.285Z" }, - { url = "https://files.pythonhosted.org/packages/0a/44/93f489d16fb63fbd41c670441536541f6e8cfa1e5a69f40bc9c5d30d8c90/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc7e8c32db809aa0f6ea1d6869ebc8518a65d5150fdfad8bcae6a49ae32a22e2", size = 2089404, upload-time = "2026-04-20T14:43:10.108Z" }, - { url = "https://files.pythonhosted.org/packages/2a/78/8692e3aa72b2d004f7a5d937f1dfdc8552ba26caf0bec75f342c40f00dec/pydantic_core-2.46.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3481bd1341dc85779ee506bc8e1196a277ace359d89d28588a9468c3ecbe63fa", size = 2114898, upload-time = "2026-04-20T14:44:51.475Z" }, - { url = "https://files.pythonhosted.org/packages/6a/62/e83133f2e7832532060175cebf1f13748f4c7e7e7165cdd1f611f174494b/pydantic_core-2.46.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8690eba565c6d68ffd3a8655525cbdd5246510b44a637ee2c6c03a7ebfe64d3c", size = 2157856, upload-time = "2026-04-20T14:43:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ec/6a500e3ad7718ee50583fae79c8651f5d37e3abce1fa9ae177ae65842c53/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4de88889d7e88d50d40ee5b39d5dac0bcaef9ba91f7e536ac064e6b2834ecccf", size = 2180168, upload-time = "2026-04-20T14:42:00.302Z" }, - { url = "https://files.pythonhosted.org/packages/d8/53/8267811054b1aa7fc1dc7ded93812372ef79a839f5e23558136a6afbfde1/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e480080975c1ef7f780b8f99ed72337e7cc5efea2e518a20a692e8e7b278eb8b", size = 2322885, upload-time = "2026-04-20T14:41:05.253Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c1/1c0acdb3aa0856ddc4ecc55214578f896f2de16f400cf51627eb3c26c1c4/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de3a5c376f8cd94da9a1b8fd3dd1c16c7a7b216ed31dc8ce9fd7a22bf13b836e", size = 2360328, upload-time = "2026-04-20T14:41:43.991Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d0/ef39cd0f4a926814f360e71c1adeab48ad214d9727e4deb48eedfb5bce1a/pydantic_core-2.46.3-cp311-cp311-win32.whl", hash = "sha256:fc331a5314ffddd5385b9ee9d0d2fee0b13c27e0e02dad71b1ae5d6561f51eeb", size = 1979464, upload-time = "2026-04-20T14:43:12.215Z" }, - { url = "https://files.pythonhosted.org/packages/18/9c/f41951b0d858e343f1cf09398b2a7b3014013799744f2c4a8ad6a3eec4f2/pydantic_core-2.46.3-cp311-cp311-win_amd64.whl", hash = "sha256:b5b9c6cf08a8a5e502698f5e153056d12c34b8fb30317e0c5fd06f45162a6346", size = 2070837, upload-time = "2026-04-20T14:41:47.707Z" }, - { url = "https://files.pythonhosted.org/packages/9f/1e/264a17cd582f6ed50950d4d03dd5fefd84e570e238afe1cb3e25cf238769/pydantic_core-2.46.3-cp311-cp311-win_arm64.whl", hash = "sha256:5dfd51cf457482f04ec49491811a2b8fd5b843b64b11eecd2d7a1ee596ea78a6", size = 2053647, upload-time = "2026-04-20T14:42:27.535Z" }, - { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, - { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, - { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, - { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, - { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, - { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, - { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, - { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, - { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, - { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, - { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, - { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, - { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, - { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, - { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, - { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, - { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, - { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, - { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, - { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, - { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, - { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, - { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, - { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, - { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, - { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, - { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, - { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, - { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, - { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, - { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, - { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, - { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, - { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, - { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, - { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, - { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, - { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, - { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, - { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, - { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, - { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, - { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, - { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, - { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, - { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, - { url = "https://files.pythonhosted.org/packages/66/7f/03dbad45cd3aa9083fbc93c210ae8b005af67e4136a14186950a747c6874/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:9715525891ed524a0a1eb6d053c74d4d4ad5017677fb00af0b7c2644a31bae46", size = 2105683, upload-time = "2026-04-20T14:42:19.779Z" }, - { url = "https://files.pythonhosted.org/packages/26/22/4dc186ac8ea6b257e9855031f51b62a9637beac4d68ac06bee02f046f836/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:9d2f400712a99a013aff420ef1eb9be077f8189a36c1e3ef87660b4e1088a874", size = 1940052, upload-time = "2026-04-20T14:43:59.274Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ca/d376391a5aff1f2e8188960d7873543608130a870961c2b6b5236627c116/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd2aab0e2e9dc2daf36bd2686c982535d5e7b1d930a1344a7bb6e82baab42a76", size = 1988172, upload-time = "2026-04-20T14:41:17.469Z" }, - { url = "https://files.pythonhosted.org/packages/0e/6b/523b9f85c23788755d6ab949329de692a2e3a584bc6beb67fef5e035aa9d/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9d76736da5f362fabfeea6a69b13b7f2be405c6d6966f06b2f6bfff7e64531", size = 2128596, upload-time = "2026-04-20T14:40:41.707Z" }, - { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, - { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, - { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, - { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, - { url = "https://files.pythonhosted.org/packages/1f/da/99d40830684f81dec901cac521b5b91c095394cc1084b9433393cde1c2df/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:13afdd885f3d71280cf286b13b310ee0f7ccfefd1dbbb661514a474b726e2f25", size = 2107973, upload-time = "2026-04-20T14:42:06.175Z" }, - { url = "https://files.pythonhosted.org/packages/99/a5/87024121818d75bbb2a98ddbaf638e40e7a18b5e0f5492c9ca4b1b316107/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f91c0aff3e3ee0928edd1232c57f643a7a003e6edf1860bc3afcdc749cb513f3", size = 1947191, upload-time = "2026-04-20T14:43:14.319Z" }, - { url = "https://files.pythonhosted.org/packages/60/62/0c1acfe10945b83a6a59d19fbaa92f48825381509e5701b855c08f13db76/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6529d1d128321a58d30afcc97b49e98836542f68dd41b33c2e972bb9e5290536", size = 2123791, upload-time = "2026-04-20T14:43:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/75/3e/3b2393b4c8f44285561dc30b00cf307a56a2eff7c483a824db3b8221ca51/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:975c267cff4f7e7272eacbe50f6cc03ca9a3da4c4fbd66fffd89c94c1e311aa1", size = 2153197, upload-time = "2026-04-20T14:44:27.932Z" }, - { url = "https://files.pythonhosted.org/packages/ba/75/5af02fb35505051eee727c061f2881c555ab4f8ddb2d42da715a42c9731b/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2b8e4f2bbdf71415c544b4b1138b8060db7b6611bc927e8064c769f64bed651c", size = 2181073, upload-time = "2026-04-20T14:43:20.729Z" }, - { url = "https://files.pythonhosted.org/packages/10/92/7e0e1bd9ca3c68305db037560ca2876f89b2647deb2f8b6319005de37505/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e61ea8e9fff9606d09178f577ff8ccdd7206ff73d6552bcec18e1033c4254b85", size = 2315886, upload-time = "2026-04-20T14:44:04.826Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d8/101655f27eaf3e44558ead736b2795d12500598beed4683f279396fa186e/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b504bda01bafc69b6d3c7a0c7f039dcf60f47fab70e06fe23f57b5c75bdc82b8", size = 2360528, upload-time = "2026-04-20T14:40:47.431Z" }, - { url = "https://files.pythonhosted.org/packages/07/0f/1c34a74c8d07136f0d729ffe5e1fdab04fbdaa7684f61a92f92511a84a15/pydantic_core-2.46.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b00b76f7142fc60c762ce579bd29c8fa44aaa56592dd3c54fab3928d0d4ca6ff", size = 2184144, upload-time = "2026-04-20T14:42:57Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, ] [[package]] name = "pydantic-graph" -version = "1.89.1" +version = "1.100.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -3108,23 +3148,23 @@ dependencies = [ { name = "pydantic" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/64/f26c4d17568ab06ae576af0771ad83753cc2661bf9ca5a5698d01404ee20/pydantic_graph-1.89.1.tar.gz", hash = "sha256:99b8ae10fd10400208ee469355969e2dc253a600c3f667a5e790874064846e85", size = 59257, upload-time = "2026-05-01T19:09:40.998Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/8b/eee672fa01eec3ea34e7d8962d54aa16d658ad0723466122a7ba2828caa1/pydantic_graph-1.100.0.tar.gz", hash = "sha256:7651fa6ccce9d88a35b1d2cfe79d5d1dbb2415457503009195014bf31f6075bd", size = 62559, upload-time = "2026-05-21T04:05:01.682Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/52/9070e11f52424fe34e2ca96ae122902cab7c4325e2a90b33d44a410843b1/pydantic_graph-1.89.1-py3-none-any.whl", hash = "sha256:2ebce28573e81de9924c2ff68f90f949ccd96bbc2e8dc6cf4bb96208b34fbec0", size = 73065, upload-time = "2026-05-01T19:09:32.912Z" }, + { url = "https://files.pythonhosted.org/packages/bb/12/21d6a68743229553c8ba9ca19da73c2d7e18dc6f8fbfd56c8c12c5587cb6/pydantic_graph-1.100.0-py3-none-any.whl", hash = "sha256:ba0b0a70bfd320b58b7012614b857f4b12dbb95b233da7127a6ff973c03d24e7", size = 80101, upload-time = "2026-05-21T04:04:53.635Z" }, ] [[package]] name = "pydantic-settings" -version = "2.14.0" +version = "2.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/98/c8345dccdc31de4228c039a98f6467a941e39558da41c1744fbe29fa5666/pydantic_settings-2.14.0.tar.gz", hash = "sha256:24285fd4b0e0c06507dd9fdfd331ee23794305352aaec8fc4eb92d4047aeb67d", size = 235709, upload-time = "2026-04-20T13:37:40.293Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/dd/bebff3040138f00ae8a102d426b27349b9a49acc310fcae7f92112d867e3/pydantic_settings-2.14.0-py3-none-any.whl", hash = "sha256:fc8d5d692eb7092e43c8647c1c35a3ecd00e040fcf02ed86f4cb5458ca62182e", size = 60940, upload-time = "2026-04-20T13:37:38.586Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, ] [[package]] @@ -3152,15 +3192,15 @@ crypto = [ [[package]] name = "pymdown-extensions" -version = "10.21.2" +version = "10.21.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/08/f1c908c581fd11913da4711ea7ba32c0eee40b0190000996bb863b0c9349/pymdown_extensions-10.21.2.tar.gz", hash = "sha256:c3f55a5b8a1d0edf6699e35dcbea71d978d34ff3fa79f3d807b8a5b3fa90fbdc", size = 853922, upload-time = "2026-03-29T15:01:55.233Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/26/d1015444da4d952a1ca487a236b522eb979766f0295a0bd0c5fc089989a9/pymdown_extensions-10.21.3.tar.gz", hash = "sha256:72cfcf55f07aea0d4af2c4f11dd4e52466ddfb1bb819673146398e0bd3a77354", size = 854140, upload-time = "2026-05-13T12:57:32.267Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/27/a2fc51a4a122dfd1015e921ae9d22fee3d20b0b8080d9a704578bf9deece/pymdown_extensions-10.21.2-py3-none-any.whl", hash = "sha256:5c0fd2a2bea14eb39af8ff284f1066d898ab2187d81b889b75d46d4348c01638", size = 268901, upload-time = "2026-03-29T15:01:53.244Z" }, + { url = "https://files.pythonhosted.org/packages/7e/85/545a951eecc270fcd688288c600017e2050a1aacb56c711d208586d3e470/pymdown_extensions-10.21.3-py3-none-any.whl", hash = "sha256:d7a5d08014fc571e80ca21dd6f854e31f94c489800350564d55d15b3c41e76b6", size = 269002, upload-time = "2026-05-13T12:57:30.296Z" }, ] [[package]] @@ -3229,11 +3269,11 @@ wheels = [ [[package]] name = "python-multipart" -version = "0.0.27" +version = "0.0.29" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/9b/f23807317a113dc36e74e75eb265a02dd1a4d9082abc3c1064acd22997c4/python_multipart-0.0.27.tar.gz", hash = "sha256:9870a6a8c5a20a5bf4f07c017bd1489006ff8836cff097b6933355ee2b49b602", size = 44043, upload-time = "2026-04-27T10:51:26.649Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/fe/70bd71a6738b09a0bdf6480ca6436b167469ca4578b2a0efbe390b4b0e70/python_multipart-0.0.29.tar.gz", hash = "sha256:643e93849196645e2dbdd81a0f8829a23123ad7f797a84a364c6fb3563f18904", size = 45678, upload-time = "2026-05-17T17:29:47.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/78/4126abcbdbd3c559d43e0db7f7b9173fc6befe45d39a2856cc0b8ec2a5a6/python_multipart-0.0.27-py3-none-any.whl", hash = "sha256:6fccfad17a27334bd0193681b369f476eda3409f17381a2d65aa7df3f7275645", size = 29254, upload-time = "2026-04-27T10:51:24.997Z" }, + { url = "https://files.pythonhosted.org/packages/8f/cb/769cfc37177252872a45a71f3fbdde9d51b471a3f3c14bfe95dde3407386/python_multipart-0.0.29-py3-none-any.whl", hash = "sha256:2ddcc971cef266225f54f552d8fa10bcfbb1f14446caec199060daac59ff2d69", size = 29640, upload-time = "2026-05-17T17:29:45.69Z" }, ] [[package]] @@ -3453,7 +3493,6 @@ book = [ { name = "altair" }, { name = "autodocsumm" }, { name = "duckdb" }, - { name = "fastapi" }, { name = "marimo" }, { name = "plotly" }, { name = "sympy" }, @@ -3472,6 +3511,7 @@ dev = [ { name = "types-python-dateutil" }, ] docs = [ + { name = "fastapi" }, { name = "griffe-pydantic" }, { name = "griffe-typingdoc" }, { name = "kaleido" }, @@ -3499,7 +3539,7 @@ requires-dist = [ { name = "ccy", specifier = ">=2.0.0" }, { name = "ccy", extras = ["holidays"], marker = "extra == 'ai'", specifier = ">=2.0.0" }, { name = "duckdb", marker = "extra == 'book'", specifier = ">=1.4.4" }, - { name = "fastapi", marker = "extra == 'book'", specifier = ">=0.129.0" }, + { name = "fastapi", marker = "extra == 'docs'", specifier = ">=0.129.0" }, { name = "ghp-import", marker = "extra == 'dev'", specifier = ">=2.0.2" }, { name = "google-genai", marker = "extra == 'ai'", specifier = ">=1.61.0" }, { name = "griffe-pydantic", marker = "extra == 'docs'", specifier = ">=1.1.0" }, @@ -3567,7 +3607,7 @@ wheels = [ [[package]] name = "requests" -version = "2.33.1" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -3575,9 +3615,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]] @@ -3712,27 +3752,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, +version = "0.15.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, + { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, + { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, + { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, ] [[package]] @@ -4040,15 +4080,15 @@ wheels = [ [[package]] name = "sse-starlette" -version = "3.4.1" +version = "3.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/9a/f35932a8c0eb6b2287b66fa65a0321df8c84e4e355a659c1841a37c39fdb/sse_starlette-3.4.1.tar.gz", hash = "sha256:f780bebcf6c8997fe514e3bd8e8c648d8284976b391c8bed0bcb1f611632b555", size = 35127, upload-time = "2026-04-26T13:32:32.292Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", size = 31819, upload-time = "2026-05-12T17:37:17.019Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/07/45c21ed03d708c477367305726b89919b020a3a2a01f72aaf5ad941caf35/sse_starlette-3.4.1-py3-none-any.whl", hash = "sha256:6b43cf21f1d574d582a6e1b0cfbde1c94dc86a32a701a7168c99c4475c6bd1d0", size = 16487, upload-time = "2026-04-26T13:32:30.819Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", size = 16514, upload-time = "2026-05-12T17:37:15.601Z" }, ] [[package]] @@ -4210,16 +4250,16 @@ wheels = [ [[package]] name = "tomlkit" -version = "0.14.0" +version = "0.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/af/14b24e41977adb296d6bd1fb59402cf7d60ce364f90c890bd2ec65c43b5a/tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064", size = 187167, upload-time = "2026-01-13T01:14:53.304Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/db/03eaf4331631ef6b27d6e3c9b68c54dc6f0d63d87201fed600cc409307fd/tomlkit-0.15.0.tar.gz", hash = "sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3", size = 161875, upload-time = "2026-05-10T07:38:22.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/11/87d6d29fb5d237229d67973a6c9e06e048f01cf4994dee194ab0ea841814/tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680", size = 39310, upload-time = "2026-01-13T01:14:51.965Z" }, + { url = "https://files.pythonhosted.org/packages/6a/43/8bd850ee71a191bf072e31302c73a66be413fecdd98fdcd111ecbcce13ca/tomlkit-0.15.0-py3-none-any.whl", hash = "sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738", size = 41328, upload-time = "2026-05-10T07:38:23.517Z" }, ] [[package]] name = "torch" -version = "2.11.0+cu126" +version = "2.12.0+cu126" source = { registry = "https://download.pytorch.org/whl/cu126" } dependencies = [ { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, @@ -4238,24 +4278,24 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:36ae7e5522b86e5d74d70f0c1a5b32eda3a0ae1635749060d0335a8856c778ea", upload-time = "2026-04-27T20:50:19Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a992bf8b3f2f4a8e0f2caf204ea1b1206466535eb485d4f61caf69a881e2fae7", upload-time = "2026-04-27T20:50:51Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp311-cp311-win_amd64.whl", hash = "sha256:ce9aeead7950ae8eb48891568f9314a9a4130996b55e797c75e0c0d2846714ae", upload-time = "2026-04-27T20:52:26Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:dc05f49d97c04a32d139df19d77209ceca3c484083f0db1dc332f168a19ef8d8", upload-time = "2026-04-27T20:54:02Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9235c0c2f5032d1f8af75dd97493f3ad12aaedf81c0f3fab2d13c1d90bc54ff9", upload-time = "2026-04-27T20:54:34Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp312-cp312-win_amd64.whl", hash = "sha256:1b7d728ddcf84b12f64ca10ec5f6ce91dd9edcc5e62ed5f0a7260ca00f029e8b", upload-time = "2026-04-27T20:56:19Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:3bbbfc7ed16d878aef9b91a8e78c033bf131ffb8357e23ff80911210683a31b3", upload-time = "2026-04-27T20:58:05Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5f6e2a5709876dd25a5fe0d4f0ab1ef33b33bb60431fcbfe768ab6468dcfe88a", upload-time = "2026-04-27T20:58:40Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp313-cp313-win_amd64.whl", hash = "sha256:12f7f1b73ba522576ea2050fbe2dc720a30cf681c73b8ea2d4f5480d66fad8f3", upload-time = "2026-04-27T21:00:22Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7945e39fe82b85d7d018f68085ffaa6c5305a1634adb0bc792d835953b36fc9b", upload-time = "2026-04-27T21:02:11Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:47adcccf4de0fdb4a1550f477d919daec74f1007d15d939acfcef3080d26f9ec", upload-time = "2026-04-27T21:02:46Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp313-cp313t-win_amd64.whl", hash = "sha256:478ba5a57cba329f6878cf4c9bf6baa21c17c2e2b39784e0f7d3ee56b10a85a7", upload-time = "2026-04-27T21:04:33Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:9bef6e2c04c24163bf0cafab82ee2aecdf503b1817f936e1e6f5c652231b06f1", upload-time = "2026-04-27T21:06:48Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:09083ecca5f6f6214b021d12c971763267cd1270df9ffcbb6291c815c483b1a0", upload-time = "2026-04-27T21:07:26Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp314-cp314-win_amd64.whl", hash = "sha256:146a8016c5abba673ea8af7d78e45e297b23e1f53c2a6749418a7c94f5d8d9ed", upload-time = "2026-04-27T21:09:25Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:561ac0b9041f43c6acb927526f892cd64304eff8725536be0d86e27992588ab3", upload-time = "2026-04-27T21:11:25Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:e0e31c656a407c11164d2d9257e31773562ca9ad82f755851dac511d48e9fc4d", upload-time = "2026-04-27T21:12:00Z" }, - { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.11.0%2Bcu126-cp314-cp314t-win_amd64.whl", hash = "sha256:3b4deea8cb01bf8f336ac8f87298f67a44835044f24deea8e0dc2d33f5d3f68d", upload-time = "2026-04-27T21:13:49Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:082514b013f2c091b1902bf94bb0f69a8c3e9ac93ab084edf541ceb1b146d8fe", upload-time = "2026-05-12T23:23:03Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:94eb1c8fc870446adfbeb550633708529c1baa9907e2c82d3bb2e76c7dd1d644", upload-time = "2026-05-12T23:23:38Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp311-cp311-win_amd64.whl", hash = "sha256:dbbdaf04ca82e568228ffbff7a269d5a86cc00ed5a606a2b6d13c205a269fb69", upload-time = "2026-05-12T23:25:13Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:7b13d35e799c5b970403ba8ed7f33041ae5c1c0a2b6320ba3288082df3df3a45", upload-time = "2026-05-12T23:26:44Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:792711a06946fa1dcd1a86d46c387dd413744b9324262ff77c05f61830d0e678", upload-time = "2026-05-12T23:27:16Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp312-cp312-win_amd64.whl", hash = "sha256:194f5bd0721b968e769777b8ab4dbe51dd7ffdfdf295db045093b94a1b9765bb", upload-time = "2026-05-12T23:28:57Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:3cf6676d41d8d57350d45d738b35cbed7671e36242a836993cd69b0c18819177", upload-time = "2026-05-12T23:30:41Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8727a3901c34bf9825069aaf82f0984dd28ff622e1a727d2534555cd778fc5dc", upload-time = "2026-05-12T23:31:17Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp313-cp313-win_amd64.whl", hash = "sha256:163a5020765016b11de7580e61d2d94e9595b8a8d0e5641c10b469fc34360e47", upload-time = "2026-05-12T23:32:53Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:debd0815f6a2383c2a69cc2a40b4b3566ab339677f2a0cf8faff23daaa9ae03d", upload-time = "2026-05-12T23:34:19Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:1719b4ed6cbe5ff750e5636b2625bade85caeea937436d8b235f5e49e471875d", upload-time = "2026-05-12T23:34:46Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp313-cp313t-win_amd64.whl", hash = "sha256:13558cc2c4432c96deab6e5c4a8b3367d98a3ae5ec15123607529ff2f0f12ed3", upload-time = "2026-05-12T23:36:14Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e9be67e6c64b980cfd75f8cf09463d7aea84dd75cddd9a90c6b2363be221a6b5", upload-time = "2026-05-12T23:37:39Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:149a376813baf61f4a6d1fa2b3dd046a41c98b91d7d2c22a0989984642373f73", upload-time = "2026-05-12T23:38:07Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp314-cp314-win_amd64.whl", hash = "sha256:4b05a1e104739100179ffb0d94daf17f1808b2f71cd895841729ccf06460b0d3", upload-time = "2026-05-12T23:39:31Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:16f9187e12efffae37983c2edd7560cf7b1828bae84a30a3fd6733b3adcbdc6b", upload-time = "2026-05-12T23:40:51Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6c1535d135828f839da6478bdfa94bcb4cf1dbd1bad06ca3d8ca07c94451348f", upload-time = "2026-05-12T23:41:20Z" }, + { url = "https://download-r2.pytorch.org/whl/cu126/torch-2.12.0%2Bcu126-cp314-cp314t-win_amd64.whl", hash = "sha256:ec030dd30287eda9338ee401dcca722758862337bd0cdb904325b8eeba5c2694", upload-time = "2026-05-12T23:42:43Z" }, ] [[package]] @@ -4272,30 +4312,30 @@ wheels = [ [[package]] name = "triton" -version = "3.6.0" +version = "3.7.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/2c/96f92f3c60387e14cc45aed49487f3486f89ea27106c1b1376913c62abe4/triton-3.6.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49df5ef37379c0c2b5c0012286f80174fcf0e073e5ade1ca9a86c36814553651", size = 176081190, upload-time = "2026-01-20T16:16:00.523Z" }, - { url = "https://files.pythonhosted.org/packages/e0/12/b05ba554d2c623bffa59922b94b0775673de251f468a9609bc9e45de95e9/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3", size = 188214640, upload-time = "2026-01-20T16:00:35.869Z" }, - { url = "https://files.pythonhosted.org/packages/17/5d/08201db32823bdf77a0e2b9039540080b2e5c23a20706ddba942924ebcd6/triton-3.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:374f52c11a711fd062b4bfbb201fd9ac0a5febd28a96fb41b4a0f51dde3157f4", size = 176128243, upload-time = "2026-01-20T16:16:07.857Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", size = 188266850, upload-time = "2026-01-20T16:00:43.041Z" }, - { url = "https://files.pythonhosted.org/packages/3c/12/34d71b350e89a204c2c7777a9bba0dcf2f19a5bfdd70b57c4dbc5ffd7154/triton-3.6.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448e02fe6dc898e9e5aa89cf0ee5c371e99df5aa5e8ad976a80b93334f3494fd", size = 176133521, upload-time = "2026-01-20T16:16:13.321Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0b/37d991d8c130ce81a8728ae3c25b6e60935838e9be1b58791f5997b24a54/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9", size = 188289450, upload-time = "2026-01-20T16:00:49.136Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4e/41b0c8033b503fd3cfcd12392cdd256945026a91ff02452bef40ec34bee7/triton-3.6.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1722e172d34e32abc3eb7711d0025bb69d7959ebea84e3b7f7a341cd7ed694d6", size = 176276087, upload-time = "2026-01-20T16:16:18.989Z" }, - { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296, upload-time = "2026-01-20T16:00:56.042Z" }, - { url = "https://files.pythonhosted.org/packages/49/55/5ecf0dcaa0f2fbbd4420f7ef227ee3cb172e91e5fede9d0ecaddc43363b4/triton-3.6.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5523241e7d1abca00f1d240949eebdd7c673b005edbbce0aca95b8191f1d43", size = 176138577, upload-time = "2026-01-20T16:16:25.426Z" }, - { url = "https://files.pythonhosted.org/packages/df/3d/9e7eee57b37c80cec63322c0231bb6da3cfe535a91d7a4d64896fcb89357/triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a17a5d5985f0ac494ed8a8e54568f092f7057ef60e1b0fa09d3fd1512064e803", size = 188273063, upload-time = "2026-01-20T16:01:07.278Z" }, - { url = "https://files.pythonhosted.org/packages/48/db/56ee649cab5eaff4757541325aca81f52d02d4a7cd3506776cad2451e060/triton-3.6.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b3a97e8ed304dfa9bd23bb41ca04cdf6b2e617d5e782a8653d616037a5d537d", size = 176274804, upload-time = "2026-01-20T16:16:31.528Z" }, - { url = "https://files.pythonhosted.org/packages/f6/56/6113c23ff46c00aae423333eb58b3e60bdfe9179d542781955a5e1514cb3/triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46bd1c1af4b6704e554cad2eeb3b0a6513a980d470ccfa63189737340c7746a7", size = 188397994, upload-time = "2026-01-20T16:01:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c1/5d842314bb6c78442cc60437928781701c6050b8d479bc2a1aed691d37ca/triton-3.7.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9e71fc392675fac364e0ecf4ef3f76f85b7f5433a16f4c3c5fe5f05a52c85fe", size = 188480277, upload-time = "2026-05-07T19:05:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/13/31/8315ea5f8dd18e60970b3022e3a8b93fd37e0b784fbbef86e10c8e6e5ca1/triton-3.7.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22bacffce443f54593dd20f05294d5a40622e0ea9ab632816f87154504356221", size = 201415942, upload-time = "2026-05-07T18:46:06.479Z" }, + { url = "https://files.pythonhosted.org/packages/f7/13/ec05adfcd87311d532ba61e3af143e8be59fcd26675884c4682841406a20/triton-3.7.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4bf49b00a7a377a68a6da603a876e797614e6455a80e9021669c476a953ad9a", size = 188505104, upload-time = "2026-05-07T19:05:09.843Z" }, + { url = "https://files.pythonhosted.org/packages/62/7b/468a576e35beef1426e0828e28e9ba9e65f5474d496f16ee126c15646324/triton-3.7.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f111161d49bf903c0eaedde3962353a3d841c08a836839b7cc1025b8426efcf", size = 201457567, upload-time = "2026-05-07T18:46:13.505Z" }, + { url = "https://files.pythonhosted.org/packages/01/e1/a59a583de59b8f62c495d67c80ee3ea97d09e91ac80c4c6e76456ed8d8ac/triton-3.7.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abdf6beaa89b1bcfb9a43cd990536ce66091a997841a4814b260b7bee4c88c3c", size = 188503209, upload-time = "2026-05-07T19:05:17.935Z" }, + { url = "https://files.pythonhosted.org/packages/30/b1/b7507bb9815d403927c8dd51d4158ed2e11751a92dbc118a044f247b6848/triton-3.7.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a35d7afe3f3f058e7ec49fcce09794049e0ffc5c59019ac25ec3413741b8c4e7", size = 201453566, upload-time = "2026-05-07T18:46:20.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8f/0bea7a6a0c989315c9135a1d7fb37e41905cfb3a17cbc1f10044ebd4cc3a/triton-3.7.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc1d61c172d257db80ddf42595131fb196ad2e9bdd751e90fe2ef13531734e8b", size = 188612899, upload-time = "2026-05-07T19:05:24.955Z" }, + { url = "https://files.pythonhosted.org/packages/e1/02/d96f57828d0912aec733b9bc7e0e7dbfd2c6f079a8fa433ac25cb93d1a30/triton-3.7.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70fb9bbdc9f400afc54bbf6eb2670af28829a6ae3996863317964783141daf56", size = 201553816, upload-time = "2026-05-07T18:46:27.49Z" }, + { url = "https://files.pythonhosted.org/packages/40/fb/82a802dac4689f2a2fb2e69302e6a138eecc3e175bbe976ba3cfc717683a/triton-3.7.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a44a8476d0d3571eac4e4d1048e1ff75aad81a09ff4602ccfc56c6dea1672e", size = 188507879, upload-time = "2026-05-07T19:05:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/8f/af/9904ec6d3c93d9b24e5ec360445bbdf758b7f00bfbeedb89cb0eb64eb8bb/triton-3.7.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9b85e72968a9d8bba5ddb24e9b64aaabaf48affb042f2755cb7cfa92b7531ce", size = 201460637, upload-time = "2026-05-07T18:46:34.749Z" }, + { url = "https://files.pythonhosted.org/packages/a1/f9/4835a8ea746b88727d8899f4e3ccce4f9cacb38abfc3bb0a638266c53111/triton-3.7.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18a160de426fd99f92b0baf509045360afbd3bfaa0b4a5171dde800ec9f09684", size = 188608706, upload-time = "2026-05-07T19:05:39.218Z" }, + { url = "https://files.pythonhosted.org/packages/c1/68/fa86e5a39608000f645535b2c124920126327ab731f8c4fafd5b07ff8d4b/triton-3.7.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce061073102714b725f3660ec6939d94a1da7984b3aa99c921417cae273672f5", size = 201546766, upload-time = "2026-05-07T18:46:42.088Z" }, ] [[package]] name = "types-python-dateutil" -version = "2.9.0.20260408" +version = "2.9.0.20260518" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/f3/2427775f80cd5e19a0a71ba8e5ab7645a01a852f43a5fd0ffc24f66338e0/types_python_dateutil-2.9.0.20260408.tar.gz", hash = "sha256:8b056ec01568674235f64ecbcef928972a5fac412f5aab09c516dfa2acfbb582", size = 16981, upload-time = "2026-04-08T04:28:10.995Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/e8/c01bdf0d7c3659428c091fbd693177093639565bcbc86bc20098e6d37cc6/types_python_dateutil-2.9.0.20260518.tar.gz", hash = "sha256:51f02dc03b61c7f6a07df45797d4dfe8a1aa47f0b7db9ad89f6fd3a1a70e1b51", size = 17082, upload-time = "2026-05-18T06:05:24.508Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/c6/eeba37bfee282a6a97f889faef9352d6172c6a5088eb9a4daf570d9d748d/types_python_dateutil-2.9.0.20260408-py3-none-any.whl", hash = "sha256:473139d514a71c9d1fbd8bb328974bedcb1cc3dba57aad04ffa4157f483c216f", size = 18437, upload-time = "2026-04-08T04:28:10.095Z" }, + { url = "https://files.pythonhosted.org/packages/36/22/169273273ca34e9ab0ae2f387ba72ed7e09faaaf834da01d6b89c2bea71a/types_python_dateutil-2.9.0.20260518-py3-none-any.whl", hash = "sha256:d6a9c5bd0de61460c8fdef8ab2b400f956a1a1075cce08d4e2b4434e478c50b8", size = 18431, upload-time = "2026-05-18T06:05:23.641Z" }, ] [[package]] @@ -4330,24 +4370,24 @@ wheels = [ [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] name = "uvicorn" -version = "0.46.0" +version = "0.47.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/93/041fca8274050e40e6791f267d82e0e2e27dd165627bd640d3e0e378d877/uvicorn-0.46.0.tar.gz", hash = "sha256:fb9da0926999cc6cb22dc7cd71a94a632f078e6ae47ff683c5c420750fb7413d", size = 88758, upload-time = "2026-04-23T07:16:00.151Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b1/8e7077a8641086aea449e1b5752a570f1b5906c64e0a33cd6d93b63a066b/uvicorn-0.47.0.tar.gz", hash = "sha256:7c9a0ea1a9414106bbab7324609c162d8fa0cdcdcb703060987269d77c7bb533", size = 90582, upload-time = "2026-05-14T18:16:54.455Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/a3/5b1562db76a5a488274b2332a97199b32d0442aca0ed193697fd47786316/uvicorn-0.46.0-py3-none-any.whl", hash = "sha256:bbebbcbed972d162afca128605223022bedd345b7bc7855ce66deb31487a9048", size = 70926, upload-time = "2026-04-23T07:15:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/15/41/ac2dfdbc1f60c7af4f994c7a335cfa7040c01642b605d65f611cecc2a1e4/uvicorn-0.47.0-py3-none-any.whl", hash = "sha256:2c5715bc12d1892d84752049f400cd1c3cb018514967fdfeb97640443a6a9432", size = 71301, upload-time = "2026-05-14T18:16:51.762Z" }, ] [[package]] @@ -4438,131 +4478,99 @@ wheels = [ [[package]] name = "yarl" -version = "1.23.0" +version = "1.24.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" }, - { url = "https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", size = 86248, upload-time = "2026-03-01T22:04:44.757Z" }, - { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", size = 100566, upload-time = "2026-03-01T22:04:47.639Z" }, - { url = "https://files.pythonhosted.org/packages/49/fb/c438fb5108047e629f6282a371e6e91cf3f97ee087c4fb748a1f32ceef55/yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05", size = 92079, upload-time = "2026-03-01T22:04:48.925Z" }, - { url = "https://files.pythonhosted.org/packages/d9/13/d269aa1aed3e4f50a5a103f96327210cc5fa5dd2d50882778f13c7a14606/yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83", size = 108741, upload-time = "2026-03-01T22:04:50.838Z" }, - { url = "https://files.pythonhosted.org/packages/85/fb/115b16f22c37ea4437d323e472945bea97301c8ec6089868fa560abab590/yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c", size = 108099, upload-time = "2026-03-01T22:04:52.499Z" }, - { url = "https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", size = 102678, upload-time = "2026-03-01T22:04:55.176Z" }, - { url = "https://files.pythonhosted.org/packages/85/59/cd98e556fbb2bf8fab29c1a722f67ad45c5f3447cac798ab85620d1e70af/yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b", size = 100803, upload-time = "2026-03-01T22:04:56.588Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", size = 100163, upload-time = "2026-03-01T22:04:58.492Z" }, - { url = "https://files.pythonhosted.org/packages/e7/64/6980f99ab00e1f0ff67cb84766c93d595b067eed07439cfccfc8fb28c1a6/yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788", size = 93859, upload-time = "2026-03-01T22:05:00.268Z" }, - { url = "https://files.pythonhosted.org/packages/38/69/912e6c5e146793e5d4b5fe39ff5b00f4d22463dfd5a162bec565ac757673/yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222", size = 108202, upload-time = "2026-03-01T22:05:02.273Z" }, - { url = "https://files.pythonhosted.org/packages/59/97/35ca6767524687ad64e5f5c31ad54bc76d585585a9fcb40f649e7e82ffed/yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb", size = 99866, upload-time = "2026-03-01T22:05:03.597Z" }, - { url = "https://files.pythonhosted.org/packages/d3/1c/1a3387ee6d73589f6f2a220ae06f2984f6c20b40c734989b0a44f5987308/yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc", size = 107852, upload-time = "2026-03-01T22:05:04.986Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", size = 102919, upload-time = "2026-03-01T22:05:06.397Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1c/9a1979aec4a81896d597bcb2177827f2dbee3f5b7cc48b2d0dadb644b41d/yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5", size = 82602, upload-time = "2026-03-01T22:05:08.444Z" }, - { url = "https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46", size = 87461, upload-time = "2026-03-01T22:05:10.145Z" }, - { url = "https://files.pythonhosted.org/packages/93/95/07e3553fe6f113e6864a20bdc53a78113cda3b9ced8784ee52a52c9f80d8/yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928", size = 82336, upload-time = "2026-03-01T22:05:11.554Z" }, - { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, - { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, - { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, - { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, - { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, - { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, - { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, - { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, - { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, - { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, - { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, - { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, - { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, - { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, - { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, - { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, - { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, - { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, - { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" }, - { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" }, - { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" }, - { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" }, - { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, - { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" }, - { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" }, - { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, - { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" }, - { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" }, - { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, - { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" }, - { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, - { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" }, - { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" }, - { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" }, - { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" }, - { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, - { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" }, - { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" }, - { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" }, - { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" }, - { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, - { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" }, - { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" }, - { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" }, - { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, - { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, - { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, - { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, - { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, - { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, - { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, - { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, - { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, - { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, - { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, - { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, - { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, - { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, - { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, - { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, - { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, - { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, - { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, - { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, - { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, - { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, - { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, - { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, - { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, - { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, - { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, - { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, - { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, - { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, - { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, - { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, - { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, -] - -[[package]] -name = "zipp" -version = "3.23.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/21/093488dfc7cc8964ded15ab726fad40f25fd3d788fd741cc1c5a17d78ee8/zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110", size = 25965, upload-time = "2026-04-13T23:21:46.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc", size = 10378, upload-time = "2026-04-13T23:21:45.386Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798, upload-time = "2026-05-19T21:31:05.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/c5/1ce244152ff2839645e7cae92f90e7bafcb2c52bea7ff586ac714f14f5df/yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1", size = 128971, upload-time = "2026-05-19T21:28:20.543Z" }, + { url = "https://files.pythonhosted.org/packages/87/5a/00f36967203ed89cb3acd2c8ed526cc3fed9418eb70ce128160a911c8499/yarl-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a97e42c8a2233f2f279ecadd9e4a037bcb5d813b78435e8eedd4db5a9e9708c", size = 91507, upload-time = "2026-05-19T21:28:22.556Z" }, + { url = "https://files.pythonhosted.org/packages/31/d0/1fb0c1cd27288f39f6974da4318c32768d72c9890984541fdf1e2e32a51d/yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d", size = 91343, upload-time = "2026-05-19T21:28:24.092Z" }, + { url = "https://files.pythonhosted.org/packages/03/ce/d4a646508bed2f8dec6435b40166fe9308dd191262033d3f307b2bbcaecd/yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae", size = 105704, upload-time = "2026-05-19T21:28:25.872Z" }, + { url = "https://files.pythonhosted.org/packages/4b/07/b3278e82d8bc41485bcf6d856cd0433262593de615b1d3dc43bd3f5bead4/yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a", size = 97281, upload-time = "2026-05-19T21:28:27.352Z" }, + { url = "https://files.pythonhosted.org/packages/17/5b/4cee6e7c92e487bebe7afc797da0aa54a248ab4e776a68fe369ec29665a5/yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e", size = 114020, upload-time = "2026-05-19T21:28:29.458Z" }, + { url = "https://files.pythonhosted.org/packages/5c/82/111076571545a7d4f9cca3fbd5c6f40615af58642be09f12328f48022468/yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50", size = 111450, upload-time = "2026-05-19T21:28:31.262Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ec/08f671f69a444d704aeecebf92af659b67b97a869942411d0a578b08c334/yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003", size = 106384, upload-time = "2026-05-19T21:28:32.856Z" }, + { url = "https://files.pythonhosted.org/packages/e5/86/ce41e7a7a199340b2330d52b60f25c4074b6636dd0e60b1a80d31a9db042/yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f", size = 106153, upload-time = "2026-05-19T21:28:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5d/31be8a729531ab3e55ac3e7e5c800be8c89ea98947f418b2f6ea259fb6ee/yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f", size = 105322, upload-time = "2026-05-19T21:28:36.642Z" }, + { url = "https://files.pythonhosted.org/packages/47/9b/b57afb22b386ae87ac9940f09878b98d8c333f89113e6fc96fcf4ca9eb64/yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294", size = 99057, upload-time = "2026-05-19T21:28:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4f/06348c27c8389256c313e8a57d796808fc0264c915dd5e7cfd3c0e314dc7/yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2", size = 113502, upload-time = "2026-05-19T21:28:40.091Z" }, + { url = "https://files.pythonhosted.org/packages/5f/1c/284f307b298e4a17b7943b07d9d7ecc4151537f8d137ba51f3bb6c31ca20/yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c", size = 105253, upload-time = "2026-05-19T21:28:41.987Z" }, + { url = "https://files.pythonhosted.org/packages/c8/bf/0de123bec8619e45c80cbded9085f61b5b4a9eddb8abe6d25d28ee1ec866/yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b", size = 111345, upload-time = "2026-05-19T21:28:43.93Z" }, + { url = "https://files.pythonhosted.org/packages/90/af/0248eb065e51129d2a9b2436cd1b5c772c19a6b04e5b6a186955671e3319/yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5", size = 106558, upload-time = "2026-05-19T21:28:45.806Z" }, + { url = "https://files.pythonhosted.org/packages/21/3c/f960d7a65ef97d8ba9b424fb5128796a4bc710fc6df2ddbbd7dfdc3bbd20/yarl-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:f8fdbcff8b2c7c9284e60c196f693588598ddcee31e11c18e14949ce44519d45", size = 92808, upload-time = "2026-05-19T21:28:48.465Z" }, + { url = "https://files.pythonhosted.org/packages/03/1a/49fb03750e4de4d2284cd5b885a383133c34eef45bd59631b2bb8b7e81e8/yarl-1.24.2-cp311-cp311-win_arm64.whl", hash = "sha256:b32c37a7a337e90822c45797bf3d79d60875cfcccd3ecc80e9f453d87026c122", size = 87610, upload-time = "2026-05-19T21:28:50.07Z" }, + { url = "https://files.pythonhosted.org/packages/f0/da/866bcb01076ba49d2b42b309867bed3826421f1c479655eb7a607b44f20b/yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8", size = 129957, upload-time = "2026-05-19T21:28:51.695Z" }, + { url = "https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2", size = 92164, upload-time = "2026-05-19T21:28:53.242Z" }, + { url = "https://files.pythonhosted.org/packages/29/b6/170e2b8d4e3bc30e6bfdcca53556537f5bf595e938632dfcb059311f3ff6/yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d", size = 91688, upload-time = "2026-05-19T21:28:54.865Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a5/c9f655d5553ea0b99fdac9d6a99ad3f9b3e73b8e5758bb46f58c9831f74c/yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035", size = 102902, upload-time = "2026-05-19T21:28:56.963Z" }, + { url = "https://files.pythonhosted.org/packages/5d/bc/6b9664d815d79af4ee553337f9d606c56bbf269186ada9172de45f1b5f60/yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576", size = 97931, upload-time = "2026-05-19T21:28:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/98/ec/32ba48acae30fecd60928f5791188b80a9d6ee3840507ffda29fecd37b71/yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8", size = 111030, upload-time = "2026-05-19T21:29:00.148Z" }, + { url = "https://files.pythonhosted.org/packages/82/5a/6f4cd081e5f4934d2ae3a8ef4abe3afacc010d26f0035ee91b35cd7d7c37/yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7", size = 110392, upload-time = "2026-05-19T21:29:02.155Z" }, + { url = "https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c", size = 105612, upload-time = "2026-05-19T21:29:04.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/80/264ab684f181e1a876389374519ff05d10248725535ae2ac4e8ac4e563d6/yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d", size = 104487, upload-time = "2026-05-19T21:29:06.491Z" }, + { url = "https://files.pythonhosted.org/packages/41/07/efabe5df87e96d7ad5959760b888344be48cd6884db127b407c6b5503adc/yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db", size = 102333, upload-time = "2026-05-19T21:29:08.267Z" }, + { url = "https://files.pythonhosted.org/packages/44/0c/bcf7c42603e1009295f586d8890f2ba032c8b53310e815adf0a202c73d9f/yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712", size = 99025, upload-time = "2026-05-19T21:29:10.682Z" }, + { url = "https://files.pythonhosted.org/packages/4f/82/84482ab1a57a0f21a08afe6a7004c61d741f8f2ecc3b05c321577c612164/yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996", size = 110507, upload-time = "2026-05-19T21:29:12.954Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8d/a546ba1dfe1b0f290e05fef145cd07614c0f15df1a707195e512d1e39d1d/yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b", size = 103719, upload-time = "2026-05-19T21:29:14.893Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b6/267f2a09213138473adfce6b8a6e17791d7fee70bd4d9003218e4dec58b0/yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c", size = 110438, upload-time = "2026-05-19T21:29:16.485Z" }, + { url = "https://files.pythonhosted.org/packages/48/2d/1c8d89c7c5f9cad9fb2902445d94e2ab1d7aa35de029afbb8ae95c42d00f/yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1", size = 105719, upload-time = "2026-05-19T21:29:18.367Z" }, + { url = "https://files.pythonhosted.org/packages/a7/25/722e3b93bd687009afb2d59a35e13d30ddd8f80571445bb0c4e4ce26ec66/yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad", size = 92901, upload-time = "2026-05-19T21:29:20.014Z" }, + { url = "https://files.pythonhosted.org/packages/39/47/4486ccfb674c04854a1ef8aa77868b6a6f765feaf69633409d7ca4f02cb8/yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30", size = 87229, upload-time = "2026-05-19T21:29:22.1Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/fcf0ce677f17e5c471c06311dd25964be38a4c586993632910d2e75278bc/yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536", size = 128978, upload-time = "2026-05-19T21:29:23.83Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/8e63299bb71ed61a834121d9d3fe6c9fcf2a6a5d09754ff4f20f2d20baf5/yarl-1.24.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e89418f65eda18f99030386305bd44d7d504e328a7945db1ead514fbe03a0607", size = 91733, upload-time = "2026-05-19T21:29:25.375Z" }, + { url = "https://files.pythonhosted.org/packages/c1/24/16748d5dab6daec8b0ed81ccec639a1cded0f18dcc62a4f696b4fe366c37/yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1", size = 91113, upload-time = "2026-05-19T21:29:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/b63fff7b71211e866624b21432d5943cbb633eb0c2872d9ee3070648f22c/yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986", size = 103899, upload-time = "2026-05-19T21:29:28.842Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/ba1974b8533909636f7733fe86cf677e3619527c3c2fa913e0ea89c48757/yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488", size = 97862, upload-time = "2026-05-19T21:29:31.086Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/123ac993b5c2ba6f554a140305620cb8f150fa543711bbc49be3ec0a65a4/yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b", size = 111060, upload-time = "2026-05-19T21:29:32.657Z" }, + { url = "https://files.pythonhosted.org/packages/23/37/c472d3af3509688392134a88a825276770a187f1daa4de3f6dc0a327a751/yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592", size = 110613, upload-time = "2026-05-19T21:29:34.379Z" }, + { url = "https://files.pythonhosted.org/packages/df/88/09c28dad91e662ccfaa1b78f1c57badde74fc9d0b23e74aef644750ecd73/yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617", size = 107012, upload-time = "2026-05-19T21:29:36.216Z" }, + { url = "https://files.pythonhosted.org/packages/07/ab/9d4f69d571a94f4d112fa7e2e007200f5a54d319f58c82ac7b7baa61f5c6/yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92", size = 105887, upload-time = "2026-05-19T21:29:38.746Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9a/000b2b66c0d772a499fc531d21dab92dfeb73b640a12eed6ba89f49bb2d0/yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a", size = 103620, upload-time = "2026-05-19T21:29:40.368Z" }, + { url = "https://files.pythonhosted.org/packages/41/7c/7c1050f73450fbdaa3f0c72017059f00ce5e13366692f3dba25275a1083d/yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44", size = 100599, upload-time = "2026-05-19T21:29:42.66Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b1/29e5756b3926705f5f6089bd5b9f50a56eaac550da6e260bf713ead44d04/yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a", size = 110604, upload-time = "2026-05-19T21:29:44.632Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/8415bc96e9b150cde942fbac9a8182985e58f40ce5c54c34ed015407d3ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf", size = 105161, upload-time = "2026-05-19T21:29:46.755Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d4/cde059abfa229553b7298a2eadde2752e723d50aeedaef86ce59da2718ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056", size = 110619, upload-time = "2026-05-19T21:29:48.972Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2c/d6a6c9a61549f7b6c7e6dc6937d195bcf069582b47b7200dcd0e7b256acf/yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992", size = 107362, upload-time = "2026-05-19T21:29:51Z" }, + { url = "https://files.pythonhosted.org/packages/92/dd/3ae5fe417e9d1c353a548553326eb9935e76b6b727161563b424cc296df3/yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656", size = 92667, upload-time = "2026-05-19T21:29:52.743Z" }, + { url = "https://files.pythonhosted.org/packages/10/cc/a7beb239f78f27fca1b053c8e8595e4179c02e62249b4687ec218c370c50/yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461", size = 87069, upload-time = "2026-05-19T21:29:54.442Z" }, + { url = "https://files.pythonhosted.org/packages/40/0e/e08087695fc12789263821c5dc0f8dc52b5b17efd0887cacf419f8a43ba3/yarl-1.24.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f9312b3c02d9b3d23840f67952913c9c8721d7f1b7db305289faefa878f364c2", size = 129670, upload-time = "2026-05-19T21:29:56.631Z" }, + { url = "https://files.pythonhosted.org/packages/3a/98/ab4b5ed1b1b5cd973c8a3eb994c3a6aefb6ce6d399e21bb5f0316c33815c/yarl-1.24.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a4f4d6cd615823bfc7fb7e9b5987c3f41666371d870d51058f77e2680fbe9630", size = 91916, upload-time = "2026-05-19T21:29:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b1/5297bb6a7df4782f7605bffc43b31f5044070935fbbcaa6c705a07e6ac65/yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8", size = 91625, upload-time = "2026-05-19T21:30:00.412Z" }, + { url = "https://files.pythonhosted.org/packages/02/a7/45baabfff76829264e623b185cff0c340d7e11bf3e1cd9ea37e7d17934bd/yarl-1.24.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fecd17873a096036c1c87ab3486f1aef7f269ada7f23f7f856f93b1cc7744f14", size = 104574, upload-time = "2026-05-19T21:30:02.544Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/3a5ab144d3d650ca37d4f4b57e56169be8af3ca34c448793e064b30baaed/yarl-1.24.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a46d1ab4ba4d32e6dc80daf8a28ce0bd83d08df52fbc32f3e288663427734535", size = 97534, upload-time = "2026-05-19T21:30:04.319Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b5/5658fef3681fb5776b4513b052bec750009f47b3a592251c705d75375798/yarl-1.24.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73e68edf6dfd5f73f9ca127d84e2a6f9213c65bdffb736bda19524c0564fcd14", size = 111481, upload-time = "2026-05-19T21:30:05.988Z" }, + { url = "https://files.pythonhosted.org/packages/4c/06/fdcd7dde037f00866dce123ed4ba23dba94beb56fc4cf561668d27be37f2/yarl-1.24.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a296ca617f2d25fbceafb962b88750d627e5984e75732c712154d058ae8d79a3", size = 111529, upload-time = "2026-05-19T21:30:07.738Z" }, + { url = "https://files.pythonhosted.org/packages/c2/53/d81269aaafccea0d33396c03035de997b743f11e648e6e27a0df99c72980/yarl-1.24.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51b2cf5ec89a8b8470177641ed62a3ba22d74e1e898e06ad53aa77972487208", size = 107338, upload-time = "2026-05-19T21:30:09.713Z" }, + { url = "https://files.pythonhosted.org/packages/ae/04/23049463f729bd899df203a7960505a75333edd499cda8aa1d5a82b64df5/yarl-1.24.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:310fc687f7b2044ec54e372c8cbe923bb88f5c37bded0d3079e5791c2fc3cf50", size = 106147, upload-time = "2026-05-19T21:30:11.365Z" }, + { url = "https://files.pythonhosted.org/packages/14/18/04a4b5830b43ed5e4c5015b40e9f6241ad91487d71611061b4e111d6ac80/yarl-1.24.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:297a2fe352ecf858b30a98f87948746ec16f001d279f84aebdbd3bd965e2f1bd", size = 104272, upload-time = "2026-05-19T21:30:12.978Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f7/8cffdf319aee7a7c1dbd07b61d91c3e3fda460c7a93b5f93e445f3806c4c/yarl-1.24.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2a263e76b97bc42bdcd7c5f4953dec1f7cd62a1112fa7f869e57255229390d67", size = 99962, upload-time = "2026-05-19T21:30:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/d7/39/b3cce3b7dbef64ac700ad4cea156a207d01bede0f507587616c364b5468e/yarl-1.24.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:822519b64cf0b474f1a0aaef1dc621438ea46bb77c94df97a5b4d213a7d8a8b1", size = 111063, upload-time = "2026-05-19T21:30:16.683Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ea/100818505e7ebf165c7242ff17fdf7d9fee79e27234aeca871c1082920d7/yarl-1.24.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b6067060d9dc594899ba83e6db6c48c68d1e494a6dab158156ed86977ca7bcb1", size = 105438, upload-time = "2026-05-19T21:30:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d2/e075a0b32aa6625087de9e653087df0759fed5de4a435fef594181102a77/yarl-1.24.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0063adad533e57171b79db3943b229d40dfafeeee579767f96541f106bac5f1b", size = 111458, upload-time = "2026-05-19T21:30:21.024Z" }, + { url = "https://files.pythonhosted.org/packages/e6/5c/ceea7ba98b65c8eb8d947fdc52f9bedfcd43c6a57c9e3c90c17be8f324a3/yarl-1.24.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ee8e3fb34513e8dc082b586ef4910c98335d43a6fab688cd44d4851bacfce3e8", size = 107589, upload-time = "2026-05-19T21:30:23.412Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d9/5582d57e2b2db9b85eb6663a22efdd78e08805f3f5389566e9fcad254d1b/yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0", size = 94424, upload-time = "2026-05-19T21:30:25.425Z" }, + { url = "https://files.pythonhosted.org/packages/92/10/7dc07a0e22806a9280f42a57361395506e800c64e22737cd7b0886feab42/yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57", size = 88690, upload-time = "2026-05-19T21:30:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/9e/13/d5b8e2c8667db955bcb3de233f18798fefe7edf1d7429c2c9d4f9c401114/yarl-1.24.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:221ce1dd921ac4f603957f17d7c18c5cc0797fbb52f156941f92e04605d1d67b", size = 136248, upload-time = "2026-05-19T21:30:29.297Z" }, + { url = "https://files.pythonhosted.org/packages/de/46/a4a97c05c9c9b8fd266bb2a0df12992c7fbd02391eb9640583411b6dab32/yarl-1.24.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5f3224db28173a00d7afacdee07045cc4673dfab2b15492c7ae10deddbece761", size = 95084, upload-time = "2026-05-19T21:30:31.031Z" }, + { url = "https://files.pythonhosted.org/packages/95/b2/845cf2074a015e6fe0d0808cf1a2d9e868386c4220d657ebd8302b199043/yarl-1.24.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c557165320d6244ebe3a02431b2a201a20080e02f41f0cfa0ccc47a183765da8", size = 95272, upload-time = "2026-05-19T21:30:33.062Z" }, + { url = "https://files.pythonhosted.org/packages/fe/16/e69d4aa244aef45235ddfebc0e04036a6829842bc5a6a795aedc6c998d23/yarl-1.24.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:904065e6e85b1fa54d0d87438bd58c14c0bad97aad654ad1077fd9d87e8478ed", size = 101497, upload-time = "2026-05-19T21:30:34.842Z" }, + { url = "https://files.pythonhosted.org/packages/15/94/c07107715d621076863ee88b3ddf183fa5e9d4aba5769623c9979828410a/yarl-1.24.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cec2a38d70edc10e0e856ceda886af5327a017ccbde8e1de1bd44d300357543", size = 94002, upload-time = "2026-05-19T21:30:37.724Z" }, + { url = "https://files.pythonhosted.org/packages/a9/35/fc1bbdd895b5e4010b8fdd037f7ed3aa289d3863e08231b30231ca9a0815/yarl-1.24.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7484b9361ed222ee1ca5b4337aa4cbdcc4618ce5aff57d9ef1582fd95893fc0", size = 106524, upload-time = "2026-05-19T21:30:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/32b66d0a4ba47c296cf86d03e2c67bff58399fe6d6d84d5205c04c66cc6d/yarl-1.24.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:84f9670b89f34db07f81e53aee83e0b938a3412329d51c8f922488be7fcc4024", size = 106165, upload-time = "2026-05-19T21:30:41.888Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/37cb5ff50c5e825d4d38e81bb04d1b7e96bf960f7ab89f9850b162f3f114/yarl-1.24.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abb2759733d63a28b4956500a5dd57140f26486c92b2caedfb964ab7d9b79dbf", size = 103010, upload-time = "2026-05-19T21:30:43.985Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/4597912315096f7bb359e46e13bf8b60994fcbb2db29b804c0902ef4eff5/yarl-1.24.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:081c2bf54efe03774d0311172bc04fedf9ca01e644d4cd8c805688e527209bdc", size = 101128, upload-time = "2026-05-19T21:30:46.291Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/c8e86e120521e646013d02a8e3b8884392e28494be8f392366e50d208efc/yarl-1.24.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:86746bef442aa479107fe28132e1277237f9c24c2f00b0b0cf22b3ee0904f2bb", size = 101382, upload-time = "2026-05-19T21:30:48.085Z" }, + { url = "https://files.pythonhosted.org/packages/fa/98/70b229236118f89dbeb739b76f10225bbf53b5497725502594c9a01d699a/yarl-1.24.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2d07d21d0bc4b17558e8de0b02fbfdf1e347d3bb3699edd00bb92e7c57925420", size = 95964, upload-time = "2026-05-19T21:30:49.785Z" }, + { url = "https://files.pythonhosted.org/packages/87/f8/56c386981e3c8648d279fdef2397ffec577e8320fd5649745e34d54faeb7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4fb1ac3fc5fecd8ae7453ea237e4d22b49befa70266dfe1629924245c21a0c7f", size = 106204, upload-time = "2026-05-19T21:30:51.862Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1e/765afe97811ca35933e2a7de70ac57b1997ea2e4ee895719ee7a231fb7e5/yarl-1.24.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4da31a5512ed1729ca8d8aacde3f7faeb8843cde3165d6bcf7f88f74f17bb8aa", size = 101510, upload-time = "2026-05-19T21:30:53.62Z" }, + { url = "https://files.pythonhosted.org/packages/ee/78/393913f4b9039e1edd09ae8a9bbb9d539be909a8abf6d8a2084585bed4b7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:533ded4dceb5f1f3da7906244f4e82cf46cfd40d84c69a1faf5ac506aa65ecbe", size = 105584, upload-time = "2026-05-19T21:30:55.962Z" }, + { url = "https://files.pythonhosted.org/packages/78/87/deb17b7049bbe74ea11a713b86f8f27800cc1c8648b0b797243ebb4830ba/yarl-1.24.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7b3a85525f6e7eeabcfdd372862b21ee1915db1b498a04e8bf0e389b607ff0bd", size = 103410, upload-time = "2026-05-19T21:30:57.962Z" }, + { url = "https://files.pythonhosted.org/packages/8f/be/f9f7594e23b5b93affff0318e4593c1920331bcaefda326cabcad94296a1/yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215", size = 102980, upload-time = "2026-05-19T21:30:59.735Z" }, + { url = "https://files.pythonhosted.org/packages/65/a4/ba80dccd3593ff1f01051a818694d07b58cb8232677ee9a22a5a1f93a9fc/yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d", size = 91219, upload-time = "2026-05-19T21:31:01.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" }, ]