diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 23061d612b..9f025647ad 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -41,9 +41,10 @@ on: jobs: rust-check: - # Fast gate: type-check both with and without CUDA stubs so duplicate - # stub definitions or cfg mismatches fail in ~30s instead of surfacing - # during the slower maturin build below. + # Early gate: type-check both with and without CUDA stubs so duplicate + # stub definitions or cfg mismatches fail quickly instead of surfacing + # during the slower maturin build below. Also runs qdp-core f32 Parquet + # CPU smoke tests (issue #1342). runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 @@ -57,6 +58,17 @@ jobs: QDP_NO_CUDA: "1" run: cargo check --workspace --tests + # CPU smoke for the f32 Parquet pipeline (issue #1342). No GPU in CI, so + # GPU fidelity cases self-skip when the probe finds no functional GPU + # (stub build: kernel launch returns Err; no driver: cudarc panics and + # catch_unwind treats it as skip). Reader-level assertions still run. + # Scoped to these two binaries — other gpu_*.rs tests lack probe-skip. + - name: Cargo test (f32 Parquet CPU smoke) + working-directory: qdp + env: + QDP_NO_CUDA: "1" + run: cargo test -p qdp-core --test parquet_f32 --test parquet_f32_fidelity + test: needs: rust-check runs-on: ubuntu-latest diff --git a/docs/api/index.md b/docs/api/index.md deleted file mode 100644 index 6bf5de5457..0000000000 --- a/docs/api/index.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: API Reference -sidebar_label: API Reference -description: Generated API reference for Apache Mahout. -hide_edit_button: true -toc_min_heading_level: 2 -toc_max_heading_level: 3 ---- - -# API Reference - -This experimental reference is for developers trying Mahout's Python APIs. -It focuses on the public interfaces you are expected to call while the API -documentation is still evolving. - -## Packages - -- [Qumat](qumat.md) -- [QDP](qumat_qdp.md) diff --git a/docs/api/qumat_header.md b/docs/api/qumat_header.md index 318175649f..88734c1644 100644 --- a/docs/api/qumat_header.md +++ b/docs/api/qumat_header.md @@ -1,10 +1,14 @@ --- -title: Qumat -sidebar_label: Qumat -description: Generated API reference for Apache Mahout. -hide_edit_button: true +title: API Reference +sidebar_label: API Reference +description: Generated Python API reference for the Qumat circuit interface. +custom_edit_url: null toc_min_heading_level: 2 -toc_max_heading_level: 3 +toc_max_heading_level: 4 --- -# Qumat +# API Reference + +Use this page when you know which class or method you need. For installation, +backend configuration, and a complete first circuit, see +[Qumat getting started](./getting-started.md). diff --git a/docs/api/qumat_qdp_header.md b/docs/api/qumat_qdp_header.md index 573ea06e3c..14cb9b5f04 100644 --- a/docs/api/qumat_qdp_header.md +++ b/docs/api/qumat_qdp_header.md @@ -1,10 +1,21 @@ --- -title: QDP -sidebar_label: QDP -description: Generated API reference for Apache Mahout. -hide_edit_button: true +title: API Reference +sidebar_label: API Reference +description: Generated Python API reference for QDP encoding and data loading. +custom_edit_url: null toc_min_heading_level: 2 toc_max_heading_level: 3 --- -# QDP +# API Reference + +Use the [QDP Python guide](./python-api.md) for backend selection and +complete workflows. Use this generated reference for signatures, parameters, +return values, and exceptions. + +## Key entry points + +- [QdpEngine](#qdpengine) — encode data with an explicitly selected backend +- [QuantumDataLoader](#quantumdataloader) — build iterable encoding pipelines +- [QdpBenchmark](#qdpbenchmark) — measure throughput and latency +- [QdpTensor](#qdptensor) — exchange encoded results through DLPack diff --git a/docs/community/who-we-are.md b/docs/community/who-we-are.md index 594a5a3ce4..426785cb85 100644 --- a/docs/community/who-we-are.md +++ b/docs/community/who-we-are.md @@ -26,6 +26,7 @@ Ellen Friedman | ellenf@... | No | @Ellen_Friedman Frank Scholten | frankscholten@... | No | Gokhan Capan | gcapan@... | No | Grant Ingersoll | gsingers@... | No | (Emeritus PMC) @gsingers +Guan-Hua (Vic) Wen | vicwen@... | No | @viiccwen Guan-Ming (Wesley) Chiu | guanmingchiu@... | Yes | @guan404ming Holden Karau | holden@... | No | Isabel Drost-Fromm | isabel@... | Yes | diff --git a/docs/index.md b/docs/index.md index bb2dc9ec1a..ee26b7e88a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -20,8 +20,9 @@ anywhere.' - [Basic Gates](./qumat/basic-gates) - Introduction to fundamental quantum gates (NOT, Hadamard, CNOT, Toffoli, SWAP, Pauli gates, CSWAP, U gate) - [Parameterized Quantum Circuits and Rotation Gates](./qumat/parameterized-circuits) - Rotation gates (Rx, Ry, Rz) and creating/optimizing parameterized circuits -### API Reference -- [API Documentation](./qumat/api) - Complete reference for all QuMat class methods +### Python API Reference +- [Qumat API](./qumat/api) - Generated reference for quantum circuits +- [QDP API](./qdp/api) - Generated reference for quantum data encoding ### Additional Resources - [Parameterized Quantum Circuits: Developer's Guide](./advanced/pqc) - In-depth guide to PQCs diff --git a/docs/qdp/api.md b/docs/qdp/api.md deleted file mode 100644 index 38bc059868..0000000000 --- a/docs/qdp/api.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -title: API Reference - QDP ---- - -# API Reference - -Mahout QDP (Quantum Data Plane) provides GPU-accelerated quantum state encoding. -It writes classical data directly into GPU memory and returns a DLPack-compatible -handle for zero-copy integration with downstream frameworks. - -## Module: `qumat.qdp` - -Prefer importing from `qumat.qdp`; the native extension is `_qdp`. - -```python -import qumat.qdp as qdp -# or: from _qdp import QdpEngine, QuantumTensor -``` - -## Class: `QdpEngine` - -### `QdpEngine(device_id=0, precision="float32", backend="cuda")` - -Create a GPU encoder instance. - -**Parameters** -- `device_id` (int): GPU device ordinal, default `0` (CUDA ordinal when `backend="cuda"`; ROCm/PyTorch device index when `backend="amd"`). -- `precision` (str): `"float32"` or `"float64"`. -- `backend` (str): Public Python route selector. `qumat.qdp` uses `"cuda"` for the Rust/CUDA path and `"amd"` for the Triton AMD route. - -**Raises** -- `RuntimeError`: Initialization failure or unsupported precision. - -### `encode(data, num_qubits, encoding_method="amplitude") -> QuantumTensor` - -Encode classical input into a quantum state and return a DLPack tensor on GPU. - -**Parameters** -- `data`: Supported inputs - - `list[float]` - - `numpy.ndarray` (1D/2D, dtype=float64, C-contiguous) - - `torch.Tensor` (CPU): float64, contiguous - - `torch.Tensor` (CUDA, direct-input fast path): float32 or float64, contiguous, on the same device as the engine. Limited to `amplitude`, `angle`, `basis`, `iqp`, and `iqp-z` (see Advanced Encoding Support Matrix). For `phase`, pass a CPU tensor, NumPy array, or list instead. - - `str` / `pathlib.Path` file path - - `.parquet`, `.arrow` / `.feather`, `.npy`, `.pt` / `.pth`, `.pb` - - remote URL (`s3://bucket/key`, `gs://bucket/key`) when built with `remote-io` -- `num_qubits` (int): Number of qubits, range 1–30. -- `encoding_method` (str): `"amplitude" | "angle" | "basis" | "phase" | "iqp" | "iqp-z"` (lowercase). - -**Returns** -- `QuantumTensor` with 2D shape: - - single sample: `[1, 2^num_qubits]` - - batch: `[batch_size, 2^num_qubits]` - -**Notes** -- Output dtype is `complex64` (`precision="float32"`) or `complex128` (`precision="float64"`). -- Parquet streaming currently supports `"amplitude"` and `"basis"`. -- PyTorch file inputs (`.pt`, `.pth`) require building with the `pytorch` feature. -- Remote URL query/fragment is not supported (`?versionId=...`, `#...`). - -### Advanced Encoding Support Matrix - -For the advanced methods documented below, support currently differs by route: - -| Surface | `phase` | `iqp` | `iqp-z` | -|---------|---------|-------|---------| -| `qumat.qdp.QdpEngine(..., backend="cuda").encode(...)` | ✅ | ✅ | ✅ | -| CUDA tensor direct-input fast path | ❌ | ✅ | ✅ | -| `qumat.qdp.QdpEngine(..., backend="amd")` | ❌ | ❌ | ❌ | - -Notes: -- `phase` is implemented and tested on the CUDA encode path, but it is not part of the CUDA tensor direct-input fast path today. -- The AMD Triton route currently supports `amplitude`, `angle`, and `basis` only. - -**Raises** -- `RuntimeError`: Invalid inputs, shapes, dtypes, or unsupported formats. - -### `encode_from_tensorflow(path, num_qubits, encoding_method="amplitude") -> QuantumTensor` - -Encode directly from a TensorFlow TensorProto file (`.pb`). - -## Class: `QuantumTensor` - -DLPack wrapper for GPU-resident quantum states. - -### `__dlpack__(stream=None)` - -Return a DLPack PyCapsule. This can be consumed only once. - -### `__dlpack_device__()` - -Return `(device_type, device_id)`; CUDA devices report `(2, gpu_id)`. - -**Ownership & Lifetime** -- If not consumed, memory is freed when the object is dropped. -- If consumed, ownership transfers to the consumer (e.g., PyTorch). - -## Encoding Methods - -### `amplitude` - -- Input length `<= 2^num_qubits`; remaining entries are zero-padded. -- L2 normalization is applied. -- Zero vectors / NaN / Inf raise errors. - -### `angle` - -- Each sample must provide exactly `num_qubits` angles. -- NaN / Inf raise errors. - -### `basis` - -- Each sample provides one integer index in `[0, 2^num_qubits)`. - -### `phase` - -- Expects `n` phase angles for `n = num_qubits`. -- Produces a product state of the form `(1/sqrt(2^n)) * sum_b exp(i * phase(b)) |b>`. -- All phase angles must be finite (no NaN/Inf). -- Available on the CUDA encode path; not currently exposed through the AMD route. - -### `iqp` - -- Expects `n + n*(n-1)/2` parameters for `n = num_qubits` (Z + ZZ terms). -- All parameters must be finite (no NaN/Inf). - -### `iqp-z` - -- Expects `n` parameters for `n = num_qubits` (Z terms only). -- All parameters must be finite (no NaN/Inf). - -## Supported File Formats - -- **Parquet**: `.parquet` -- **Arrow IPC**: `.arrow`, `.feather` -- **NumPy**: `.npy` -- **PyTorch**: `.pt`, `.pth` (requires `pytorch` feature) -- **TensorFlow**: `.pb` (TensorProto) - -## Common Errors - -- `num_qubits` out of range. -- Input length exceeds `2^num_qubits`. -- CPU NumPy / Torch inputs that are not contiguous `float64`. -- CUDA Torch tensors used with unsupported encoding methods (e.g. `phase`), or CUDA tensors that are not contiguous / not on the same device as the engine. -- DLPack capsule consumed more than once. - -## Requirements & Deprecation - -- Linux with an NVIDIA GPU (CUDA). -- CUDA driver/toolkit installed. -- Python 3.10–3.12 (`requires-python >=3.10,<3.13`). -- `qumat` installed (the QDP native extension ships as `qumat-qdp`). -- Optional: `torch` for DLPack integration, `numpy` for NumPy inputs. - -No deprecations are planned for the initial PoC. diff --git a/docs/qdp/getting-started.md b/docs/qdp/getting-started.md index 3579875f64..27be389b3b 100644 --- a/docs/qdp/getting-started.md +++ b/docs/qdp/getting-started.md @@ -121,7 +121,7 @@ Notes: ## Tips - Default `precision` is `"float32"`; pass `precision="float64"` for higher precision: `QdpEngine(device_id=0, precision="float64")`. -- NumPy inputs must be `float64` dtype. CUDA `torch.Tensor` inputs accept `float32` or `float64` for amplitude; angle and IQP methods require `float64` for batched inputs. +- NumPy inputs must be `float64` dtype. CUDA `torch.Tensor` inputs support `float32` or `float64` for `amplitude` and `angle` single-sample or batched inputs; `basis` accepts `int64` or `float32` single-sample or batched index tensors. `iqp` and `iqp-z` CUDA tensor inputs require `float64`, and `phase` currently requires host input. - Backend selection is explicit; valid values are `"cuda"` and `"amd"` (with `"triton_amd"` accepted as an alias for `"amd"`). ## Troubleshooting diff --git a/docs/qumat/api.md b/docs/qumat/api.md deleted file mode 100644 index 4628295396..0000000000 --- a/docs/qumat/api.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: QuMat Class Methods -sidebar_label: API ---- - -# QuMat Class Methods - -## `__init__(self, backend_config)` -- **Purpose**: Initializes the QuMat instance with a specific backend. -- **Parameters**: - - `backend_config` (dict): Configuration for the backend including its name and options. -- **Usage**: Used to set up the quantum computing backend based on user configuration. - -## `create_empty_circuit(self, num_qubits)` -- **Purpose**: Creates an empty quantum circuit with a specified number of qubits. -- **Parameters**: - - `num_qubits` (int): Number of qubits in the quantum circuit. -- **Usage**: Used at the start of quantum computations to prepare a new quantum circuit. - -## `apply_not_gate(self, qubit_index)` -- **Purpose**: Applies a NOT gate (quantum equivalent of a classical NOT) to a specified qubit. -- **Parameters**: - - `qubit_index` (int): Index of the qubit to which the gate is applied. -- **Usage**: Used to flip the state of a qubit from 0 to 1 or from 1 to 0. - -## `apply_hadamard_gate(self, qubit_index)` -- **Purpose**: Applies a Hadamard gate to a specified qubit. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. -- **Usage**: Used to create a superposition state, allowing the qubit to be both 0 and 1 simultaneously. - -## `apply_cnot_gate(self, control_qubit_index, target_qubit_index)` -- **Purpose**: Applies a Controlled-NOT (CNOT) gate between two qubits. -- **Parameters**: - - `control_qubit_index` (int): Index of the control qubit. - - `target_qubit_index` (int): Index of the target qubit. -- **Usage**: Fundamental for entangling qubits, which is essential for quantum algorithms. - -## `apply_toffoli_gate(self, control_qubit_index1, control_qubit_index2, target_qubit_index)` -- **Purpose**: Applies a Toffoli gate (CCX gate) to three qubits. -- **Parameters**: - - `control_qubit_index1` (int): Index of the first control qubit. - - `control_qubit_index2` (int): Index of the second control qubit. - - `target_qubit_index` (int): Index of the target qubit. -- **Usage**: Acts as a quantum AND gate, used in algorithms requiring conditional logic. - -## `apply_swap_gate(self, qubit_index1, qubit_index2)` -- **Purpose**: Swaps the states of two qubits. -- **Parameters**: - - `qubit_index1` (int): Index of the first qubit. - - `qubit_index2` (int): Index of the second qubit. -- **Usage**: Useful in quantum algorithms for rearranging qubit states. - -## `apply_cswap_gate(self, control_qubit_index, target_qubit_index1, target_qubit_index2)` -- **Purpose**: Applies a controlled-SWAP (Fredkin) gate that swaps two targets when the control is |1⟩. -- **Parameters**: - - `control_qubit_index` (int): Index of the control qubit. - - `target_qubit_index1` (int): Index of the first target qubit. - - `target_qubit_index2` (int): Index of the second target qubit. -- **Usage**: Used in overlap estimation routines such as the swap test. - -## `apply_pauli_x_gate(self, qubit_index)` -- **Purpose**: Applies a Pauli-X gate to a specified qubit. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. -- **Usage**: Equivalent to a NOT gate, flips the qubit state. - -## `apply_pauli_y_gate(self, qubit_index)` -- **Purpose**: Applies a Pauli-Y gate to a specified qubit. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. -- **Usage**: Impacts the phase and amplitude of a qubit's state. - -## `apply_pauli_z_gate(self, qubit_index)` -- **Purpose**: Applies a Pauli-Z gate to a specified qubit. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. -- **Usage**: Alters the phase of a qubit without changing its amplitude. - -## `apply_t_gate(self, qubit_index)` -- **Purpose**: Applies the T (π/8) phase gate to a specified qubit. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. -- **Usage**: Adds a π/4 phase to |1⟩. Together with the Hadamard (H) and CNOT gates, it enables universal single-qubit control. - -## `execute_circuit(self)` -- **Purpose**: Executes the quantum circuit and retrieves the results. -- **Usage**: Used to run the entire set of quantum operations and measure the outcomes. - -## `get_final_state_vector(self)` -- **Purpose**: Returns the final state vector of the circuit from the configured backend. -- **Usage**: Retrieves the full quantum state for simulation and analysis workflows. - -## `draw_circuit(self)` -- **Purpose**: Visualizes the quantum circuit. -- **Returns**: A string representation of the circuit visualization (format depends on backend). -- **Usage**: Returns a visualization string that can be printed or used programmatically. Example: `print(qc.draw_circuit())` or `viz = qc.draw_circuit()`. -- **Note**: Uses underlying libraries' methods for drawing circuits (Qiskit's `draw()`, Cirq's `str()`, or Braket's `str()`). - -## `apply_rx_gate(self, qubit_index, angle)` -- **Purpose**: Applies a rotation around the X-axis to a specified qubit with an optional parameter for optimization. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. - - `angle` (str or float): Angle in radians for the rotation. Can be a static value or a parameter name for optimization. -- **Usage**: Used to rotate a qubit around the X-axis, often in parameterized quantum circuits for variational algorithms. - -## `apply_ry_gate(self, qubit_index, angle)` -- **Purpose**: Applies a rotation around the Y-axis to a specified qubit with an optional parameter for optimization. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. - - `angle` (str or float): Angle in radians for the rotation. Can be a static value or a parameter name for optimization. -- **Usage**: Used to rotate a qubit around the Y-axis in parameterized circuits, aiding in the creation of complex quantum states. - -## `apply_rz_gate(self, qubit_index, angle)` -- **Purpose**: Applies a rotation around the Z-axis to a specified qubit with an optional parameter for optimization. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. - - `angle` (str or float): Angle in radians for the rotation. Can be a static value or a parameter name for optimization. -- **Usage**: Utilized in parameterized quantum circuits to modify the phase of a qubit state during optimization. - -## `apply_u_gate(self, qubit_index, theta, phi, lambd)` -- **Purpose**: Applies the universal single-qubit U(θ, φ, λ) gate. -- **Parameters**: - - `qubit_index` (int): Index of the qubit. - - `theta` (float): Rotation angle θ. - - `phi` (float): Rotation angle φ. - - `lambd` (float): Rotation angle λ. -- **Usage**: Provides full single-qubit unitary control via Z–Y–Z Euler decomposition. - -## `execute_circuit(self, parameter_values=None)` -- **Purpose**: Executes the quantum circuit with the ability to bind specific parameter values if provided. -- **Parameters**: - - `parameter_values` (dict, optional): A dictionary where keys are parameter names and values are the numerical values to bind. -- **Usage**: Enables the execution of parameterized circuits by binding parameter values, facilitating optimization processes. - -## `bind_parameters(self, parameter_values)` -- **Purpose**: Binds numerical values to the parameters of the quantum circuit, allowing for dynamic updates during optimization. -- **Parameters**: - - `parameter_values` (dict): A dictionary with parameter names as keys and numerical values to bind. -- **Usage**: Essential for optimization loops where parameters are adjusted based on cost function evaluations. - -## `_handle_parameter(self, param_name)` -- **Purpose**: Internal function to manage parameter registration. -- **Parameters**: - - `param_name` (str): The name of the parameter to handle. -- **Usage**: Automatically invoked when applying parameterized gates to keep track of parameters efficiently. - -## `swap_test(self, ancilla_qubit, qubit1, qubit2)` -- **Purpose**: Builds the swap-test subcircuit (H–CSWAP–H) to compare two quantum states. -- **Parameters**: - - `ancilla_qubit` (int): Index of the ancilla control qubit. - - `qubit1` (int): Index of the first state qubit. - - `qubit2` (int): Index of the second state qubit. -- **Usage**: Used in overlap/fidelity estimation between two states. - -## `measure_overlap(self, qubit1, qubit2, ancilla_qubit=0)` -- **Purpose**: Executes the swap test and returns |⟨ψ|φ⟩|² using backend-specific measurement parsing. -- **Parameters**: - - `qubit1` (int): Index of the first state qubit. - - `qubit2` (int): Index of the second state qubit. - - `ancilla_qubit` (int, default to 0): Index of the ancilla qubit. -- **Usage**: Convenience wrapper for fidelity/overlap measurement across backends. diff --git a/docs/qumat/getting-started.md b/docs/qumat/getting-started.md index 4547e3ff57..bffaf39411 100644 --- a/docs/qumat/getting-started.md +++ b/docs/qumat/getting-started.md @@ -37,12 +37,16 @@ The project uses `uv` to handle dependency overrides required for Python 3.10+ c ## Basic Usage ```python -from qumat import QumatCircuit - -circuit = QumatCircuit(2) -circuit.h(0) -circuit.cx(0, 1) -result = circuit.run() +from qumat import QuMat + +qumat = QuMat({ + "backend_name": "qiskit", + "backend_options": {"simulator_type": "aer_simulator"}, +}) +qumat.create_empty_circuit(num_qubits=2) +qumat.apply_hadamard_gate(0) +qumat.apply_cnot_gate(0, 1) +result = qumat.execute_circuit() print(result) ``` diff --git a/pyproject.toml b/pyproject.toml index 66599b9bfb..ea0dada468 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ dev = [ "pre-commit>=3.0.0", "maturin>=1.10.2", "patchelf>=0.17.2.4", - "torch>=2.2,<=2.9.0", + "torch>=2.2,<=2.13.0", "numpy>=1.24,<2.0", "setuptools>=80.9.0", "tensorflow>=2.20", diff --git a/qdp/Cargo.lock b/qdp/Cargo.lock index 985f1c2c42..8fcbe7339f 100644 --- a/qdp/Cargo.lock +++ b/qdp/Cargo.lock @@ -16,7 +16,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -496,6 +496,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" version = "0.4.43" @@ -575,6 +586,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -913,10 +933,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasm-bindgen", ] @@ -2219,14 +2251,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.2", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -2267,6 +2300,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.8.6" @@ -2274,18 +2313,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", - "rand_chacha 0.3.1", + "rand_chacha", "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -2298,16 +2338,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -2319,11 +2349,17 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.5" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" dependencies = [ - "getrandom 0.3.4", + "rand_core 0.10.1", ] [[package]] @@ -2673,7 +2709,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -2684,7 +2720,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] diff --git a/qdp/qdp-core/src/estimate.rs b/qdp/qdp-core/src/estimate.rs new file mode 100644 index 0000000000..cd2247a0de --- /dev/null +++ b/qdp/qdp-core/src/estimate.rs @@ -0,0 +1,182 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Pure, allocation-free memory estimation for pipeline configurations. +//! +//! [`estimate_memory`] answers "how much memory will this config need?" from the config alone — +//! no allocation, no CUDA calls, no device queries — so callers can fail fast before the first +//! batch instead of discovering an overflow mid-run. + +use crate::error::{MahoutError, Result}; +use crate::types::{Dtype, Encoding}; + +/// Predicted memory footprint of a pipeline configuration, in bytes. +/// +/// Produced by [`estimate_memory`]. Both fields are upper-bound estimates derived from config +/// arithmetic only; nothing here reflects an actual allocation. See [`estimate_memory`] for the +/// formulas behind each field and a worked example. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct MemoryEstimate { + /// Host-side prefetch pool: `prefetch_depth` batches of raw (unencoded) input. + pub cpu_prefetch_bytes: u64, + /// Device-side state-vector buffer, including a double-buffering allowance. + pub gpu_state_bytes: u64, +} + +impl MemoryEstimate { + /// Combined host + device footprint in bytes. + /// + /// Saturates instead of overflowing: values produced by [`estimate_memory`] are checked to sum + /// without overflow, but the fields are public and may be set directly. + #[must_use] + pub const fn total(&self) -> u64 { + self.cpu_prefetch_bytes.saturating_add(self.gpu_state_bytes) + } +} + +/// Estimate the CPU prefetch-pool and GPU state-buffer footprint of a pipeline configuration. +/// +/// Pure function: performs no allocation, touches no device, and never panics — every product is +/// computed with checked arithmetic and an overflow becomes [`MahoutError::InvalidInput`] naming +/// the parameter responsible. +/// +/// # Formulas +/// +/// Let `n = num_qubits`, `bpe = dtype.bytes()` (4 for f32, 8 for f64), and +/// `complex_bytes = 2 * bpe` (real + imaginary component). +/// +/// | Field | Formula | +/// |----------------------|-----------------------------------------------------| +/// | `cpu_prefetch_bytes` | `prefetch_depth * batch_size * sample_len * bpe` | +/// | `gpu_state_bytes` | `2 * batch_size * state_len * complex_bytes` | +/// | `total()` | `cpu_prefetch_bytes + gpu_state_bytes` | +/// +/// `sample_len` is the per-sample **input** length and depends on the encoding +/// ([`Encoding::vector_len`]): `2^n` for amplitude, `n` for angle/iqp-z/phase, +/// `n + n*(n-1)/2` for iqp, `1` for basis. `state_len` is always `2^n` — every encoding produces a +/// full state vector on the device regardless of how small its input is. +/// +/// # `prefetch_depth` +/// +/// Pass an **already-resolved** depth: this function does not replicate the pipeline's +/// auto-compute logic (`PipelineConfig::normalize` / `compute_optimal_prefetch_depth`). `0` is that +/// logic's sentinel, so passing it estimates a zero-byte pool rather than what the pipeline would +/// actually allocate — run the config through `normalize` first. +/// +/// # dtype fallback +/// +/// A `Float32` request for an encoding without an f32 batch path +/// ([`Encoding::supports_f32`]) is downgraded to `Float64` before estimating, mirroring +/// `PipelineConfig::normalize` — otherwise the estimate would report half the memory the pipeline +/// actually uses. +/// +/// # Modeling caveats +/// +/// 1. **The leading `2×` on `gpu_state_bytes` is a double-buffering allowance (state vector + +/// recycle buffer), not the complex real/imaginary factor** — the real/imag pair is already +/// inside `complex_bytes`. The batch path (`GpuStateVector::new_batch`) allocates a single +/// `batch_size × state_len × complex_bytes` buffer, so the `2×` is a deliberate conservative +/// upper bound. +/// 2. **`cpu_prefetch_bytes` covers exactly `prefetch_depth` batches.** The true instantaneous peak +/// can reach `prefetch_depth + 2` batches (one being produced and one being consumed alongside a +/// full channel); this `+2` is **not** folded into the returned value, so the number stays +/// aligned with the formula above. Budget headroom accordingly. +/// 3. **The host-side streaming chunk buffer (Parquet reader) is excluded.** This estimate covers +/// only the prefetch pool and GPU state buffer; folding in the reader's chunk buffer needs +/// reader config beyond this signature and is tracked as a follow-up. B2 must account for it +/// separately for streaming sources. +/// +/// # Errors +/// +/// Returns [`MahoutError::InvalidInput`] when `num_qubits` is too large for `2^n` to be +/// representable, or when any product overflows `u64`. +/// +/// # Examples +/// +/// 16-qubit amplitude, f32, batch 64, prefetch depth 16: +/// +/// ``` +/// use qdp_core::{Dtype, Encoding, estimate_memory}; +/// +/// let est = estimate_memory(Encoding::Amplitude, 16, 64, Dtype::Float32, 16).unwrap(); +/// // cpu: 16 * 64 * 65536 * 4 bytes +/// assert_eq!(est.cpu_prefetch_bytes, 256 * 1024 * 1024); +/// // gpu: 2 * 64 * 65536 * 8 bytes +/// assert_eq!(est.gpu_state_bytes, 64 * 1024 * 1024); +/// assert_eq!(est.total(), 320 * 1024 * 1024); +/// ``` +pub fn estimate_memory( + encoding: Encoding, + num_qubits: u32, + batch_size: usize, + dtype: Dtype, + prefetch_depth: usize, +) -> Result { + // Mirror PipelineConfig::normalize: f32 is only kept for encodings with a real f32 batch path. + let dtype = if matches!(dtype, Dtype::Float32) && !encoding.supports_f32() { + Dtype::Float64 + } else { + dtype + }; + + // Device side always holds a full 2^n state vector per sample, whatever the input length is. + // Compute it with checked_shl rather than Encoding::vector_len, which would panic on `1 << n` + // for large n. + let state_len = 1u64.checked_shl(num_qubits).ok_or_else(|| { + MahoutError::InvalidInput(format!( + "num_qubits too large to estimate: {num_qubits} (2^n state vector is not representable)" + )) + })?; + + let sample_len = match encoding { + Encoding::Amplitude => state_len, + _ => encoding.vector_len(num_qubits) as u64, + }; + + let bytes_per_elem = dtype.bytes() as u64; + let complex_bytes = 2 * bytes_per_elem; + let batch = batch_size as u64; + let depth = prefetch_depth as u64; + + let cpu_prefetch_bytes = depth + .checked_mul(batch) + .and_then(|v| v.checked_mul(sample_len)) + .and_then(|v| v.checked_mul(bytes_per_elem)) + .ok_or_else(|| overflow_err("CPU prefetch pool", num_qubits, batch_size, prefetch_depth))?; + + let gpu_state_bytes = 2u64 + .checked_mul(batch) + .and_then(|v| v.checked_mul(state_len)) + .and_then(|v| v.checked_mul(complex_bytes)) + .ok_or_else(|| overflow_err("GPU state buffer", num_qubits, batch_size, prefetch_depth))?; + + // total() adds the two; make sure that cannot overflow either. + cpu_prefetch_bytes + .checked_add(gpu_state_bytes) + .ok_or_else(|| overflow_err("total footprint", num_qubits, batch_size, prefetch_depth))?; + + Ok(MemoryEstimate { + cpu_prefetch_bytes, + gpu_state_bytes, + }) +} + +fn overflow_err(what: &str, num_qubits: u32, batch_size: usize, depth: usize) -> MahoutError { + MahoutError::InvalidInput(format!( + "{what} size overflows u64 for num_qubits={num_qubits}, batch_size={batch_size}, \ + prefetch_depth={depth}; reduce num_qubits or batch_size" + )) +} diff --git a/qdp/qdp-core/src/gpu/cuda_ffi.rs b/qdp/qdp-core/src/gpu/cuda_ffi.rs index f1c9fcde78..ca4521e698 100644 --- a/qdp/qdp-core/src/gpu/cuda_ffi.rs +++ b/qdp/qdp-core/src/gpu/cuda_ffi.rs @@ -78,6 +78,10 @@ mod cuda_rt { pub(crate) fn cudaMemGetInfo(free: *mut usize, total: *mut usize) -> i32; + /// Number of CUDA-capable devices. Used to detect whether a GPU is + /// actually present at runtime (see `cuda_runtime_available`). + pub(crate) fn cudaGetDeviceCount(count: *mut i32) -> i32; + pub(crate) fn cudaMemcpyAsync( dst: *mut c_void, src: *const c_void, @@ -165,6 +169,10 @@ mod no_cuda_stubs { QDP_CUDA_UNAVAILABLE } + pub(crate) unsafe fn cudaGetDeviceCount(_count: *mut i32) -> i32 { + QDP_CUDA_UNAVAILABLE + } + pub(crate) unsafe fn cudaMemcpyAsync( _dst: *mut c_void, _src: *const c_void, @@ -299,6 +307,7 @@ mod hip_rt { fn hipEventQuery(event: *mut c_void) -> i32; fn hipEventSynchronize(event: *mut c_void) -> i32; fn hipEventElapsedTime(ms: *mut f32, start: *mut c_void, end: *mut c_void) -> i32; + fn hipGetDeviceCount(count: *mut i32) -> i32; } // hipHostMallocDefault == 0, matching cudaHostAllocDefault used by callers. @@ -418,4 +427,25 @@ mod hip_rt { ) -> i32 { unsafe { hipEventElapsedTime(ms, start, end) } } + + pub(crate) unsafe fn cudaGetDeviceCount(count: *mut i32) -> i32 { + unsafe { hipGetDeviceCount(count) } + } +} + +/// Returns `true` if a usable GPU is present at runtime. +/// +/// This is deliberately distinct from "the extension is importable": a +/// no-toolkit (`qdp_no_cuda`) build links CUDA stubs that return a non-zero +/// sentinel, and a host with the toolkit but no GPU reports zero devices. Both +/// yield `false` here, so callers (and the Python test suite) can gate GPU work +/// on an accurate signal rather than mere importability. On the HIP backend the +/// call resolves to `hipGetDeviceCount`, so it reports AMD devices the same way. +pub fn cuda_runtime_available() -> bool { + let mut count: i32 = 0; + // SAFETY: `cudaGetDeviceCount` writes a single `i32` through `count` and + // accesses no other memory. In a `qdp_no_cuda` build this resolves to the + // stub above, which returns the unavailable sentinel without dereferencing. + let rc = unsafe { cudaGetDeviceCount(&mut count) }; + rc == CUDA_SUCCESS && count > 0 } diff --git a/qdp/qdp-core/src/gpu/encodings/amplitude.rs b/qdp/qdp-core/src/gpu/encodings/amplitude.rs index 798498b4a7..3534698b70 100644 --- a/qdp/qdp-core/src/gpu/encodings/amplitude.rs +++ b/qdp/qdp-core/src/gpu/encodings/amplitude.rs @@ -22,7 +22,7 @@ use std::sync::Arc; -use super::QuantumEncoder; +use super::{QuantumEncoder, validate_qubit_count}; #[cfg(qdp_gpu_platform)] use crate::error::cuda_error_to_string; use crate::error::{MahoutError, Result}; @@ -308,6 +308,7 @@ impl QuantumEncoder for AmplitudeEncoder { num_qubits: usize, stream: *mut c_void, ) -> Result { + validate_qubit_count(num_qubits)?; let state_len = 1 << num_qubits; if input_len == 0 { return Err(MahoutError::InvalidInput( @@ -371,6 +372,7 @@ impl QuantumEncoder for AmplitudeEncoder { num_qubits: usize, stream: *mut c_void, ) -> Result { + validate_qubit_count(num_qubits)?; let state_len = 1 << num_qubits; if sample_size == 0 { return Err(MahoutError::InvalidInput( @@ -475,6 +477,7 @@ impl QuantumEncoder for AmplitudeEncoder { ) -> Result { crate::profile_scope!("AmplitudeEncoder::encode_batch_f32"); + validate_qubit_count(num_qubits)?; let state_len = 1 << num_qubits; if sample_size == 0 { @@ -609,6 +612,7 @@ impl QuantumEncoder for AmplitudeEncoder { num_qubits: usize, stream: *mut c_void, ) -> Result { + validate_qubit_count(num_qubits)?; let state_len = 1 << num_qubits; if sample_size == 0 { return Err(MahoutError::InvalidInput( @@ -871,6 +875,7 @@ impl AmplitudeEncoder { )); } + validate_qubit_count(num_qubits)?; let state_len = 1usize << num_qubits; if input_len > state_len { return Err(MahoutError::InvalidInput(format!( @@ -940,6 +945,7 @@ impl AmplitudeEncoder { num_qubits: usize, stream: *mut c_void, ) -> Result { + validate_qubit_count(num_qubits)?; let state_len = 1 << num_qubits; if num_samples == 0 { return Err(MahoutError::InvalidInput( diff --git a/qdp/qdp-core/src/gpu/encodings/mod.rs b/qdp/qdp-core/src/gpu/encodings/mod.rs index 208da9423b..a05cc83e6a 100644 --- a/qdp/qdp-core/src/gpu/encodings/mod.rs +++ b/qdp/qdp-core/src/gpu/encodings/mod.rs @@ -26,7 +26,7 @@ use crate::preprocessing::Preprocessor; use std::ffi::c_void; /// Maximum number of qubits supported (16GB GPU memory limit) -/// This constant must match MAX_QUBITS in qdp-kernels/src/kernel_config.h +/// Shared by all QDP encoder validation paths. pub const MAX_QUBITS: usize = 30; /// Validates qubit count against practical limits. diff --git a/qdp/qdp-core/src/lib.rs b/qdp/qdp-core/src/lib.rs index 4cfb4f079e..818229fba8 100644 --- a/qdp/qdp-core/src/lib.rs +++ b/qdp/qdp-core/src/lib.rs @@ -27,6 +27,7 @@ pub mod dlpack; #[cfg(qdp_gpu_platform)] mod encoding; pub mod error; +pub mod estimate; pub mod gpu; pub mod gpu_rt; pub mod io; @@ -42,6 +43,8 @@ pub mod types; mod profiling; pub use error::{MahoutError, Result, cuda_error_to_string}; +pub use estimate::{MemoryEstimate, estimate_memory}; +pub use gpu::cuda_ffi::cuda_runtime_available; pub use gpu::memory::Precision; pub use reader::{FloatElem, NullHandling, handle_float32_nulls, handle_float64_nulls}; pub use types::{Dtype, Encoding}; diff --git a/qdp/qdp-core/tests/common/mod.rs b/qdp/qdp-core/tests/common/mod.rs index 9580de5fb5..f67174d889 100644 --- a/qdp/qdp-core/tests/common/mod.rs +++ b/qdp/qdp-core/tests/common/mod.rs @@ -17,7 +17,9 @@ #[cfg(qdp_gpu_platform)] use std::sync::Arc; -use arrow::array::{FixedSizeListArray, Float64Array}; +use arrow::array::{ + Array, FixedSizeListArray, Float32Builder, Float64Array, Float64Builder, ListBuilder, +}; use arrow::datatypes::{DataType, Field, Schema}; use arrow::record_batch::RecordBatch; use parquet::arrow::ArrowWriter; @@ -81,6 +83,79 @@ pub fn write_fixed_size_list_parquet(path: &str, data: &[f64], sample_size: usiz writer.close().unwrap(); } +/// Writes a `List` Parquet file; each `sample_size` consecutive values in +/// `data` form one row. Mirrors [`write_list_parquet_f64`] for the f32 column path +/// (issue #1342 Parquet f32 fidelity tests). +#[allow(dead_code)] +#[allow(clippy::manual_is_multiple_of)] +pub fn write_list_parquet_f32(path: &str, data: &[f32], sample_size: usize) { + assert!(sample_size > 0, "sample_size must be > 0"); + assert!( + data.len() % sample_size == 0, + "Data length ({}) must be a multiple of sample size ({})", + data.len(), + sample_size + ); + use std::fs::File; + use std::sync::Arc; + + let mut builder = ListBuilder::new(Float32Builder::new()); + for row in data.chunks(sample_size) { + builder.values().append_slice(row); + builder.append(true); + } + let list_array = builder.finish(); + + let schema = Arc::new(Schema::new(vec![Field::new( + "data", + list_array.data_type().clone(), + true, + )])); + let batch = RecordBatch::try_new(schema.clone(), vec![Arc::new(list_array) as _]).unwrap(); + + let file = File::create(path).unwrap(); + let props = WriterProperties::builder().build(); + let mut writer = ArrowWriter::try_new(file, schema, Some(props)).unwrap(); + writer.write(&batch).unwrap(); + writer.close().unwrap(); +} + +/// Writes a `List` Parquet file; each `sample_size` consecutive values in +/// `data` form one row. Companion to [`write_list_parquet_f32`]. +#[allow(dead_code)] +#[allow(clippy::manual_is_multiple_of)] +pub fn write_list_parquet_f64(path: &str, data: &[f64], sample_size: usize) { + assert!(sample_size > 0, "sample_size must be > 0"); + assert!( + data.len() % sample_size == 0, + "Data length ({}) must be a multiple of sample size ({})", + data.len(), + sample_size + ); + use std::fs::File; + use std::sync::Arc; + + let mut builder = ListBuilder::new(Float64Builder::new()); + for row in data.chunks(sample_size) { + builder.values().append_slice(row); + builder.append(true); + } + let list_array = builder.finish(); + + let schema = Arc::new(Schema::new(vec![Field::new( + "data", + list_array.data_type().clone(), + true, + )])); + let batch = RecordBatch::try_new(schema.clone(), vec![Arc::new(list_array) as _]).unwrap(); + + let file = File::create(path).unwrap(); + let props = WriterProperties::builder().build(); + let mut writer = ArrowWriter::try_new(file, schema, Some(props)).unwrap(); + writer.write(&batch).unwrap(); + writer.close().unwrap(); +} + /// Returns a CUDA device handle, or `None` when CUDA is unavailable for the test environment. #[cfg(qdp_gpu_platform)] #[allow(dead_code)] diff --git a/qdp/qdp-core/tests/estimate.rs b/qdp/qdp-core/tests/estimate.rs new file mode 100644 index 0000000000..b0dff03750 --- /dev/null +++ b/qdp/qdp-core/tests/estimate.rs @@ -0,0 +1,138 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests for [`qdp_core::estimate_memory`]. +//! +//! Byte values are derived from the memory model in issue #1429: +//! cpu_prefetch_bytes = prefetch_depth * batch_size * sample_len * bytes_per_elem +//! gpu_state_bytes = 2 * batch_size * state_len * complex_bytes (complex_bytes = 2 * bpe) + +use qdp_core::{Dtype, Encoding, estimate_memory}; + +const MIB: u64 = 1024 * 1024; +const GIB: u64 = 1024 * 1024 * 1024; + +/// Reference case A from the issue: 16-qubit amplitude f32, batch 64, prefetch depth 16. +#[test] +fn reference_case_a_amplitude_16q_f32() { + let est = estimate_memory(Encoding::Amplitude, 16, 64, Dtype::Float32, 16).unwrap(); + + // cpu: 16 * 64 * 2^16 * 4 = 268,435,456 (256 MiB) + assert_eq!(est.cpu_prefetch_bytes, 268_435_456); + assert_eq!(est.cpu_prefetch_bytes, 256 * MIB); + + // gpu: 2 * 64 * 2^16 * 8 = 67,108,864 (64 MiB) + assert_eq!(est.gpu_state_bytes, 67_108_864); + assert_eq!(est.gpu_state_bytes, 64 * MIB); + + // total: 335,544,320 (320 MiB) + assert_eq!(est.total(), 335_544_320); + assert_eq!(est.total(), 320 * MIB); +} + +/// Reference case B from the issue: 20-qubit amplitude f32, batch 64, prefetch depth 1. +#[test] +fn reference_case_b_amplitude_20q_f32() { + let est = estimate_memory(Encoding::Amplitude, 20, 64, Dtype::Float32, 1).unwrap(); + + // cpu: 1 * 64 * 2^20 * 4 = 268,435,456 (256 MiB) + assert_eq!(est.cpu_prefetch_bytes, 268_435_456); + assert_eq!(est.cpu_prefetch_bytes, 256 * MIB); + + // gpu: 2 * 64 * 2^20 * 8 = 1,073,741,824 (1 GiB) + assert_eq!(est.gpu_state_bytes, 1_073_741_824); + assert_eq!(est.gpu_state_bytes, GIB); + + // total: 1,342,177,280 (1.25 GiB) + assert_eq!(est.total(), 1_342_177_280); +} + +/// f64 doubles both terms of case A via `Dtype::bytes()` (8 vs 4). +#[test] +fn case_a_f64_doubles_both_terms() { + let f64_est = estimate_memory(Encoding::Amplitude, 16, 64, Dtype::Float64, 16).unwrap(); + + // cpu: 536,870,912 (512 MiB), gpu: 134,217,728 (128 MiB), total: 671,088,640 (640 MiB) + assert_eq!(f64_est.cpu_prefetch_bytes, 536_870_912); + assert_eq!(f64_est.gpu_state_bytes, 134_217_728); + assert_eq!(f64_est.total(), 671_088_640); + + // Exactly double the f32 case A. + let f32_est = estimate_memory(Encoding::Amplitude, 16, 64, Dtype::Float32, 16).unwrap(); + assert_eq!(f64_est.cpu_prefetch_bytes, 2 * f32_est.cpu_prefetch_bytes); + assert_eq!(f64_est.gpu_state_bytes, 2 * f32_est.gpu_state_bytes); + assert_eq!(f64_est.total(), 2 * f32_est.total()); +} + +#[test] +fn angle_and_basis_have_tiny_cpu_side() { + // Angle input is one value per qubit; basis is a single index. The GPU state vector is 2^n + // either way, so the device side dominates by orders of magnitude. + let angle = estimate_memory(Encoding::Angle, 16, 64, Dtype::Float32, 4).unwrap(); + assert_eq!(angle.cpu_prefetch_bytes, 4 * 64 * 16 * 4); + + let basis = estimate_memory(Encoding::Basis, 16, 64, Dtype::Float32, 4).unwrap(); + // depth 4 * batch 64 * sample_len 1 * 4 bytes + assert_eq!(basis.cpu_prefetch_bytes, 4 * 64 * 4); + + let amplitude = estimate_memory(Encoding::Amplitude, 16, 64, Dtype::Float32, 4).unwrap(); + assert_eq!(angle.gpu_state_bytes, amplitude.gpu_state_bytes); + assert_eq!(basis.gpu_state_bytes, amplitude.gpu_state_bytes); + assert!(angle.cpu_prefetch_bytes < amplitude.cpu_prefetch_bytes / 1000); +} + +#[test] +fn iqp_f32_falls_back_to_f64() { + // IQP has no f32 batch encode path, so a Float32 request must estimate as Float64 — + // otherwise the estimate would report half the memory the pipeline really uses. + let requested_f32 = estimate_memory(Encoding::Iqp, 30, 8, Dtype::Float32, 2).unwrap(); + let explicit_f64 = estimate_memory(Encoding::Iqp, 30, 8, Dtype::Float64, 2).unwrap(); + assert_eq!(requested_f32, explicit_f64); + + // vector_len(iqp, 30) = 30 + 30*29/2 = 465 + assert_eq!(requested_f32.cpu_prefetch_bytes, 2 * 8 * 465 * 8); + assert_eq!(requested_f32.gpu_state_bytes, 2 * 8 * (1u64 << 30) * 16); +} + +#[test] +fn amplitude_keeps_f32() { + let f32_est = estimate_memory(Encoding::Amplitude, 12, 16, Dtype::Float32, 2).unwrap(); + let f64_est = estimate_memory(Encoding::Amplitude, 12, 16, Dtype::Float64, 2).unwrap(); + assert_ne!(f32_est, f64_est); +} + +#[test] +fn oversized_qubit_count_errors_instead_of_panicking() { + // 2^63 is representable but every downstream product overflows. + assert!(estimate_memory(Encoding::Amplitude, 63, 64, Dtype::Float32, 1).is_err()); + // 2^64 is not representable at all. + assert!(estimate_memory(Encoding::Amplitude, 64, 1, Dtype::Float32, 1).is_err()); + assert!(estimate_memory(Encoding::Angle, 200, 1, Dtype::Float32, 1).is_err()); +} + +#[test] +fn oversized_batch_errors_instead_of_panicking() { + assert!(estimate_memory(Encoding::Amplitude, 30, usize::MAX, Dtype::Float64, 1).is_err()); + assert!(estimate_memory(Encoding::Amplitude, 20, 1 << 40, Dtype::Float64, 1024).is_err()); +} + +#[test] +fn zero_batch_size_estimates_zero() { + let est = estimate_memory(Encoding::Amplitude, 16, 0, Dtype::Float32, 4).unwrap(); + assert_eq!(est.cpu_prefetch_bytes, 0); + assert_eq!(est.gpu_state_bytes, 0); + assert_eq!(est.total(), 0); +} diff --git a/qdp/qdp-core/tests/gpu_ptr_encoding.rs b/qdp/qdp-core/tests/gpu_ptr_encoding.rs index b5fed7c7fa..ebb7dcfe4a 100644 --- a/qdp/qdp-core/tests/gpu_ptr_encoding.rs +++ b/qdp/qdp-core/tests/gpu_ptr_encoding.rs @@ -22,6 +22,8 @@ // where the stream field is already *mut c_void; silence the HIP-only redundancy. #![cfg_attr(feature = "hip", allow(clippy::unnecessary_cast))] +use qdp_core::gpu::encodings::MAX_QUBITS; +use qdp_core::gpu::{AmplitudeEncoder, QuantumEncoder}; use qdp_core::gpu_rt::{DevicePtr, DeviceSlice}; use qdp_core::{MahoutError, Precision, QdpEngine}; use std::ffi::c_void; @@ -44,8 +46,59 @@ fn engine_f32() -> Option { common::qdp_engine_with_precision(Precision::Float32) } +fn assert_max_qubits_error(result: qdp_core::Result) { + assert!( + matches!(result, Err(MahoutError::InvalidInput(msg)) if + msg.contains("exceeds") && msg.contains(&MAX_QUBITS.to_string())), + "amplitude GPU-pointer path should use the shared qubit limit" + ); +} + // ---- Validation / error-path tests (return before using pointer) ---- +#[test] +fn test_amplitude_gpu_pointer_paths_reject_excessive_qubits() { + let Some(engine) = common::qdp_engine() else { + return; + }; + + let Some((_f64_device, f64_data_d)) = common::copy_f64_to_device(&[1.0]) else { + return; + }; + let Some((f32_device, f32_data_d)) = common::copy_f32_to_device(&[1.0_f32]) else { + return; + }; + let f64_ptr = *f64_data_d.device_ptr() as *const f64 as *const c_void; + let f32_ptr = *f32_data_d.device_ptr() as *const f32; + + // Use the platform word size so a missing validation call fails at the shift without + // attempting an enormous GPU allocation. + let excessive_qubits = usize::BITS as usize; + + assert_max_qubits_error(unsafe { + engine.encode_from_gpu_ptr(f64_ptr, 1, excessive_qubits, "amplitude") + }); + assert_max_qubits_error(unsafe { + engine.encode_batch_from_gpu_ptr(f64_ptr, 1, 1, excessive_qubits, "amplitude") + }); + assert_max_qubits_error(unsafe { + engine.encode_from_gpu_ptr_f32(f32_ptr, 1, excessive_qubits) + }); + assert_max_qubits_error(unsafe { + engine.encode_batch_from_gpu_ptr_f32(f32_ptr, 1, 1, excessive_qubits) + }); + assert_max_qubits_error(unsafe { + AmplitudeEncoder.encode_batch_from_gpu_ptr_f32( + &f32_device, + f32_ptr as *const c_void, + 1, + 1, + excessive_qubits, + std::ptr::null_mut(), + ) + }); +} + #[test] fn test_encode_from_gpu_ptr_unknown_method() { let Some(engine) = common::qdp_engine() else { diff --git a/qdp/qdp-core/tests/gpu_validation.rs b/qdp/qdp-core/tests/gpu_validation.rs index 4f0d1a879e..5e9f41be1d 100644 --- a/qdp/qdp-core/tests/gpu_validation.rs +++ b/qdp/qdp-core/tests/gpu_validation.rs @@ -127,6 +127,16 @@ fn test_input_validation_max_qubits() { } _ => panic!("Expected InvalidInput error for max qubits"), } + + // Use the platform word size so a missing validation call fails at the shift without + // attempting an enormous GPU allocation. + let excessive_qubits = usize::BITS as usize; + let result = engine.encode_batch_f32(&[1.0_f32], 1, 1, excessive_qubits, "amplitude"); + assert!( + matches!(result, Err(MahoutError::InvalidInput(msg)) if + msg.contains("exceeds") && msg.contains(&MAX_QUBITS.to_string())), + "f32 batch path should use the shared qubit limit" + ); } #[test] diff --git a/qdp/qdp-core/tests/parquet_f32_fidelity.rs b/qdp/qdp-core/tests/parquet_f32_fidelity.rs new file mode 100644 index 0000000000..0bd629e68d --- /dev/null +++ b/qdp/qdp-core/tests/parquet_f32_fidelity.rs @@ -0,0 +1,258 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! End-to-end f32 Parquet fidelity tests — issue #1342. +//! +//! These tests extend `gpu_fidelity.rs` (which compares f32 vs f64 encodings on +//! in-memory data) by sourcing the data from Parquet: the same deterministic +//! amplitude data is written as both a `List` and a `List` +//! column, read back through `ParquetReader::` / `ParquetReader::`, and +//! encoded with the f32 / f64 kernels respectively. We then compare the GPU +//! state vectors with `fidelity_cross_precision`. +//! +//! Two layers: +//! * CPU smoke (no GPU, runs everywhere): the f32 reader and the f64 reader +//! return the same logical values up to the f64→f32 rounding. This is the +//! part that actually asserts in CI (ubuntu, no GPU). +//! * GPU fidelity (platforms that build the GPU backend, skipped otherwise): +//! full reader→kernel pipeline. Thresholds match `gpu_fidelity.rs` — +//! amplitude f32 norm precision means ~1e-3 at 8–16 qubits, NOT 0.99999. +//! The issue's "≥ 0.99999 where applicable" does not apply to amplitude +//! encoding; see `gpu_fidelity.rs::compare_f32_f64_amplitude` for the +//! established baseline. + +use std::sync::atomic::{AtomicUsize, Ordering}; + +use qdp_core::reader::{DataReader, NullHandling}; +use qdp_core::readers::parquet::ParquetReader; + +mod common; + +static FILE_COUNTER: AtomicUsize = AtomicUsize::new(0); + +/// Deterministic amplitude data, identical generator to `gpu_fidelity.rs`. +fn make_amplitude_data(num_samples: usize, sample_size: usize) -> Vec { + let total = num_samples * sample_size; + (0..total) + .map(|i| ((i as f64) + 1.0) / total as f64) + .collect() +} + +/// Returns `(f32_path, f64_path)` for two temp Parquet files holding the same +/// logical data as `List` and `List` respectively. +fn write_pair(data_f64: &[f64], sample_size: usize) -> (TempFile, TempFile) { + let n = FILE_COUNTER.fetch_add(1, Ordering::Relaxed); + let pid = std::process::id(); + let f32_path = std::env::temp_dir().join(format!("mahout_f32fid_{pid}_{n}_f32.parquet")); + let f64_path = std::env::temp_dir().join(format!("mahout_f32fid_{pid}_{n}_f64.parquet")); + + let data_f32: Vec = data_f64.iter().map(|&x| x as f32).collect(); + common::write_list_parquet_f32(f32_path.to_str().unwrap(), &data_f32, sample_size); + common::write_list_parquet_f64(f64_path.to_str().unwrap(), data_f64, sample_size); + + (TempFile(f32_path), TempFile(f64_path)) +} + +struct TempFile(std::path::PathBuf); + +impl Drop for TempFile { + fn drop(&mut self) { + let _ = std::fs::remove_file(&self.0); + } +} + +// --------------------------------------------------------------------------- +// CPU smoke (no GPU) — this is what actually asserts in CI. +// --------------------------------------------------------------------------- + +/// The f32 reader and the f64 reader return the same shape, and the f32 values +/// equal the f64 values narrowed with `as f32` (Arrow cast == IEEE +/// round-to-nearest, same as the f64→f32 path the kernel would see). +#[test] +fn test_parquet_f32_f64_reader_consistency() { + let num_samples = 4; + let sample_size = 256; // 8 qubits + let data_f64 = make_amplitude_data(num_samples, sample_size); + let (f32_file, f64_file) = write_pair(&data_f64, sample_size); + + let mut reader_f32 = + ParquetReader::::new(&f32_file.0, None, NullHandling::FillZero).unwrap(); + let (data32, n32, s32) = reader_f32.read_batch().unwrap(); + + let mut reader_f64 = + ParquetReader::::new(&f64_file.0, None, NullHandling::FillZero).unwrap(); + let (data64, n64, s64) = reader_f64.read_batch().unwrap(); + + assert_eq!((n32, s32), (num_samples, sample_size)); + assert_eq!((n64, s64), (num_samples, sample_size)); + assert_eq!(data32.len(), data64.len()); + + for (i, (&v32, &v64)) in data32.iter().zip(data64.iter()).enumerate() { + assert_eq!( + v32, v64 as f32, + "f32 reader value {v32} != f64 narrowed value {} at index {i}", + v64 as f32 + ); + } +} + +// --------------------------------------------------------------------------- +// GPU fidelity — mirrors compare_f32_f64_amplitude, Parquet src. +// --------------------------------------------------------------------------- + +#[cfg(qdp_gpu_platform)] +mod gpu { + use super::*; + use qdp_core::Precision; + use qdp_core::gpu::metrics::{ + download_complex_f32, download_complex_f64, fidelity_cross_precision, + }; + + /// Returns `true` only when CUDA kernels actually launch. Two distinct + /// no-GPU environments must both be detected as "skip": + /// * No toolkit but a driver present (the `QDP_NO_CUDA` stub): engine and + /// device creation and host→device copies all succeed — only a kernel + /// launch fails with code 999, surfacing as an `Err` here. + /// * No driver at all (CI runner without `libcuda.so`): `cudarc` loads the + /// driver dynamically and **panics** on first use rather than returning + /// an `Err`, so `.ok()` does not catch it. + /// + /// We probe with a trivial 1-qubit amplitude encode inside `catch_unwind` and + /// treat any panic or `Err` as "no functional GPU". A real GPU that errors + /// here is a genuine bug, which the `.expect(...)` calls below surface loudly. + fn cuda_is_functional() -> bool { + // `cudarc`'s dlopen failure panics with a long message; silence the + // default hook just for the probe so a skipped run isn't mistaken for a + // failure. Serialized because the panic hook is process-global. + static PROBE_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); + let _guard = PROBE_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + let prev_hook = std::panic::take_hook(); + std::panic::set_hook(Box::new(|_| {})); + let probe = std::panic::catch_unwind(|| { + let engine = common::qdp_engine_with_precision(Precision::Float32)?; + let dlpack = engine + .encode_batch_f32(&[1.0_f32, 0.0], 1, 2, 1, "amplitude") + .ok()?; + unsafe { common::take_deleter_and_delete(dlpack) }; + Some(()) + }); + std::panic::set_hook(prev_hook); + matches!(probe, Ok(Some(()))) + } + + /// Read the same data from an f32 and an f64 Parquet column, encode at the + /// matching precision, and return the minimum per-sample cross-precision + /// fidelity. `None` when no functional GPU is available. + fn parquet_amplitude_fidelity(num_qubits: usize) -> Option { + if !cuda_is_functional() { + return None; + } + let engine_f64 = common::qdp_engine_with_precision(Precision::Float64)?; + let engine_f32 = common::qdp_engine_with_precision(Precision::Float32)?; + let device = common::cuda_device()?; + + let state_dim = 1usize << num_qubits; + let num_samples = 4; + let sample_size = state_dim; + + let data_f64 = make_amplitude_data(num_samples, sample_size); + let (f32_file, f64_file) = write_pair(&data_f64, sample_size); + + // f32 column → f32 reader → f32 kernel + let mut reader_f32 = + ParquetReader::::new(&f32_file.0, None, NullHandling::FillZero).unwrap(); + let (host_in_f32, _, _) = reader_f32.read_batch().unwrap(); + let dlpack_f32 = engine_f32 + .encode_batch_f32( + &host_in_f32, + num_samples, + sample_size, + num_qubits, + "amplitude", + ) + .expect("F32 encode_batch should succeed"); + + // f64 column → f64 reader → f64 kernel + let mut reader_f64 = + ParquetReader::::new(&f64_file.0, None, NullHandling::FillZero).unwrap(); + let (host_in_f64, _, _) = reader_f64.read_batch().unwrap(); + let dlpack_f64 = engine_f64 + .encode_batch( + &host_in_f64, + num_samples, + sample_size, + num_qubits, + "amplitude", + ) + .expect("F64 encode_batch should succeed"); + + let f64_tensor = unsafe { &(*dlpack_f64).dl_tensor }; + let f32_tensor = unsafe { &(*dlpack_f32).dl_tensor }; + + let total_elements = num_samples * state_dim; + let host_f64 = + download_complex_f64(&device, f64_tensor.data as *const _, total_elements).unwrap(); + let host_f32 = + download_complex_f32(&device, f32_tensor.data as *const _, total_elements).unwrap(); + + let mut min_fidelity = 1.0_f64; + for s in 0..num_samples { + let off = s * state_dim * 2; + let sample_f64 = &host_f64[off..off + state_dim * 2]; + let sample_f32 = &host_f32[off..off + state_dim * 2]; + let f = fidelity_cross_precision(sample_f32, sample_f64).unwrap(); + if f < min_fidelity { + min_fidelity = f; + } + } + + unsafe { + common::take_deleter_and_delete(dlpack_f64); + common::take_deleter_and_delete(dlpack_f32); + } + + Some(min_fidelity) + } + + /// Run the Parquet f32-vs-f64 amplitude case at `num_qubits`, skipping when + /// no GPU is available. Threshold matches `gpu_fidelity.rs` (1e-3 at 8-16). + fn assert_amplitude_fidelity(num_qubits: usize) { + let Some(fidelity) = parquet_amplitude_fidelity(num_qubits) else { + println!("SKIP: No GPU available"); + return; + }; + println!("Parquet F32 vs F64 fidelity @ {num_qubits} qubits: {fidelity:.10}"); + assert!( + fidelity > 1.0 - 1e-3, + "Fidelity too low at {num_qubits} qubits: {fidelity}" + ); + } + + #[test] + fn test_parquet_f32_vs_f64_amplitude_8_qubits() { + assert_amplitude_fidelity(8); + } + + #[test] + fn test_parquet_f32_vs_f64_amplitude_12_qubits() { + assert_amplitude_fidelity(12); + } + + #[test] + fn test_parquet_f32_vs_f64_amplitude_16_qubits() { + assert_amplitude_fidelity(16); + } +} diff --git a/qdp/qdp-kernels/src/kernel_config.h b/qdp/qdp-kernels/src/kernel_config.h index 9a5708ac31..069f69a3b4 100644 --- a/qdp/qdp-kernels/src/kernel_config.h +++ b/qdp/qdp-kernels/src/kernel_config.h @@ -50,13 +50,6 @@ // This is a hardware limitation, not a tunable parameter #define CUDA_MAX_GRID_DIM_1D 2147483647 -// ============================================================================ -// Qubit Limits -// ============================================================================ -// Maximum qubits supported (16GB GPU memory limit) -// This limit ensures state vectors fit within practical GPU memory constraints -#define MAX_QUBITS 30 - // ============================================================================ // FWT (Fast Walsh-Hadamard Transform) Configuration // ============================================================================ diff --git a/qdp/qdp-python/README.md b/qdp/qdp-python/README.md index d770cc9774..aa67021a3b 100644 --- a/qdp/qdp-python/README.md +++ b/qdp/qdp-python/README.md @@ -96,12 +96,14 @@ Backend support boundary: ### Pipeline / loader dtype (Rust internals) `QuantumDataLoader` and `run_throughput_pipeline` build a Rust `PipelineConfig` with an -`encoding` plus a `dtype` (float32 vs float64). The prefetch thread can only keep an +`encoding` plus a `dtype` (float32 vs float64). The prefetch thread can keep an end-to-end **float32 host batch** for encodings whose GPU stack implements the batch **f32** -path (`encode_batch_f32`). **Today that is amplitude only.** Angle and basis still fall back -to float64 for that loop until their batch f32 implementations exist. The eventual full -matrix (e.g. angle/basis under `supports_f32` once kernels are wired) is broader than what -the pipeline uses today. +path (`encode_batch_f32`): `amplitude`, `angle`, and `basis`. IQP-family and phase +encodings still normalize to float64 in this loop. + +For streaming basis files, the loader reads basis indices as float64 even when float32 is +requested, because basis values are integer state indices and float32 cannot represent +large indices exactly. ## Input Sources diff --git a/qdp/qdp-python/benchmark/README.md b/qdp/qdp-python/benchmark/README.md index d30715a1c8..6d11bfdf9b 100644 --- a/qdp/qdp-python/benchmark/README.md +++ b/qdp/qdp-python/benchmark/README.md @@ -9,6 +9,8 @@ scripts: that measures vectors/sec across Mahout, PennyLane, and Qiskit. - `benchmark_latency.py`: Data-to-State latency benchmark (CPU RAM -> GPU VRAM). - `benchmark_phase.py`: GPU phase encoding latency benchmark (batch encode timing). +- `benchmark_parquet_f32.py`: end-to-end f32 vs f64 Parquet pipeline throughput + (vectors/sec and f32/f64 speedup); see [Parquet f32 vs f64](#parquet-f32-vs-f64-throughput). ## Quick Start @@ -34,10 +36,32 @@ uv run --project qdp/qdp-python python qdp/qdp-python/benchmark/benchmark_e2e.py uv run --project qdp/qdp-python python qdp/qdp-python/benchmark/benchmark_latency.py uv run --project qdp/qdp-python python qdp/qdp-python/benchmark/benchmark_throughput.py uv run --project qdp/qdp-python python qdp/qdp-python/benchmark/benchmark_phase.py +uv run --project qdp/qdp-python python qdp/qdp-python/benchmark/benchmark_parquet_f32.py ``` This keeps all benchmark dependencies in the unified repo root venv (`mahout/.venv`). +## Parquet f32 vs f64 throughput + +`benchmark_parquet_f32.py` reads the same amplitude data from a Parquet file +through `QuantumDataLoader` at `dtype("float32")` and `dtype("float64")`, and +reports vectors/sec for each plus the f32/f64 speedup (issue #1342). The +expected win is ~25-35% when the Parquet column is native f32. + +```bash +uv run --project qdp/qdp-python python qdp/qdp-python/benchmark/benchmark_parquet_f32.py \ + --qubits 12 --batches 200 --batch-size 64 +``` + +By default two temporary files holding the same data — a native +`FixedSizeList` and a native `FixedSizeList` — are generated +and each is read at its matching dtype, so the f32 run measures the zero-copy +native-f32 path (not a f64→f32 cast). Pass `--parquet PATH` to benchmark your +own file at both dtypes instead. The generated data is materialized in RAM and +on disk and grows as `batches * batch_size * 2^qubits`, so raise `--qubits` with +that cost in mind. Requires an NVIDIA GPU (the native file loader is Linux + +CUDA only); not run in CI. + ## Manual Setup If you prefer to set up manually (or if `make benchmark` is not available): diff --git a/qdp/qdp-python/benchmark/benchmark_parquet_f32.py b/qdp/qdp-python/benchmark/benchmark_parquet_f32.py new file mode 100644 index 0000000000..396836b423 --- /dev/null +++ b/qdp/qdp-python/benchmark/benchmark_parquet_f32.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python3 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""End-to-end f32 vs f64 Parquet pipeline throughput benchmark (issue #1342). + +Reads amplitude data from a Parquet file through ``QuantumDataLoader`` at +``dtype("float32")`` and ``dtype("float64")`` and reports encoded +vectors/second for each, plus the f32/f64 speedup. The expected win is +~25-35% when the Parquet column is native f32 (see #1338). + +To actually exercise the native f32 path, the default (no ``--parquet``) run +generates *two* files holding the same logical data — one native +``FixedSizeList`` and one native ``FixedSizeList`` — and reads +each at its matching dtype, so the f32 run is the zero-copy native-f32 read, not +a f64→f32 cast. With ``--parquet PATH`` the same user file is read at both +dtypes (a native-f32 column hits the zero-copy path; a f64 column is cast to f32 +on read). + +This is a GPU/Linux-only benchmark: ``QuantumDataLoader``'s native file loader is +only available on Linux with CUDA, mirroring ``benchmark_phase.py``. It is NOT +wired into CI; run it locally on a GPU box. + +Run from the repo root:: + + uv run --project qdp/qdp-python \\ + python qdp/qdp-python/benchmark/benchmark_parquet_f32.py \\ + --qubits 12 --batches 200 --batch-size 64 + +The generated data is materialized in RAM and on disk and grows as +``batches * batch_size * 2^qubits``, so raise ``--qubits`` with that cost in mind. +""" + +from __future__ import annotations + +import argparse +import os +import tempfile +import time + +import numpy as np +import pyarrow as pa +import pyarrow.parquet as pq +from qumat_qdp import QuantumDataLoader + + +def _generate_parquet( + path: str, + total_rows: int, + sample_size: int, + np_dtype: type[np.floating], + pa_type: pa.DataType, +) -> None: + """Write a ``FixedSizeList`` Parquet file of random data. + + Each call generates its own data from a fixed seed, so the f32 and f64 files + hold the same logical values without the caller keeping both large host + arrays alive at once. A FixedSizeList has no offsets buffer, so this also + sidesteps the int32 offset overflow a variable ``List`` hits once + ``total_rows * sample_size`` exceeds 2^31 (large --qubits). + """ + flat = np.random.default_rng(0).random(total_rows * sample_size) + if np_dtype != np.float64: + flat = flat.astype(np_dtype) + values = pa.array(flat, type=pa_type) + list_array = pa.FixedSizeListArray.from_arrays(values, sample_size) + pq.write_table(pa.table({"data": list_array}), path) + + +def run_loader( + path: str, + dtype: str, + num_qubits: int, + total_batches: int, + batch_size: int, + encoding_method: str, +) -> tuple[float, float]: + """Iterate the loader at the given dtype; return (duration_sec, vec/s). + + The native file loader reads the *entire* file regardless of ``--batches``: + ``total_batches`` is ignored for file sources (only ``--batch-size`` sets + batch granularity), and iteration runs until EOF. So the loop processes + exactly the file's Parquet row count, and ``num_rows / elapsed`` is the true + throughput for any ``--parquet`` file -- not just the generated case where + ``num_rows == batches * batch_size``. (Do not clamp to ``batches * + batch_size``: for a file larger than that, the whole file is still read, so + clamping would divide the full read time by an undercount.) + """ + total_vectors = pq.read_metadata(path).num_rows + loader = ( + QuantumDataLoader(device_id=0) + .qubits(num_qubits) + .encoding(encoding_method) + .batches(total_batches, size=batch_size) + .dtype(dtype) + .source_file(path) + ) + start = time.perf_counter() + for _ in loader: # drive the pipeline; the encoded batch is not needed + pass + elapsed = max(time.perf_counter() - start, 1e-9) + return elapsed, total_vectors / elapsed + + +def main() -> None: + parser = argparse.ArgumentParser( + description="f32 vs f64 Parquet pipeline throughput benchmark" + ) + # Default sizes are deliberately modest: the generated data is materialized + # in host RAM and written to disk (one f32 + one f64 file), so it grows as + # batches * batch_size * 2^qubits. 12 qubits keeps the default run ~0.4 GB; + # raise --qubits with that cost in mind. + parser.add_argument("--qubits", type=int, default=12) + parser.add_argument( + "--batches", + type=int, + default=200, + help="Number of batches. Sizes the generated data (batches * batch_size " + "rows); ignored with --parquet, where the whole file is always read.", + ) + parser.add_argument("--batch-size", type=int, default=64) + parser.add_argument("--encoding", type=str, default="amplitude") + parser.add_argument("--trials", type=int, default=3) + parser.add_argument( + "--parquet", + type=str, + default=None, + help="Existing Parquet file to benchmark at both dtypes; " + "if omitted, native f32 and f64 temp files are generated.", + ) + args = parser.parse_args() + + sample_size = 1 << args.qubits + total_rows = args.batches * args.batch_size + + tmp_paths: list[str] = [] + # Map each dtype to the file it should read. For the generated case each + # dtype reads its own native-precision file (no cast); for --parquet both + # read the user's single file. + paths: dict[str, str] + if args.parquet is None: + f64_fd, f64_path = tempfile.mkstemp(suffix="_bench_f64.parquet") + f32_fd, f32_path = tempfile.mkstemp(suffix="_bench_f32.parquet") + os.close(f64_fd) + os.close(f32_fd) + # Register for cleanup before generating, so a failure mid-generation + # (e.g. MemoryError on large --qubits, or disk-full) still removes them. + tmp_paths = [f64_path, f32_path] + paths = {"float64": f64_path, "float32": f32_path} + else: + paths = {"float64": args.parquet, "float32": args.parquet} + + try: + if args.parquet is None: + print( + f"Generating {total_rows} rows x {sample_size} cols (native f32 + f64)" + ) + _generate_parquet( + paths["float64"], total_rows, sample_size, np.float64, pa.float64() + ) + _generate_parquet( + paths["float32"], total_rows, sample_size, np.float32, pa.float32() + ) + + print("=" * 70) + print("Parquet f32 vs f64 pipeline throughput") + print( + f" qubits={args.qubits}, batches={args.batches}, " + f"batch_size={args.batch_size}, encoding={args.encoding}" + ) + print("=" * 70) + + results: dict[str, float] = {} + for dtype in ("float64", "float32"): + vps_trials: list[float] = [] + for t in range(args.trials): + dur, vps = run_loader( + paths[dtype], + dtype, + args.qubits, + args.batches, + args.batch_size, + args.encoding, + ) + vps_trials.append(vps) + print(f" [{dtype}] trial {t + 1}: {dur:.4f} s, {vps:.1f} vec/s") + results[dtype] = sorted(vps_trials)[len(vps_trials) // 2] + print(f" [{dtype}] median: {results[dtype]:.1f} vec/s") + + print("-" * 70) + if results["float64"] <= 0.0: + print(" No vectors encoded (empty file?); skipping speedup.") + else: + speedup = results["float32"] / results["float64"] + print(f" f32/f64 speedup: {speedup:.3f}x ({(speedup - 1.0) * 100:+.1f}%)") + finally: + for p in tmp_paths: + os.remove(p) + + +if __name__ == "__main__": + main() diff --git a/qdp/qdp-python/benchmark/encoding_benchmarks/qdp_pipeline/iris_amplitude.py b/qdp/qdp-python/benchmark/encoding_benchmarks/qdp_pipeline/iris_amplitude.py index 7b0132343d..09ba096f1d 100644 --- a/qdp/qdp-python/benchmark/encoding_benchmarks/qdp_pipeline/iris_amplitude.py +++ b/qdp/qdp-python/benchmark/encoding_benchmarks/qdp_pipeline/iris_amplitude.py @@ -322,9 +322,12 @@ def _run_training_gpu( ) -> dict[str, Any]: """GPU path: lightning.gpu + PyTorch interface, data stays on GPU. Optional early stop every 100 steps.""" device = encoded_train.device - dtype = encoded_train.dtype - Y_train_t = torch.tensor(Y_train, dtype=dtype, device=device) - Y_test_t = torch.tensor(Y_test, dtype=dtype, device=device) + # Encoded data may be complex (from QDP); use real dtype for weights, bias and labels. + real_dtype = ( + torch.float64 if encoded_train.dtype == torch.complex128 else torch.float32 + ) + Y_train_t = torch.tensor(Y_train, dtype=real_dtype, device=device) + Y_test_t = torch.tensor(Y_test, dtype=real_dtype, device=device) @qml.qnode(dev_qml, interface="torch", diff_method="adjoint") def circuit(weights, state_vector): @@ -341,10 +344,12 @@ def cost(weights, bias, X_batch, Y_batch): return torch.mean((Y_batch - preds) ** 2) torch.manual_seed(seed) - weights = 0.01 * torch.randn( - num_layers, NUM_QUBITS, 3, device=device, dtype=dtype, requires_grad=True + weights = ( + (0.01 * torch.randn(num_layers, NUM_QUBITS, 3, device=device, dtype=real_dtype)) + .detach() + .requires_grad_(True) ) - bias = torch.tensor(0.0, device=device, dtype=dtype, requires_grad=True) + bias = torch.tensor(0.0, device=device, dtype=real_dtype, requires_grad=True) opt = torch.optim.SGD([weights, bias], lr=lr, momentum=0.9, nesterov=True) t0 = time.perf_counter() diff --git a/qdp/qdp-python/pyproject.toml b/qdp/qdp-python/pyproject.toml index 4eba07c418..03969dbc57 100644 --- a/qdp/qdp-python/pyproject.toml +++ b/qdp/qdp-python/pyproject.toml @@ -31,7 +31,7 @@ dynamic = ["version"] [dependency-groups] dev = [ "pytest", - "torch>=2.2,<=2.12.0", + "torch>=2.2,<=2.13.0", "triton>=3.0", ] benchmark = [ @@ -39,7 +39,7 @@ benchmark = [ "pandas>=2.0", "pyarrow>=14.0", "tensorflow>=2.20", - "torch>=2.2,<=2.12.0", + "torch>=2.2,<=2.13.0", "triton>=3.0", "qiskit>=1.0", "qiskit-aer>=0.17.2", diff --git a/qdp/qdp-python/qumat_qdp/__init__.py b/qdp/qdp-python/qumat_qdp/__init__.py index 2b75661417..81ffd66347 100644 --- a/qdp/qdp-python/qumat_qdp/__init__.py +++ b/qdp/qdp-python/qumat_qdp/__init__.py @@ -44,6 +44,27 @@ BACKEND = get_backend() + +def is_cuda_available() -> bool: + """Return whether a usable CUDA device is available to the native engine. + + Unlike the importability of the ``_qdp`` extension -- which only means it + was built, possibly against CUDA stubs on a host without the toolkit -- this + reflects whether GPU work can actually run: ``False`` for a stub build or a + host with no CUDA device, ``True`` only when the native runtime reports at + least one device. + """ + if _qdp_mod is None: + return False + probe = getattr(_qdp_mod, "cuda_available", None) + if probe is None: + return False + try: + return bool(probe()) + except Exception: + return False + + from qumat_qdp.api import ( LatencyResult, QdpBenchmark, @@ -68,6 +89,7 @@ "ThroughputResult", "TritonAmdEngine", "force_backend", + "is_cuda_available", "is_triton_amd_available", "run_throughput_pipeline_py", ] diff --git a/qdp/qdp-python/qumat_qdp/_backend.py b/qdp/qdp-python/qumat_qdp/_backend.py index f44e19adc3..583f843634 100644 --- a/qdp/qdp-python/qumat_qdp/_backend.py +++ b/qdp/qdp-python/qumat_qdp/_backend.py @@ -72,7 +72,7 @@ def get_backend() -> Backend: """Return the active backend. Only the Rust backend is auto-detected. The PyTorch reference - backend must be selected explicitly via :func:`force_backend`. + backend must be selected explicitly via ``force_backend()``. """ if _forced_backend is not None: return _forced_backend diff --git a/qdp/qdp-python/qumat_qdp/api.py b/qdp/qdp-python/qumat_qdp/api.py index 98042b250e..0cf66b8ceb 100644 --- a/qdp/qdp-python/qumat_qdp/api.py +++ b/qdp/qdp-python/qumat_qdp/api.py @@ -18,15 +18,18 @@ Benchmark API: supports Rust-optimized pipeline and PyTorch reference backend. Usage: - from qumat_qdp import QdpBenchmark, ThroughputResult, LatencyResult - # Rust backend (default): - result = (QdpBenchmark(device_id=0).qubits(16).encoding("amplitude") - .batches(100, size=64).warmup(2).run_throughput()) +```python +from qumat_qdp import QdpBenchmark, ThroughputResult, LatencyResult - # PyTorch reference (must be explicitly selected): - result = (QdpBenchmark(device_id=0).backend("pytorch").qubits(16) - .encoding("amplitude").batches(100, size=64).run_throughput()) +# Rust backend (default): +result = (QdpBenchmark(device_id=0).qubits(16).encoding("amplitude") + .batches(100, size=64).warmup(2).run_throughput()) + +# PyTorch reference (must be explicitly selected): +result = (QdpBenchmark(device_id=0).backend("pytorch").qubits(16) + .encoding("amplitude").batches(100, size=64).run_throughput()) +``` """ from __future__ import annotations @@ -40,7 +43,7 @@ class ThroughputResult: """Throughput benchmark measurement. - Returned by :meth:`QdpBenchmark.run_throughput`. ``duration_sec`` is the + Returned by ``QdpBenchmark.run_throughput()``. ``duration_sec`` is the measured timed section after any configured warmup batches. ``vectors_per_sec`` is computed over ``total_batches * batch_size`` encoded input vectors. """ @@ -53,7 +56,7 @@ class ThroughputResult: class LatencyResult: """Latency benchmark measurement. - Returned by :meth:`QdpBenchmark.run_latency`. ``duration_sec`` is the same + Returned by ``QdpBenchmark.run_latency()``. ``duration_sec`` is the same timed interval used for throughput, and ``latency_ms_per_vector`` is the average milliseconds per encoded input vector across the measured batches. """ @@ -206,7 +209,7 @@ def run_throughput(self) -> ThroughputResult: pipeline with any configured warmup batches; ``"pytorch"`` runs the reference encoder loop and synchronizes CUDA timing when applicable. - :returns: A :class:`ThroughputResult` containing elapsed seconds and + :returns: A ``ThroughputResult`` containing elapsed seconds and encoded vectors per second. :raises ValueError: If required benchmark parameters are missing. :raises RuntimeError: If the Rust backend is selected but unavailable. @@ -223,7 +226,7 @@ def run_latency(self) -> LatencyResult: method. The Rust backend reports latency from the native pipeline; the PyTorch backend derives average latency from its throughput run. - :returns: A :class:`LatencyResult` containing elapsed seconds and mean + :returns: A ``LatencyResult`` containing elapsed seconds and mean milliseconds per encoded vector. :raises ValueError: If required benchmark parameters are missing. :raises RuntimeError: If the Rust backend is selected but unavailable. diff --git a/qdp/qdp-python/qumat_qdp/loader.py b/qdp/qdp-python/qumat_qdp/loader.py index a70233650c..bf225ad1e1 100644 --- a/qdp/qdp-python/qumat_qdp/loader.py +++ b/qdp/qdp-python/qumat_qdp/loader.py @@ -18,13 +18,16 @@ Quantum Data Loader: Python builder for Rust-backed batch iterator. Usage: - from qumat_qdp import QuantumDataLoader - loader = (QuantumDataLoader(device_id=0).qubits(16).encoding("amplitude") - .batches(100, size=64).source_synthetic()) - for qt in loader: - batch = torch.from_dlpack(qt) - ... +```python +from qumat_qdp import QuantumDataLoader + +loader = (QuantumDataLoader(device_id=0).qubits(16).encoding("amplitude") + .batches(100, size=64).source_synthetic()) +for qt in loader: + batch = torch.from_dlpack(qt) + ... +``` """ from __future__ import annotations @@ -333,7 +336,7 @@ def encoding(self, method: str) -> QuantumDataLoader: ``"iqp"``, ``"iqp-z"``, and ``"phase"``. Use these canonical lowercase names because the selected backend receives the string exactly as supplied. The PyTorch reference backend supports the same methods as - :mod:`qumat_qdp.torch_ref`; use the native backend for methods that are + ``qumat_qdp.torch_ref``; use the native backend for methods that are not available in the reference path. :param method: Encoding method name. @@ -415,7 +418,7 @@ def source_file(self, path: str, streaming: bool = False) -> QuantumDataLoader: Remote ``s3://`` and ``gs://`` paths are accepted when the native remote I/O feature is enabled; remote query strings and fragments are rejected. - Element precision is controlled by :meth:`dtype`. By default file input is + Element precision is controlled by ``dtype()``. By default file input is loaded as ``float64`` (lossless). Selecting ``dtype("float32")`` narrows f64 file contents to f32 on load; values outside the f32 range become ``±Inf``. ``basis`` encoding is exempt: its values are integer state indices, so it is @@ -450,9 +453,9 @@ def source_file(self, path: str, streaming: bool = False) -> QuantumDataLoader: def dtype(self, name: str) -> QuantumDataLoader: """Set the element precision used when loading file sources. - Applies to the native :meth:`source_file` path. ``"float64"`` (the default) + Applies to the native ``source_file()`` path. ``"float64"`` (the default) loads file contents losslessly; ``"float32"`` narrows them to f32 on load. - See :meth:`source_file` for the cast caveats, including the ``basis`` + See ``source_file()`` for the cast caveats, including the ``basis`` exemption. :param name: ``"float32"``/``"f32"`` or ``"float64"``/``"f64"`` (case-insensitive). diff --git a/qdp/qdp-python/qumat_qdp/tensor.py b/qdp/qdp-python/qumat_qdp/tensor.py index 986109fa08..aad9e7ca60 100644 --- a/qdp/qdp-python/qumat_qdp/tensor.py +++ b/qdp/qdp-python/qumat_qdp/tensor.py @@ -85,5 +85,5 @@ def to_torch(self) -> Any: return torch.from_dlpack(self) -#: Backward-compatible alias for :class:`QdpTensor`. +#: Backward-compatible alias for ``QdpTensor``. QuantumTensor = QdpTensor diff --git a/qdp/qdp-python/src/engine.rs b/qdp/qdp-python/src/engine.rs index f40cc5e459..b818e84419 100644 --- a/qdp/qdp-python/src/engine.rs +++ b/qdp/qdp-python/src/engine.rs @@ -16,7 +16,7 @@ use crate::pytorch::{ extract_cuda_tensor_info, get_torch_cuda_stream_ptr, is_cuda_tensor, is_pytorch_tensor, - validate_cuda_tensor_for_encoding, validate_shape, validate_tensor, + validate_cuda_tensor_for_encoding, validate_shape, validate_tensor_cpu, }; use crate::tensor::QuantumTensor; use numpy::{PyReadonlyArray1, PyReadonlyArray2, PyUntypedArrayMethods}; @@ -206,7 +206,7 @@ impl QdpEngine { } // CPU tensor path - validate_tensor(data)?; + validate_tensor_cpu(data)?; // PERF: Avoid Tensor -> Python list -> Vec deep copies. // // For CPU tensors, `tensor.detach().numpy()` returns a NumPy view that shares the same diff --git a/qdp/qdp-python/src/lib.rs b/qdp/qdp-python/src/lib.rs index cd7f19200f..2f0b55a17e 100644 --- a/qdp/qdp-python/src/lib.rs +++ b/qdp/qdp-python/src/lib.rs @@ -68,6 +68,18 @@ fn run_throughput_pipeline_py( )) } +/// Returns ``True`` if a usable CUDA device is available to the native engine. +/// +/// This reflects whether GPU work can actually run -- it is ``False`` for a +/// stub build (the extension built without the CUDA toolkit) or a host with no +/// CUDA device, and ``True`` only when the native runtime reports a device. +/// Importability of this module only means it was built, which a stub build +/// makes possible without a GPU. +#[pyfunction] +fn cuda_available() -> bool { + qdp_core::cuda_runtime_available() +} + /// Quantum Data Plane (QDP) Python module /// /// GPU-accelerated quantum data encoding with DLPack integration. @@ -78,6 +90,7 @@ fn _qdp(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; + m.add_function(wrap_pyfunction!(cuda_available, m)?)?; #[cfg(qdp_gpu_platform)] m.add_class::()?; #[cfg(qdp_gpu_platform)] diff --git a/qdp/qdp-python/src/pytorch.rs b/qdp/qdp-python/src/pytorch.rs index a46ae1df2c..8181e551f3 100644 --- a/qdp/qdp-python/src/pytorch.rs +++ b/qdp/qdp-python/src/pytorch.rs @@ -33,12 +33,12 @@ pub fn is_pytorch_tensor(obj: &Bound<'_, PyAny>) -> PyResult { Ok(module_name == "torch") } -/// Helper to validate CPU tensor -pub fn validate_tensor(tensor: &Bound<'_, PyAny>) -> PyResult<()> { - if !is_pytorch_tensor(tensor)? { - return Err(PyRuntimeError::new_err("Object is not a PyTorch Tensor")); - } - +/// Validate that a PyTorch tensor lives on the CPU. +/// +/// The caller must have already confirmed `tensor` is a `torch.Tensor` (e.g. +/// via [`is_pytorch_tensor`]). This function only checks device placement, so +/// it also rejects non-CPU backends such as CUDA, MPS, XLA, and HPU. +pub fn validate_tensor_cpu(tensor: &Bound<'_, PyAny>) -> PyResult<()> { let device = tensor.getattr("device")?; let device_type: String = device.getattr("type")?.extract()?; diff --git a/qdp/qdp-python/uv.lock b/qdp/qdp-python/uv.lock index 3ae41ff3bf..0c91e3d496 100644 --- a/qdp/qdp-python/uv.lock +++ b/qdp/qdp-python/uv.lock @@ -277,42 +277,51 @@ wheels = [ [[package]] name = "cuda-toolkit" -version = "13.0.2" +version = "13.0.3.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c7/a79086a62c98befcdb8349656c6f114e2db3b8b2422f6e25c97a7f2a9a3c/cuda_toolkit-13.0.3.0-py2.py3-none-any.whl", hash = "sha256:d693caaa261214ddd7dbb60d68e71cbed884e68c2be7509778f3051da0b91c3f", size = 2512, upload-time = "2026-04-14T00:50:08.173Z" }, ] [package.optional-dependencies] +cublas = [ + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] cudart = [ - { name = "nvidia-cuda-runtime", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cuda-runtime", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cufft = [ - { name = "nvidia-cufft", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cufft", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cufile = [ - { name = "nvidia-cufile", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cufile", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] cupti = [ - { name = "nvidia-cuda-cupti", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cuda-cupti", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] curand = [ - { name = "nvidia-curand", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-curand", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cusolver = [ - { name = "nvidia-cusolver", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusolver", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cusparse = [ - { name = "nvidia-cusparse", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] nvjitlink = [ - { name = "nvidia-nvjitlink", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] nvrtc = [ - { name = "nvidia-cuda-nvrtc", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] nvtx = [ - { name = "nvidia-nvtx", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-nvtx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] [[package]] @@ -1616,13 +1625,13 @@ benchmark = [ { name = "scikit-learn", specifier = ">=1.3" }, { name = "scipy", specifier = ">=1.11" }, { name = "tensorflow", specifier = ">=2.20" }, - { name = "torch", specifier = ">=2.2,<=2.12.0" }, + { name = "torch", specifier = ">=2.2,<=2.13.0" }, { name = "tqdm" }, { name = "triton", specifier = ">=3.0" }, ] dev = [ { name = "pytest" }, - { name = "torch", specifier = ">=2.2,<=2.12.0" }, + { name = "torch", specifier = ">=2.2,<=2.13.0" }, { name = "triton", specifier = ">=3.0" }, ] @@ -2001,17 +2010,16 @@ wheels = [ [[package]] name = "torch" -version = "2.12.0" +version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, - { name = "cuda-toolkit", extra = ["cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" }, + { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" }, { name = "filelock" }, { name = "fsspec" }, { name = "jinja2" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "networkx", version = "3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "nvidia-cublas", marker = "sys_platform == 'linux'" }, { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" }, { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" }, { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" }, @@ -2022,18 +2030,18 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/b7/53fe0436586716ab7aecff41e26b9302d57c85ded481fd83a2cd741e6b4e/torch-2.12.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1834bd984f8a2f4f16bdfbeecca9146184b220aa46276bf5756735b5dae12812", size = 87981887, upload-time = "2026-05-13T14:55:53.234Z" }, - { url = "https://files.pythonhosted.org/packages/34/60/d930eac44c30de06ed16f6d1ba4e785e1632532b50d8f0bf9bf699a4d0c7/torch-2.12.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d4d029801cb7b6df858804a2a21b00cc2aa0bf0ee5d2ab18d343c9e9e5681f35", size = 426355000, upload-time = "2026-05-13T14:54:31.944Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0c/c76b6a087820bab55705b94dfc074e520de9ae91f5ef90da2ecbf2a3ef12/torch-2.12.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d47e7dee68ac4cd7a068b26bcd6b989935427709fae1c8f7bd0019978f829e15", size = 532144998, upload-time = "2026-05-13T14:56:05.523Z" }, - { url = "https://files.pythonhosted.org/packages/4a/64/8a0d036e166a6aa85ee09bef072f3655d1ba5d5486a68d1b03b6813c01b3/torch-2.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:cf9839790285dd472e7a16aafcb4a4e6bf58ec1b494045044b0eefb0eb4bd1f2", size = 122949877, upload-time = "2026-05-13T14:55:46.841Z" }, - { url = "https://files.pythonhosted.org/packages/18/62/131124fb95df03811b8260d1d43dcc5ee85ea1a344b964613d7efe77fb08/torch-2.12.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:10802fd383bbfed646212e765a72c37d2185205d4f26eb197a254e8ac7ddcb25", size = 87990344, upload-time = "2026-05-13T14:55:42.154Z" }, - { url = "https://files.pythonhosted.org/packages/12/9c/dda0dbd547dc549839824135f223792fd0e725f28ed0715dda366b7acaa2/torch-2.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c12592630aef72feaf18bd3f197ef587bbfa21131b31c38b23ab2e55fce92e36", size = 426362932, upload-time = "2026-05-13T14:54:15.295Z" }, - { url = "https://files.pythonhosted.org/packages/e2/d2/a7dd5a3f9bdaa7842124e8e2359202b317c48d47d2fc5816fafdf2049adb/torch-2.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:415c1b8d0412f67551c8e89a2daca0fb3e56694af0281ba155eaa9da481f58b4", size = 532170085, upload-time = "2026-05-13T14:55:20.788Z" }, - { url = "https://files.pythonhosted.org/packages/12/1b/a61ce2004f9ab0ea8964a6e6168133a127795667639e2ff4f8f2bdb16a65/torch-2.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:dd37188ea325042cb1f6cafa56822b11ada2520c04791a52629b0af25bdfbfd9", size = 122953128, upload-time = "2026-05-13T14:54:52.744Z" }, - { url = "https://files.pythonhosted.org/packages/ef/bb/285d643f254731294c9b595a007eac39db4600a98682d7bca688f42ca164/torch-2.12.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b41339df93d491435e790ff8bcbae1c0ce777175889bfd1281d119862793e6a2", size = 88010197, upload-time = "2026-05-13T14:55:35.414Z" }, - { url = "https://files.pythonhosted.org/packages/79/81/76debf1db1343bd929bbb5d74c89fb437c2ed88eb144712557e7bd3eea45/torch-2.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8fbef9f108a863e7722a73740998967e3b074742a834fc5be3a535a2befa7057", size = 426376751, upload-time = "2026-05-13T14:55:03.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/f0/80026028b603c4650ff270fc3785bdef4bd6738765a9cc5a0f5a637d65a2/torch-2.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4b4f64c2c2b11f7510d93dd6412b87025ff6eddd6bb61c3b5a3d892ea20c4756", size = 532261691, upload-time = "2026-05-13T14:52:54.453Z" }, - { url = "https://files.pythonhosted.org/packages/b9/c2/64b06cbb7830fb3cd9be13e1158b31a3f36b68e6a209105ee3c9d9480be0/torch-2.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:8b958caff4a14d3a3b0b2dfc6a378f64dda9728a9dad28c08a0db9ce4dafb549", size = 122988114, upload-time = "2026-05-13T14:54:42.153Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e7/19894fdb51c7dbaf94f5a79bb0871da0992e8e4241e579cb006da46d2e58/torch-2.13.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:94f0de129916f77b8dc2c7a8eff644cfeddfe59e39c9f55e9f6e17543410281d", size = 111178962, upload-time = "2026-07-08T16:05:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5c/b1d5de470c54e339b30a92d96683a71bcebd78f5f2a7fc714cd6dc6bbd68/torch-2.13.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0ab4b69f3ee03a62a002cfbf77b1ca5e88aceb4ea64cb4388bb28f638ddbb045", size = 427198333, upload-time = "2026-07-08T16:05:36.847Z" }, + { url = "https://files.pythonhosted.org/packages/50/c0/68a84105e1fcb8970144b388ff3d3e5dc15a3be28c1e247841f7d7247e41/torch-2.13.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c78b7b4d04461855a764cf01bae9a462bb88bc93defcfa11235cbc8fdf3e12c4", size = 526555154, upload-time = "2026-07-08T16:05:06.507Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c9/0bb9d097b03cbaf96bb75b15e867347b8e41bfcdfe0539452d17d9e63993/torch-2.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:2bd30b6b730d987fa386ce3898933762c5cb8cc82eb0535211d787cc3ce2dfeb", size = 122015602, upload-time = "2026-07-08T16:05:45.25Z" }, + { url = "https://files.pythonhosted.org/packages/5b/fe/cba54dc58523434919b66f13a667e36e436deddd77ca519e96553617d4ec/torch-2.13.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:e76f9bcecc52b8ff711239a2f7547d5353df95878ab232f0773c1d95928b92f8", size = 111187938, upload-time = "2026-07-08T16:05:17.065Z" }, + { url = "https://files.pythonhosted.org/packages/c2/59/1e3160e18e12aa3038390efab3ce02b36a9d4d6a527ecdd8520dca2e68d8/torch-2.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:092790c696a760c729fd5722835f50b9d81fd7c8f141571f3f3cf4081a8f664c", size = 427199369, upload-time = "2026-07-08T16:04:51.054Z" }, + { url = "https://files.pythonhosted.org/packages/01/79/1f2d34ad7034ee1c7ffc1cf8bf0f8213af2a81df6ecdb3997ecec107c09d/torch-2.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60fcdcb2f3876e21146cb4524ef06397d727ca9ad5f020818547e25075fe3cb7", size = 526574961, upload-time = "2026-07-08T16:04:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fd/0f2ce40f58aefbdb3392f9acce3c8171940943ae2d661f70558bfa73befb/torch-2.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:a0d8b11f16a48d60e2015d8213aa0390744cbebb98e58b62b3514dddc656e330", size = 122015870, upload-time = "2026-07-08T16:05:27.59Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3a/ed0f4d4d1dcde03bced7aac9a28e800abcdc0cbd06b6775044c9fbd877b7/torch-2.13.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2fe228aba290d14b9f31b049be550dbd469c3fd3013d7a19705b30454da97027", size = 111213045, upload-time = "2026-07-08T16:05:22.997Z" }, + { url = "https://files.pythonhosted.org/packages/df/a9/f6a2a4d763ff1df02e9a64c477029db614295bc9367f4131223791ccc243/torch-2.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:572df8be8ffb4599c88cbd6a0726f1f854f4da65d2e3c09f0e2c2283333cd6d4", size = 427210998, upload-time = "2026-07-08T16:04:37.708Z" }, + { url = "https://files.pythonhosted.org/packages/f3/82/fea946351658e6534db52d2cc12bc53087cbf87f9440c5f180f367c1950b/torch-2.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:796633c4cdf0fe2cdced72d8f88f22e73dbcfce83132763162f6d4bff13b820b", size = 526605292, upload-time = "2026-07-08T16:04:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/21/d6/e8f3c6f7e01f626f77259de9860d2a78bc84c40539e28e79b7e98b0bb659/torch-2.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:024c6cc0c1b085f2f91f20a3dc27b0471d021c31ce84b81be3afdc39f791fd9d", size = 122057313, upload-time = "2026-07-08T16:03:53.43Z" }, ] [[package]] @@ -2050,15 +2058,15 @@ wheels = [ [[package]] name = "triton" -version = "3.7.0" +version = "3.7.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/97/dcd1f2a0f8336691bff74abc59b2ed9c69a0c0f8f65cd77109c49e05f068/triton-3.7.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223ac302091491436c248a34ee1e6c47a1026486579103c906ffd805be50cb89", size = 188367104, upload-time = "2026-05-07T19:04:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c0/c2ac4fd2d8809b7579d4a820a0f9e5de62a9bc8a757ed4b3abf4f7ee964a/triton-3.7.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c631b65668d4951213b948a413c0564184305b77bb45cc9d686d3e1ecc4701a3", size = 201313191, upload-time = "2026-05-07T18:45:58.444Z" }, - { 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/ec/ea/629cc37436ca5df93ce98956d09cd2ca1498bfee8ef4972d2fe48b9f958c/triton-3.7.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3daf64305d6cea88d3334c65ebc9bcd0c64c9564a977084366aa768d57cbcf64", size = 184551013, upload-time = "2026-06-17T20:03:37.551Z" }, + { url = "https://files.pythonhosted.org/packages/15/76/c79c34311625227a288df3e483fc5cdf3d596624cbd4b4758c4cbdc14af3/triton-3.7.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee89fbf782ec2ad50391dd1cf26cbea4f4467154c37f4773026da8fc31c0f58e", size = 197596267, upload-time = "2026-06-17T19:53:06.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f9/19d842d06a08559534fa1eaab6ca551b1bcf40f06620bddec1babaa2772d/triton-3.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4a0e1cd4c4a76370ed74a8432a53cea28716827d19e40ffc732233e35ceb3f6", size = 184664887, upload-time = "2026-06-17T20:03:42.913Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5e/fce69606f7f240297f163e25539906732b199530d486ce67ae319877e821/triton-3.7.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6744957e9fd610a29680ec2346057d0c86948ed3812468670719f391e94b44a5", size = 197701306, upload-time = "2026-06-17T19:53:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/94/fa/f856e24deb462d5f18bd4b5a746957862ab9b6ee5834bda60605ec348366/triton-3.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9497f2e696ee368862a181a90b2dcc03ca978cc4f602abd67c7d81022a6988e1", size = 184692359, upload-time = "2026-06-17T20:03:48.288Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6f/fb96d15db6f36d6eae4cafb998c2e0353bf59d7c4ea1662d7497f269134a/triton-3.7.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e40869937a68206ec70d7f25bb7ec6433cb083f9135e1f36dbd318dc449a728", size = 197719725, upload-time = "2026-06-17T19:53:20.419Z" }, ] [[package]] diff --git a/testing/conftest.py b/testing/conftest.py index 95009cc3cf..010b7230af 100644 --- a/testing/conftest.py +++ b/testing/conftest.py @@ -47,9 +47,18 @@ def _gpu_available() -> bool: toolkit -- it links stub CUDA Runtime symbols (see qdp-core ``build.rs`` / ``cuda_ffi.rs``). So importing ``_qdp`` no longer implies a working GPU, and ``@pytest.mark.gpu`` tests must additionally check for a real device. - This mirrors the ``torch.cuda.is_available()`` guard used by the inline - skips throughout the QDP test modules. + + Prefers the native engine's own signal (``qumat_qdp.is_cuda_available()``), + which is correct even for a stub build: a host with a GPU + PyTorch but no + CUDA toolkit builds ``_qdp`` against stubs, where ``torch.cuda.is_available()`` + would wrongly report True. Falls back to torch when the helper is absent. """ + try: + from qumat_qdp import is_cuda_available + + return bool(is_cuda_available()) + except Exception: + pass try: import torch diff --git a/testing/qdp_python/test_fallback.py b/testing/qdp_python/test_fallback.py index 9b34ff12b4..ac9e7739d4 100644 --- a/testing/qdp_python/test_fallback.py +++ b/testing/qdp_python/test_fallback.py @@ -85,6 +85,29 @@ def test_get_torch(self): t = get_torch() assert t is not None # torch is available in test env + def test_is_cuda_available_returns_bool(self): + """is_cuda_available() returns a plain bool without crashing. + + On a stub build (the extension built without the CUDA toolkit) or a host + with no device it must be False -- and querying it must NOT abort the + process, which is the regression this guards (a stub build previously + aborted when GPU code ran). + """ + from qumat_qdp import is_cuda_available + + assert isinstance(is_cuda_available(), bool) + + def test_is_cuda_available_matches_extension(self): + """The helper mirrors the native ``_qdp.cuda_available()`` signal.""" + from qumat_qdp import is_cuda_available + + try: + import _qdp + except ImportError: + assert is_cuda_available() is False + else: + assert is_cuda_available() == bool(_qdp.cuda_available()) + # --------------------------------------------------------------------------- # Loader with explicit PyTorch backend diff --git a/uv.lock b/uv.lock index c687a0b778..cb38818e54 100644 --- a/uv.lock +++ b/uv.lock @@ -1767,50 +1767,42 @@ wheels = [ [[package]] name = "pillow" -version = "12.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", size = 5354355, upload-time = "2026-04-01T14:42:15.402Z" }, - { url = "https://files.pythonhosted.org/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", size = 4695871, upload-time = "2026-04-01T14:42:18.234Z" }, - { url = "https://files.pythonhosted.org/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", size = 6269734, upload-time = "2026-04-01T14:42:20.608Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", size = 8076080, upload-time = "2026-04-01T14:42:23.095Z" }, - { url = "https://files.pythonhosted.org/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", size = 6382236, upload-time = "2026-04-01T14:42:25.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", size = 7070220, upload-time = "2026-04-01T14:42:28.68Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", size = 6493124, upload-time = "2026-04-01T14:42:31.579Z" }, - { url = "https://files.pythonhosted.org/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", size = 7194324, upload-time = "2026-04-01T14:42:34.615Z" }, - { url = "https://files.pythonhosted.org/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", size = 6376363, upload-time = "2026-04-01T14:42:37.19Z" }, - { url = "https://files.pythonhosted.org/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", size = 7083523, upload-time = "2026-04-01T14:42:39.62Z" }, - { url = "https://files.pythonhosted.org/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", size = 2463318, upload-time = "2026-04-01T14:42:42.063Z" }, - { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, - { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, - { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, - { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, - { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, - { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, - { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, - { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, - { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, - { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, - { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, - { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, - { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, - { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, - { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, - { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, - { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, - { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, - { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, - { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/c2/669d88644cddb1485bd9534e63e8cf476c8e51cb3c3a1297677023505c0e/pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a", size = 5392418, upload-time = "2026-07-01T11:53:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ba/3762f376a2948e3036488d773a146e0ae6ecc2ca03ac20e2615bd0b2ba02/pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7", size = 4785287, upload-time = "2026-07-01T11:53:29.761Z" }, + { url = "https://files.pythonhosted.org/packages/07/50/b5d688cc9c52d4482f3d5bcab6ce20bc2a74a85d2343841c907444a3be2c/pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f", size = 6253754, upload-time = "2026-07-01T11:53:32.298Z" }, + { url = "https://files.pythonhosted.org/packages/4e/89/36f4cd76cf4baf05c50ababb976249153f18c959171c7f6ba09a6f217260/pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec", size = 6925605, upload-time = "2026-07-01T11:53:34.487Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/4de58cf6633b9e3a6061ef4be6fb91fc3c90b812ece886f531e3c523d777/pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468", size = 6327788, upload-time = "2026-07-01T11:53:36.433Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/14d53682a19550dbbaf3b598f807d5457646c510805a44c7d7891cd1cd1a/pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed", size = 7036288, upload-time = "2026-07-01T11:53:38.712Z" }, + { url = "https://files.pythonhosted.org/packages/38/1d/36279e3c77efe034e4cc2b0393ee74ffdb5a62391dacbf9b916154f5f0b8/pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1", size = 6472396, upload-time = "2026-07-01T11:53:40.781Z" }, + { url = "https://files.pythonhosted.org/packages/48/7c/8fa0039574c476d7c6fa57dd7c32a130436877c6ec1e5ce1cc8ec44878c1/pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb", size = 7226887, upload-time = "2026-07-01T11:53:42.764Z" }, + { url = "https://files.pythonhosted.org/packages/fa/17/e324be141d173c1c919428066c3259f21c1b8982e564e01a4a81e96dbdcf/pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f", size = 2568039, upload-time = "2026-07-01T11:53:45.372Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/0a78b0e02d7ac54bc03e5321c9220da52f0c2ea83b21f7c40e7f3169c502/pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756", size = 5392415, upload-time = "2026-07-01T11:53:47.162Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5b/a02d30018abd97ced9f5a6c63d28597694a00d066516b9c1c6de45859fc9/pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6", size = 4785266, upload-time = "2026-07-01T11:53:49.079Z" }, + { url = "https://files.pythonhosted.org/packages/c8/98/766667a4be768150a202836acd9fad19c06824ca86c4286d3cf6b274964e/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd", size = 6263814, upload-time = "2026-07-01T11:53:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/ede717bc1144f63886c21fd349bb95860b0d1a21149ff16f2bb362b612b6/pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd", size = 6934408, upload-time = "2026-07-01T11:53:53.487Z" }, + { url = "https://files.pythonhosted.org/packages/a3/48/9c58b685e69d49c31af6c8eb9012055fab7e665785165c84796e2c73ce72/pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c", size = 6337160, upload-time = "2026-07-01T11:53:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/ff/fa/dc2a5c0ba6df93f67c31d34b808b7ce440b40cdbf96f0b81cde1d1e6fa93/pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5", size = 7045172, upload-time = "2026-07-01T11:53:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/86/a5/444817a4d4c4c2417df00513086ca196f388d8f9ef40c2e4ccd1ad1af54b/pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b", size = 6472232, upload-time = "2026-07-01T11:53:59.767Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/4bad1b18d132a50b27e1365e1ab163616f7a5bb56d330f66f9d1d9d4f9d4/pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a", size = 7233653, upload-time = "2026-07-01T11:54:02.066Z" }, + { url = "https://files.pythonhosted.org/packages/fd/16/00f91ab7760dc842f5aad55217e80fc4a7067a0604535249bc8a2d6d9870/pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26", size = 2568195, upload-time = "2026-07-01T11:54:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/75/18/2e8b40223153ccbc60df07f9e8928dc0c76202aa4e55ae9f53962b6510d6/pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468", size = 5302510, upload-time = "2026-07-01T11:56:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/46/3e/51fabf59d5ab801ceab709453d3ab6b180083496579549de4c45ced6528a/pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94", size = 4736058, upload-time = "2026-07-01T11:56:28.041Z" }, + { url = "https://files.pythonhosted.org/packages/bf/20/22fe9384b7949e25fb1293bcfc84fb82590ff4ea6b37c95b24d26d793d86/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e", size = 5237776, upload-time = "2026-07-01T11:56:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/08/14/f6ba68107680ffa74b39985f3f30884e41318fbc4250caa423c79b4788bb/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3", size = 5860358, upload-time = "2026-07-01T11:56:32.68Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786, upload-time = "2026-07-01T11:56:35.046Z" }, ] [[package]] @@ -1891,11 +1883,11 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.3" +version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/9a/23310166d960def5897e91fe20e5b724601b02a22e84ba1f94232c0b7f67/pyasn1-0.6.4.tar.gz", hash = "sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81", size = 151262, upload-time = "2026-07-09T01:12:33.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3b/6163796d69c3977d1e4287bea4a6979161cbbdd170ebb430511e8e1999ce/pyasn1-0.6.4-py3-none-any.whl", hash = "sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b", size = 84410, upload-time = "2026-07-09T01:12:32.92Z" }, ] [[package]] @@ -2503,11 +2495,11 @@ wheels = [ [[package]] name = "setuptools" -version = "80.9.0" +version = "83.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, ] [[package]] diff --git a/website/README.md b/website/README.md index 8a36da7617..f20f1920c8 100644 --- a/website/README.md +++ b/website/README.md @@ -15,7 +15,7 @@ npm install npm run start ``` -This starts a local development server at `http://localhost:3000` with hot reload. The changes to the documentation will be reflected at `http://localhost:3000/docs/next/`. +This starts a local development server at `http://localhost:3000` with hot reload. The changes to the documentation will be reflected at `http://localhost:3000/docs/master/`. ## Architecture @@ -156,10 +156,14 @@ Syntax highlighting is available for: Python, Java, Scala, Rust, Bash, and more. ````markdown ```python -from qumat import QumatCircuit - -circuit = QumatCircuit(2) -circuit.h(0) +from qumat import QuMat + +qumat = QuMat({ + "backend_name": "qiskit", + "backend_options": {"simulator_type": "aer_simulator"}, +}) +qumat.create_empty_circuit(num_qubits=2) +qumat.apply_hadamard_gate(0) ``` ```` @@ -168,7 +172,7 @@ circuit.h(0) ### Current Versions Released versions are listed in `versions.json`. The first version in that file is -served as `latest` at `/docs`; the editable current docs are served at `/docs/next`. +served as `latest` at `/docs`; the editable current docs are served at `/docs/master`. ### Creating a New Version @@ -227,7 +231,7 @@ Triggers: ### Changes are not reflected in the development server -Please ensure that you are looking at `http://localhost:3000/docs/next/`. +Please ensure that you are looking at `http://localhost:3000/docs/master/`. ### Broken Links diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index e75ee849ad..d52ba7f8da 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -101,7 +101,7 @@ const config: Config = { { // Only include redirects for paths that are known to exist // Additional redirects can be added after build verification - createRedirects(existingPath) { + createRedirects(existingPath: string) { // Redirect /news.html to /blog if (existingPath === '/blog') { return ['/news.html', '/news']; diff --git a/website/package-lock.json b/website/package-lock.json index 1ea9214704..9cd74e041b 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -8,71 +8,85 @@ "name": "mahout-website", "version": "0.5.0", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/faster": "3.10.1", - "@docusaurus/plugin-client-redirects": "3.10.1", - "@docusaurus/preset-classic": "3.10.1", - "@fontsource/maven-pro": "^5.2.10", - "@fontsource/mulish": "^5.2.8", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "rehype-katex": "^7.0.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/faster": "3.10.2", + "@docusaurus/plugin-client-redirects": "3.10.2", + "@docusaurus/preset-classic": "3.10.2", + "@fontsource/maven-pro": "^5.3.0", + "@fontsource/mulish": "^5.3.0", + "@mdx-js/react": "^3.1.1", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "rehype-katex": "^7.0.1", "remark-math": "^6.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/tsconfig": "3.10.1", - "@docusaurus/types": "3.10.1", - "typescript": "~5.6.2" + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/types": "3.10.2", + "typescript": "~7.0.2" }, "engines": { "node": ">=20.0" } }, + "node_modules/@11ty/gray-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/gray-matter/-/gray-matter-1.0.0.tgz", + "integrity": "sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0", + "kind-of": "^6.0.3", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=11" + } + }, "node_modules/@algolia/abtesting": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.19.0.tgz", - "integrity": "sha512-Lhnez3hhXHk25lfxLAMxvkP4fmN3+1RgADhD2ssMDBYuAsDVReeyP+3SGRx+ntq8ijMrLqUyfvO72TB6jsTteQ==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.22.0.tgz", + "integrity": "sha512-BFR6zNowNKcY7Ou7TaJc9QWexES4YKPbmf/OTFofpdsdhz4x6q0lbxp3duO0EHnyrN7rE4ba/TSXuY+BDGu4+g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", - "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.9.tgz", + "integrity": "sha512-4U2JKLMWlDu0CotYyUkWakDxr8AIav3QtIUXXRpfavYN29aVWfzlwJp9T0rPKEf/dO2QCPAUc0Kq1Tj1GJxo2A==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", - "@algolia/autocomplete-shared": "1.19.8" + "@algolia/autocomplete-plugin-algolia-insights": "1.19.9", + "@algolia/autocomplete-shared": "1.19.9" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", - "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.9.tgz", + "integrity": "sha512-6mExC6X7762s2SV3eJy3QOkB8bdMmnUhQ2agvGVDuzwoGyr3PquGSY/0vPQXCfiAiCaXUz1rXn+lwghgSi0l0w==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.19.8" + "@algolia/autocomplete-shared": "1.19.9" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", - "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.9.tgz", + "integrity": "sha512-YosP9Uoek6y/Ur1r1qeogk4biMe/hzkyNcgMCciw0//3XpCM7VlYLSHnyt/vOnEOGhCCc0+3v+unEiH6zz+Z1A==", "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -80,99 +94,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.53.0.tgz", - "integrity": "sha512-0ZjA5Hcmaoz5Lj6OG0zhfIyeqzJZnLW2CRJA1W17UwMFGRtZAJ9yJKRvPEDA6gkpsIoQxORTSW6sWFiuYncPNQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.56.0.tgz", + "integrity": "sha512-7r4Z3NC7yU1oAQVWJNA2HX7tX481F3pJvCGyLIXiTdBcthz4Q/o21jwcMYDFkuI92UWTNBQQmHYgwHo1zS5dzg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.53.0.tgz", - "integrity": "sha512-kWNodP75iiEaOtemC9F/hlxNBG5E2QUjN1BusnE6m2b4l7Qh/BUO3fGCVsmKJI65VO4VKGGmT43ICvHtTcJ2JQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.56.0.tgz", + "integrity": "sha512-avmjXQSq+jadFO8Xl2em05/uQdQnEmHsJyOAdVbZkmVgpMfxL12aJwVVfGNwYr9nulcpuJN1X0lTaQ5wxuNGcA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.53.0.tgz", - "integrity": "sha512-YPN45TXD9Wrse185t/Ta7nktZsqpv97oOjCzp2sblHnCL6rBc9TDeJAg1IGl2UpdwnSD05Zu/5wLB4watOUMyg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.56.0.tgz", + "integrity": "sha512-v2TPStUhY//ripPjIVclZ8AWc7DEGooXULZGFlFu37zNatgHjw34oZZ+OSbbc/YHO+xZwPl62I1k8xH1m4S2eg==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.53.0.tgz", - "integrity": "sha512-qAcYTDJE6m924FDDUQvdD6vh7DYaqOeSpFS74IP37/JRV0v4cGBauyxTF2WzDnokUylQDbqreoFIJZfg0Fitmw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.56.0.tgz", + "integrity": "sha512-P0ehROpM4Sem3Sqo5x2cKPgj67D3G3jy0rh1Amwkcvsfr6tkvIcdCmerieanqTF7NxUMPNFLkpIFeMO8Rpa50w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.53.0.tgz", - "integrity": "sha512-fQaY+DkSJOpuUVUe8MQTwrdiKAqkJGhpDarB08duBn/sUv7Bkib6MDRQauCcWTWTe4HIW+EbwQP9R4kci1V/Yw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.56.0.tgz", + "integrity": "sha512-SXK3Vn3WVxyzbm31oePZBJkp1wpOyuWdd4B/Pv7n0aXDxmeSWhC1R1FC1517mMrFAIaPH4Rt0x6RUe7ZNjz8FA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.53.0.tgz", - "integrity": "sha512-o72tsiEZGfeS/dxL9IADfzcZWGEwKDEe5CvtrBuT//3JR+SHuTtHRI2ZTf7D7bcKagcbojvO8hnkHdfoakSlYg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.56.0.tgz", + "integrity": "sha512-5+ZdX8garFnmycnZgKhtXHePEaLj5zqDxI/0lkhhluzCcvTn0/PvvTirTg8hHYetQHvn7GDyeAiqTAieMvMW4A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.53.0.tgz", - "integrity": "sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.56.0.tgz", + "integrity": "sha512-+mKUdYvqOi0BcvpAEyCEw49vSBptufIcfibtHz2bdr1pI789M46Yt0uQEk/sxtK3teh71OQvVFHaTDzShUWewQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" @@ -185,81 +199,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.53.0.tgz", - "integrity": "sha512-oNbT6z4NwD8Pou9VPINGlN/tlG1afESh2EbxqnP6rwl95xKVD/Zlciis1PpNeO/9U/rrajc1+7DcfKi03tX1KQ==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.56.0.tgz", + "integrity": "sha512-9g/zj+AZx5moFcdFIrYQoVrueXivjUcc3MQHtCYT8WhIuk1lUh1AyEhvJCS0XBZld09cLvd1AZ3BvDBpVpX2UA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.53.0.tgz", - "integrity": "sha512-G+KZb/yd+qAOFn/cEvTGeLxQm8aP3a0od50l3z/ylccY+/o4YG3TNcjU1tFQHW4mXC137GPyR7W70R0kRQDLnA==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.56.0.tgz", + "integrity": "sha512-Qf3Sr6f9A9uxCZUf3MXS0d2b877uYzEB5yxqpVGXAhcJnBCQjrRRon0KvefpGkxy+BshrIJs96OUoMtGqXTFDA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.53.0.tgz", - "integrity": "sha512-6aVfYd55Un6IUgPLbo84WfgFZlS3L0vA1ttzXL5vahHewUJ8jYgd89TzlWRTeej7w70mb9RWsVlFYGmJ/diQww==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.56.0.tgz", + "integrity": "sha512-GXWG1rWc5wu8hY4N33Y3b6ernY6sAdAvmKWN/zHAiACOx40WnpG0TVX5YazCAr/9gOYGInSiM2A0y2jy2xbiDA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "@algolia/client-common": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.53.0.tgz", - "integrity": "sha512-ke27DqgzCOlt+RbeEdCxtXxMQOnAOi8ujr2wid0DmDKzR95Kw/f9sBsuhBxtjevCqJRJszfRTLY0B1pbO6IhkA==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.56.0.tgz", + "integrity": "sha512-7t24cBxaInS3mZb7ddEaZT/tp6q+/aR4YttsQVyP1/i+LmwPR34atO35KjaLFCcRVrlP7sYOAqkCfg6lIRB+ew==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0" + "@algolia/client-common": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.53.0.tgz", - "integrity": "sha512-GngiOqt2Gq4oLno6yXQVj9om+qSO9SWAoduoTOEg79dKZ62brB8OOIvSJG/vDNoanYi6a7Al9uDZwXvi+bcVTg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.56.0.tgz", + "integrity": "sha512-R7ePHgVYmDFjZpvrsVAfbDz/d4RxKAYZ5/vgLfIsCVRZRryjWl/3INOxpOICzitehQ5FjNtNjcLQTrmHPTcHBQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0" + "@algolia/client-common": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.53.0.tgz", - "integrity": "sha512-6mF9LZMUk0QqWvrnxkxBqhswwz6Xfiwy6/gmTzL5HrlhdVG3ITAqGV2k3XmVThP1h0Ulc3VQwiNCD7/Nr4JNlQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.56.0.tgz", + "integrity": "sha512-PIOUXlSnrqM0S+WOgDRb4RzotydJH7ZoT6tOyL7tAO7qJOfvX5wsEW8Pe+PMKMwvuI4/gIyK9cg2H7lJXqnc4Q==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.53.0" + "@algolia/client-common": "5.56.0" }, "engines": { "node": ">= 14.0.0" @@ -328,13 +342,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -627,12 +641,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -1233,15 +1247,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", - "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", + "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/traverse": "^7.29.8" }, "engines": { "node": ">=6.9.0" @@ -1537,9 +1551,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", - "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", + "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" @@ -1627,9 +1641,9 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", - "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", + "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", @@ -1953,17 +1967,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -1971,9 +1985,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -2227,9 +2241,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2648,9 +2662,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -3095,9 +3109,9 @@ } }, "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -3319,9 +3333,9 @@ } }, "node_modules/@docsearch/core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", - "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.7.0.tgz", + "integrity": "sha512-p/9xVKmPDj3FPvMfPf5naVO3Ej8SCbcUugGvx1+8GgkuBNbqxqN2Irx3WLBv8VY0jH7XpRwKWdlmjXLZsmTLsg==", "license": "MIT", "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -3341,20 +3355,20 @@ } }, "node_modules/@docsearch/css": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", - "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.7.0.tgz", + "integrity": "sha512-Sk5xkdRFeE7PeWjG9l4AfTwdvMfr9wHiwNNCpHXT4v4SNyNMKdHGvEILc31BgaVFGDDNbv5u/a73tofRiwbEZw==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz", - "integrity": "sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.7.0.tgz", + "integrity": "sha512-x6oedjJ8O8/pIDBsMo5Orca3/6cQCz616/CwthVe68l43mqnj2lrJ9kFQITBqy8hMsS3nWeBWFoVO5dJ1DCFKA==", "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.6.3", - "@docsearch/css": "4.6.3" + "@docsearch/core": "4.7.0", + "@docsearch/css": "4.7.0" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -3410,9 +3424,9 @@ } }, "node_modules/@docusaurus/babel": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", - "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.2.tgz", + "integrity": "sha512-aJ1hpGyvfkte3dDAfNbWM4biW4yWZBVz7TIGLZP+v+tWOBgxX3e0N5ZIXHIvmfNNXTI77pcHUx3KmtOk05Ze3Q==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3424,8 +3438,8 @@ "@babel/preset-typescript": "^7.25.9", "@babel/runtime": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3435,17 +3449,17 @@ } }, "node_modules/@docusaurus/bundler": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", - "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.2.tgz", + "integrity": "sha512-i0ZNcy0f0WhaOlYVgzLsWhIoEXO9kS3HRoKPtgE6vQtZUq7arKZaYdNBudr3mqCmd+TyOkwtwfHgs1ENj07r5g==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.10.1", - "@docusaurus/cssnano-preset": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", + "@docusaurus/babel": "3.10.2", + "@docusaurus/cssnano-preset": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", "babel-loader": "^9.2.1", "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", @@ -3478,18 +3492,18 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", - "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.10.1", - "@docusaurus/bundler": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.2.tgz", + "integrity": "sha512-EYByj6nk+aD9KeVxV6Hmo2/nAAT79P21Y82ycTBOBtrmqilloIbIEhgL2/8Xpt2Jz/pgNqHAwyusOGwmbKeJmA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.2", + "@docusaurus/bundler": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3497,7 +3511,7 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "core-js": "^3.31.1", - "detect-port": "^1.5.1", + "detect-port": "^2.1.0", "escape-html": "^1.0.3", "eta": "^2.2.0", "eval": "^0.1.8", @@ -3545,9 +3559,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", - "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.2.tgz", + "integrity": "sha512-4gCnHRbJLTloiwfvFAa92tgb2gI4KYhvjfQVYnEaiMO/EgvWfCo1LwytHXen+1oZAN0VAlS0JAPxp3MsvKDa3A==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", @@ -3560,15 +3574,15 @@ } }, "node_modules/@docusaurus/faster": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/faster/-/faster-3.10.1.tgz", - "integrity": "sha512-XTZhE5C1gZ/DaYYMlSk02dwP5vhpQON5QHVz1s3892mSESAywgWanURpXEDAvt4GvGuq7s+XP8rTWHZvfaJmdQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/faster/-/faster-3.10.2.tgz", + "integrity": "sha512-p/5E5/RyHv+QWusJMPN5i3OMJTqTgkhuwzVbB1AReDWTUHXQCmf5mlTFzGiDrWeQWIDOKsuOPn1jJh0s9LUOHA==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.1", + "@docusaurus/types": "3.10.2", "@rspack/core": "^1.7.10", - "@swc/core": "^1.7.39", - "@swc/html": "^1.13.5", + "@swc/core": "^1.15.40", + "@swc/html": "^1.15.40", "browserslist": "^4.24.2", "lightningcss": "^1.27.0", "semver": "^7.5.4", @@ -3584,9 +3598,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", - "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3597,14 +3611,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", - "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.2.tgz", + "integrity": "sha512-9Fd4V/SFjfrVQ0JH5EN0+iPWyFunvTeQE3gfyFeetqPaXMP0OylIjOw16dCuXG4NZJrYdBqwzjh18/h3gRi47w==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3636,12 +3650,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz", - "integrity": "sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.2.tgz", + "integrity": "sha512-h/I5e4jaAhDHW4vaLENi1i2hnOEnXY1t9R+nnRTbgUl7ymVRzN/HF7dDfj8rKYGj8gfIge+Ef+iYRAMtbGvsrQ==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.1", + "@docusaurus/types": "3.10.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3655,16 +3669,16 @@ } }, "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.1.tgz", - "integrity": "sha512-LHgd+YDvkhfOHMAE6XtUng3DQNzVM765RqVRrMJgHtzAvfopQhY6ieprqjxDVBdv21cLma6I0jHr+YCZH8fL9A==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.2.tgz", + "integrity": "sha512-z5I5ttCXw+8y2gHVZvqAMmUw4Rb0ZzKA5eCPk87SfM/jCKOTvE24yDpPAwwipvug96ij7mOwEHXWw8G4LlWdGA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -3679,19 +3693,19 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz", - "integrity": "sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz", + "integrity": "sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "cheerio": "1.0.0-rc.12", "combine-promises": "^1.1.0", "feed": "^4.2.2", @@ -3714,20 +3728,20 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", - "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.2.tgz", + "integrity": "sha512-Sqwl4FPoZBDrlY8I2VU2H8O0M91CHp9T8ToMSkTZmjvHCif+1laqfXi6sTk8IfyVS/trN5yNjcWd1bFsGB6W5Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -3747,16 +3761,16 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz", - "integrity": "sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.2.tgz", + "integrity": "sha512-h5R12sZ/vV9EPiVjvIl9YFCOwkpwXes7dQMYt3EvP6Pphu4amHxxTqWxf08Fl5DR8h+oZMbWpFTNw5vKEYfvzQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -3770,15 +3784,15 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz", - "integrity": "sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.2.tgz", + "integrity": "sha512-UkdvQby5OQUKWrw3lLnSTJXQ6VETaUVTuPQX9AABtmFm5h+ifEBx1OQ+LN726Q4byuwBf2ElHkf4qU4hTxdvRg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -3786,14 +3800,14 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz", - "integrity": "sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.2.tgz", + "integrity": "sha512-8vbZNOSCpnsT57EY6CgN7sgRVmx3KTYwO8Uvo2pbxOyb8tbqAwtT9SslqaQ41HbA1v1hpn5RP7u5s2KvRwAFpQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" @@ -3807,14 +3821,14 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz", - "integrity": "sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.2.tgz", + "integrity": "sha512-kMHMBK9j4VAtgd5owwrRLRIi0EjkrpXlX7ePj1+y68XfVZV9I1T4S+koPDm+Hfw2TtnyHvh0uNrDvjz+DjQGVA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -3826,15 +3840,14 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz", - "integrity": "sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.2.tgz", + "integrity": "sha512-Vt90nNFhtAChRe9+it1hcHFgFvETdSnOkL5Bma+p6E/yU2tAYrvvyk+gv+LJGM2ZUkyKuKXLRsZ2Lb0bO7+Vog==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "@types/gtag.js": "^0.0.20", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -3846,14 +3859,14 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz", - "integrity": "sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.2.tgz", + "integrity": "sha512-MLCffCldysi/R0nzJQP7ZWd0xAoGNnSTiVOo6TTR6mKVGFhE+/XArGe67ZcaZv1uytgQXoXs92VJrgVDrz80rQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -3865,17 +3878,17 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz", - "integrity": "sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.2.tgz", + "integrity": "sha512-PODkwg5XetLML3hU/3xpCKJUZ9cqExLaBnD/Fzzwj2VHogLeqnDisLIujae87zuze7T4mCm2A6KEqZkyiz07EQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -3889,15 +3902,15 @@ } }, "node_modules/@docusaurus/plugin-svgr": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz", - "integrity": "sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.2.tgz", + "integrity": "sha512-JgfT3jWM0TJ8Uw0cEcqxHpybngQY1vlBYpuuNO+gEh5iPh5Ar+vxq/u9CFrYsWeXy48BN7Db76Pzp2edNXUQ8A==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", @@ -3912,26 +3925,26 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz", - "integrity": "sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/plugin-content-blog": "3.10.1", - "@docusaurus/plugin-content-docs": "3.10.1", - "@docusaurus/plugin-content-pages": "3.10.1", - "@docusaurus/plugin-css-cascade-layers": "3.10.1", - "@docusaurus/plugin-debug": "3.10.1", - "@docusaurus/plugin-google-analytics": "3.10.1", - "@docusaurus/plugin-google-gtag": "3.10.1", - "@docusaurus/plugin-google-tag-manager": "3.10.1", - "@docusaurus/plugin-sitemap": "3.10.1", - "@docusaurus/plugin-svgr": "3.10.1", - "@docusaurus/theme-classic": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/theme-search-algolia": "3.10.1", - "@docusaurus/types": "3.10.1" + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.2.tgz", + "integrity": "sha512-a4B3VczmDl99zK0EufDQYomdJ186WDingjmDXxhN2PNPS9Ty/Y2M5CLFX1KQMRKqRTLiRDKfutzG5IY1FC/ceg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/plugin-content-blog": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/plugin-content-pages": "3.10.2", + "@docusaurus/plugin-css-cascade-layers": "3.10.2", + "@docusaurus/plugin-debug": "3.10.2", + "@docusaurus/plugin-google-analytics": "3.10.2", + "@docusaurus/plugin-google-gtag": "3.10.2", + "@docusaurus/plugin-google-tag-manager": "3.10.2", + "@docusaurus/plugin-sitemap": "3.10.2", + "@docusaurus/plugin-svgr": "3.10.2", + "@docusaurus/theme-classic": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-search-algolia": "3.10.2", + "@docusaurus/types": "3.10.2" }, "engines": { "node": ">=20.0" @@ -3942,24 +3955,24 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", - "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/plugin-content-blog": "3.10.1", - "@docusaurus/plugin-content-docs": "3.10.1", - "@docusaurus/plugin-content-pages": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/theme-translations": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.2.tgz", + "integrity": "sha512-JqTSLQmqmA9uKWZsD5iwBGJ4JyKB4/yTw6PsSXVPRJG/6GAm/u+add9Iip+hvwP12/AnPNztrdxsI14NJW4KeA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/plugin-content-blog": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/plugin-content-pages": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-translations": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -3983,15 +3996,15 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", - "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.2.tgz", + "integrity": "sha512-R9b/vMpK1yye6hNZTA6x/ivRv+at6GhxnXcxkpzCGzO1R1RwiquqiFg2wMFh6aqlJTpWRFKpFD2TzCDQcyOU0A==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -4011,20 +4024,20 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz", - "integrity": "sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz", + "integrity": "sha512-1msxllyhi/5m77JukXtp5UFnUAriwZIC1oJ7MTnpQpCwLTbclJi5BK5n28CTZuSXpQN2ewbbnqRgAhMM6c6ihg==", "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "^1.19.2", "@docsearch/react": "^3.9.0 || ^4.3.2", - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/plugin-content-docs": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/theme-translations": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-translations": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "algoliasearch": "^5.37.0", "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", @@ -4043,9 +4056,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz", - "integrity": "sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz", + "integrity": "sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -4055,17 +4068,10 @@ "node": ">=20.0" } }, - "node_modules/@docusaurus/tsconfig": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.10.1.tgz", - "integrity": "sha512-rYvB7yqkdqWIpAbDzQljGfM4cDBkLTbhmagZBEcsyj6oPUsz47lmW2pYdN1j+7sGFgltbAmQH62xfbrij4Eh6Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@docusaurus/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", - "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4099,21 +4105,21 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", - "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-common": "3.10.1", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4131,12 +4137,12 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", - "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.1", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4144,14 +4150,14 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", - "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4194,18 +4200,18 @@ } }, "node_modules/@fontsource/maven-pro": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/@fontsource/maven-pro/-/maven-pro-5.2.10.tgz", - "integrity": "sha512-CTydzkg80OGaZCtHXBU1FGUs5Ut7fU7kxzfm3fXenLug32+9vgt0u0iTXOx2nRpAhHsq93u0HyRUiWzESxx9iQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/maven-pro/-/maven-pro-5.3.0.tgz", + "integrity": "sha512-W7z2U3t0XHUzAAFhx/rQTw8ga2OZkiwwEiNq1G1vJzE4shOs9d2Oj5kGmt+noaEKQR4jPB29upw9b61KFX4yXg==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/mulish": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@fontsource/mulish/-/mulish-5.2.8.tgz", - "integrity": "sha512-pAqO7fkpGHd0Zjr5ieiWrr9kJiZWbaADaZWOlMERTsSqNsRUsg5y0jv4n6/VjWhd4LUfkYpiQBhP0yLDpbPNiw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/mulish/-/mulish-5.3.0.tgz", + "integrity": "sha512-Fru/fmJwg4ZlKUU4jELz6/guZhba6Lz1vraAROqooYnUbtj1iMi7BXFkQU7AkB6QP5swpvwRnO5chUp6mNh5mA==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" @@ -5283,9 +5289,9 @@ "license": "BSD-3-Clause" }, "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", "license": "MIT" }, "node_modules/@sindresorhus/is": { @@ -5569,14 +5575,14 @@ } }, "node_modules/@swc/core": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.40.tgz", - "integrity": "sha512-2kwzJikRvgtNAG7MwVZY2vEzZjTxKIq5jXOihuSV/8U+Hej8Va22t65aKnJZs3P+NwojZvR8Mf8kyM7O+V8sQg==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.47.tgz", + "integrity": "sha512-FbsO5JcfOjfH38W/rohBRBweJeERsAuIP4f377lmkmxTcq9exjtx4SkRuZY5CdfhR2CBVwDIJegBpJDffwNsOg==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.26" + "@swc/types": "^0.1.27" }, "engines": { "node": ">=10" @@ -5586,18 +5592,18 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.40", - "@swc/core-darwin-x64": "1.15.40", - "@swc/core-linux-arm-gnueabihf": "1.15.40", - "@swc/core-linux-arm64-gnu": "1.15.40", - "@swc/core-linux-arm64-musl": "1.15.40", - "@swc/core-linux-ppc64-gnu": "1.15.40", - "@swc/core-linux-s390x-gnu": "1.15.40", - "@swc/core-linux-x64-gnu": "1.15.40", - "@swc/core-linux-x64-musl": "1.15.40", - "@swc/core-win32-arm64-msvc": "1.15.40", - "@swc/core-win32-ia32-msvc": "1.15.40", - "@swc/core-win32-x64-msvc": "1.15.40" + "@swc/core-darwin-arm64": "1.15.47", + "@swc/core-darwin-x64": "1.15.47", + "@swc/core-linux-arm-gnueabihf": "1.15.47", + "@swc/core-linux-arm64-gnu": "1.15.47", + "@swc/core-linux-arm64-musl": "1.15.47", + "@swc/core-linux-ppc64-gnu": "1.15.47", + "@swc/core-linux-s390x-gnu": "1.15.47", + "@swc/core-linux-x64-gnu": "1.15.47", + "@swc/core-linux-x64-musl": "1.15.47", + "@swc/core-win32-arm64-msvc": "1.15.47", + "@swc/core-win32-ia32-msvc": "1.15.47", + "@swc/core-win32-x64-msvc": "1.15.47" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -5609,9 +5615,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.40.tgz", - "integrity": "sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.47.tgz", + "integrity": "sha512-GsoMtan3ojGGMGFbl31mmRu5ctZ56re8grGE8mO/OHJ8O+JRkzod02fe7X6ZQ8JvamA3imkEkx/h3u+vsOgPgA==", "cpu": [ "arm64" ], @@ -5625,9 +5631,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.40.tgz", - "integrity": "sha512-HbbPzvfLBUXjIB1Ezks+//lNUjmLjfyd63XSwprJgrZaXYdm70kohXPJUWdqKZozolFxbPaO+xtBaiUp6BoueA==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.47.tgz", + "integrity": "sha512-leTi7Rx3KF4zcC637iqWgk9SoV8VXAD8ppQYXsep63px5A/UftOcxLN1pmr8Z1si/YvX90ompP/rHgpYkgwXWg==", "cpu": [ "x64" ], @@ -5641,9 +5647,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.40.tgz", - "integrity": "sha512-SlRZsCjOCPR2LvFs0Ri/Xrx/5o5TCt8vl4gW6mX1hEZOG0a625RxzRHpHdAQNGykmAN/7IeaFAJG+QnNmxlHcA==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.47.tgz", + "integrity": "sha512-hBqHuoWKKIsKmDBn9qVeWqj5GWZhtlcczVaqQmNRXsDfq+voR5CxKRfamA367QjJXtceYuliLFfEL8QsskRM2g==", "cpu": [ "arm" ], @@ -5657,9 +5663,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.40.tgz", - "integrity": "sha512-Q8byxJt2fh8CR3EUX6snBpy47AoBVm+In/+Z3rjDHMjC38ZvR9/gtUUNCT0tfrn4EdVsO8/QPi59nxrxvqxvBQ==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.47.tgz", + "integrity": "sha512-TBxvRz+B4K205TWHHZxWVxkC2RFNP/Mz3PNcECBos5PsKwxjg3QSJzdoebr0VCf0Bfh8HOPldKxAP/8XkFe9gA==", "cpu": [ "arm64" ], @@ -5673,9 +5679,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.40.tgz", - "integrity": "sha512-4z0MgHU+7M0pZDqBN1El7mFXDI1SBwinfcUkAyA4v8QrhOIUOZltySt2aStQLZGrdXVXM4Y4ylfiTC04ED+MoQ==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.47.tgz", + "integrity": "sha512-3Yu3Uq/VgytqsPjTMbkPU1ExADytbdWbruJYhA584E9jrpE2Ki+R6VVPoZCeAVk1Cb7QxcRTgblw6bSa6a/R+w==", "cpu": [ "arm64" ], @@ -5689,9 +5695,9 @@ } }, "node_modules/@swc/core-linux-ppc64-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.40.tgz", - "integrity": "sha512-fLI4iUgeSZu0eRWUXwe6YzPFx9gHbFiPkl8Rp3mJfP8OpNR3nTQCGPvHdDh9xniW7mVvgMY4ni7A4VzqI1KrpA==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.47.tgz", + "integrity": "sha512-wfdMi5IaOaNtmh2/6geRoxIdNfqylUZFdtzTKS655y1axWfIWyx7As74vv0wVdjeCIZ3WmCI9odDd4rUttXOSQ==", "cpu": [ "ppc64" ], @@ -5705,9 +5711,9 @@ } }, "node_modules/@swc/core-linux-s390x-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.40.tgz", - "integrity": "sha512-YqeKMAb7d4nQSGMJQ454IlaCENpzcDqhvBE9+CPfdnYpnUXxd+BSrB6Xk0YjW8UyoEhUj4p6quATCxbsp6J3jg==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.47.tgz", + "integrity": "sha512-3hHYBY0yx8Ez7GMRrkhXHQzMdR5IZA6Wq5Ee4svlgwvSECLpnAJ9+0AimEGUFDvuLwE7nV/2+PYe8+Nm4rvNcQ==", "cpu": [ "s390x" ], @@ -5721,9 +5727,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.40.tgz", - "integrity": "sha512-7HOuS1iGcme/j/TuL1TfmmLGiMQrjv/GmjyZeydl00FKPtpGXEldwqfI56xgd1YzrzoB2svWjxbGGyQ0TEASxg==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.47.tgz", + "integrity": "sha512-TjfhjgP/jGCfFHYC3JQPhJA1HwErbIJ9JfREDc1KNkvY6P0LodCgKVIlQ5deeTbkG7ih3bF5PHJLuLpaZjdRyQ==", "cpu": [ "x64" ], @@ -5737,9 +5743,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.40.tgz", - "integrity": "sha512-h4kZYHc7dpc9P9u4brRJaS8Pl7tPVHAeiLSzw7T5RfIJgAoSdaCMKzI/2Uay9gFhaw8uyCDl0L5q37r0EpAfIA==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.47.tgz", + "integrity": "sha512-CQpS8Ge/avfjZd0UEwG/sds83Uu32deQXcV1Jo3jD0mmvQQqtYAjpsDZXugmheeAwmt+YIuoVtVHro8LMYHqsQ==", "cpu": [ "x64" ], @@ -5753,9 +5759,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.40.tgz", - "integrity": "sha512-+mQgKZXSj6mV38Zh05QaxSjUDmGP/R2JWlXZTDLSPkDzHU6p3GxN9eeSf5dfyDVU86946fmCvSzyl/ucImx8+A==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.47.tgz", + "integrity": "sha512-0W8IKHsUTYiT7G2RqtOoVWk+89yzZikIiDUb/sCK6BmQDBhN91hQSfyUtW12jhEWLzYgcfmisfsZrmZE+84U1A==", "cpu": [ "arm64" ], @@ -5769,9 +5775,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.40.tgz", - "integrity": "sha512-yvwdPLGd25mcj/mNatjNQ0lZujtQD6psH3v9PNmMb+fSzjbNG8KIDxjFWrcV+fsFVLOkyOmdJsFmX7NAFjVyPw==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.47.tgz", + "integrity": "sha512-ZIp49d2Z4/ka2jO9otOg4hDvTdPmp86kVOgS2M5FCPI7eKKZ1W0boxWn+8XeZrfERtFGW0AlMRm4JhlJa7l3NA==", "cpu": [ "ia32" ], @@ -5785,9 +5791,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.40.tgz", - "integrity": "sha512-OXtKsLU1bVtInzzDEAY2sYiF/rl4tvAnLLLpuMp3HzAOQZ5A+i69AKDhA1YLQTaMAqO3vzyYNVAYVRMPtSYD4w==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.47.tgz", + "integrity": "sha512-2h8Iek95vnixkBRCo+H8p09+Q5ll2NgSMFrWTy0iKt7+/t+8/T5mBpiT6c0ZxSS7wcWjwZ9sGZkK70tTSYHdDw==", "cpu": [ "x64" ], @@ -5807,9 +5813,9 @@ "license": "Apache-2.0" }, "node_modules/@swc/html": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.15.40.tgz", - "integrity": "sha512-YVWNrh3wZWH2oXz7uL+s1WZbFIsnAp9cCl/b+C7ufDJqhsOvbr0un9IOYZ/CxRIRdnHGfhVD199n8baD/kRQew==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.15.47.tgz", + "integrity": "sha512-Olu/8OORvYB+43v2/85nHe1EA8WSvWp8D3kctEAput/o4F+EWCK0nr4yGTqvWB7Z+ODz0k+vnxpvHQYzsKP2LA==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -5818,24 +5824,24 @@ "node": ">=14" }, "optionalDependencies": { - "@swc/html-darwin-arm64": "1.15.40", - "@swc/html-darwin-x64": "1.15.40", - "@swc/html-linux-arm-gnueabihf": "1.15.40", - "@swc/html-linux-arm64-gnu": "1.15.40", - "@swc/html-linux-arm64-musl": "1.15.40", - "@swc/html-linux-ppc64-gnu": "1.15.40", - "@swc/html-linux-s390x-gnu": "1.15.40", - "@swc/html-linux-x64-gnu": "1.15.40", - "@swc/html-linux-x64-musl": "1.15.40", - "@swc/html-win32-arm64-msvc": "1.15.40", - "@swc/html-win32-ia32-msvc": "1.15.40", - "@swc/html-win32-x64-msvc": "1.15.40" + "@swc/html-darwin-arm64": "1.15.47", + "@swc/html-darwin-x64": "1.15.47", + "@swc/html-linux-arm-gnueabihf": "1.15.47", + "@swc/html-linux-arm64-gnu": "1.15.47", + "@swc/html-linux-arm64-musl": "1.15.47", + "@swc/html-linux-ppc64-gnu": "1.15.47", + "@swc/html-linux-s390x-gnu": "1.15.47", + "@swc/html-linux-x64-gnu": "1.15.47", + "@swc/html-linux-x64-musl": "1.15.47", + "@swc/html-win32-arm64-msvc": "1.15.47", + "@swc/html-win32-ia32-msvc": "1.15.47", + "@swc/html-win32-x64-msvc": "1.15.47" } }, "node_modules/@swc/html-darwin-arm64": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.15.40.tgz", - "integrity": "sha512-A9oxSh60pMEsX/4VBpn3e6s8DfGWsHzAeG+Vd9mXgkTqt/ouX12owP6RyqfqK8v0WuEsBKkGY0+MbwLvlOG8NQ==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.15.47.tgz", + "integrity": "sha512-Qe3FXNLO/k2WN7xmBP8SzBrtLvlIbyqa8cceUOI0opE4gk+myk5qIk022MiGJOgiF1B21/wMXgA08gYjQ2lP2Q==", "cpu": [ "arm64" ], @@ -5849,9 +5855,9 @@ } }, "node_modules/@swc/html-darwin-x64": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.15.40.tgz", - "integrity": "sha512-GZ5KxJ/1pqnpOAjaa9hnkSk3M1LHjc5ci5GCt5/llAgDKFLDHzydIflHXTOIaS4nRCtfVMmD0joKX+ZWruSkJw==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.15.47.tgz", + "integrity": "sha512-khCOiWmqlqi8yz+F/ePExhht/+3/cz1XzKV7raPKVynzd6sPxYtFQlNubj305s2soEXgkYYIH0zVVLwiMOVn6Q==", "cpu": [ "x64" ], @@ -5865,9 +5871,9 @@ } }, "node_modules/@swc/html-linux-arm-gnueabihf": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.15.40.tgz", - "integrity": "sha512-Bbwtl0G6vYcWlDQmjeuyFx8YIvqi1StlQWjRNB1ZtvrRNL3JadFARhijBONiUIyTK9MgUbWtTV3QU69qzjNENQ==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.15.47.tgz", + "integrity": "sha512-7VRqaOEQEFPHSbUcnobmI59WbFK9M35Sse8TFN3hHxOlK9fINJ9yN5FuE9XEeRQAk+PFdR6WrIcF1Xwx1Cpi8A==", "cpu": [ "arm" ], @@ -5881,9 +5887,9 @@ } }, "node_modules/@swc/html-linux-arm64-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.40.tgz", - "integrity": "sha512-buu4fGyCIhkwmCetI4CfWOPn7cphJHwQ9ksK685hlL0R0PUaDCNdIxo+JAz0mK2JgPhoGqnKsVEmV6gLIL5GBw==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.47.tgz", + "integrity": "sha512-Ri9MmQqVRiEWuRfpkSTqz0bguvejXQcqQAkoW1Hke6+DColfzETcgNWa/Kw/ii5A/SS9Nb7acKaYdIw1vMBPwA==", "cpu": [ "arm64" ], @@ -5897,9 +5903,9 @@ } }, "node_modules/@swc/html-linux-arm64-musl": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.40.tgz", - "integrity": "sha512-BwWtpAGEHIP1QwKExWqBIjGpAHMahjT26ORZv3+TbwW4IuEl2QP5FrcYc30O8abCG5J1lWRl1vXKYDpzbIDz1A==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.47.tgz", + "integrity": "sha512-NyXRQiVBkeutgCwCxUUaFqZdDmpZONs7Zz3AZGoY35s9GwXF412Nt22fK/e7lO/sM6G/+S3rOom/0xTmUQSK6A==", "cpu": [ "arm64" ], @@ -5913,9 +5919,9 @@ } }, "node_modules/@swc/html-linux-ppc64-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-linux-ppc64-gnu/-/html-linux-ppc64-gnu-1.15.40.tgz", - "integrity": "sha512-wLtHgwmZu5K7PvuTROklgWJO6D+KwywpYR1geI8dSWX/AYnx/KCGVK9ncPzWVfnLXWhXbkgua3Ujdrfoxf+qSw==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-linux-ppc64-gnu/-/html-linux-ppc64-gnu-1.15.47.tgz", + "integrity": "sha512-rQ+XLJHFzu0e4M5p1+8kF2FKzI7WO9KPPji87OuicHZVrDCEqg7/jSGu3hys9CjIQIYVfR+tAFuZz3Q1/jOoNA==", "cpu": [ "ppc64" ], @@ -5929,9 +5935,9 @@ } }, "node_modules/@swc/html-linux-s390x-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-linux-s390x-gnu/-/html-linux-s390x-gnu-1.15.40.tgz", - "integrity": "sha512-WbWzQBCmvECZG6ep9D5SMMZTFCbFmRSCc7lPD3YhhaK16BNqr1AybvybZYOgxX9Ot5tq7gTWCgjFZXLDOn6Y/g==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-linux-s390x-gnu/-/html-linux-s390x-gnu-1.15.47.tgz", + "integrity": "sha512-w6bitHrllrE3lqmf14cT3spmWhZHGts1O08O4adzxztSPto7O5GM3IerqZm/NtsqlxNsfbVHnhaNXxXWe/8Q+Q==", "cpu": [ "s390x" ], @@ -5945,9 +5951,9 @@ } }, "node_modules/@swc/html-linux-x64-gnu": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.15.40.tgz", - "integrity": "sha512-i+/JqL5j9mTGMcVshWLMzciqyE3Np+gN5+UqMyO1D5zSmniJD5MHRlGXCtLaWx/MIKX0Q4Xkre33o56fmxp+uA==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.15.47.tgz", + "integrity": "sha512-FTA7E29gcyadd71prg8sJUVacYrIhAXS8L7p48yCfgcNOKquofN1TDOrHVOyYMoxplL3FUwwbN+AZxWO7QfWPQ==", "cpu": [ "x64" ], @@ -5961,9 +5967,9 @@ } }, "node_modules/@swc/html-linux-x64-musl": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.15.40.tgz", - "integrity": "sha512-mroZnb5omFc4iE01UsJgta+Nm0sIFWpGfTPk+BHfH165MZAM4wNndeczX5RpGZbQSF1nNpCoNgqJyT7l3hITMg==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.15.47.tgz", + "integrity": "sha512-g+K1GKUrj+S9o8Qsgii2g7ooMzZ750R4IAqH5CVElIA5FTMAx7KGnu9ga6aEnRwwLYxY3s1k/nN+ls0NEk240g==", "cpu": [ "x64" ], @@ -5977,9 +5983,9 @@ } }, "node_modules/@swc/html-win32-arm64-msvc": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.15.40.tgz", - "integrity": "sha512-qg1LXRrsY9FXy0S7vouSF0kkn1vdkTD//FW66iuezH7HMm5/DJGwEj7oc1zTKPWU0HnwOINOUbl6rUHrRuXHAQ==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.15.47.tgz", + "integrity": "sha512-5Iw3i00JdTySi+ccc2CM5bxY+8TZivQmcTqUC6mUdAY0/KYBgSe1/L294UJQ4OTLQqNDOYXY9jdb070zZUX7jg==", "cpu": [ "arm64" ], @@ -5993,9 +5999,9 @@ } }, "node_modules/@swc/html-win32-ia32-msvc": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.15.40.tgz", - "integrity": "sha512-5NwMmgt9A70LQzcYOl4OiIJk5AhsGP69fNRfkmXXop+iIcAGUmYy+d6F2/Gc0u05j9G0R04NPWcHBQrHQhr0Gw==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.15.47.tgz", + "integrity": "sha512-YkKd0hbIOeuFC1Sg7uGKkU2JhL+c9vAJlT6P0nRbWCAL71n01IPbdtbW6PmvgVmI7pxRYucXpr4pg839nX5+9Q==", "cpu": [ "ia32" ], @@ -6009,9 +6015,9 @@ } }, "node_modules/@swc/html-win32-x64-msvc": { - "version": "1.15.40", - "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.15.40.tgz", - "integrity": "sha512-WUNZqCZ+8WY1pr8t3X3fq4gI5+FL/tCCzlrJ2lLn0s+TyA2SLm/RPfXxQIr94EnjJWcIV21G//6/uXeBN8cPzw==", + "version": "1.15.47", + "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.15.47.tgz", + "integrity": "sha512-w9Ug+VB9hlHT4hTWIJSB40AdF+qs5w07CYq/+ef1vQRjT5naN6/SKuXmr9/CKLn3T7A9z3lRMPKE4+lmtUkBOQ==", "cpu": [ "x64" ], @@ -6025,9 +6031,9 @@ } }, "node_modules/@swc/types": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz", - "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==", + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.28.tgz", + "integrity": "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -6161,12 +6167,6 @@ "@types/send": "*" } }, - "node_modules/@types/gtag.js": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", - "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -6433,10 +6433,330 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/@ungap/structured-clone": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", - "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, "node_modules/@webassemblyjs/ast": { @@ -6686,12 +7006,12 @@ } }, "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", + "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", "license": "MIT", "engines": { - "node": ">= 10.0.0" + "node": ">= 16.0.0" } }, "node_modules/aggregate-error": { @@ -6753,34 +7073,34 @@ } }, "node_modules/algoliasearch": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.53.0.tgz", - "integrity": "sha512-OGW1q6b91CRSSeiOnM8LxuR5NYJ2esvw66jUZ4IIvdv+ItNkx3pwLuyR+jaCdbGee4ov5WgUnyPryyh11xvByQ==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.19.0", - "@algolia/client-abtesting": "5.53.0", - "@algolia/client-analytics": "5.53.0", - "@algolia/client-common": "5.53.0", - "@algolia/client-insights": "5.53.0", - "@algolia/client-personalization": "5.53.0", - "@algolia/client-query-suggestions": "5.53.0", - "@algolia/client-search": "5.53.0", - "@algolia/ingestion": "1.53.0", - "@algolia/monitoring": "1.53.0", - "@algolia/recommend": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.56.0.tgz", + "integrity": "sha512-PrqppUmhT4ENdas2pH9caE7efUcxy6EcSFhWzosiVuQBzu2tQ5yLTI6jwomT/1cuBnivzGfxiJCqDNN9FRRh+Q==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.22.0", + "@algolia/client-abtesting": "5.56.0", + "@algolia/client-analytics": "5.56.0", + "@algolia/client-common": "5.56.0", + "@algolia/client-insights": "5.56.0", + "@algolia/client-personalization": "5.56.0", + "@algolia/client-query-suggestions": "5.56.0", + "@algolia/client-search": "5.56.0", + "@algolia/ingestion": "1.56.0", + "@algolia/monitoring": "1.56.0", + "@algolia/recommend": "5.56.0", + "@algolia/requester-browser-xhr": "5.56.0", + "@algolia/requester-fetch": "5.56.0", + "@algolia/requester-node-http": "5.56.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.1.tgz", - "integrity": "sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA==", + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.2.tgz", + "integrity": "sha512-SaV+rZM3drExb0punEYYjT+sNcH74YFwN8ocjya7IDOyQvKWeQpEaSMVG3+IGTVos+feuatj7ljQ4BXlXdUp3w==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -6927,9 +7247,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "funding": [ { "type": "opencollective", @@ -6946,8 +7266,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -7053,9 +7373,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.33", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", - "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", + "version": "2.11.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.9.tgz", + "integrity": "sha512-cp447VUsGS07+n1Dqf7YSQ8maeJrjEhaDxTm1ZefbqDtypHBC5GzGMQbklR6IPR13Y8OAJRHZWEMtZipJLCttg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -7092,9 +7412,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -7178,9 +7498,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -7200,9 +7520,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "funding": [ { "type": "opencollective", @@ -7219,10 +7539,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -7389,9 +7709,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "funding": [ { "type": "opencollective", @@ -8106,9 +8426,9 @@ } }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8180,9 +8500,9 @@ } }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8703,20 +9023,19 @@ "license": "MIT" }, "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-2.1.0.tgz", + "integrity": "sha512-epZuWb/6Q62L+nDHJc/hQAqf8pylsqgk3BpZXVBx1CDnr3nkrVNn73Uu1rXcFzkNcc+hkP3whuOg7JZYaQB65Q==", "license": "MIT", "dependencies": { - "address": "^1.0.1", - "debug": "4" + "address": "^2.0.1" }, "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "detect": "dist/commonjs/bin/detect-port.js", + "detect-port": "dist/commonjs/bin/detect-port.js" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 16.0.0" } }, "node_modules/devlop": { @@ -8887,9 +9206,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.368", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", - "integrity": "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==", + "version": "1.5.399", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", + "integrity": "sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -9086,19 +9405,6 @@ "node": ">=8.0.0" } }, - "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/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -9447,9 +9753,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -9962,43 +10268,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "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/gray-matter/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/gray-matter/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/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -10589,9 +10858,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz", + "integrity": "sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -11184,9 +11453,9 @@ } }, "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "version": "17.13.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.4.tgz", + "integrity": "sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", @@ -11203,9 +11472,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -11365,9 +11634,9 @@ } }, "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -11380,23 +11649,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "cpu": [ "arm64" ], @@ -11414,9 +11683,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" ], @@ -11434,9 +11703,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" ], @@ -11454,9 +11723,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" ], @@ -11474,9 +11743,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" ], @@ -11494,9 +11763,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" ], @@ -11514,9 +11783,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" ], @@ -11534,9 +11803,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" ], @@ -11554,9 +11823,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" ], @@ -11574,9 +11843,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" ], @@ -11594,9 +11863,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -14280,9 +14549,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "funding": [ { "type": "github", @@ -14338,9 +14607,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "license": "MIT", "engines": { "node": ">=18" @@ -14936,9 +15205,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "funding": [ { "type": "opencollective", @@ -14955,7 +15224,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -14989,9 +15258,9 @@ } }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15233,9 +15502,9 @@ } }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15271,9 +15540,9 @@ } }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15399,9 +15668,9 @@ } }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15437,9 +15706,9 @@ } }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15726,9 +15995,9 @@ } }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15754,9 +16023,9 @@ } }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -15853,9 +16122,9 @@ } }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -16216,9 +16485,9 @@ } }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -16309,9 +16578,9 @@ } }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -16322,9 +16591,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -16660,24 +16929,24 @@ } }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.2.8" } }, "node_modules/react-fast-compare": { @@ -16970,9 +17239,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", - "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.1.0" @@ -17462,9 +17731,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -17616,9 +17885,9 @@ } }, "node_modules/serialize-javascript": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", - "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.7.tgz", + "integrity": "sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==", "license": "BSD-3-Clause", "engines": { "node": ">=20.0.0" @@ -17801,9 +18070,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", - "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -18063,12 +18332,6 @@ "wbuf": "^1.7.3" } }, - "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/srcset": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", @@ -18284,9 +18547,9 @@ "license": "MIT" }, "node_modules/svgo": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", - "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.4.tgz", + "integrity": "sha512-GsNRis4e8jxn2Y9ENz/8lbJ93CstG8svtMnuRaHbiF2LTJ5tK0/q3t/URPq9Zc7zVWBJnNnJMIp6bevK7bSmNg==", "license": "MIT", "dependencies": { "commander": "^7.2.0", @@ -18645,17 +18908,38 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", "devOptional": true, "license": "Apache-2.0", "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "tsc": "bin/tsc" }, "engines": { - "node": ">=14.17" + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" } }, "node_modules/undici-types": { @@ -19363,9 +19647,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz", - "integrity": "sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz", + "integrity": "sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw==", "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", @@ -19386,7 +19670,7 @@ "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", + "launch-editor": "^2.14.1", "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", @@ -19542,9 +19826,9 @@ } }, "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", + "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", diff --git a/website/package.json b/website/package.json index 95ccdb28e8..33c6a047cf 100644 --- a/website/package.json +++ b/website/package.json @@ -20,25 +20,24 @@ "version": "node scripts/version-docs.js" }, "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/faster": "3.10.1", - "@docusaurus/plugin-client-redirects": "3.10.1", - "@docusaurus/preset-classic": "3.10.1", - "@fontsource/maven-pro": "^5.2.10", - "@fontsource/mulish": "^5.2.8", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "rehype-katex": "^7.0.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/faster": "3.10.2", + "@docusaurus/plugin-client-redirects": "3.10.2", + "@docusaurus/preset-classic": "3.10.2", + "@fontsource/maven-pro": "^5.3.0", + "@fontsource/mulish": "^5.3.0", + "@mdx-js/react": "^3.1.1", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "rehype-katex": "^7.0.1", "remark-math": "^6.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/tsconfig": "3.10.1", - "@docusaurus/types": "3.10.1", - "typescript": "~5.6.2" + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/types": "3.10.2", + "typescript": "~7.0.2" }, "overrides": { "serialize-javascript": "^7.0.5", diff --git a/website/scripts/sync-docs.js b/website/scripts/sync-docs.js index a21b50707b..0e18613cd8 100644 --- a/website/scripts/sync-docs.js +++ b/website/scripts/sync-docs.js @@ -25,7 +25,6 @@ const DEST_DIR = path.resolve(__dirname, '../docs'); const BLOG_SOURCE_DIR = path.resolve(__dirname, '../../docs/blog'); const BLOG_DEST_DIR = path.resolve(__dirname, '../blog'); const API_SOURCE_DIR = path.resolve(__dirname, '../../docs/api'); -const API_DEST_DIR = path.resolve(__dirname, '../docs/api'); // Files that should be preserved during sync (not deleted) const PRESERVE_FILES = ['.gitignore']; @@ -37,7 +36,7 @@ const EXCLUDE_PATTERNS = [ /\.pyc$/, /^__pycache__$/, /^blog$/, // Blog is synced separately to website/blog - /^api$/, // API generator config is rendered separately into website/docs/api + /^api$/, // API generator config replaces the Qumat and QDP API pages ]; /** @@ -217,28 +216,24 @@ function runCommand(command, args, options = {}) { * Generate Python API reference docs with pydoc-markdown. */ function generateApiDocs() { - fs.rmSync(API_DEST_DIR, { recursive: true, force: true }); - ensureDir(API_DEST_DIR); - - copyFile(path.join(API_SOURCE_DIR, 'index.md'), path.join(API_DEST_DIR, 'index.md')); - const pages = [ { header: 'qumat_header.md', config: 'qumat.yml', - output: 'qumat.md', + output: path.join('qumat', 'api.md'), }, { header: 'qumat_qdp_header.md', config: 'qumat_qdp.yml', - output: 'qumat_qdp.md', + output: path.join('qdp', 'api.md'), }, ]; if (process.env.MAHOUT_SKIP_API_DOCS === '1') { console.log('Skipping generated Python API reference docs.'); for (const page of pages) { - const outputPath = path.join(API_DEST_DIR, page.output); + const outputPath = path.join(DEST_DIR, page.output); + ensureDir(path.dirname(outputPath)); copyFile(path.join(API_SOURCE_DIR, page.header), outputPath); fs.appendFileSync( outputPath, @@ -251,7 +246,8 @@ function generateApiDocs() { runCommand('uv', ['sync', '--frozen', '--group', 'dev']); for (const page of pages) { - const outputPath = path.join(API_DEST_DIR, page.output); + const outputPath = path.join(DEST_DIR, page.output); + ensureDir(path.dirname(outputPath)); copyFile(path.join(API_SOURCE_DIR, page.header), outputPath); const generated = runCommand( @@ -259,7 +255,7 @@ function generateApiDocs() { ['run', '--frozen', '--group', 'dev', 'pydoc-markdown', path.join('docs/api', page.config)], { capture: true }, ); - fs.appendFileSync(outputPath, generated); + fs.appendFileSync(outputPath, `\n${generated}`); } } diff --git a/website/sidebars.ts b/website/sidebars.ts index 98a9b03517..04ab3f4398 100644 --- a/website/sidebars.ts +++ b/website/sidebars.ts @@ -56,16 +56,6 @@ const sidebars: SidebarsConfig = { 'advanced/gap-analysis', ], }, - { - type: 'category', - label: 'API Reference (experiments)', - collapsed: true, - link: {type: 'doc', id: 'api/index'}, - items: [ - 'api/qumat', - 'api/qumat_qdp', - ], - }, { type: 'category', label: 'Quantum Computing Primer', diff --git a/website/tsconfig.json b/website/tsconfig.json index cb85b161c5..866360b0df 100644 --- a/website/tsconfig.json +++ b/website/tsconfig.json @@ -1,8 +1,18 @@ { // This file is not used in compilation. It is here just for a nice editor experience. - "extends": "@docusaurus/tsconfig", "compilerOptions": { - "baseUrl": "." + "allowJs": true, + "esModuleInterop": true, + "jsx": "preserve", + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "moduleResolution": "bundler", + "module": "esnext", + "noEmit": true, + "paths": { + "@site/*": ["./*"] + }, + "skipLibCheck": true }, "include": ["src/**/*", "docusaurus.config.ts", "sidebars.ts", "plugins/**/*"], "exclude": [".docusaurus", "build"] diff --git a/website/versioned_docs/version-0.6/community/who-we-are.md b/website/versioned_docs/version-0.6/community/who-we-are.md index 594a5a3ce4..426785cb85 100644 --- a/website/versioned_docs/version-0.6/community/who-we-are.md +++ b/website/versioned_docs/version-0.6/community/who-we-are.md @@ -26,6 +26,7 @@ Ellen Friedman | ellenf@... | No | @Ellen_Friedman Frank Scholten | frankscholten@... | No | Gokhan Capan | gcapan@... | No | Grant Ingersoll | gsingers@... | No | (Emeritus PMC) @gsingers +Guan-Hua (Vic) Wen | vicwen@... | No | @viiccwen Guan-Ming (Wesley) Chiu | guanmingchiu@... | Yes | @guan404ming Holden Karau | holden@... | No | Isabel Drost-Fromm | isabel@... | Yes |