commit a74881de49af5e034b5abaa1be0556347bc73b70 Author: stefan Date: Mon Jun 22 00:10:50 2026 +0900 basic project setup, tools and fsim diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..327c3ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,170 @@ +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# ---> JupyterNotebooks +# gitignore template for Jupyter Notebooks +# website: http://jupyter.org/ + +.ipynb_checkpoints +*/.ipynb_checkpoints/* + +# IPython +profile_default/ +ipython_config.py + +# Remove previous ipynb_checkpoints +# git rm -r .ipynb_checkpoints/ + +result +*nogit* \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..dc385e8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "kyupy"] + path = kyupy + url = git@git.vlab.cse.kyutech.ac.jp:stefan/kyupy.git + branch = devel diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/README.md b/README.md new file mode 100644 index 0000000..76f52c7 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# Fault Simulation + +PPSFP (Parallel-Pattern Single-Fault Propagation) style fault simulators and other utility functions for use in various projects. +These fault simulators are meant to be correct (ensured by unit-tests) and reasonably fast. + +## Quick Start + +This project has submodules. To ensure everything is up-to-date, run +``` +git submodule update --init --recursive +``` +after `git clone`, `git pull` or `git checkout`. + +This project manages reproducible programming environments with: +- [uv](https://docs.astral.sh/uv/) for managing python environments. +- [nix](https://nixos.org) for managing non-python tools and benchmark designs. Follow [this guide](https://librelane.readthedocs.io/en/stable/installation/nix_installation/index.html) or [this guide](https://github.com/fossi-foundation/nix-eda/blob/main/docs/installation.md) to setup [nix-eda](https://github.com/fossi-foundation/nix-eda/tree/main) binary cache to avoid re-building EDA-related tools. + +Smoke-test: `uv run pytest` + +For running Jupyter Notebooks in the reproducible programming environment, install a kernelspec with this command: +``` +uv run ipython kernel install --user --env VIRTUAL_ENV $(pwd)/.venv --env PATH ${PATH} --name=uv-env +``` +Run a Jupyter Lab server locally: +``` +uv run jupyter lab +``` +Choose `uv-env` as kernel in Jupyter Lab. + +`uv run main.py ` runs a naive, baseline fault simulation. + +`nix develop` makes [quaigh](https://github.com/coloquinte/quaigh) available, another simulator/atpg written in rust. + + diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..e8ce10c --- /dev/null +++ b/flake.lock @@ -0,0 +1,153 @@ +{ + "nodes": { + "fenix": { + "inputs": { + "nixpkgs": [ + "nl2bench", + "quaigh", + "naersk", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1752475459, + "narHash": "sha256-z6QEu4ZFuHiqdOPbYss4/Q8B0BFhacR8ts6jO/F/aOU=", + "owner": "nix-community", + "repo": "fenix", + "rev": "bf0d6f70f4c9a9cf8845f992105652173f4b617f", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "naersk": { + "inputs": { + "fenix": "fenix", + "nixpkgs": [ + "nl2bench", + "quaigh", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1763384566, + "narHash": "sha256-r+wgI+WvNaSdxQmqaM58lVNvJYJ16zoq+tKN20cLst4=", + "owner": "nix-community", + "repo": "naersk", + "rev": "d4155d6ebb70fbe2314959842f744aa7cabbbf6a", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "naersk", + "type": "github" + } + }, + "nix-eda": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1768614091, + "narHash": "sha256-UElQINIEz44UlEXP9eIJmjMuCIkP9fS8+WitJwyTYzw=", + "owner": "fossi-foundation", + "repo": "nix-eda", + "rev": "8d6f4ea82716b59bc6eff6b070304e1b916b2c75", + "type": "github" + }, + "original": { + "owner": "fossi-foundation", + "ref": "6.0.2", + "repo": "nix-eda", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1766201043, + "narHash": "sha256-eplAP+rorKKd0gNjV3rA6+0WMzb1X1i16F5m5pASnjA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "b3aad468604d3e488d627c0b43984eb60e75e782", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nl2bench": { + "inputs": { + "nix-eda": "nix-eda", + "quaigh": "quaigh" + }, + "locked": { + "lastModified": 1777493983, + "narHash": "sha256-QY90b9hKxAt68xYvRbcMXbDrLTQwsx9TpG8+CGG8iK8=", + "owner": "donn", + "repo": "nl2bench", + "rev": "0c5aadc0119c6178357102f7eb8ff2bdb0dc8a12", + "type": "github" + }, + "original": { + "owner": "donn", + "repo": "nl2bench", + "type": "github" + } + }, + "quaigh": { + "inputs": { + "naersk": "naersk", + "nixpkgs": [ + "nl2bench", + "nix-eda", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1768613600, + "narHash": "sha256-dcGI2FVd0SyrN5RaZXc5VrYY37pKtb/pZhNSV7MtNGE=", + "owner": "donn", + "repo": "quaigh", + "rev": "994aef4a5100ef3756032af86c51df1f932dd601", + "type": "github" + }, + "original": { + "owner": "donn", + "ref": "nixos_25.11", + "repo": "quaigh", + "type": "github" + } + }, + "root": { + "inputs": { + "nl2bench": "nl2bench" + } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1752428706, + "narHash": "sha256-EJcdxw3aXfP8Ex1Nm3s0awyH9egQvB2Gu+QEnJn2Sfg=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "591e3b7624be97e4443ea7b5542c191311aa141d", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..f354fab --- /dev/null +++ b/flake.nix @@ -0,0 +1,35 @@ +# +# Enable this shell by calling 'nix develop' in the same directory as this file. +# + +{ + description = "project development shell"; + + inputs = { + # 'quaigh' (logic synthesis / ATPG) is not in nixpkgs. The nl2bench overlay + # builds it from crates.io via naersk and pulls in nix-eda (and its nixpkgs). + nl2bench.url = "github:donn/nl2bench"; + }; + + outputs = { self, nl2bench }: + let + nix-eda = nl2bench.inputs.nix-eda; + nixpkgs = nix-eda.inputs.nixpkgs; + in { + devShells = nix-eda.forAllSystems (system: + let + pkgs = import nixpkgs { + inherit system; + overlays = [ nix-eda.overlays.default nl2bench.overlays.default ]; + }; + in { + default = pkgs.mkShell { + packages = [ + pkgs.uv + pkgs.quaigh + ]; + }; + } + ); + }; +} diff --git a/kyupy b/kyupy new file mode 160000 index 0000000..449bf9a --- /dev/null +++ b/kyupy @@ -0,0 +1 @@ +Subproject commit 449bf9a0314c43cd0dfbafb6ad98c97d9c9803ce diff --git a/main.py b/main.py new file mode 100755 index 0000000..fab81a5 --- /dev/null +++ b/main.py @@ -0,0 +1,97 @@ +#!/usr/bin/env -S uv run +import argparse +import subprocess +from pathlib import Path + +import numpy as np + +from kyupy import verilog, bench, log, logic, batchrange +from kyupy.techlib import techlib_by_name, KYUPY +from kyupy.logic_sim import LogicSim2V + +from fsim.static import LineRoles, FaultSet + +def main(): + + parser = argparse.ArgumentParser(description='Fault Stats') + parser.add_argument('-t', '--tlib', default='SKY130', help=f'techlib of circuit. default: SKY130, available: {sorted(techlib_by_name.keys())}.') + parser.add_argument('-p', '--patterns', default=1024, help='Number of random patterns to simulate.') + parser.add_argument('--seed', type=int, default=42, help='Random seed for reproducibility (default: 42).') + parser.add_argument('circuit', help='gate-level verilog file or nix package to import. See "nix flake show github:s-holst/benchmark-circuits" for available packages.') + args = parser.parse_args() + args.patterns = int(args.patterns) + args.tlib = techlib_by_name[args.tlib] + + if not (circuit_path := Path(args.circuit)).exists(): # fallback to published nix package. + nix_cmd = f"nix build github:s-holst/benchmark-circuits#{args.circuit} --print-out-paths --no-link" + benchmark_path = Path(subprocess.check_output(nix_cmd.split(), text=True).strip()) + circuit_path = next(benchmark_path.glob("*/nl/*.nl.v")) + + log.info(f'loading {circuit_path} ...') + if circuit_path.name.endswith('.bench'): + c = bench.load(circuit_path) + args.tlib = techlib_by_name['KYUPY'] + else: + c = verilog.load(circuit_path, tlib=args.tlib) + stats = {k.replace('__',''): v for k, v in c.stats(args.tlib).items() if k.startswith('__') or k.endswith('put')} + log.info(f'circuit {stats=}') + + lr = LineRoles(c, args.tlib) + log.info(f'line role stats={lr.stats}') + + fs = FaultSet(c, args.tlib) + log.info(f'fault sites: {len(fs.fault_sites)}') + log.info(f'collapsed stuck-at fault count: {len(fs.saf_equiv_classes)}') + + c.resolve_tlib_cells(args.tlib) + + ffr_stems = [] + for stem, _ in c.fanout_free_regions(KYUPY): + if len(stem.outs) > 0 and stem.outs[0] is not None: + ffr_stems.append(stem.outs[0]) + ffr_stems = np.array(ffr_stems, dtype=np.uint32) + + log.info(f'FFR count: {len(ffr_stems)}') + + sim = LogicSim2V(c, sims=min(args.patterns, 10240)) + + rng = np.random.default_rng(args.seed) + patterns = rng.choice( + [logic.ZERO, logic.ONE], + size=(sim.s_len, args.patterns), + ).astype(np.uint8) + + golden = np.zeros_like(patterns) + log.info(f'{sim=}') + + sim.simulate(patterns, golden) + log.info(f'golden sim finished.') + + syndrome = np.zeros_like(patterns) + + injection_faults = np.array(list(fs.saf_equiv_classes.keys()), dtype=np.uint32) + rng.shuffle(injection_faults) + + undetected = set() + detected = set() + + with log.progress() as p: + for fidx, fault in enumerate(injection_faults): + fault_site = fault//2 + fault_polarity = fault&1 + p.update((fidx+1) / len(injection_faults), f'd:{len(detected)} u:{len(undetected)}') + for bo, bs in batchrange(patterns.shape[1], sim.sims): + sim.s_assign[:, :bs] = patterns[:, bo:bo+bs] + sim.s_to_c() + sim.c_prop(fault_line=fault_site, fault_model=fault_polarity) + sim.c_to_s() + syndrome[:, bo:bo+bs] = sim.s_result[:,:bs] + if np.allclose(golden, syndrome): + undetected.add(fault) + else: + detected.add(fault) + + log.info(f'detected by simulation: {len(detected)}/{len(injection_faults)} - {len(detected)/len(injection_faults)*100:.1f}%') + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..24c0806 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,33 @@ +[project] +name = "fsim" +version = "0.0.1" +description = "PPSFP (Parallel-Pattern Single-Fault Propagation) style fault simulators and other utility functions for use in various projects" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "kyupy", + "numba>=0.65.1", + "numba-cuda[cu13]>=0.30.1; sys_platform != 'darwin'", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[dependency-groups] +dev = [ + "isort>=8.0.1", + "pytest>=9.0.1", + "ipython>=9.14.1", + "jupyter>=1.1.1", + "graphviz", +] + +[tool.uv.workspace] +members = [ + "kyupy", +] + +[tool.uv.sources] +kyupy = { workspace = true, editable = true } + diff --git a/src/fsim/__init__.py b/src/fsim/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/fsim/static.py b/src/fsim/static.py new file mode 100644 index 0000000..8a6d2e4 --- /dev/null +++ b/src/fsim/static.py @@ -0,0 +1,193 @@ +"""A set of tools for static (structural) analysis of gate-level circuits. +""" + +from collections import defaultdict +from itertools import product + +import numpy as np + +from kyupy.circuit import Circuit, Node +from kyupy.techlib import TechLib + +class LineRoles: + """Computes signal line roles of a circuit depending on the structural reach of each signal. + + The possible roles are any combination of the following: + - 'lout' / LOGIC_OUT: there is a structural path to a primary output via zero or more combinational gates. + - 'lseq' / LOGIC_SEQ: there is a structural path to a D input of a sequential cell via zero or more combinational gates. + - 'clk' / CLOCK: there is a structural path to a clock input of a sequential cell via zero or more combinational gates. + - 'rst' / RESET: there is a structural path to an asynchronous set or reset input of a sequential cell via zero or more combinational gates. + - 'dft' / DFT: there is a structural path to an scan-in or scan-enable input of a sequential cell via zero or more combinational gates. + + Signal lines that may propagate to various cells may have multiple roles. + The roles are encoded using bit positions in integers. + The corresponding masks are defines as class constants LOGIC_OUT, LOGIC_SEQ, etc. + """ + + LOGIC_OUT = 1 + LOGIC_SEQ = 2 + CLOCK = 4 + RESET = 8 + DFT = 16 + + def __init__(self, circuit: Circuit, tlib: TechLib): + self.line2roles = np.zeros(len(circuit.lines), dtype=np.uint8) + """Array of roles for each line index in the circuit. + """ + + outputs = {n for n in circuit.io_nodes if len(n.ins) > 0} + + for n in circuit.reversed_topological_order(tlib): + if tlib.is_dff(n.kind): + for il in n.ins.without_nones(): + pname = tlib.pin_name(n.kind, il.reader_pin) + if pname == 'D': self.line2roles[il] = self.LOGIC_SEQ + elif pname in ('CK', 'CLK', 'CLK_N'): self.line2roles[il] = self.CLOCK + elif pname in ('SET_B', 'RESET_B', 'SETB', 'RSTB', 'RN', 'SN'): self.line2roles[il] = self.RESET + elif pname in ('SCD', 'SCE', 'SE', 'SI'): self.line2roles[il] = self.DFT + else: raise ValueError(f'Unable to classify pin name "{pname}" for "{n.kind}".') + elif n in outputs: # or len(n.outs) == 0: + for il in n.ins.without_nones(): + self.line2roles[il] = self.LOGIC_OUT + else: + lc = 0 + for ol in n.outs.without_nones(): + lc |= self.line2roles[ol] + for il in n.ins.without_nones(): + self.line2roles[il] = lc + + self.roles2lines: defaultdict[int,set[int]] = defaultdict(set) + """A dictionary that maps a role combination to a set of line indices matching that role combination. + """ + for li, lc in enumerate(self.line2roles): + self.roles2lines[lc].add(li) + + @classmethod + def roles_str(cls, roles: int) -> str: + """Returns a human-readable string for a role combination given as int. + """ + roles_list = [n for v, n in ( + (cls.LOGIC_OUT, 'lout'), + (cls.LOGIC_SEQ, 'lseq'), + (cls.CLOCK, 'clk'), + (cls.RESET, 'rst'), + (cls.DFT, 'dft')) if (roles&v) != 0] + return 'none' if len(roles_list) == 0 else '|'.join(roles_list) + + @property + def stats(self): + """A dictionary mapping each role combination to the number of matching signal lines. + """ + return {self.roles_str(roles): len(self.roles2lines[roles]) for roles in range(256) if len(self.roles2lines[roles]) > 0} + + +class FaultSet: + """Computes eligible fault sites and a collapsed set of stuck-at faults for a circuit. + + Faults in this class are represented by integers of the form: `line_index * 2 + polarity`. + Line index defines the location in the circuit, and polarity is 0 for stuck-at-0 and 1 for stuck-at-1. + Faults sites are located only in the combinational portion of the circuit (excluding clock tree, asynchronous set/reset logic, dft/scan). + Stuck-at faults are collapsed using basic controlling-value theory of simple gates. + """ + + def __init__(self, circuit: Circuit, tlib: TechLib): + lr = LineRoles(circuit, tlib) + + self.fault_sites = {l.index for l in circuit.lines + if (lr.line2roles[l] & (lr.LOGIC_OUT|lr.LOGIC_SEQ)) # line propagates to output or sequential element + and ( + (l.driver.kind == '__fork__' and len(l.driver.outs) > 1) # fanout branch + or (l.driver.kind == '__fork__' and len(l.driver.ins) == 0) # primary input + or (l.driver.kind != '__fork__' ) # gate output + ) + } + """Set of line indices of all eligible fault sites. A fault site is eligible iff: + fault effect can propagate via combinational gates (only) to outputs of to a flip-flop, AND + (fault site is driven by a standard cell OR it is a primary input signal OR it is a branch of a fan-out). + """ + + self.saf_set = {site*2+polarity for site, polarity in product(self.fault_sites, (0, 1))} + """Set of all stuck-at faults in the circuit. Each stuck-at fault is encoded as integer i with + i & 1 being the polarity and i // 2 the circuit line index of its location. + """ + + self.saf_equiv_classes : dict[int,set[int]] = {} + r"""Dictionary mapping a representative stuck-at fault to its set of equivalent faults. The + representative is always the fault closest to the circuit's outputs. The value set of + representative f always contains at least f (:math:`f \in` saf_equiv_classes[f]). + """ + + def collect_equivalent_faults(circuit: Circuit, fault: int) -> set: + site = fault//2 + polarity = fault&1 + driver = circuit.lines[site].driver + # Stop collapsing at fanout stems, primary inputs, and cells whose + # output faults have no equivalent single-input fault (XOR/XNOR, MUX, the two-term + # AND-OR/OR-AND cells, and sequential elements). + if len(driver.outs) > 1 or len(driver.ins) == 0 or driver.kind in ('XOR2', 'XOR3', 'XOR4', 'XNOR2', 'XNOR3', 'XNOR4', 'MUX21', 'AO22', 'AOI22', 'OA22', 'OAI22', 'DFF', 'LATCH'): return {fault} + if driver.kind == 'INV1': return {fault} | collect_equivalent_faults(circuit, driver.ins[0].index*2 + (1-polarity)) + if driver.kind in ('BUF1', '__fork__'): return {fault} | collect_equivalent_faults(circuit, driver.ins[0].index*2 + (polarity)) + + def collapse(*faults: tuple) -> set: + """Collapse the output fault onto the given (input_line, stuck_value) pairs.""" + equiv = {fault} + for site, value in faults: + equiv |= collect_equivalent_faults(circuit, site.index*2 + value) + return equiv + + # Simple gates: driving any input to its controlling value forces the output. + # AND : out s-a-0 == every input s-a-0 (out s-a-1 has no equivalent) + # NAND: out s-a-1 == every input s-a-0 (out s-a-0 has no equivalent) + # OR : out s-a-1 == every input s-a-1 (out s-a-0 has no equivalent) + # NOR : out s-a-0 == every input s-a-1 (out s-a-1 has no equivalent) + if driver.kind.startswith('NAND'): + return collapse(*((il, 0) for il in driver.ins.without_nones())) if polarity == 1 else {fault} + if driver.kind.startswith('AND'): + return collapse(*((il, 0) for il in driver.ins.without_nones())) if polarity == 0 else {fault} + if driver.kind.startswith('NOR'): + return collapse(*((il, 1) for il in driver.ins.without_nones())) if polarity == 0 else {fault} + if driver.kind.startswith('OR'): + return collapse(*((il, 1) for il in driver.ins.without_nones())) if polarity == 1 else {fault} + + # AND-OR / OR-AND complex gates: only the "single" (un-paired) terms force the output. + # AO21 = (i0&i1) | i2 : out s-a-1 == i2 s-a-1 + # AOI21 = ~AO21 : out s-a-0 == i2 s-a-1 + # OA21 = (i0|i1) & i2 : out s-a-0 == i2 s-a-0 + # OAI21 = ~OA21 : out s-a-1 == i2 s-a-0 + # AO211 = (i0&i1) | i2 | i3 : out s-a-1 == i2 s-a-1, i3 s-a-1 + # AOI211= ~AO211 : out s-a-0 == i2 s-a-1, i3 s-a-1 + # OA211 = (i0|i1) & i2 & i3 : out s-a-0 == i2 s-a-0, i3 s-a-0 + # OAI211= ~OA211 : out s-a-1 == i2 s-a-0, i3 s-a-0 + if driver.kind == 'AO21': return collapse((driver.ins[2], 1)) if polarity == 1 else {fault} + if driver.kind == 'AOI21': return collapse((driver.ins[2], 1)) if polarity == 0 else {fault} + if driver.kind == 'OA21': return collapse((driver.ins[2], 0)) if polarity == 0 else {fault} + if driver.kind == 'OAI21': return collapse((driver.ins[2], 0)) if polarity == 1 else {fault} + if driver.kind == 'AO211': return collapse((driver.ins[2], 1), (driver.ins[3], 1)) if polarity == 1 else {fault} + if driver.kind == 'AOI211': return collapse((driver.ins[2], 1), (driver.ins[3], 1)) if polarity == 0 else {fault} + if driver.kind == 'OA211': return collapse((driver.ins[2], 0), (driver.ins[3], 0)) if polarity == 0 else {fault} + if driver.kind == 'OAI211': return collapse((driver.ins[2], 0), (driver.ins[3], 0)) if polarity == 1 else {fault} + + raise ValueError(f'Unknown node kind {driver.kind}. Circuit should have been resolved to techlib.KYUPY?') + + remaining = self.saf_set.copy() + circuit_resolved = circuit.copy() + circuit_resolved.resolve_tlib_cells(tlib) + for n in circuit.reversed_topological_order(tlib): + for il in n.ins.without_nones(): + for polarity in (0, 1): + repr = il.index*2+polarity + if repr in remaining: + equiv = collect_equivalent_faults(circuit_resolved, repr) & remaining + remaining.difference_update(equiv) + self.saf_equiv_classes[repr] = equiv + + self.circuit = circuit + self.tlib = tlib + + def fault_str(self, fault: int) -> str: + site = self.circuit.lines[fault//2] + polarity = '@1' if fault&1 else '@0' + if site.driver.kind == '__fork__': + return f'{site.reader.name}/{self.tlib.pin_name(site.reader.kind, site.reader_pin)}{polarity}' + else: + return f'{site.driver.name}/{self.tlib.pin_name(site.driver.kind, site.driver_pin, output=True)}{polarity}' diff --git a/tests/c6288.bench b/tests/c6288.bench new file mode 100644 index 0000000..4a12d7a --- /dev/null +++ b/tests/c6288.bench @@ -0,0 +1,2488 @@ +# c6288 +# 32 inputs +# 32 outputs +# 32 inverters +# 2384 gates ( 256 ANDs + 32 NANDs + 2128 NORs ) + +INPUT(1) +INPUT(18) +INPUT(35) +INPUT(52) +INPUT(69) +INPUT(86) +INPUT(103) +INPUT(120) +INPUT(137) +INPUT(154) +INPUT(171) +INPUT(188) +INPUT(205) +INPUT(222) +INPUT(239) +INPUT(256) +INPUT(273) +INPUT(290) +INPUT(307) +INPUT(324) +INPUT(341) +INPUT(358) +INPUT(375) +INPUT(392) +INPUT(409) +INPUT(426) +INPUT(443) +INPUT(460) +INPUT(477) +INPUT(494) +INPUT(511) +INPUT(528) + +OUTPUT(545) +OUTPUT(1581) +OUTPUT(1901) +OUTPUT(2223) +OUTPUT(2548) +OUTPUT(2877) +OUTPUT(3211) +OUTPUT(3552) +OUTPUT(3895) +OUTPUT(4241) +OUTPUT(4591) +OUTPUT(4946) +OUTPUT(5308) +OUTPUT(5672) +OUTPUT(5971) +OUTPUT(6123) +OUTPUT(6150) +OUTPUT(6160) +OUTPUT(6170) +OUTPUT(6180) +OUTPUT(6190) +OUTPUT(6200) +OUTPUT(6210) +OUTPUT(6220) +OUTPUT(6230) +OUTPUT(6240) +OUTPUT(6250) +OUTPUT(6260) +OUTPUT(6270) +OUTPUT(6280) +OUTPUT(6287) +OUTPUT(6288) + +545 = AND(1, 273) +546 = AND(1, 290) +549 = AND(1, 307) +552 = AND(1, 324) +555 = AND(1, 341) +558 = AND(1, 358) +561 = AND(1, 375) +564 = AND(1, 392) +567 = AND(1, 409) +570 = AND(1, 426) +573 = AND(1, 443) +576 = AND(1, 460) +579 = AND(1, 477) +582 = AND(1, 494) +585 = AND(1, 511) +588 = AND(1, 528) +591 = AND(18, 273) +594 = AND(18, 290) +597 = AND(18, 307) +600 = AND(18, 324) +603 = AND(18, 341) +606 = AND(18, 358) +609 = AND(18, 375) +612 = AND(18, 392) +615 = AND(18, 409) +618 = AND(18, 426) +621 = AND(18, 443) +624 = AND(18, 460) +627 = AND(18, 477) +630 = AND(18, 494) +633 = AND(18, 511) +636 = AND(18, 528) +639 = AND(35, 273) +642 = AND(35, 290) +645 = AND(35, 307) +648 = AND(35, 324) +651 = AND(35, 341) +654 = AND(35, 358) +657 = AND(35, 375) +660 = AND(35, 392) +663 = AND(35, 409) +666 = AND(35, 426) +669 = AND(35, 443) +672 = AND(35, 460) +675 = AND(35, 477) +678 = AND(35, 494) +681 = AND(35, 511) +684 = AND(35, 528) +687 = AND(52, 273) +690 = AND(52, 290) +693 = AND(52, 307) +696 = AND(52, 324) +699 = AND(52, 341) +702 = AND(52, 358) +705 = AND(52, 375) +708 = AND(52, 392) +711 = AND(52, 409) +714 = AND(52, 426) +717 = AND(52, 443) +720 = AND(52, 460) +723 = AND(52, 477) +726 = AND(52, 494) +729 = AND(52, 511) +732 = AND(52, 528) +735 = AND(69, 273) +738 = AND(69, 290) +741 = AND(69, 307) +744 = AND(69, 324) +747 = AND(69, 341) +750 = AND(69, 358) +753 = AND(69, 375) +756 = AND(69, 392) +759 = AND(69, 409) +762 = AND(69, 426) +765 = AND(69, 443) +768 = AND(69, 460) +771 = AND(69, 477) +774 = AND(69, 494) +777 = AND(69, 511) +780 = AND(69, 528) +783 = AND(86, 273) +786 = AND(86, 290) +789 = AND(86, 307) +792 = AND(86, 324) +795 = AND(86, 341) +798 = AND(86, 358) +801 = AND(86, 375) +804 = AND(86, 392) +807 = AND(86, 409) +810 = AND(86, 426) +813 = AND(86, 443) +816 = AND(86, 460) +819 = AND(86, 477) +822 = AND(86, 494) +825 = AND(86, 511) +828 = AND(86, 528) +831 = AND(103, 273) +834 = AND(103, 290) +837 = AND(103, 307) +840 = AND(103, 324) +843 = AND(103, 341) +846 = AND(103, 358) +849 = AND(103, 375) +852 = AND(103, 392) +855 = AND(103, 409) +858 = AND(103, 426) +861 = AND(103, 443) +864 = AND(103, 460) +867 = AND(103, 477) +870 = AND(103, 494) +873 = AND(103, 511) +876 = AND(103, 528) +879 = AND(120, 273) +882 = AND(120, 290) +885 = AND(120, 307) +888 = AND(120, 324) +891 = AND(120, 341) +894 = AND(120, 358) +897 = AND(120, 375) +900 = AND(120, 392) +903 = AND(120, 409) +906 = AND(120, 426) +909 = AND(120, 443) +912 = AND(120, 460) +915 = AND(120, 477) +918 = AND(120, 494) +921 = AND(120, 511) +924 = AND(120, 528) +927 = AND(137, 273) +930 = AND(137, 290) +933 = AND(137, 307) +936 = AND(137, 324) +939 = AND(137, 341) +942 = AND(137, 358) +945 = AND(137, 375) +948 = AND(137, 392) +951 = AND(137, 409) +954 = AND(137, 426) +957 = AND(137, 443) +960 = AND(137, 460) +963 = AND(137, 477) +966 = AND(137, 494) +969 = AND(137, 511) +972 = AND(137, 528) +975 = AND(154, 273) +978 = AND(154, 290) +981 = AND(154, 307) +984 = AND(154, 324) +987 = AND(154, 341) +990 = AND(154, 358) +993 = AND(154, 375) +996 = AND(154, 392) +999 = AND(154, 409) +1002 = AND(154, 426) +1005 = AND(154, 443) +1008 = AND(154, 460) +1011 = AND(154, 477) +1014 = AND(154, 494) +1017 = AND(154, 511) +1020 = AND(154, 528) +1023 = AND(171, 273) +1026 = AND(171, 290) +1029 = AND(171, 307) +1032 = AND(171, 324) +1035 = AND(171, 341) +1038 = AND(171, 358) +1041 = AND(171, 375) +1044 = AND(171, 392) +1047 = AND(171, 409) +1050 = AND(171, 426) +1053 = AND(171, 443) +1056 = AND(171, 460) +1059 = AND(171, 477) +1062 = AND(171, 494) +1065 = AND(171, 511) +1068 = AND(171, 528) +1071 = AND(188, 273) +1074 = AND(188, 290) +1077 = AND(188, 307) +1080 = AND(188, 324) +1083 = AND(188, 341) +1086 = AND(188, 358) +1089 = AND(188, 375) +1092 = AND(188, 392) +1095 = AND(188, 409) +1098 = AND(188, 426) +1101 = AND(188, 443) +1104 = AND(188, 460) +1107 = AND(188, 477) +1110 = AND(188, 494) +1113 = AND(188, 511) +1116 = AND(188, 528) +1119 = AND(205, 273) +1122 = AND(205, 290) +1125 = AND(205, 307) +1128 = AND(205, 324) +1131 = AND(205, 341) +1134 = AND(205, 358) +1137 = AND(205, 375) +1140 = AND(205, 392) +1143 = AND(205, 409) +1146 = AND(205, 426) +1149 = AND(205, 443) +1152 = AND(205, 460) +1155 = AND(205, 477) +1158 = AND(205, 494) +1161 = AND(205, 511) +1164 = AND(205, 528) +1167 = AND(222, 273) +1170 = AND(222, 290) +1173 = AND(222, 307) +1176 = AND(222, 324) +1179 = AND(222, 341) +1182 = AND(222, 358) +1185 = AND(222, 375) +1188 = AND(222, 392) +1191 = AND(222, 409) +1194 = AND(222, 426) +1197 = AND(222, 443) +1200 = AND(222, 460) +1203 = AND(222, 477) +1206 = AND(222, 494) +1209 = AND(222, 511) +1212 = AND(222, 528) +1215 = AND(239, 273) +1218 = AND(239, 290) +1221 = AND(239, 307) +1224 = AND(239, 324) +1227 = AND(239, 341) +1230 = AND(239, 358) +1233 = AND(239, 375) +1236 = AND(239, 392) +1239 = AND(239, 409) +1242 = AND(239, 426) +1245 = AND(239, 443) +1248 = AND(239, 460) +1251 = AND(239, 477) +1254 = AND(239, 494) +1257 = AND(239, 511) +1260 = AND(239, 528) +1263 = AND(256, 273) +1266 = AND(256, 290) +1269 = AND(256, 307) +1272 = AND(256, 324) +1275 = AND(256, 341) +1278 = AND(256, 358) +1281 = AND(256, 375) +1284 = AND(256, 392) +1287 = AND(256, 409) +1290 = AND(256, 426) +1293 = AND(256, 443) +1296 = AND(256, 460) +1299 = AND(256, 477) +1302 = AND(256, 494) +1305 = AND(256, 511) +1308 = AND(256, 528) +1311 = NOT(591) +1315 = NOT(639) +1319 = NOT(687) +1323 = NOT(735) +1327 = NOT(783) +1331 = NOT(831) +1335 = NOT(879) +1339 = NOT(927) +1343 = NOT(975) +1347 = NOT(1023) +1351 = NOT(1071) +1355 = NOT(1119) +1359 = NOT(1167) +1363 = NOT(1215) +1367 = NOT(1263) +1371 = NOR(591, 1311) +1372 = NOT(1311) +1373 = NOR(639, 1315) +1374 = NOT(1315) +1375 = NOR(687, 1319) +1376 = NOT(1319) +1377 = NOR(735, 1323) +1378 = NOT(1323) +1379 = NOR(783, 1327) +1380 = NOT(1327) +1381 = NOR(831, 1331) +1382 = NOT(1331) +1383 = NOR(879, 1335) +1384 = NOT(1335) +1385 = NOR(927, 1339) +1386 = NOT(1339) +1387 = NOR(975, 1343) +1388 = NOT(1343) +1389 = NOR(1023, 1347) +1390 = NOT(1347) +1391 = NOR(1071, 1351) +1392 = NOT(1351) +1393 = NOR(1119, 1355) +1394 = NOT(1355) +1395 = NOR(1167, 1359) +1396 = NOT(1359) +1397 = NOR(1215, 1363) +1398 = NOT(1363) +1399 = NOR(1263, 1367) +1400 = NOT(1367) +1401 = NOR(1371, 1372) +1404 = NOR(1373, 1374) +1407 = NOR(1375, 1376) +1410 = NOR(1377, 1378) +1413 = NOR(1379, 1380) +1416 = NOR(1381, 1382) +1419 = NOR(1383, 1384) +1422 = NOR(1385, 1386) +1425 = NOR(1387, 1388) +1428 = NOR(1389, 1390) +1431 = NOR(1391, 1392) +1434 = NOR(1393, 1394) +1437 = NOR(1395, 1396) +1440 = NOR(1397, 1398) +1443 = NOR(1399, 1400) +1446 = NOR(1401, 546) +1450 = NOR(1404, 594) +1454 = NOR(1407, 642) +1458 = NOR(1410, 690) +1462 = NOR(1413, 738) +1466 = NOR(1416, 786) +1470 = NOR(1419, 834) +1474 = NOR(1422, 882) +1478 = NOR(1425, 930) +1482 = NOR(1428, 978) +1486 = NOR(1431, 1026) +1490 = NOR(1434, 1074) +1494 = NOR(1437, 1122) +1498 = NOR(1440, 1170) +1502 = NOR(1443, 1218) +1506 = NOR(1401, 1446) +1507 = NOR(1446, 546) +1508 = NOR(1311, 1446) +1511 = NOR(1404, 1450) +1512 = NOR(1450, 594) +1513 = NOR(1315, 1450) +1516 = NOR(1407, 1454) +1517 = NOR(1454, 642) +1518 = NOR(1319, 1454) +1521 = NOR(1410, 1458) +1522 = NOR(1458, 690) +1523 = NOR(1323, 1458) +1526 = NOR(1413, 1462) +1527 = NOR(1462, 738) +1528 = NOR(1327, 1462) +1531 = NOR(1416, 1466) +1532 = NOR(1466, 786) +1533 = NOR(1331, 1466) +1536 = NOR(1419, 1470) +1537 = NOR(1470, 834) +1538 = NOR(1335, 1470) +1541 = NOR(1422, 1474) +1542 = NOR(1474, 882) +1543 = NOR(1339, 1474) +1546 = NOR(1425, 1478) +1547 = NOR(1478, 930) +1548 = NOR(1343, 1478) +1551 = NOR(1428, 1482) +1552 = NOR(1482, 978) +1553 = NOR(1347, 1482) +1556 = NOR(1431, 1486) +1557 = NOR(1486, 1026) +1558 = NOR(1351, 1486) +1561 = NOR(1434, 1490) +1562 = NOR(1490, 1074) +1563 = NOR(1355, 1490) +1566 = NOR(1437, 1494) +1567 = NOR(1494, 1122) +1568 = NOR(1359, 1494) +1571 = NOR(1440, 1498) +1572 = NOR(1498, 1170) +1573 = NOR(1363, 1498) +1576 = NOR(1443, 1502) +1577 = NOR(1502, 1218) +1578 = NOR(1367, 1502) +1581 = NOR(1506, 1507) +1582 = NOR(1511, 1512) +1585 = NOR(1516, 1517) +1588 = NOR(1521, 1522) +1591 = NOR(1526, 1527) +1594 = NOR(1531, 1532) +1597 = NOR(1536, 1537) +1600 = NOR(1541, 1542) +1603 = NOR(1546, 1547) +1606 = NOR(1551, 1552) +1609 = NOR(1556, 1557) +1612 = NOR(1561, 1562) +1615 = NOR(1566, 1567) +1618 = NOR(1571, 1572) +1621 = NOR(1576, 1577) +1624 = NOR(1266, 1578) +1628 = NOR(1582, 1508) +1632 = NOR(1585, 1513) +1636 = NOR(1588, 1518) +1640 = NOR(1591, 1523) +1644 = NOR(1594, 1528) +1648 = NOR(1597, 1533) +1652 = NOR(1600, 1538) +1656 = NOR(1603, 1543) +1660 = NOR(1606, 1548) +1664 = NOR(1609, 1553) +1668 = NOR(1612, 1558) +1672 = NOR(1615, 1563) +1676 = NOR(1618, 1568) +1680 = NOR(1621, 1573) +1684 = NOR(1266, 1624) +1685 = NOR(1624, 1578) +1686 = NOR(1582, 1628) +1687 = NOR(1628, 1508) +1688 = NOR(1585, 1632) +1689 = NOR(1632, 1513) +1690 = NOR(1588, 1636) +1691 = NOR(1636, 1518) +1692 = NOR(1591, 1640) +1693 = NOR(1640, 1523) +1694 = NOR(1594, 1644) +1695 = NOR(1644, 1528) +1696 = NOR(1597, 1648) +1697 = NOR(1648, 1533) +1698 = NOR(1600, 1652) +1699 = NOR(1652, 1538) +1700 = NOR(1603, 1656) +1701 = NOR(1656, 1543) +1702 = NOR(1606, 1660) +1703 = NOR(1660, 1548) +1704 = NOR(1609, 1664) +1705 = NOR(1664, 1553) +1706 = NOR(1612, 1668) +1707 = NOR(1668, 1558) +1708 = NOR(1615, 1672) +1709 = NOR(1672, 1563) +1710 = NOR(1618, 1676) +1711 = NOR(1676, 1568) +1712 = NOR(1621, 1680) +1713 = NOR(1680, 1573) +1714 = NOR(1684, 1685) +1717 = NOR(1686, 1687) +1720 = NOR(1688, 1689) +1723 = NOR(1690, 1691) +1726 = NOR(1692, 1693) +1729 = NOR(1694, 1695) +1732 = NOR(1696, 1697) +1735 = NOR(1698, 1699) +1738 = NOR(1700, 1701) +1741 = NOR(1702, 1703) +1744 = NOR(1704, 1705) +1747 = NOR(1706, 1707) +1750 = NOR(1708, 1709) +1753 = NOR(1710, 1711) +1756 = NOR(1712, 1713) +1759 = NOR(1714, 1221) +1763 = NOR(1717, 549) +1767 = NOR(1720, 597) +1771 = NOR(1723, 645) +1775 = NOR(1726, 693) +1779 = NOR(1729, 741) +1783 = NOR(1732, 789) +1787 = NOR(1735, 837) +1791 = NOR(1738, 885) +1795 = NOR(1741, 933) +1799 = NOR(1744, 981) +1803 = NOR(1747, 1029) +1807 = NOR(1750, 1077) +1811 = NOR(1753, 1125) +1815 = NOR(1756, 1173) +1819 = NOR(1714, 1759) +1820 = NOR(1759, 1221) +1821 = NOR(1624, 1759) +1824 = NOR(1717, 1763) +1825 = NOR(1763, 549) +1826 = NOR(1628, 1763) +1829 = NOR(1720, 1767) +1830 = NOR(1767, 597) +1831 = NOR(1632, 1767) +1834 = NOR(1723, 1771) +1835 = NOR(1771, 645) +1836 = NOR(1636, 1771) +1839 = NOR(1726, 1775) +1840 = NOR(1775, 693) +1841 = NOR(1640, 1775) +1844 = NOR(1729, 1779) +1845 = NOR(1779, 741) +1846 = NOR(1644, 1779) +1849 = NOR(1732, 1783) +1850 = NOR(1783, 789) +1851 = NOR(1648, 1783) +1854 = NOR(1735, 1787) +1855 = NOR(1787, 837) +1856 = NOR(1652, 1787) +1859 = NOR(1738, 1791) +1860 = NOR(1791, 885) +1861 = NOR(1656, 1791) +1864 = NOR(1741, 1795) +1865 = NOR(1795, 933) +1866 = NOR(1660, 1795) +1869 = NOR(1744, 1799) +1870 = NOR(1799, 981) +1871 = NOR(1664, 1799) +1874 = NOR(1747, 1803) +1875 = NOR(1803, 1029) +1876 = NOR(1668, 1803) +1879 = NOR(1750, 1807) +1880 = NOR(1807, 1077) +1881 = NOR(1672, 1807) +1884 = NOR(1753, 1811) +1885 = NOR(1811, 1125) +1886 = NOR(1676, 1811) +1889 = NOR(1756, 1815) +1890 = NOR(1815, 1173) +1891 = NOR(1680, 1815) +1894 = NOR(1819, 1820) +1897 = NOR(1269, 1821) +1901 = NOR(1824, 1825) +1902 = NOR(1829, 1830) +1905 = NOR(1834, 1835) +1908 = NOR(1839, 1840) +1911 = NOR(1844, 1845) +1914 = NOR(1849, 1850) +1917 = NOR(1854, 1855) +1920 = NOR(1859, 1860) +1923 = NOR(1864, 1865) +1926 = NOR(1869, 1870) +1929 = NOR(1874, 1875) +1932 = NOR(1879, 1880) +1935 = NOR(1884, 1885) +1938 = NOR(1889, 1890) +1941 = NOR(1894, 1891) +1945 = NOR(1269, 1897) +1946 = NOR(1897, 1821) +1947 = NOR(1902, 1826) +1951 = NOR(1905, 1831) +1955 = NOR(1908, 1836) +1959 = NOR(1911, 1841) +1963 = NOR(1914, 1846) +1967 = NOR(1917, 1851) +1971 = NOR(1920, 1856) +1975 = NOR(1923, 1861) +1979 = NOR(1926, 1866) +1983 = NOR(1929, 1871) +1987 = NOR(1932, 1876) +1991 = NOR(1935, 1881) +1995 = NOR(1938, 1886) +1999 = NOR(1894, 1941) +2000 = NOR(1941, 1891) +2001 = NOR(1945, 1946) +2004 = NOR(1902, 1947) +2005 = NOR(1947, 1826) +2006 = NOR(1905, 1951) +2007 = NOR(1951, 1831) +2008 = NOR(1908, 1955) +2009 = NOR(1955, 1836) +2010 = NOR(1911, 1959) +2011 = NOR(1959, 1841) +2012 = NOR(1914, 1963) +2013 = NOR(1963, 1846) +2014 = NOR(1917, 1967) +2015 = NOR(1967, 1851) +2016 = NOR(1920, 1971) +2017 = NOR(1971, 1856) +2018 = NOR(1923, 1975) +2019 = NOR(1975, 1861) +2020 = NOR(1926, 1979) +2021 = NOR(1979, 1866) +2022 = NOR(1929, 1983) +2023 = NOR(1983, 1871) +2024 = NOR(1932, 1987) +2025 = NOR(1987, 1876) +2026 = NOR(1935, 1991) +2027 = NOR(1991, 1881) +2028 = NOR(1938, 1995) +2029 = NOR(1995, 1886) +2030 = NOR(1999, 2000) +2033 = NOR(2001, 1224) +2037 = NOR(2004, 2005) +2040 = NOR(2006, 2007) +2043 = NOR(2008, 2009) +2046 = NOR(2010, 2011) +2049 = NOR(2012, 2013) +2052 = NOR(2014, 2015) +2055 = NOR(2016, 2017) +2058 = NOR(2018, 2019) +2061 = NOR(2020, 2021) +2064 = NOR(2022, 2023) +2067 = NOR(2024, 2025) +2070 = NOR(2026, 2027) +2073 = NOR(2028, 2029) +2076 = NOR(2030, 1176) +2080 = NOR(2001, 2033) +2081 = NOR(2033, 1224) +2082 = NOR(1897, 2033) +2085 = NOR(2037, 552) +2089 = NOR(2040, 600) +2093 = NOR(2043, 648) +2097 = NOR(2046, 696) +2101 = NOR(2049, 744) +2105 = NOR(2052, 792) +2109 = NOR(2055, 840) +2113 = NOR(2058, 888) +2117 = NOR(2061, 936) +2121 = NOR(2064, 984) +2125 = NOR(2067, 1032) +2129 = NOR(2070, 1080) +2133 = NOR(2073, 1128) +2137 = NOR(2030, 2076) +2138 = NOR(2076, 1176) +2139 = NOR(1941, 2076) +2142 = NOR(2080, 2081) +2145 = NOR(1272, 2082) +2149 = NOR(2037, 2085) +2150 = NOR(2085, 552) +2151 = NOR(1947, 2085) +2154 = NOR(2040, 2089) +2155 = NOR(2089, 600) +2156 = NOR(1951, 2089) +2159 = NOR(2043, 2093) +2160 = NOR(2093, 648) +2161 = NOR(1955, 2093) +2164 = NOR(2046, 2097) +2165 = NOR(2097, 696) +2166 = NOR(1959, 2097) +2169 = NOR(2049, 2101) +2170 = NOR(2101, 744) +2171 = NOR(1963, 2101) +2174 = NOR(2052, 2105) +2175 = NOR(2105, 792) +2176 = NOR(1967, 2105) +2179 = NOR(2055, 2109) +2180 = NOR(2109, 840) +2181 = NOR(1971, 2109) +2184 = NOR(2058, 2113) +2185 = NOR(2113, 888) +2186 = NOR(1975, 2113) +2189 = NOR(2061, 2117) +2190 = NOR(2117, 936) +2191 = NOR(1979, 2117) +2194 = NOR(2064, 2121) +2195 = NOR(2121, 984) +2196 = NOR(1983, 2121) +2199 = NOR(2067, 2125) +2200 = NOR(2125, 1032) +2201 = NOR(1987, 2125) +2204 = NOR(2070, 2129) +2205 = NOR(2129, 1080) +2206 = NOR(1991, 2129) +2209 = NOR(2073, 2133) +2210 = NOR(2133, 1128) +2211 = NOR(1995, 2133) +2214 = NOR(2137, 2138) +2217 = NOR(2142, 2139) +2221 = NOR(1272, 2145) +2222 = NOR(2145, 2082) +2223 = NOR(2149, 2150) +2224 = NOR(2154, 2155) +2227 = NOR(2159, 2160) +2230 = NOR(2164, 2165) +2233 = NOR(2169, 2170) +2236 = NOR(2174, 2175) +2239 = NOR(2179, 2180) +2242 = NOR(2184, 2185) +2245 = NOR(2189, 2190) +2248 = NOR(2194, 2195) +2251 = NOR(2199, 2200) +2254 = NOR(2204, 2205) +2257 = NOR(2209, 2210) +2260 = NOR(2214, 2211) +2264 = NOR(2142, 2217) +2265 = NOR(2217, 2139) +2266 = NOR(2221, 2222) +2269 = NOR(2224, 2151) +2273 = NOR(2227, 2156) +2277 = NOR(2230, 2161) +2281 = NOR(2233, 2166) +2285 = NOR(2236, 2171) +2289 = NOR(2239, 2176) +2293 = NOR(2242, 2181) +2297 = NOR(2245, 2186) +2301 = NOR(2248, 2191) +2305 = NOR(2251, 2196) +2309 = NOR(2254, 2201) +2313 = NOR(2257, 2206) +2317 = NOR(2214, 2260) +2318 = NOR(2260, 2211) +2319 = NOR(2264, 2265) +2322 = NOR(2266, 1227) +2326 = NOR(2224, 2269) +2327 = NOR(2269, 2151) +2328 = NOR(2227, 2273) +2329 = NOR(2273, 2156) +2330 = NOR(2230, 2277) +2331 = NOR(2277, 2161) +2332 = NOR(2233, 2281) +2333 = NOR(2281, 2166) +2334 = NOR(2236, 2285) +2335 = NOR(2285, 2171) +2336 = NOR(2239, 2289) +2337 = NOR(2289, 2176) +2338 = NOR(2242, 2293) +2339 = NOR(2293, 2181) +2340 = NOR(2245, 2297) +2341 = NOR(2297, 2186) +2342 = NOR(2248, 2301) +2343 = NOR(2301, 2191) +2344 = NOR(2251, 2305) +2345 = NOR(2305, 2196) +2346 = NOR(2254, 2309) +2347 = NOR(2309, 2201) +2348 = NOR(2257, 2313) +2349 = NOR(2313, 2206) +2350 = NOR(2317, 2318) +2353 = NOR(2319, 1179) +2357 = NOR(2266, 2322) +2358 = NOR(2322, 1227) +2359 = NOR(2145, 2322) +2362 = NOR(2326, 2327) +2365 = NOR(2328, 2329) +2368 = NOR(2330, 2331) +2371 = NOR(2332, 2333) +2374 = NOR(2334, 2335) +2377 = NOR(2336, 2337) +2380 = NOR(2338, 2339) +2383 = NOR(2340, 2341) +2386 = NOR(2342, 2343) +2389 = NOR(2344, 2345) +2392 = NOR(2346, 2347) +2395 = NOR(2348, 2349) +2398 = NOR(2350, 1131) +2402 = NOR(2319, 2353) +2403 = NOR(2353, 1179) +2404 = NOR(2217, 2353) +2407 = NOR(2357, 2358) +2410 = NOR(1275, 2359) +2414 = NOR(2362, 555) +2418 = NOR(2365, 603) +2422 = NOR(2368, 651) +2426 = NOR(2371, 699) +2430 = NOR(2374, 747) +2434 = NOR(2377, 795) +2438 = NOR(2380, 843) +2442 = NOR(2383, 891) +2446 = NOR(2386, 939) +2450 = NOR(2389, 987) +2454 = NOR(2392, 1035) +2458 = NOR(2395, 1083) +2462 = NOR(2350, 2398) +2463 = NOR(2398, 1131) +2464 = NOR(2260, 2398) +2467 = NOR(2402, 2403) +2470 = NOR(2407, 2404) +2474 = NOR(1275, 2410) +2475 = NOR(2410, 2359) +2476 = NOR(2362, 2414) +2477 = NOR(2414, 555) +2478 = NOR(2269, 2414) +2481 = NOR(2365, 2418) +2482 = NOR(2418, 603) +2483 = NOR(2273, 2418) +2486 = NOR(2368, 2422) +2487 = NOR(2422, 651) +2488 = NOR(2277, 2422) +2491 = NOR(2371, 2426) +2492 = NOR(2426, 699) +2493 = NOR(2281, 2426) +2496 = NOR(2374, 2430) +2497 = NOR(2430, 747) +2498 = NOR(2285, 2430) +2501 = NOR(2377, 2434) +2502 = NOR(2434, 795) +2503 = NOR(2289, 2434) +2506 = NOR(2380, 2438) +2507 = NOR(2438, 843) +2508 = NOR(2293, 2438) +2511 = NOR(2383, 2442) +2512 = NOR(2442, 891) +2513 = NOR(2297, 2442) +2516 = NOR(2386, 2446) +2517 = NOR(2446, 939) +2518 = NOR(2301, 2446) +2521 = NOR(2389, 2450) +2522 = NOR(2450, 987) +2523 = NOR(2305, 2450) +2526 = NOR(2392, 2454) +2527 = NOR(2454, 1035) +2528 = NOR(2309, 2454) +2531 = NOR(2395, 2458) +2532 = NOR(2458, 1083) +2533 = NOR(2313, 2458) +2536 = NOR(2462, 2463) +2539 = NOR(2467, 2464) +2543 = NOR(2407, 2470) +2544 = NOR(2470, 2404) +2545 = NOR(2474, 2475) +2548 = NOR(2476, 2477) +2549 = NOR(2481, 2482) +2552 = NOR(2486, 2487) +2555 = NOR(2491, 2492) +2558 = NOR(2496, 2497) +2561 = NOR(2501, 2502) +2564 = NOR(2506, 2507) +2567 = NOR(2511, 2512) +2570 = NOR(2516, 2517) +2573 = NOR(2521, 2522) +2576 = NOR(2526, 2527) +2579 = NOR(2531, 2532) +2582 = NOR(2536, 2533) +2586 = NOR(2467, 2539) +2587 = NOR(2539, 2464) +2588 = NOR(2543, 2544) +2591 = NOR(2545, 1230) +2595 = NOR(2549, 2478) +2599 = NOR(2552, 2483) +2603 = NOR(2555, 2488) +2607 = NOR(2558, 2493) +2611 = NOR(2561, 2498) +2615 = NOR(2564, 2503) +2619 = NOR(2567, 2508) +2623 = NOR(2570, 2513) +2627 = NOR(2573, 2518) +2631 = NOR(2576, 2523) +2635 = NOR(2579, 2528) +2639 = NOR(2536, 2582) +2640 = NOR(2582, 2533) +2641 = NOR(2586, 2587) +2644 = NOR(2588, 1182) +2648 = NOR(2545, 2591) +2649 = NOR(2591, 1230) +2650 = NOR(2410, 2591) +2653 = NOR(2549, 2595) +2654 = NOR(2595, 2478) +2655 = NOR(2552, 2599) +2656 = NOR(2599, 2483) +2657 = NOR(2555, 2603) +2658 = NOR(2603, 2488) +2659 = NOR(2558, 2607) +2660 = NOR(2607, 2493) +2661 = NOR(2561, 2611) +2662 = NOR(2611, 2498) +2663 = NOR(2564, 2615) +2664 = NOR(2615, 2503) +2665 = NOR(2567, 2619) +2666 = NOR(2619, 2508) +2667 = NOR(2570, 2623) +2668 = NOR(2623, 2513) +2669 = NOR(2573, 2627) +2670 = NOR(2627, 2518) +2671 = NOR(2576, 2631) +2672 = NOR(2631, 2523) +2673 = NOR(2579, 2635) +2674 = NOR(2635, 2528) +2675 = NOR(2639, 2640) +2678 = NOR(2641, 1134) +2682 = NOR(2588, 2644) +2683 = NOR(2644, 1182) +2684 = NOR(2470, 2644) +2687 = NOR(2648, 2649) +2690 = NOR(1278, 2650) +2694 = NOR(2653, 2654) +2697 = NOR(2655, 2656) +2700 = NOR(2657, 2658) +2703 = NOR(2659, 2660) +2706 = NOR(2661, 2662) +2709 = NOR(2663, 2664) +2712 = NOR(2665, 2666) +2715 = NOR(2667, 2668) +2718 = NOR(2669, 2670) +2721 = NOR(2671, 2672) +2724 = NOR(2673, 2674) +2727 = NOR(2675, 1086) +2731 = NOR(2641, 2678) +2732 = NOR(2678, 1134) +2733 = NOR(2539, 2678) +2736 = NOR(2682, 2683) +2739 = NOR(2687, 2684) +2743 = NOR(1278, 2690) +2744 = NOR(2690, 2650) +2745 = NOR(2694, 558) +2749 = NOR(2697, 606) +2753 = NOR(2700, 654) +2757 = NOR(2703, 702) +2761 = NOR(2706, 750) +2765 = NOR(2709, 798) +2769 = NOR(2712, 846) +2773 = NOR(2715, 894) +2777 = NOR(2718, 942) +2781 = NOR(2721, 990) +2785 = NOR(2724, 1038) +2789 = NOR(2675, 2727) +2790 = NOR(2727, 1086) +2791 = NOR(2582, 2727) +2794 = NOR(2731, 2732) +2797 = NOR(2736, 2733) +2801 = NOR(2687, 2739) +2802 = NOR(2739, 2684) +2803 = NOR(2743, 2744) +2806 = NOR(2694, 2745) +2807 = NOR(2745, 558) +2808 = NOR(2595, 2745) +2811 = NOR(2697, 2749) +2812 = NOR(2749, 606) +2813 = NOR(2599, 2749) +2816 = NOR(2700, 2753) +2817 = NOR(2753, 654) +2818 = NOR(2603, 2753) +2821 = NOR(2703, 2757) +2822 = NOR(2757, 702) +2823 = NOR(2607, 2757) +2826 = NOR(2706, 2761) +2827 = NOR(2761, 750) +2828 = NOR(2611, 2761) +2831 = NOR(2709, 2765) +2832 = NOR(2765, 798) +2833 = NOR(2615, 2765) +2836 = NOR(2712, 2769) +2837 = NOR(2769, 846) +2838 = NOR(2619, 2769) +2841 = NOR(2715, 2773) +2842 = NOR(2773, 894) +2843 = NOR(2623, 2773) +2846 = NOR(2718, 2777) +2847 = NOR(2777, 942) +2848 = NOR(2627, 2777) +2851 = NOR(2721, 2781) +2852 = NOR(2781, 990) +2853 = NOR(2631, 2781) +2856 = NOR(2724, 2785) +2857 = NOR(2785, 1038) +2858 = NOR(2635, 2785) +2861 = NOR(2789, 2790) +2864 = NOR(2794, 2791) +2868 = NOR(2736, 2797) +2869 = NOR(2797, 2733) +2870 = NOR(2801, 2802) +2873 = NOR(2803, 1233) +2877 = NOR(2806, 2807) +2878 = NOR(2811, 2812) +2881 = NOR(2816, 2817) +2884 = NOR(2821, 2822) +2887 = NOR(2826, 2827) +2890 = NOR(2831, 2832) +2893 = NOR(2836, 2837) +2896 = NOR(2841, 2842) +2899 = NOR(2846, 2847) +2902 = NOR(2851, 2852) +2905 = NOR(2856, 2857) +2908 = NOR(2861, 2858) +2912 = NOR(2794, 2864) +2913 = NOR(2864, 2791) +2914 = NOR(2868, 2869) +2917 = NOR(2870, 1185) +2921 = NOR(2803, 2873) +2922 = NOR(2873, 1233) +2923 = NOR(2690, 2873) +2926 = NOR(2878, 2808) +2930 = NOR(2881, 2813) +2934 = NOR(2884, 2818) +2938 = NOR(2887, 2823) +2942 = NOR(2890, 2828) +2946 = NOR(2893, 2833) +2950 = NOR(2896, 2838) +2954 = NOR(2899, 2843) +2958 = NOR(2902, 2848) +2962 = NOR(2905, 2853) +2966 = NOR(2861, 2908) +2967 = NOR(2908, 2858) +2968 = NOR(2912, 2913) +2971 = NOR(2914, 1137) +2975 = NOR(2870, 2917) +2976 = NOR(2917, 1185) +2977 = NOR(2739, 2917) +2980 = NOR(2921, 2922) +2983 = NOR(1281, 2923) +2987 = NOR(2878, 2926) +2988 = NOR(2926, 2808) +2989 = NOR(2881, 2930) +2990 = NOR(2930, 2813) +2991 = NOR(2884, 2934) +2992 = NOR(2934, 2818) +2993 = NOR(2887, 2938) +2994 = NOR(2938, 2823) +2995 = NOR(2890, 2942) +2996 = NOR(2942, 2828) +2997 = NOR(2893, 2946) +2998 = NOR(2946, 2833) +2999 = NOR(2896, 2950) +3000 = NOR(2950, 2838) +3001 = NOR(2899, 2954) +3002 = NOR(2954, 2843) +3003 = NOR(2902, 2958) +3004 = NOR(2958, 2848) +3005 = NOR(2905, 2962) +3006 = NOR(2962, 2853) +3007 = NOR(2966, 2967) +3010 = NOR(2968, 1089) +3014 = NOR(2914, 2971) +3015 = NOR(2971, 1137) +3016 = NOR(2797, 2971) +3019 = NOR(2975, 2976) +3022 = NOR(2980, 2977) +3026 = NOR(1281, 2983) +3027 = NOR(2983, 2923) +3028 = NOR(2987, 2988) +3031 = NOR(2989, 2990) +3034 = NOR(2991, 2992) +3037 = NOR(2993, 2994) +3040 = NOR(2995, 2996) +3043 = NOR(2997, 2998) +3046 = NOR(2999, 3000) +3049 = NOR(3001, 3002) +3052 = NOR(3003, 3004) +3055 = NOR(3005, 3006) +3058 = NOR(3007, 1041) +3062 = NOR(2968, 3010) +3063 = NOR(3010, 1089) +3064 = NOR(2864, 3010) +3067 = NOR(3014, 3015) +3070 = NOR(3019, 3016) +3074 = NOR(2980, 3022) +3075 = NOR(3022, 2977) +3076 = NOR(3026, 3027) +3079 = NOR(3028, 561) +3083 = NOR(3031, 609) +3087 = NOR(3034, 657) +3091 = NOR(3037, 705) +3095 = NOR(3040, 753) +3099 = NOR(3043, 801) +3103 = NOR(3046, 849) +3107 = NOR(3049, 897) +3111 = NOR(3052, 945) +3115 = NOR(3055, 993) +3119 = NOR(3007, 3058) +3120 = NOR(3058, 1041) +3121 = NOR(2908, 3058) +3124 = NOR(3062, 3063) +3127 = NOR(3067, 3064) +3131 = NOR(3019, 3070) +3132 = NOR(3070, 3016) +3133 = NOR(3074, 3075) +3136 = NOR(3076, 1236) +3140 = NOR(3028, 3079) +3141 = NOR(3079, 561) +3142 = NOR(2926, 3079) +3145 = NOR(3031, 3083) +3146 = NOR(3083, 609) +3147 = NOR(2930, 3083) +3150 = NOR(3034, 3087) +3151 = NOR(3087, 657) +3152 = NOR(2934, 3087) +3155 = NOR(3037, 3091) +3156 = NOR(3091, 705) +3157 = NOR(2938, 3091) +3160 = NOR(3040, 3095) +3161 = NOR(3095, 753) +3162 = NOR(2942, 3095) +3165 = NOR(3043, 3099) +3166 = NOR(3099, 801) +3167 = NOR(2946, 3099) +3170 = NOR(3046, 3103) +3171 = NOR(3103, 849) +3172 = NOR(2950, 3103) +3175 = NOR(3049, 3107) +3176 = NOR(3107, 897) +3177 = NOR(2954, 3107) +3180 = NOR(3052, 3111) +3181 = NOR(3111, 945) +3182 = NOR(2958, 3111) +3185 = NOR(3055, 3115) +3186 = NOR(3115, 993) +3187 = NOR(2962, 3115) +3190 = NOR(3119, 3120) +3193 = NOR(3124, 3121) +3197 = NOR(3067, 3127) +3198 = NOR(3127, 3064) +3199 = NOR(3131, 3132) +3202 = NOR(3133, 1188) +3206 = NOR(3076, 3136) +3207 = NOR(3136, 1236) +3208 = NOR(2983, 3136) +3211 = NOR(3140, 3141) +3212 = NOR(3145, 3146) +3215 = NOR(3150, 3151) +3218 = NOR(3155, 3156) +3221 = NOR(3160, 3161) +3224 = NOR(3165, 3166) +3227 = NOR(3170, 3171) +3230 = NOR(3175, 3176) +3233 = NOR(3180, 3181) +3236 = NOR(3185, 3186) +3239 = NOR(3190, 3187) +3243 = NOR(3124, 3193) +3244 = NOR(3193, 3121) +3245 = NOR(3197, 3198) +3248 = NOR(3199, 1140) +3252 = NOR(3133, 3202) +3253 = NOR(3202, 1188) +3254 = NOR(3022, 3202) +3257 = NOR(3206, 3207) +3260 = NOR(1284, 3208) +3264 = NOR(3212, 3142) +3268 = NOR(3215, 3147) +3272 = NOR(3218, 3152) +3276 = NOR(3221, 3157) +3280 = NOR(3224, 3162) +3284 = NOR(3227, 3167) +3288 = NOR(3230, 3172) +3292 = NOR(3233, 3177) +3296 = NOR(3236, 3182) +3300 = NOR(3190, 3239) +3301 = NOR(3239, 3187) +3302 = NOR(3243, 3244) +3305 = NOR(3245, 1092) +3309 = NOR(3199, 3248) +3310 = NOR(3248, 1140) +3311 = NOR(3070, 3248) +3314 = NOR(3252, 3253) +3317 = NOR(3257, 3254) +3321 = NOR(1284, 3260) +3322 = NOR(3260, 3208) +3323 = NOR(3212, 3264) +3324 = NOR(3264, 3142) +3325 = NOR(3215, 3268) +3326 = NOR(3268, 3147) +3327 = NOR(3218, 3272) +3328 = NOR(3272, 3152) +3329 = NOR(3221, 3276) +3330 = NOR(3276, 3157) +3331 = NOR(3224, 3280) +3332 = NOR(3280, 3162) +3333 = NOR(3227, 3284) +3334 = NOR(3284, 3167) +3335 = NOR(3230, 3288) +3336 = NOR(3288, 3172) +3337 = NOR(3233, 3292) +3338 = NOR(3292, 3177) +3339 = NOR(3236, 3296) +3340 = NOR(3296, 3182) +3341 = NOR(3300, 3301) +3344 = NOR(3302, 1044) +3348 = NOR(3245, 3305) +3349 = NOR(3305, 1092) +3350 = NOR(3127, 3305) +3353 = NOR(3309, 3310) +3356 = NOR(3314, 3311) +3360 = NOR(3257, 3317) +3361 = NOR(3317, 3254) +3362 = NOR(3321, 3322) +3365 = NOR(3323, 3324) +3368 = NOR(3325, 3326) +3371 = NOR(3327, 3328) +3374 = NOR(3329, 3330) +3377 = NOR(3331, 3332) +3380 = NOR(3333, 3334) +3383 = NOR(3335, 3336) +3386 = NOR(3337, 3338) +3389 = NOR(3339, 3340) +3392 = NOR(3341, 996) +3396 = NOR(3302, 3344) +3397 = NOR(3344, 1044) +3398 = NOR(3193, 3344) +3401 = NOR(3348, 3349) +3404 = NOR(3353, 3350) +3408 = NOR(3314, 3356) +3409 = NOR(3356, 3311) +3410 = NOR(3360, 3361) +3413 = NOR(3362, 1239) +3417 = NOR(3365, 564) +3421 = NOR(3368, 612) +3425 = NOR(3371, 660) +3429 = NOR(3374, 708) +3433 = NOR(3377, 756) +3437 = NOR(3380, 804) +3441 = NOR(3383, 852) +3445 = NOR(3386, 900) +3449 = NOR(3389, 948) +3453 = NOR(3341, 3392) +3454 = NOR(3392, 996) +3455 = NOR(3239, 3392) +3458 = NOR(3396, 3397) +3461 = NOR(3401, 3398) +3465 = NOR(3353, 3404) +3466 = NOR(3404, 3350) +3467 = NOR(3408, 3409) +3470 = NOR(3410, 1191) +3474 = NOR(3362, 3413) +3475 = NOR(3413, 1239) +3476 = NOR(3260, 3413) +3479 = NOR(3365, 3417) +3480 = NOR(3417, 564) +3481 = NOR(3264, 3417) +3484 = NOR(3368, 3421) +3485 = NOR(3421, 612) +3486 = NOR(3268, 3421) +3489 = NOR(3371, 3425) +3490 = NOR(3425, 660) +3491 = NOR(3272, 3425) +3494 = NOR(3374, 3429) +3495 = NOR(3429, 708) +3496 = NOR(3276, 3429) +3499 = NOR(3377, 3433) +3500 = NOR(3433, 756) +3501 = NOR(3280, 3433) +3504 = NOR(3380, 3437) +3505 = NOR(3437, 804) +3506 = NOR(3284, 3437) +3509 = NOR(3383, 3441) +3510 = NOR(3441, 852) +3511 = NOR(3288, 3441) +3514 = NOR(3386, 3445) +3515 = NOR(3445, 900) +3516 = NOR(3292, 3445) +3519 = NOR(3389, 3449) +3520 = NOR(3449, 948) +3521 = NOR(3296, 3449) +3524 = NOR(3453, 3454) +3527 = NOR(3458, 3455) +3531 = NOR(3401, 3461) +3532 = NOR(3461, 3398) +3533 = NOR(3465, 3466) +3536 = NOR(3467, 1143) +3540 = NOR(3410, 3470) +3541 = NOR(3470, 1191) +3542 = NOR(3317, 3470) +3545 = NOR(3474, 3475) +3548 = NOR(1287, 3476) +3552 = NOR(3479, 3480) +3553 = NOR(3484, 3485) +3556 = NOR(3489, 3490) +3559 = NOR(3494, 3495) +3562 = NOR(3499, 3500) +3565 = NOR(3504, 3505) +3568 = NOR(3509, 3510) +3571 = NOR(3514, 3515) +3574 = NOR(3519, 3520) +3577 = NOR(3524, 3521) +3581 = NOR(3458, 3527) +3582 = NOR(3527, 3455) +3583 = NOR(3531, 3532) +3586 = NOR(3533, 1095) +3590 = NOR(3467, 3536) +3591 = NOR(3536, 1143) +3592 = NOR(3356, 3536) +3595 = NOR(3540, 3541) +3598 = NOR(3545, 3542) +3602 = NOR(1287, 3548) +3603 = NOR(3548, 3476) +3604 = NOR(3553, 3481) +3608 = NOR(3556, 3486) +3612 = NOR(3559, 3491) +3616 = NOR(3562, 3496) +3620 = NOR(3565, 3501) +3624 = NOR(3568, 3506) +3628 = NOR(3571, 3511) +3632 = NOR(3574, 3516) +3636 = NOR(3524, 3577) +3637 = NOR(3577, 3521) +3638 = NOR(3581, 3582) +3641 = NOR(3583, 1047) +3645 = NOR(3533, 3586) +3646 = NOR(3586, 1095) +3647 = NOR(3404, 3586) +3650 = NOR(3590, 3591) +3653 = NOR(3595, 3592) +3657 = NOR(3545, 3598) +3658 = NOR(3598, 3542) +3659 = NOR(3602, 3603) +3662 = NOR(3553, 3604) +3663 = NOR(3604, 3481) +3664 = NOR(3556, 3608) +3665 = NOR(3608, 3486) +3666 = NOR(3559, 3612) +3667 = NOR(3612, 3491) +3668 = NOR(3562, 3616) +3669 = NOR(3616, 3496) +3670 = NOR(3565, 3620) +3671 = NOR(3620, 3501) +3672 = NOR(3568, 3624) +3673 = NOR(3624, 3506) +3674 = NOR(3571, 3628) +3675 = NOR(3628, 3511) +3676 = NOR(3574, 3632) +3677 = NOR(3632, 3516) +3678 = NOR(3636, 3637) +3681 = NOR(3638, 999) +3685 = NOR(3583, 3641) +3686 = NOR(3641, 1047) +3687 = NOR(3461, 3641) +3690 = NOR(3645, 3646) +3693 = NOR(3650, 3647) +3697 = NOR(3595, 3653) +3698 = NOR(3653, 3592) +3699 = NOR(3657, 3658) +3702 = NOR(3659, 1242) +3706 = NOR(3662, 3663) +3709 = NOR(3664, 3665) +3712 = NOR(3666, 3667) +3715 = NOR(3668, 3669) +3718 = NOR(3670, 3671) +3721 = NOR(3672, 3673) +3724 = NOR(3674, 3675) +3727 = NOR(3676, 3677) +3730 = NOR(3678, 951) +3734 = NOR(3638, 3681) +3735 = NOR(3681, 999) +3736 = NOR(3527, 3681) +3739 = NOR(3685, 3686) +3742 = NOR(3690, 3687) +3746 = NOR(3650, 3693) +3747 = NOR(3693, 3647) +3748 = NOR(3697, 3698) +3751 = NOR(3699, 1194) +3755 = NOR(3659, 3702) +3756 = NOR(3702, 1242) +3757 = NOR(3548, 3702) +3760 = NOR(3706, 567) +3764 = NOR(3709, 615) +3768 = NOR(3712, 663) +3772 = NOR(3715, 711) +3776 = NOR(3718, 759) +3780 = NOR(3721, 807) +3784 = NOR(3724, 855) +3788 = NOR(3727, 903) +3792 = NOR(3678, 3730) +3793 = NOR(3730, 951) +3794 = NOR(3577, 3730) +3797 = NOR(3734, 3735) +3800 = NOR(3739, 3736) +3804 = NOR(3690, 3742) +3805 = NOR(3742, 3687) +3806 = NOR(3746, 3747) +3809 = NOR(3748, 1146) +3813 = NOR(3699, 3751) +3814 = NOR(3751, 1194) +3815 = NOR(3598, 3751) +3818 = NOR(3755, 3756) +3821 = NOR(1290, 3757) +3825 = NOR(3706, 3760) +3826 = NOR(3760, 567) +3827 = NOR(3604, 3760) +3830 = NOR(3709, 3764) +3831 = NOR(3764, 615) +3832 = NOR(3608, 3764) +3835 = NOR(3712, 3768) +3836 = NOR(3768, 663) +3837 = NOR(3612, 3768) +3840 = NOR(3715, 3772) +3841 = NOR(3772, 711) +3842 = NOR(3616, 3772) +3845 = NOR(3718, 3776) +3846 = NOR(3776, 759) +3847 = NOR(3620, 3776) +3850 = NOR(3721, 3780) +3851 = NOR(3780, 807) +3852 = NOR(3624, 3780) +3855 = NOR(3724, 3784) +3856 = NOR(3784, 855) +3857 = NOR(3628, 3784) +3860 = NOR(3727, 3788) +3861 = NOR(3788, 903) +3862 = NOR(3632, 3788) +3865 = NOR(3792, 3793) +3868 = NOR(3797, 3794) +3872 = NOR(3739, 3800) +3873 = NOR(3800, 3736) +3874 = NOR(3804, 3805) +3877 = NOR(3806, 1098) +3881 = NOR(3748, 3809) +3882 = NOR(3809, 1146) +3883 = NOR(3653, 3809) +3886 = NOR(3813, 3814) +3889 = NOR(3818, 3815) +3893 = NOR(1290, 3821) +3894 = NOR(3821, 3757) +3895 = NOR(3825, 3826) +3896 = NOR(3830, 3831) +3899 = NOR(3835, 3836) +3902 = NOR(3840, 3841) +3905 = NOR(3845, 3846) +3908 = NOR(3850, 3851) +3911 = NOR(3855, 3856) +3914 = NOR(3860, 3861) +3917 = NOR(3865, 3862) +3921 = NOR(3797, 3868) +3922 = NOR(3868, 3794) +3923 = NOR(3872, 3873) +3926 = NOR(3874, 1050) +3930 = NOR(3806, 3877) +3931 = NOR(3877, 1098) +3932 = NOR(3693, 3877) +3935 = NOR(3881, 3882) +3938 = NOR(3886, 3883) +3942 = NOR(3818, 3889) +3943 = NOR(3889, 3815) +3944 = NOR(3893, 3894) +3947 = NOR(3896, 3827) +3951 = NOR(3899, 3832) +3955 = NOR(3902, 3837) +3959 = NOR(3905, 3842) +3963 = NOR(3908, 3847) +3967 = NOR(3911, 3852) +3971 = NOR(3914, 3857) +3975 = NOR(3865, 3917) +3976 = NOR(3917, 3862) +3977 = NOR(3921, 3922) +3980 = NOR(3923, 1002) +3984 = NOR(3874, 3926) +3985 = NOR(3926, 1050) +3986 = NOR(3742, 3926) +3989 = NOR(3930, 3931) +3992 = NOR(3935, 3932) +3996 = NOR(3886, 3938) +3997 = NOR(3938, 3883) +3998 = NOR(3942, 3943) +4001 = NOR(3944, 1245) +4005 = NOR(3896, 3947) +4006 = NOR(3947, 3827) +4007 = NOR(3899, 3951) +4008 = NOR(3951, 3832) +4009 = NOR(3902, 3955) +4010 = NOR(3955, 3837) +4011 = NOR(3905, 3959) +4012 = NOR(3959, 3842) +4013 = NOR(3908, 3963) +4014 = NOR(3963, 3847) +4015 = NOR(3911, 3967) +4016 = NOR(3967, 3852) +4017 = NOR(3914, 3971) +4018 = NOR(3971, 3857) +4019 = NOR(3975, 3976) +4022 = NOR(3977, 954) +4026 = NOR(3923, 3980) +4027 = NOR(3980, 1002) +4028 = NOR(3800, 3980) +4031 = NOR(3984, 3985) +4034 = NOR(3989, 3986) +4038 = NOR(3935, 3992) +4039 = NOR(3992, 3932) +4040 = NOR(3996, 3997) +4043 = NOR(3998, 1197) +4047 = NOR(3944, 4001) +4048 = NOR(4001, 1245) +4049 = NOR(3821, 4001) +4052 = NOR(4005, 4006) +4055 = NOR(4007, 4008) +4058 = NOR(4009, 4010) +4061 = NOR(4011, 4012) +4064 = NOR(4013, 4014) +4067 = NOR(4015, 4016) +4070 = NOR(4017, 4018) +4073 = NOR(4019, 906) +4077 = NOR(3977, 4022) +4078 = NOR(4022, 954) +4079 = NOR(3868, 4022) +4082 = NOR(4026, 4027) +4085 = NOR(4031, 4028) +4089 = NOR(3989, 4034) +4090 = NOR(4034, 3986) +4091 = NOR(4038, 4039) +4094 = NOR(4040, 1149) +4098 = NOR(3998, 4043) +4099 = NOR(4043, 1197) +4100 = NOR(3889, 4043) +4103 = NOR(4047, 4048) +4106 = NOR(1293, 4049) +4110 = NOR(4052, 570) +4114 = NOR(4055, 618) +4118 = NOR(4058, 666) +4122 = NOR(4061, 714) +4126 = NOR(4064, 762) +4130 = NOR(4067, 810) +4134 = NOR(4070, 858) +4138 = NOR(4019, 4073) +4139 = NOR(4073, 906) +4140 = NOR(3917, 4073) +4143 = NOR(4077, 4078) +4146 = NOR(4082, 4079) +4150 = NOR(4031, 4085) +4151 = NOR(4085, 4028) +4152 = NOR(4089, 4090) +4155 = NOR(4091, 1101) +4159 = NOR(4040, 4094) +4160 = NOR(4094, 1149) +4161 = NOR(3938, 4094) +4164 = NOR(4098, 4099) +4167 = NOR(4103, 4100) +4171 = NOR(1293, 4106) +4172 = NOR(4106, 4049) +4173 = NOR(4052, 4110) +4174 = NOR(4110, 570) +4175 = NOR(3947, 4110) +4178 = NOR(4055, 4114) +4179 = NOR(4114, 618) +4180 = NOR(3951, 4114) +4183 = NOR(4058, 4118) +4184 = NOR(4118, 666) +4185 = NOR(3955, 4118) +4188 = NOR(4061, 4122) +4189 = NOR(4122, 714) +4190 = NOR(3959, 4122) +4193 = NOR(4064, 4126) +4194 = NOR(4126, 762) +4195 = NOR(3963, 4126) +4198 = NOR(4067, 4130) +4199 = NOR(4130, 810) +4200 = NOR(3967, 4130) +4203 = NOR(4070, 4134) +4204 = NOR(4134, 858) +4205 = NOR(3971, 4134) +4208 = NOR(4138, 4139) +4211 = NOR(4143, 4140) +4215 = NOR(4082, 4146) +4216 = NOR(4146, 4079) +4217 = NOR(4150, 4151) +4220 = NOR(4152, 1053) +4224 = NOR(4091, 4155) +4225 = NOR(4155, 1101) +4226 = NOR(3992, 4155) +4229 = NOR(4159, 4160) +4232 = NOR(4164, 4161) +4236 = NOR(4103, 4167) +4237 = NOR(4167, 4100) +4238 = NOR(4171, 4172) +4241 = NOR(4173, 4174) +4242 = NOR(4178, 4179) +4245 = NOR(4183, 4184) +4248 = NOR(4188, 4189) +4251 = NOR(4193, 4194) +4254 = NOR(4198, 4199) +4257 = NOR(4203, 4204) +4260 = NOR(4208, 4205) +4264 = NOR(4143, 4211) +4265 = NOR(4211, 4140) +4266 = NOR(4215, 4216) +4269 = NOR(4217, 1005) +4273 = NOR(4152, 4220) +4274 = NOR(4220, 1053) +4275 = NOR(4034, 4220) +4278 = NOR(4224, 4225) +4281 = NOR(4229, 4226) +4285 = NOR(4164, 4232) +4286 = NOR(4232, 4161) +4287 = NOR(4236, 4237) +4290 = NOR(4238, 1248) +4294 = NOR(4242, 4175) +4298 = NOR(4245, 4180) +4302 = NOR(4248, 4185) +4306 = NOR(4251, 4190) +4310 = NOR(4254, 4195) +4314 = NOR(4257, 4200) +4318 = NOR(4208, 4260) +4319 = NOR(4260, 4205) +4320 = NOR(4264, 4265) +4323 = NOR(4266, 957) +4327 = NOR(4217, 4269) +4328 = NOR(4269, 1005) +4329 = NOR(4085, 4269) +4332 = NOR(4273, 4274) +4335 = NOR(4278, 4275) +4339 = NOR(4229, 4281) +4340 = NOR(4281, 4226) +4341 = NOR(4285, 4286) +4344 = NOR(4287, 1200) +4348 = NOR(4238, 4290) +4349 = NOR(4290, 1248) +4350 = NOR(4106, 4290) +4353 = NOR(4242, 4294) +4354 = NOR(4294, 4175) +4355 = NOR(4245, 4298) +4356 = NOR(4298, 4180) +4357 = NOR(4248, 4302) +4358 = NOR(4302, 4185) +4359 = NOR(4251, 4306) +4360 = NOR(4306, 4190) +4361 = NOR(4254, 4310) +4362 = NOR(4310, 4195) +4363 = NOR(4257, 4314) +4364 = NOR(4314, 4200) +4365 = NOR(4318, 4319) +4368 = NOR(4320, 909) +4372 = NOR(4266, 4323) +4373 = NOR(4323, 957) +4374 = NOR(4146, 4323) +4377 = NOR(4327, 4328) +4380 = NOR(4332, 4329) +4384 = NOR(4278, 4335) +4385 = NOR(4335, 4275) +4386 = NOR(4339, 4340) +4389 = NOR(4341, 1152) +4393 = NOR(4287, 4344) +4394 = NOR(4344, 1200) +4395 = NOR(4167, 4344) +4398 = NOR(4348, 4349) +4401 = NOR(1296, 4350) +4405 = NOR(4353, 4354) +4408 = NOR(4355, 4356) +4411 = NOR(4357, 4358) +4414 = NOR(4359, 4360) +4417 = NOR(4361, 4362) +4420 = NOR(4363, 4364) +4423 = NOR(4365, 861) +4427 = NOR(4320, 4368) +4428 = NOR(4368, 909) +4429 = NOR(4211, 4368) +4432 = NOR(4372, 4373) +4435 = NOR(4377, 4374) +4439 = NOR(4332, 4380) +4440 = NOR(4380, 4329) +4441 = NOR(4384, 4385) +4444 = NOR(4386, 1104) +4448 = NOR(4341, 4389) +4449 = NOR(4389, 1152) +4450 = NOR(4232, 4389) +4453 = NOR(4393, 4394) +4456 = NOR(4398, 4395) +4460 = NOR(1296, 4401) +4461 = NOR(4401, 4350) +4462 = NOR(4405, 573) +4466 = NOR(4408, 621) +4470 = NOR(4411, 669) +4474 = NOR(4414, 717) +4478 = NOR(4417, 765) +4482 = NOR(4420, 813) +4486 = NOR(4365, 4423) +4487 = NOR(4423, 861) +4488 = NOR(4260, 4423) +4491 = NOR(4427, 4428) +4494 = NOR(4432, 4429) +4498 = NOR(4377, 4435) +4499 = NOR(4435, 4374) +4500 = NOR(4439, 4440) +4503 = NOR(4441, 1056) +4507 = NOR(4386, 4444) +4508 = NOR(4444, 1104) +4509 = NOR(4281, 4444) +4512 = NOR(4448, 4449) +4515 = NOR(4453, 4450) +4519 = NOR(4398, 4456) +4520 = NOR(4456, 4395) +4521 = NOR(4460, 4461) +4524 = NOR(4405, 4462) +4525 = NOR(4462, 573) +4526 = NOR(4294, 4462) +4529 = NOR(4408, 4466) +4530 = NOR(4466, 621) +4531 = NOR(4298, 4466) +4534 = NOR(4411, 4470) +4535 = NOR(4470, 669) +4536 = NOR(4302, 4470) +4539 = NOR(4414, 4474) +4540 = NOR(4474, 717) +4541 = NOR(4306, 4474) +4544 = NOR(4417, 4478) +4545 = NOR(4478, 765) +4546 = NOR(4310, 4478) +4549 = NOR(4420, 4482) +4550 = NOR(4482, 813) +4551 = NOR(4314, 4482) +4554 = NOR(4486, 4487) +4557 = NOR(4491, 4488) +4561 = NOR(4432, 4494) +4562 = NOR(4494, 4429) +4563 = NOR(4498, 4499) +4566 = NOR(4500, 1008) +4570 = NOR(4441, 4503) +4571 = NOR(4503, 1056) +4572 = NOR(4335, 4503) +4575 = NOR(4507, 4508) +4578 = NOR(4512, 4509) +4582 = NOR(4453, 4515) +4583 = NOR(4515, 4450) +4584 = NOR(4519, 4520) +4587 = NOR(4521, 1251) +4591 = NOR(4524, 4525) +4592 = NOR(4529, 4530) +4595 = NOR(4534, 4535) +4598 = NOR(4539, 4540) +4601 = NOR(4544, 4545) +4604 = NOR(4549, 4550) +4607 = NOR(4554, 4551) +4611 = NOR(4491, 4557) +4612 = NOR(4557, 4488) +4613 = NOR(4561, 4562) +4616 = NOR(4563, 960) +4620 = NOR(4500, 4566) +4621 = NOR(4566, 1008) +4622 = NOR(4380, 4566) +4625 = NOR(4570, 4571) +4628 = NOR(4575, 4572) +4632 = NOR(4512, 4578) +4633 = NOR(4578, 4509) +4634 = NOR(4582, 4583) +4637 = NOR(4584, 1203) +4641 = NOR(4521, 4587) +4642 = NOR(4587, 1251) +4643 = NOR(4401, 4587) +4646 = NOR(4592, 4526) +4650 = NOR(4595, 4531) +4654 = NOR(4598, 4536) +4658 = NOR(4601, 4541) +4662 = NOR(4604, 4546) +4666 = NOR(4554, 4607) +4667 = NOR(4607, 4551) +4668 = NOR(4611, 4612) +4671 = NOR(4613, 912) +4675 = NOR(4563, 4616) +4676 = NOR(4616, 960) +4677 = NOR(4435, 4616) +4680 = NOR(4620, 4621) +4683 = NOR(4625, 4622) +4687 = NOR(4575, 4628) +4688 = NOR(4628, 4572) +4689 = NOR(4632, 4633) +4692 = NOR(4634, 1155) +4696 = NOR(4584, 4637) +4697 = NOR(4637, 1203) +4698 = NOR(4456, 4637) +4701 = NOR(4641, 4642) +4704 = NOR(1299, 4643) +4708 = NOR(4592, 4646) +4709 = NOR(4646, 4526) +4710 = NOR(4595, 4650) +4711 = NOR(4650, 4531) +4712 = NOR(4598, 4654) +4713 = NOR(4654, 4536) +4714 = NOR(4601, 4658) +4715 = NOR(4658, 4541) +4716 = NOR(4604, 4662) +4717 = NOR(4662, 4546) +4718 = NOR(4666, 4667) +4721 = NOR(4668, 864) +4725 = NOR(4613, 4671) +4726 = NOR(4671, 912) +4727 = NOR(4494, 4671) +4730 = NOR(4675, 4676) +4733 = NOR(4680, 4677) +4737 = NOR(4625, 4683) +4738 = NOR(4683, 4622) +4739 = NOR(4687, 4688) +4742 = NOR(4689, 1107) +4746 = NOR(4634, 4692) +4747 = NOR(4692, 1155) +4748 = NOR(4515, 4692) +4751 = NOR(4696, 4697) +4754 = NOR(4701, 4698) +4758 = NOR(1299, 4704) +4759 = NOR(4704, 4643) +4760 = NOR(4708, 4709) +4763 = NOR(4710, 4711) +4766 = NOR(4712, 4713) +4769 = NOR(4714, 4715) +4772 = NOR(4716, 4717) +4775 = NOR(4718, 816) +4779 = NOR(4668, 4721) +4780 = NOR(4721, 864) +4781 = NOR(4557, 4721) +4784 = NOR(4725, 4726) +4787 = NOR(4730, 4727) +4791 = NOR(4680, 4733) +4792 = NOR(4733, 4677) +4793 = NOR(4737, 4738) +4796 = NOR(4739, 1059) +4800 = NOR(4689, 4742) +4801 = NOR(4742, 1107) +4802 = NOR(4578, 4742) +4805 = NOR(4746, 4747) +4808 = NOR(4751, 4748) +4812 = NOR(4701, 4754) +4813 = NOR(4754, 4698) +4814 = NOR(4758, 4759) +4817 = NOR(4760, 576) +4821 = NOR(4763, 624) +4825 = NOR(4766, 672) +4829 = NOR(4769, 720) +4833 = NOR(4772, 768) +4837 = NOR(4718, 4775) +4838 = NOR(4775, 816) +4839 = NOR(4607, 4775) +4842 = NOR(4779, 4780) +4845 = NOR(4784, 4781) +4849 = NOR(4730, 4787) +4850 = NOR(4787, 4727) +4851 = NOR(4791, 4792) +4854 = NOR(4793, 1011) +4858 = NOR(4739, 4796) +4859 = NOR(4796, 1059) +4860 = NOR(4628, 4796) +4863 = NOR(4800, 4801) +4866 = NOR(4805, 4802) +4870 = NOR(4751, 4808) +4871 = NOR(4808, 4748) +4872 = NOR(4812, 4813) +4875 = NOR(4814, 1254) +4879 = NOR(4760, 4817) +4880 = NOR(4817, 576) +4881 = NOR(4646, 4817) +4884 = NOR(4763, 4821) +4885 = NOR(4821, 624) +4886 = NOR(4650, 4821) +4889 = NOR(4766, 4825) +4890 = NOR(4825, 672) +4891 = NOR(4654, 4825) +4894 = NOR(4769, 4829) +4895 = NOR(4829, 720) +4896 = NOR(4658, 4829) +4899 = NOR(4772, 4833) +4900 = NOR(4833, 768) +4901 = NOR(4662, 4833) +4904 = NOR(4837, 4838) +4907 = NOR(4842, 4839) +4911 = NOR(4784, 4845) +4912 = NOR(4845, 4781) +4913 = NOR(4849, 4850) +4916 = NOR(4851, 963) +4920 = NOR(4793, 4854) +4921 = NOR(4854, 1011) +4922 = NOR(4683, 4854) +4925 = NOR(4858, 4859) +4928 = NOR(4863, 4860) +4932 = NOR(4805, 4866) +4933 = NOR(4866, 4802) +4934 = NOR(4870, 4871) +4937 = NOR(4872, 1206) +4941 = NOR(4814, 4875) +4942 = NOR(4875, 1254) +4943 = NOR(4704, 4875) +4946 = NOR(4879, 4880) +4947 = NOR(4884, 4885) +4950 = NOR(4889, 4890) +4953 = NOR(4894, 4895) +4956 = NOR(4899, 4900) +4959 = NOR(4904, 4901) +4963 = NOR(4842, 4907) +4964 = NOR(4907, 4839) +4965 = NOR(4911, 4912) +4968 = NOR(4913, 915) +4972 = NOR(4851, 4916) +4973 = NOR(4916, 963) +4974 = NOR(4733, 4916) +4977 = NOR(4920, 4921) +4980 = NOR(4925, 4922) +4984 = NOR(4863, 4928) +4985 = NOR(4928, 4860) +4986 = NOR(4932, 4933) +4989 = NOR(4934, 1158) +4993 = NOR(4872, 4937) +4994 = NOR(4937, 1206) +4995 = NOR(4754, 4937) +4998 = NOR(4941, 4942) +5001 = NOR(1302, 4943) +5005 = NOR(4947, 4881) +5009 = NOR(4950, 4886) +5013 = NOR(4953, 4891) +5017 = NOR(4956, 4896) +5021 = NOR(4904, 4959) +5022 = NOR(4959, 4901) +5023 = NOR(4963, 4964) +5026 = NOR(4965, 867) +5030 = NOR(4913, 4968) +5031 = NOR(4968, 915) +5032 = NOR(4787, 4968) +5035 = NOR(4972, 4973) +5038 = NOR(4977, 4974) +5042 = NOR(4925, 4980) +5043 = NOR(4980, 4922) +5044 = NOR(4984, 4985) +5047 = NOR(4986, 1110) +5051 = NOR(4934, 4989) +5052 = NOR(4989, 1158) +5053 = NOR(4808, 4989) +5056 = NOR(4993, 4994) +5059 = NOR(4998, 4995) +5063 = NOR(1302, 5001) +5064 = NOR(5001, 4943) +5065 = NOR(4947, 5005) +5066 = NOR(5005, 4881) +5067 = NOR(4950, 5009) +5068 = NOR(5009, 4886) +5069 = NOR(4953, 5013) +5070 = NOR(5013, 4891) +5071 = NOR(4956, 5017) +5072 = NOR(5017, 4896) +5073 = NOR(5021, 5022) +5076 = NOR(5023, 819) +5080 = NOR(4965, 5026) +5081 = NOR(5026, 867) +5082 = NOR(4845, 5026) +5085 = NOR(5030, 5031) +5088 = NOR(5035, 5032) +5092 = NOR(4977, 5038) +5093 = NOR(5038, 4974) +5094 = NOR(5042, 5043) +5097 = NOR(5044, 1062) +5101 = NOR(4986, 5047) +5102 = NOR(5047, 1110) +5103 = NOR(4866, 5047) +5106 = NOR(5051, 5052) +5109 = NOR(5056, 5053) +5113 = NOR(4998, 5059) +5114 = NOR(5059, 4995) +5115 = NOR(5063, 5064) +5118 = NOR(5065, 5066) +5121 = NOR(5067, 5068) +5124 = NOR(5069, 5070) +5127 = NOR(5071, 5072) +5130 = NOR(5073, 771) +5134 = NOR(5023, 5076) +5135 = NOR(5076, 819) +5136 = NOR(4907, 5076) +5139 = NOR(5080, 5081) +5142 = NOR(5085, 5082) +5146 = NOR(5035, 5088) +5147 = NOR(5088, 5032) +5148 = NOR(5092, 5093) +5151 = NOR(5094, 1014) +5155 = NOR(5044, 5097) +5156 = NOR(5097, 1062) +5157 = NOR(4928, 5097) +5160 = NOR(5101, 5102) +5163 = NOR(5106, 5103) +5167 = NOR(5056, 5109) +5168 = NOR(5109, 5053) +5169 = NOR(5113, 5114) +5172 = NOR(5115, 1257) +5176 = NOR(5118, 579) +5180 = NOR(5121, 627) +5184 = NOR(5124, 675) +5188 = NOR(5127, 723) +5192 = NOR(5073, 5130) +5193 = NOR(5130, 771) +5194 = NOR(4959, 5130) +5197 = NOR(5134, 5135) +5200 = NOR(5139, 5136) +5204 = NOR(5085, 5142) +5205 = NOR(5142, 5082) +5206 = NOR(5146, 5147) +5209 = NOR(5148, 966) +5213 = NOR(5094, 5151) +5214 = NOR(5151, 1014) +5215 = NOR(4980, 5151) +5218 = NOR(5155, 5156) +5221 = NOR(5160, 5157) +5225 = NOR(5106, 5163) +5226 = NOR(5163, 5103) +5227 = NOR(5167, 5168) +5230 = NOR(5169, 1209) +5234 = NOR(5115, 5172) +5235 = NOR(5172, 1257) +5236 = NOR(5001, 5172) +5239 = NOR(5118, 5176) +5240 = NOR(5176, 579) +5241 = NOR(5005, 5176) +5244 = NOR(5121, 5180) +5245 = NOR(5180, 627) +5246 = NOR(5009, 5180) +5249 = NOR(5124, 5184) +5250 = NOR(5184, 675) +5251 = NOR(5013, 5184) +5254 = NOR(5127, 5188) +5255 = NOR(5188, 723) +5256 = NOR(5017, 5188) +5259 = NOR(5192, 5193) +5262 = NOR(5197, 5194) +5266 = NOR(5139, 5200) +5267 = NOR(5200, 5136) +5268 = NOR(5204, 5205) +5271 = NOR(5206, 918) +5275 = NOR(5148, 5209) +5276 = NOR(5209, 966) +5277 = NOR(5038, 5209) +5280 = NOR(5213, 5214) +5283 = NOR(5218, 5215) +5287 = NOR(5160, 5221) +5288 = NOR(5221, 5157) +5289 = NOR(5225, 5226) +5292 = NOR(5227, 1161) +5296 = NOR(5169, 5230) +5297 = NOR(5230, 1209) +5298 = NOR(5059, 5230) +5301 = NOR(5234, 5235) +5304 = NOR(1305, 5236) +5308 = NOR(5239, 5240) +5309 = NOR(5244, 5245) +5312 = NOR(5249, 5250) +5315 = NOR(5254, 5255) +5318 = NOR(5259, 5256) +5322 = NOR(5197, 5262) +5323 = NOR(5262, 5194) +5324 = NOR(5266, 5267) +5327 = NOR(5268, 870) +5331 = NOR(5206, 5271) +5332 = NOR(5271, 918) +5333 = NOR(5088, 5271) +5336 = NOR(5275, 5276) +5339 = NOR(5280, 5277) +5343 = NOR(5218, 5283) +5344 = NOR(5283, 5215) +5345 = NOR(5287, 5288) +5348 = NOR(5289, 1113) +5352 = NOR(5227, 5292) +5353 = NOR(5292, 1161) +5354 = NOR(5109, 5292) +5357 = NOR(5296, 5297) +5360 = NOR(5301, 5298) +5364 = NOR(1305, 5304) +5365 = NOR(5304, 5236) +5366 = NOR(5309, 5241) +5370 = NOR(5312, 5246) +5374 = NOR(5315, 5251) +5378 = NOR(5259, 5318) +5379 = NOR(5318, 5256) +5380 = NOR(5322, 5323) +5383 = NOR(5324, 822) +5387 = NOR(5268, 5327) +5388 = NOR(5327, 870) +5389 = NOR(5142, 5327) +5392 = NOR(5331, 5332) +5395 = NOR(5336, 5333) +5399 = NOR(5280, 5339) +5400 = NOR(5339, 5277) +5401 = NOR(5343, 5344) +5404 = NOR(5345, 1065) +5408 = NOR(5289, 5348) +5409 = NOR(5348, 1113) +5410 = NOR(5163, 5348) +5413 = NOR(5352, 5353) +5416 = NOR(5357, 5354) +5420 = NOR(5301, 5360) +5421 = NOR(5360, 5298) +5422 = NOR(5364, 5365) +5425 = NOR(5309, 5366) +5426 = NOR(5366, 5241) +5427 = NOR(5312, 5370) +5428 = NOR(5370, 5246) +5429 = NOR(5315, 5374) +5430 = NOR(5374, 5251) +5431 = NOR(5378, 5379) +5434 = NOR(5380, 774) +5438 = NOR(5324, 5383) +5439 = NOR(5383, 822) +5440 = NOR(5200, 5383) +5443 = NOR(5387, 5388) +5446 = NOR(5392, 5389) +5450 = NOR(5336, 5395) +5451 = NOR(5395, 5333) +5452 = NOR(5399, 5400) +5455 = NOR(5401, 1017) +5459 = NOR(5345, 5404) +5460 = NOR(5404, 1065) +5461 = NOR(5221, 5404) +5464 = NOR(5408, 5409) +5467 = NOR(5413, 5410) +5471 = NOR(5357, 5416) +5472 = NOR(5416, 5354) +5473 = NOR(5420, 5421) +5476 = NOR(5422, 1260) +5480 = NOR(5425, 5426) +5483 = NOR(5427, 5428) +5486 = NOR(5429, 5430) +5489 = NOR(5431, 726) +5493 = NOR(5380, 5434) +5494 = NOR(5434, 774) +5495 = NOR(5262, 5434) +5498 = NOR(5438, 5439) +5501 = NOR(5443, 5440) +5505 = NOR(5392, 5446) +5506 = NOR(5446, 5389) +5507 = NOR(5450, 5451) +5510 = NOR(5452, 969) +5514 = NOR(5401, 5455) +5515 = NOR(5455, 1017) +5516 = NOR(5283, 5455) +5519 = NOR(5459, 5460) +5522 = NOR(5464, 5461) +5526 = NOR(5413, 5467) +5527 = NOR(5467, 5410) +5528 = NOR(5471, 5472) +5531 = NOR(5473, 1212) +5535 = NOR(5422, 5476) +5536 = NOR(5476, 1260) +5537 = NOR(5304, 5476) +5540 = NOR(5480, 582) +5544 = NOR(5483, 630) +5548 = NOR(5486, 678) +5552 = NOR(5431, 5489) +5553 = NOR(5489, 726) +5554 = NOR(5318, 5489) +5557 = NOR(5493, 5494) +5560 = NOR(5498, 5495) +5564 = NOR(5443, 5501) +5565 = NOR(5501, 5440) +5566 = NOR(5505, 5506) +5569 = NOR(5507, 921) +5573 = NOR(5452, 5510) +5574 = NOR(5510, 969) +5575 = NOR(5339, 5510) +5578 = NOR(5514, 5515) +5581 = NOR(5519, 5516) +5585 = NOR(5464, 5522) +5586 = NOR(5522, 5461) +5587 = NOR(5526, 5527) +5590 = NOR(5528, 1164) +5594 = NOR(5473, 5531) +5595 = NOR(5531, 1212) +5596 = NOR(5360, 5531) +5599 = NOR(5535, 5536) +5602 = NOR(1308, 5537) +5606 = NOR(5480, 5540) +5607 = NOR(5540, 582) +5608 = NOR(5366, 5540) +5611 = NOR(5483, 5544) +5612 = NOR(5544, 630) +5613 = NOR(5370, 5544) +5616 = NOR(5486, 5548) +5617 = NOR(5548, 678) +5618 = NOR(5374, 5548) +5621 = NOR(5552, 5553) +5624 = NOR(5557, 5554) +5628 = NOR(5498, 5560) +5629 = NOR(5560, 5495) +5630 = NOR(5564, 5565) +5633 = NOR(5566, 873) +5637 = NOR(5507, 5569) +5638 = NOR(5569, 921) +5639 = NOR(5395, 5569) +5642 = NOR(5573, 5574) +5645 = NOR(5578, 5575) +5649 = NOR(5519, 5581) +5650 = NOR(5581, 5516) +5651 = NOR(5585, 5586) +5654 = NOR(5587, 1116) +5658 = NOR(5528, 5590) +5659 = NOR(5590, 1164) +5660 = NOR(5416, 5590) +5663 = NOR(5594, 5595) +5666 = NOR(5599, 5596) +5670 = NOR(1308, 5602) +5671 = NOR(5602, 5537) +5672 = NOR(5606, 5607) +5673 = NOR(5611, 5612) +5676 = NOR(5616, 5617) +5679 = NOR(5621, 5618) +5683 = NOR(5557, 5624) +5684 = NOR(5624, 5554) +5685 = NOR(5628, 5629) +5688 = NOR(5630, 825) +5692 = NOR(5566, 5633) +5693 = NOR(5633, 873) +5694 = NOR(5446, 5633) +5697 = NOR(5637, 5638) +5700 = NOR(5642, 5639) +5704 = NOR(5578, 5645) +5705 = NOR(5645, 5575) +5706 = NOR(5649, 5650) +5709 = NOR(5651, 1068) +5713 = NOR(5587, 5654) +5714 = NOR(5654, 1116) +5715 = NOR(5467, 5654) +5718 = NOR(5658, 5659) +5721 = NOR(5663, 5660) +5725 = NOR(5599, 5666) +5726 = NOR(5666, 5596) +5727 = NOR(5670, 5671) +5730 = NOR(5673, 5608) +5734 = NOR(5676, 5613) +5738 = NOR(5621, 5679) +5739 = NOR(5679, 5618) +5740 = NOR(5683, 5684) +5743 = NOR(5685, 777) +5747 = NOR(5630, 5688) +5748 = NOR(5688, 825) +5749 = NOR(5501, 5688) +5752 = NOR(5692, 5693) +5755 = NOR(5697, 5694) +5759 = NOR(5642, 5700) +5760 = NOR(5700, 5639) +5761 = NOR(5704, 5705) +5764 = NOR(5706, 1020) +5768 = NOR(5651, 5709) +5769 = NOR(5709, 1068) +5770 = NOR(5522, 5709) +5773 = NOR(5713, 5714) +5776 = NOR(5718, 5715) +5780 = NOR(5663, 5721) +5781 = NOR(5721, 5660) +5782 = NOR(5725, 5726) +5785 = NOR(5673, 5730) +5786 = NOR(5730, 5608) +5787 = NOR(5676, 5734) +5788 = NOR(5734, 5613) +5789 = NOR(5738, 5739) +5792 = NOR(5740, 729) +5796 = NOR(5685, 5743) +5797 = NOR(5743, 777) +5798 = NOR(5560, 5743) +5801 = NOR(5747, 5748) +5804 = NOR(5752, 5749) +5808 = NOR(5697, 5755) +5809 = NOR(5755, 5694) +5810 = NOR(5759, 5760) +5813 = NOR(5761, 972) +5817 = NOR(5706, 5764) +5818 = NOR(5764, 1020) +5819 = NOR(5581, 5764) +5822 = NOR(5768, 5769) +5825 = NOR(5773, 5770) +5829 = NOR(5718, 5776) +5830 = NOR(5776, 5715) +5831 = NOR(5780, 5781) +5834 = NOR(5785, 5786) +5837 = NOR(5787, 5788) +5840 = NOR(5789, 681) +5844 = NOR(5740, 5792) +5845 = NOR(5792, 729) +5846 = NOR(5624, 5792) +5849 = NOR(5796, 5797) +5852 = NOR(5801, 5798) +5856 = NOR(5752, 5804) +5857 = NOR(5804, 5749) +5858 = NOR(5808, 5809) +5861 = NOR(5810, 924) +5865 = NOR(5761, 5813) +5866 = NOR(5813, 972) +5867 = NOR(5645, 5813) +5870 = NOR(5817, 5818) +5873 = NOR(5822, 5819) +5877 = NOR(5773, 5825) +5878 = NOR(5825, 5770) +5879 = NOR(5829, 5830) +5882 = NOR(5834, 585) +5886 = NOR(5837, 633) +5890 = NOR(5789, 5840) +5891 = NOR(5840, 681) +5892 = NOR(5679, 5840) +5895 = NOR(5844, 5845) +5898 = NOR(5849, 5846) +5902 = NOR(5801, 5852) +5903 = NOR(5852, 5798) +5904 = NOR(5856, 5857) +5907 = NOR(5858, 876) +5911 = NOR(5810, 5861) +5912 = NOR(5861, 924) +5913 = NOR(5700, 5861) +5916 = NOR(5865, 5866) +5919 = NOR(5870, 5867) +5923 = NOR(5822, 5873) +5924 = NOR(5873, 5819) +5925 = NOR(5877, 5878) +5928 = NOR(5834, 5882) +5929 = NOR(5882, 585) +5930 = NOR(5730, 5882) +5933 = NOR(5837, 5886) +5934 = NOR(5886, 633) +5935 = NOR(5734, 5886) +5938 = NOR(5890, 5891) +5941 = NOR(5895, 5892) +5945 = NOR(5849, 5898) +5946 = NOR(5898, 5846) +5947 = NOR(5902, 5903) +5950 = NOR(5904, 828) +5954 = NOR(5858, 5907) +5955 = NOR(5907, 876) +5956 = NOR(5755, 5907) +5959 = NOR(5911, 5912) +5962 = NOR(5916, 5913) +5966 = NOR(5870, 5919) +5967 = NOR(5919, 5867) +5968 = NOR(5923, 5924) +5971 = NOR(5928, 5929) +5972 = NOR(5933, 5934) +5975 = NOR(5938, 5935) +5979 = NOR(5895, 5941) +5980 = NOR(5941, 5892) +5981 = NOR(5945, 5946) +5984 = NOR(5947, 780) +5988 = NOR(5904, 5950) +5989 = NOR(5950, 828) +5990 = NOR(5804, 5950) +5993 = NOR(5954, 5955) +5996 = NOR(5959, 5956) +6000 = NOR(5916, 5962) +6001 = NOR(5962, 5913) +6002 = NOR(5966, 5967) +6005 = NOR(5972, 5930) +6009 = NOR(5938, 5975) +6010 = NOR(5975, 5935) +6011 = NOR(5979, 5980) +6014 = NOR(5981, 732) +6018 = NOR(5947, 5984) +6019 = NOR(5984, 780) +6020 = NOR(5852, 5984) +6023 = NOR(5988, 5989) +6026 = NOR(5993, 5990) +6030 = NOR(5959, 5996) +6031 = NOR(5996, 5956) +6032 = NOR(6000, 6001) +6035 = NOR(5972, 6005) +6036 = NOR(6005, 5930) +6037 = NOR(6009, 6010) +6040 = NOR(6011, 684) +6044 = NOR(5981, 6014) +6045 = NOR(6014, 732) +6046 = NOR(5898, 6014) +6049 = NOR(6018, 6019) +6052 = NOR(6023, 6020) +6056 = NOR(5993, 6026) +6057 = NOR(6026, 5990) +6058 = NOR(6030, 6031) +6061 = NOR(6035, 6036) +6064 = NOR(6037, 636) +6068 = NOR(6011, 6040) +6069 = NOR(6040, 684) +6070 = NOR(5941, 6040) +6073 = NOR(6044, 6045) +6076 = NOR(6049, 6046) +6080 = NOR(6023, 6052) +6081 = NOR(6052, 6020) +6082 = NOR(6056, 6057) +6085 = NOR(6061, 588) +6089 = NOR(6037, 6064) +6090 = NOR(6064, 636) +6091 = NOR(5975, 6064) +6094 = NOR(6068, 6069) +6097 = NOR(6073, 6070) +6101 = NOR(6049, 6076) +6102 = NOR(6076, 6046) +6103 = NOR(6080, 6081) +6106 = NOR(6061, 6085) +6107 = NOR(6085, 588) +6108 = NOR(6005, 6085) +6111 = NOR(6089, 6090) +6114 = NOR(6094, 6091) +6118 = NOR(6073, 6097) +6119 = NOR(6097, 6070) +6120 = NOR(6101, 6102) +6123 = NOR(6106, 6107) +6124 = NOR(6111, 6108) +6128 = NOR(6094, 6114) +6129 = NOR(6114, 6091) +6130 = NOR(6118, 6119) +6133 = NOR(6111, 6124) +6134 = NOR(6124, 6108) +6135 = NOR(6128, 6129) +6138 = NOR(6133, 6134) +6141 = NOT(6138) +6145 = NOR(6138, 6141) +6146 = NOT(6141) +6147 = NOR(6124, 6141) +6150 = NOR(6145, 6146) +6151 = NOR(6135, 6147) +6155 = NOR(6135, 6151) +6156 = NOR(6151, 6147) +6157 = NOR(6114, 6151) +6160 = NOR(6155, 6156) +6161 = NOR(6130, 6157) +6165 = NOR(6130, 6161) +6166 = NOR(6161, 6157) +6167 = NOR(6097, 6161) +6170 = NOR(6165, 6166) +6171 = NOR(6120, 6167) +6175 = NOR(6120, 6171) +6176 = NOR(6171, 6167) +6177 = NOR(6076, 6171) +6180 = NOR(6175, 6176) +6181 = NOR(6103, 6177) +6185 = NOR(6103, 6181) +6186 = NOR(6181, 6177) +6187 = NOR(6052, 6181) +6190 = NOR(6185, 6186) +6191 = NOR(6082, 6187) +6195 = NOR(6082, 6191) +6196 = NOR(6191, 6187) +6197 = NOR(6026, 6191) +6200 = NOR(6195, 6196) +6201 = NOR(6058, 6197) +6205 = NOR(6058, 6201) +6206 = NOR(6201, 6197) +6207 = NOR(5996, 6201) +6210 = NOR(6205, 6206) +6211 = NOR(6032, 6207) +6215 = NOR(6032, 6211) +6216 = NOR(6211, 6207) +6217 = NOR(5962, 6211) +6220 = NOR(6215, 6216) +6221 = NOR(6002, 6217) +6225 = NOR(6002, 6221) +6226 = NOR(6221, 6217) +6227 = NOR(5919, 6221) +6230 = NOR(6225, 6226) +6231 = NOR(5968, 6227) +6235 = NOR(5968, 6231) +6236 = NOR(6231, 6227) +6237 = NOR(5873, 6231) +6240 = NOR(6235, 6236) +6241 = NOR(5925, 6237) +6245 = NOR(5925, 6241) +6246 = NOR(6241, 6237) +6247 = NOR(5825, 6241) +6250 = NOR(6245, 6246) +6251 = NOR(5879, 6247) +6255 = NOR(5879, 6251) +6256 = NOR(6251, 6247) +6257 = NOR(5776, 6251) +6260 = NOR(6255, 6256) +6261 = NOR(5831, 6257) +6265 = NOR(5831, 6261) +6266 = NOR(6261, 6257) +6267 = NOR(5721, 6261) +6270 = NOR(6265, 6266) +6271 = NOR(5782, 6267) +6275 = NOR(5782, 6271) +6276 = NOR(6271, 6267) +6277 = NOR(5666, 6271) +6280 = NOR(6275, 6276) +6281 = NOR(5727, 6277) +6285 = NOR(5727, 6281) +6286 = NOR(6281, 6277) +6287 = NOR(5602, 6281) +6288 = NOR(6285, 6286) diff --git a/tests/test_fault_set.py b/tests/test_fault_set.py new file mode 100644 index 0000000..7902f87 --- /dev/null +++ b/tests/test_fault_set.py @@ -0,0 +1,119 @@ +from kyupy import bench +from kyupy.techlib import KYUPY +from fsim.static import FaultSet + +def test_trivial_inv(): + c = bench.parse('input(i) output(o) o=INV(i)') + fs = FaultSet(c, KYUPY) + assert len(fs.saf_set) == 4 + assert len(fs.saf_equiv_classes) == 2 + oline = c.forks['o'].ins[0] + iline = oline.driver.ins[0] + assert fs.fault_str(oline.index*2) == 'o/o@0' + assert fs.fault_str(oline.index*2+1) == 'o/o@1' + assert fs.fault_str(iline.index*2) == 'o/i0@0' + assert fs.fault_str(iline.index*2+1) == 'o/i0@1' + assert oline.index*2 in fs.saf_equiv_classes + assert iline.index*2+1 in fs.saf_equiv_classes[oline.index*2] + assert oline.index*2+1 in fs.saf_equiv_classes + assert iline.index*2 in fs.saf_equiv_classes[oline.index*2+1] + +def test_and(): + c = bench.parse('input(i0, i1) output(o) o=AND(i0, i1)') + for n in c.nodes: + print(n) + fs = FaultSet(c, KYUPY) + assert len(fs.saf_set) == 6 + assert len(fs.saf_equiv_classes) == 4 + oline = c.forks['o'].ins[0] + i0line = oline.driver.ins[0] + i1line = oline.driver.ins[0] + assert oline.index*2 in fs.saf_equiv_classes + assert i0line.index*2 not in fs.saf_equiv_classes + assert i1line.index*2 not in fs.saf_equiv_classes + assert oline.index*2+1 in fs.saf_equiv_classes + assert len(fs.saf_equiv_classes[oline.index*2]) == 3 + assert len(fs.saf_equiv_classes[oline.index*2+1]) == 1 + + +def _class_sizes(src): + """Returns (#equiv class of output s-a-0, #equiv class of output s-a-1).""" + c = bench.parse(src) + fs = FaultSet(c, KYUPY) + oline = c.forks['o'].ins[0] + return (len(fs.saf_equiv_classes.get(oline.index*2, set())), + len(fs.saf_equiv_classes.get(oline.index*2+1, set()))) + + +def test_nand(): + # out s-a-1 collapses with both inputs s-a-0; out s-a-0 has no equivalent. + assert _class_sizes('input(i0,i1) output(o) o=NAND2(i0,i1)') == (1, 3) + + +def test_or(): + # out s-a-1 collapses with all inputs s-a-1; out s-a-0 has no equivalent. + assert _class_sizes('input(i0,i1) output(o) o=OR2(i0,i1)') == (1, 3) + assert _class_sizes('input(i0,i1,i2,i3) output(o) o=OR4(i0,i1,i2,i3)') == (1, 5) + + +def test_nor(): + # out s-a-0 collapses with all inputs s-a-1; out s-a-1 has no equivalent. + assert _class_sizes('input(i0,i1) output(o) o=NOR2(i0,i1)') == (3, 1) + + +def test_aoi_oai_complex(): + # Only the "single" term of the and-or/or-and cells forces the output. + assert _class_sizes('input(i0,i1,i2) output(o) o=AO21(i0,i1,i2)') == (1, 2) + assert _class_sizes('input(i0,i1,i2) output(o) o=AOI21(i0,i1,i2)') == (2, 1) + assert _class_sizes('input(i0,i1,i2) output(o) o=OA21(i0,i1,i2)') == (2, 1) + assert _class_sizes('input(i0,i1,i2) output(o) o=OAI21(i0,i1,i2)') == (1, 2) + assert _class_sizes('input(i0,i1,i2,i3) output(o) o=AO211(i0,i1,i2,i3)') == (1, 3) + assert _class_sizes('input(i0,i1,i2,i3) output(o) o=OAI211(i0,i1,i2,i3)') == (1, 3) + # The two-term variants do not collapse onto any single input. + assert _class_sizes('input(i0,i1,i2,i3) output(o) o=AO22(i0,i1,i2,i3)') == (1, 1) + +def test_s27(): + # bench parser does not add any clock or set/reset logic. + c = bench.parse(''' + # 1 outputs + # 3 D-type flipflops + # 2 inverters + # 8 gates (1 ANDs + 1 NANDs + 2 ORs + 4 NORs) + + INPUT(G0) + INPUT(G1) + INPUT(G2) + INPUT(G3) + + OUTPUT(G17) + + G5 = DFF(G10) + G6 = DFF(G11) + G7 = DFF(G13) + + G14 = NOT(G0) + G17 = NOT(G11) + + G8 = AND(G14, G6) + + G15 = OR(G12, G8) + G16 = OR(G3, G8) + + G9 = NAND(G16, G15) + + G10 = NOR(G14, G11) + G11 = NOR(G5, G9) + G12 = NOR(G1, G7) + G13 = NOR(G2, G12) + ''') + fs = FaultSet(c, KYUPY) + assert len(fs.saf_set) == 52 + assert len(fs.saf_equiv_classes) == 32 + g11_line = c.cells['G11'].outs[0] + g11_sa_0 = g11_line.index*2 + assert g11_sa_0 in fs.saf_equiv_classes + assert len(fs.saf_equiv_classes[g11_sa_0]) == 5 # collapse via G9 + g15_line = c.cells['G15'].outs[0] + g15_sa_0 = g15_line.index*2 + assert g15_sa_0 in fs.saf_equiv_classes[g11_sa_0] + diff --git a/tests/test_line_roles.py b/tests/test_line_roles.py new file mode 100644 index 0000000..6aac89f --- /dev/null +++ b/tests/test_line_roles.py @@ -0,0 +1,62 @@ +from kyupy import bench +from kyupy.techlib import KYUPY +from fsim.static import LineRoles + +def test_trivial_inv(): + c = bench.parse('input(i) output(o) o=INV(i)') + lr = LineRoles(c, KYUPY) + assert len(lr.line2roles) == 2 + assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 2 + +def test_input_fanout(): + c = bench.parse('input(i) output(o1) output(o2) o1=INV(i) o2=INV(i)') + lr = LineRoles(c, KYUPY) + assert len(lr.line2roles) == 4 + assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 4 + +def test_fanout(): + c = bench.parse('input(i) output(o1) output(o2) ii=INV(i) o1=INV(ii) o2=INV(ii)') + lr = LineRoles(c, KYUPY) + assert len(lr.line2roles) == 6 + assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 6 + +def test_s27(): + # bench parser does not add any clock or set/reset logic. + c = bench.parse(''' + # 1 outputs + # 3 D-type flipflops + # 2 inverters + # 8 gates (1 ANDs + 1 NANDs + 2 ORs + 4 NORs) + + INPUT(G0) + INPUT(G1) + INPUT(G2) + INPUT(G3) + + OUTPUT(G17) + + G5 = DFF(G10) + G6 = DFF(G11) + G7 = DFF(G13) + + G14 = NOT(G0) + G17 = NOT(G11) + + G8 = AND(G14, G6) + + G15 = OR(G12, G8) + G16 = OR(G3, G8) + + G9 = NAND(G16, G15) + + G10 = NOR(G14, G11) + G11 = NOR(G5, G9) + G12 = NOR(G1, G7) + G13 = NOR(G2, G12) + ''') + lr = LineRoles(c, KYUPY) + assert len(lr.line2roles) == 34 # total number of signal lines in circuit + # 2 + 9 + 23 = 34 + assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 2 + assert len(lr.roles2lines[LineRoles.LOGIC_SEQ]) == 9 + assert len(lr.roles2lines[LineRoles.LOGIC_OUT|LineRoles.LOGIC_SEQ]) == 23 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..8ec2fb5 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1950 @@ +version = 1 +revision = 3 +requires-python = ">=3.12, <3.14" + +[manifest] +members = [ + "fsim", + "kyupy", +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/b5/001890774a9552aff22502b8da382593109ce0c95314abaebbb116567545/anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89", size = 253586, upload-time = "2026-06-15T22:00:49.021Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/16/9826f089383c593cdfc4a6e5aca94d9e91ae1692c57af82c3b2aa5e810f7/anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9", size = 123506, upload-time = "2026-06-15T22:00:47.595Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, +] + +[[package]] +name = "bleach" +version = "6.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/3c/e12ac860709702bd5ebeb9b56a4fe334f1001246ee1b8f2b7ee28912df7d/bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452", size = 204857, upload-time = "2026-06-05T13:01:13.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl", hash = "sha256:4b6b6a54fff2e69a3dde9d21cc6301220bee3c3cb792187d11403fd795031081", size = 165109, upload-time = "2026-06-05T13:01:12.504Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "cuda-bindings" +version = "13.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-pathfinder" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/7c/95/872a0392122f1fb43fcb06869790ef3171f37beee9f7db8f441739113570/cuda_bindings-13.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:b134dd8c5c66ae4c4ad814f7aee88fd215353c077010cbc47e3b55ed35ec9eff", size = 5875099, upload-time = "2026-05-29T23:11:54.635Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/2394f8163360f8391f8f1b7e72d300a82724edb81a7b7084c799fbd4c91f/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9efb21c1ee64981e184b9e0ba5eb3179e5ba3d4b51665a6cb52b8ef3d01a7cbf", size = 5920504, upload-time = "2026-05-29T23:11:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/34/c2/ef9b6a63f7dc432712a462c816662e662e00d38caa9b861c8c2588195d03/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2732904099e0a4d4db774a5fc6d91ee95fae065b4d2ecabb4968c5fe2406c9d7", size = 6476660, upload-time = "2026-05-29T23:11:59.188Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2f/6a0dd496550c6fafbf6aeb1bf40242eeabb2fd138a43892aabb4be8224c2/cuda_bindings-13.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:18c8c167c8907b8f02531ca810534315c458dabef31f7965095619bf647b9202", size = 5830027, upload-time = "2026-05-29T23:12:01.205Z" }, +] + +[[package]] +name = "cuda-core" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-pathfinder" }, + { name = "numpy" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/a0/1daeae599cadd612689dbbf70d7da1c01883964fc2fbc7386f3c630a68cf/cuda_core-1.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6816dc020aee6103d8071bc02d8e4e1d91f2b49596f666896d608d92224d79d1", size = 4789856, upload-time = "2026-05-12T20:11:30.862Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4d/603557ab3cb171cc2a61d3678a39cb4dae3fd21275078bfbd1c0b0b5230b/cuda_core-1.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be7b65311bf78964b7905adbf3c0f8f717d432f2854dc45169277729bf60f1e2", size = 5106023, upload-time = "2026-05-12T20:11:33.509Z" }, + { url = "https://files.pythonhosted.org/packages/c2/1a/ae079963c9df7f4274227eb63cf8f6083a532a6443adb340d951fd21c626/cuda_core-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a5c1aa3b738a7599ea289498d038fe625d259fd7ab795394541eee58a8e29bc", size = 4663076, upload-time = "2026-05-12T20:11:35.784Z" }, + { url = "https://files.pythonhosted.org/packages/57/f9/a6676b1fa555fad5748a945f4b530b51b898b4771a1e5d9f3520d3f415ea/cuda_core-1.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c427e5025096d96fcd5092fdc85d5d5e4ac3dea007914e90472ed52f27220446", size = 4749800, upload-time = "2026-05-12T20:11:38.012Z" }, + { url = "https://files.pythonhosted.org/packages/9c/9d/4534a9564a812ee95b43db7324f9b25cbffda001bb348bb5b3f90dad50b9/cuda_core-1.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b392178202c652368883dbe3773cee14f3e1ed6b8bf45d1a1bcdd37c73604e06", size = 5078597, upload-time = "2026-05-12T20:11:40.836Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7c/2f68b0bdeb7dd36204f752468254d6b4487c6d82e9e442cfbe815a656eac/cuda_core-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:b99e3ca9bf3bd2c7d3028e5dc541b00e432e21373816889cdf2722b675bd9be8", size = 4647545, upload-time = "2026-05-12T20:11:43.494Z" }, +] + +[[package]] +name = "cuda-pathfinder" +version = "1.5.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c8/26f2e4aae92f11522a96043892ba39a90eac610d5242523aa863212bc1c7/cuda_pathfinder-1.5.5-py3-none-any.whl", hash = "sha256:0228c023f95d1480f143ef5c8922d27a2ab052087a942e81dc289c9eb8f91689", size = 51671, upload-time = "2026-05-27T01:21:25.413Z" }, +] + +[[package]] +name = "cuda-toolkit" +version = "13.3.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/8c/29b52f76ee4b4f94d5f1ef05797a83ae48ba8b6d5fcd5691dafb570a5f65/cuda_toolkit-13.3.0-py2.py3-none-any.whl", hash = "sha256:6e50798a0cc6e94f3044be58ca7b6628852c017ccec1220af88e60d266fe8f2c", size = 2642, upload-time = "2026-05-27T14:36:44.226Z" }, +] + +[package.optional-dependencies] +cccl = [ + { name = "nvidia-cuda-cccl", 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 = "(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 = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +nvvm = [ + { name = "nvidia-nvvm", 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]] +name = "debugpy" +version = "1.8.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/aa/12037145b7a56eaa5b29b41872f7a21b538e807e13f32c4d3c46e59be084/debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6", size = 1697577, upload-time = "2026-06-01T19:30:35.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/df/bf625547431a9cadc9f4cbfeda38866e2b17f6aed147b625377e87834449/debugpy-1.8.21-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:9f96713896f39c3dff0ee841f47320c3f2983d33c341e009361bb0ebc79adc4e", size = 2483609, upload-time = "2026-06-01T19:30:50.794Z" }, + { url = "https://files.pythonhosted.org/packages/bf/09/59324b903599031ff9faaec1758292409f6561a0ec2492fe4b703327705a/debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176", size = 3968900, upload-time = "2026-06-01T19:30:52.341Z" }, + { url = "https://files.pythonhosted.org/packages/14/cd/27f65b805d7fe005c44e1a36b9183ecdfbcdbf9d3e721a5115d461ecc7ee/debugpy-1.8.21-cp312-cp312-win32.whl", hash = "sha256:4743373c1cac7f9e74a1b9915bf1dbe0e900eca657ffb170ae07ac8363205ae9", size = 5336340, upload-time = "2026-06-01T19:30:54.047Z" }, + { url = "https://files.pythonhosted.org/packages/77/1d/c84e30c0c674184948b66f076ab271c01d940618a2824c23cd035a27bc20/debugpy-1.8.21-cp312-cp312-win_amd64.whl", hash = "sha256:bd7ba9dd3daa7c2f942c6ca8d4695a16bf9ac16b63615261c7982bc74f7ed20c", size = 5374751, upload-time = "2026-06-01T19:30:55.891Z" }, + { url = "https://files.pythonhosted.org/packages/77/6b/d817e1f8cc77aa055d37fba092e0febfdff40fe652d8d53d4cd7a86ad98d/debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88", size = 2477398, upload-time = "2026-06-01T19:30:57.644Z" }, + { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2c616337cf6ba7b07ebbc97f02c6c945a8e2f76b365e33ee809c32ee36d1/debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1", size = 5336288, upload-time = "2026-06-01T19:31:00.79Z" }, + { url = "https://files.pythonhosted.org/packages/f8/99/9175103392f84c4b1bf7622888cdc68da07f0ff7d9e581266428f6776033/debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0", size = 5376567, upload-time = "2026-06-01T19:31:02.56Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + +[[package]] +name = "fsim" +version = "0.0.1" +source = { editable = "." } +dependencies = [ + { name = "kyupy" }, + { name = "numba" }, + { name = "numba-cuda", extra = ["cu13"], marker = "sys_platform != 'darwin'" }, +] + +[package.dev-dependencies] +dev = [ + { name = "graphviz" }, + { name = "ipython" }, + { name = "isort" }, + { name = "jupyter" }, + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [ + { name = "kyupy", editable = "kyupy" }, + { name = "numba", specifier = ">=0.65.1" }, + { name = "numba-cuda", extras = ["cu13"], marker = "sys_platform != 'darwin'", specifier = ">=0.30.1" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "graphviz" }, + { name = "ipython", specifier = ">=9.14.1" }, + { name = "isort", specifier = ">=8.0.1" }, + { name = "jupyter", specifier = ">=1.1.1" }, + { name = "pytest", specifier = ">=9.0.1" }, +] + +[[package]] +name = "graphviz" +version = "0.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b3/3ac91e9be6b761a4b30d66ff165e54439dcd48b83f4e20d644867215f6ca/graphviz-0.21.tar.gz", hash = "sha256:20743e7183be82aaaa8ad6c93f8893c923bd6658a04c32ee115edb3c8a835f78", size = 200434, upload-time = "2025-06-15T09:35:05.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl", hash = "sha256:54f33de9f4f911d7e84e4191749cac8cc5653f815b06738c54db9a15ab8b1e42", size = 47300, upload-time = "2025-06-15T09:35:04.433Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imagesize" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "ipykernel" +version = "7.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio2" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/c4/e4a38f579de4225a561305666f7541cdabb30075def2aa1ac17bd73c1fb5/ipykernel-7.3.0.tar.gz", hash = "sha256:9acaaaf97d16355166e4085afe9d225bfbdf2b7ef520f9df3be8f2b248275e09", size = 184899, upload-time = "2026-06-10T08:41:25.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/02/77b271f5dc58bfbc0b577c877b2365d1ffea2afe66a80c13f2312820348c/ipykernel-7.3.0-py3-none-any.whl", hash = "sha256:897eb64da762549ef610698fca5e9675195ec6ac8ec7f19d81ce1ca20c876057", size = 120583, upload-time = "2026-06-10T08:41:23.648Z" }, +] + +[[package]] +name = "ipython" +version = "9.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil", marker = "sys_platform != 'emscripten'" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/23/3a27530575643c8bb7bfc757a28e2e7ef80092afbf59a2bc5716320b6602/ipython-9.14.1.tar.gz", hash = "sha256:f913bf74df06d458e46ced84ca506c23797590d594b236fe60b14df213291e7b", size = 4433457, upload-time = "2026-06-05T08:12:34.921Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/22/58818a63eaf8982b67632b1bc20585c811611b15a8da19d6012323dc76a5/ipython-9.14.1-py3-none-any.whl", hash = "sha256:5d4a9ecaa3b10e6e5f269dd0948bdb58ca9cb851899cd23e07c320d3eb11613c", size = 627770, upload-time = "2026-06-05T08:12:33.045Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + +[[package]] +name = "isort" +version = "8.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/7c/ec4ab396d31b3b395e2e999c8f46dec78c5e29209fac49d1f4dace04041d/isort-8.0.1.tar.gz", hash = "sha256:171ac4ff559cdc060bcfff550bc8404a486fee0caab245679c2abe7cb253c78d", size = 769592, upload-time = "2026-02-28T10:08:20.685Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733, upload-time = "2026-02-28T10:08:19.466Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "json5" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/7d/05c46a96a78147ae3bf99c2f4169ce144a70220b8d6fcd56f6ec368b8ce9/json5-0.15.0.tar.gz", hash = "sha256:7424d1f1eb1d56da6e3d70643f53619862b4ce81440bdb8ecfd6f875e5ba4a71", size = 53278, upload-time = "2026-06-19T20:08:27.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/be/59527c99478aade6bb33a68d72e6e18dd4e6ff6eacfc7d01bdb15bc76912/json5-0.15.0-py3-none-any.whl", hash = "sha256:56636a30c0e8a4665fe2179c0212f32eae3796dea89ea6f649b9436ecdb39618", size = 36570, upload-time = "2026-06-19T20:08:26.748Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "rfc3987-syntax" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipywidgets" }, + { name = "jupyter-console" }, + { name = "jupyterlab" }, + { name = "nbconvert" }, + { name = "notebook" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, +] + +[[package]] +name = "jupyter-builder" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/45/d0df8b43c10a61529c0f4a8af5e19ebe108f0c3af8f57e0fc358969907af/jupyter_builder-1.0.2.tar.gz", hash = "sha256:6155d78a5325010532a6419ffcba89eac643fd1aa56ea83115e661924d6f6aab", size = 968638, upload-time = "2026-06-12T02:33:25.767Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/b6/c418e0b3256f67c04933566b80bfce947350682db92c4b786a8653db32d6/jupyter_builder-1.0.2-py3-none-any.whl", hash = "sha256:b024f65d36e1d530542db597b00dd513261aa59842e0d0fbbb1015a9f1935e9c", size = 910789, upload-time = "2026-06-12T02:33:23.317Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/dc/5512503b088997c2250b8bf18258fba9d9ce5ead641183700960d3c9d342/jupyter_client-8.9.1.tar.gz", hash = "sha256:a58f730dd9e728ba16ba1d62ebccf7ffe1ebbdbce4e95cfae941b7321ae1f4fa", size = 359256, upload-time = "2026-06-09T13:15:01.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/6f/56d39bf385c5c27988aebaf0c18a2a17e960575740100973511018bd904e/jupyter_client-8.9.1-py3-none-any.whl", hash = "sha256:0b7a295bc46e8751e9adae84781f726c851c1d911bd793edc4a3bde942e3da81", size = 109828, upload-time = "2026-06-09T13:14:58.835Z" }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/f8/475c4241b2b75af0deaae453ed003c6c851766dbc44d332d8baf245dc931/jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3", size = 62854, upload-time = "2026-04-20T23:17:50.66Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf", size = 19512, upload-time = "2026-04-20T23:17:48.927Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/dc/db3a582633170186f8c8b31298d7eb26ad0eb031a1f53476c258b64eed05/jupyter_server-2.20.0.tar.gz", hash = "sha256:b5778ba337d8015a3dc2b80803ecdd5ac18d3797fddf61a50ea5fb472b4ebe14", size = 756523, upload-time = "2026-06-17T12:09:09.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/71/8c002223e873a870f5c41dc69b0a7c922301123e4a31d5d01ecb700aef77/jupyter_server-2.20.0-py3-none-any.whl", hash = "sha256:c3b67c93c471e947c18b5026f04f21614218adb706df8f48227d3ee8e0a7cdcc", size = 393143, upload-time = "2026-06-17T12:09:07.234Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14", size = 13704, upload-time = "2026-01-14T16:53:18.738Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-builder" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/3c/1ebd737b860cdbe61eed71536d06aab4e1781fbdcf07ecd5a1afe05b8adf/jupyterlab-4.6.0.tar.gz", hash = "sha256:6a8b88f2aae7ed4d012c634fc957c1a27f3aa217c32f0ced0175fac9ee17f9e5", size = 28181861, upload-time = "2026-06-18T13:52:56.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/eb/aa48075d0aa3d0188db34ba2704f53791757743c0bb02e18c4eef989b6de/jupyterlab-4.6.0-py3-none-any.whl", hash = "sha256:b6938cb8a1ef3d43860ff4745a680c62cc0a9385f9672295bb56cd2e7cfeebe2", size = 17143447, upload-time = "2026-06-18T13:52:51.42Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "kyupy" +version = "0.0.7" +source = { editable = "kyupy" } +dependencies = [ + { name = "lark" }, + { name = "numpy" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ipython" }, + { name = "jupyter" }, + { name = "myst-parser" }, + { name = "pytest" }, + { name = "sphinx" }, + { name = "sphinx-rtd-theme" }, +] + +[package.metadata] +requires-dist = [ + { name = "lark", specifier = ">=1.3.0" }, + { name = "numpy", specifier = ">=1.17.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "ipython", specifier = ">=9.14.1" }, + { name = "jupyter", specifier = ">=1.1.1" }, + { name = "myst-parser", specifier = ">=4.0.1" }, + { name = "pytest", specifier = ">=9.0.1" }, + { name = "sphinx", specifier = ">=8.1.3" }, + { name = "sphinx-rtd-theme", specifier = ">=3.0.2" }, +] + +[[package]] +name = "lark" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz", hash = "sha256:62031ce968ec74e95092184d4b0e857e444f8fdff0b8f9213707699570c33ccc", size = 193614, upload-time = "2026-03-31T18:29:53.497Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/48/4b7fe0e34c169fa2f12532916133e0b219d2823b540733651b34fdac509a/llvmlite-0.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:306a265f408c259067257a732c8e159284334018b4083a9e35f67d19792b164f", size = 37232769, upload-time = "2026-03-31T18:28:43.735Z" }, + { url = "https://files.pythonhosted.org/packages/e6/4b/e3f2cd17822cf772a4a51a0a8080b0032e6d37b2dbe8cfb724eac4e31c52/llvmlite-0.47.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5853bf26160857c0c2573415ff4efe01c4c651e59e2c55c2a088740acfee51cd", size = 56275178, upload-time = "2026-03-31T18:28:48.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a3b4a543185305a9bdf3d9759d53646ed96e55e7dfd43f53e7a421b8fbae/llvmlite-0.47.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:003bcf7fa579e14db59c1a1e113f93ab8a06b56a4be31c7f08264d1d4072d077", size = 55128632, upload-time = "2026-03-31T18:28:52.901Z" }, + { url = "https://files.pythonhosted.org/packages/2f/f5/d281ae0f79378a5a91f308ea9fdb9f9cc068fddd09629edc0725a5a8fde1/llvmlite-0.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:f3079f25bdc24cd9d27c4b2b5e68f5f60c4fdb7e8ad5ee2b9b006007558f9df7", size = 38138692, upload-time = "2026-03-31T18:28:57.147Z" }, + { url = "https://files.pythonhosted.org/packages/77/6f/4615353e016799f80fa52ccb270a843c413b22361fadda2589b2922fb9b0/llvmlite-0.47.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a3c6a735d4e1041808434f9d440faa3d78d9b4af2ee64d05a66f351883b6ceec", size = 37232771, upload-time = "2026-03-31T18:29:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/31/b8/69f5565f1a280d032525878a86511eebed0645818492feeb169dfb20ae8e/llvmlite-0.47.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2699a74321189e812d476a43d6d7f652f51811e7b5aad9d9bba842a1c7927acb", size = 56275178, upload-time = "2026-03-31T18:29:05.748Z" }, + { url = "https://files.pythonhosted.org/packages/d6/da/b32cafcb926fb0ce2aa25553bf32cb8764af31438f40e2481df08884c947/llvmlite-0.47.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c6951e2b29930227963e53ee152441f0e14be92e9d4231852102d986c761e40", size = 55128632, upload-time = "2026-03-31T18:29:11.235Z" }, + { url = "https://files.pythonhosted.org/packages/46/9f/4898b44e4042c60fafcb1162dfb7014f6f15b1ec19bf29cfea6bf26df90d/llvmlite-0.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2e9adf8698d813a9a5efb2d4370caf344dbc1e145019851fee6a6f319ba760e", size = 38138695, upload-time = "2026-03-31T18:29:15.43Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mistune" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, +] + +[[package]] +name = "myst-parser" +version = "5.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/dc/f3dfb7488b770f3f67e6545085bf2abea5172e88f57b8ad25ef860ca704c/myst_parser-5.1.0-py3-none-any.whl", hash = "sha256:9c91c52b3cdb4d94a6506e4fab4e2f296c7623a0da0dcbe6de1565c3dad67a8a", size = 85817, upload-time = "2026-05-13T09:38:17.904Z" }, +] + +[[package]] +name = "nbclient" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/a5/b3bae4b590c0cbcada2c63a34f7580024e834a8ba213e949a2f906705787/nbclient-0.11.0.tar.gz", hash = "sha256:04a134a5b087f2c5887f228aca155db50169b8cd9334dee6942c8e927e56081a", size = 62535, upload-time = "2026-06-05T07:52:41.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/c9/94d73e5a01c5b926c3fa2496e97d7a8dc28ed5a77c0b2ed712f1a62e6694/nbclient-0.11.0-py3-none-any.whl", hash = "sha256:ef7fa0d59d6e1d41103933d8a445a18d5de860ca6b613b87b8574accdb3c2895", size = 25288, upload-time = "2026-06-05T07:52:40.115Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "nest-asyncio2" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/73/731debf26e27e0a0323d7bda270dc2f634b398e38f040a09da1f4351d0aa/nest_asyncio2-1.7.2.tar.gz", hash = "sha256:1921d70b92cc4612c374928d081552efb59b83d91b2b789d935c665fa01729a8", size = 14743, upload-time = "2026-02-13T00:34:04.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/3c/3179b85b0e1c3659f0369940200cd6d0fa900e6cefcc7ea0bc6dd0e29ffb/nest_asyncio2-1.7.2-py3-none-any.whl", hash = "sha256:f5dfa702f3f81f6a03857e9a19e2ba578c0946a4ad417b4c50a24d7ba641fe01", size = 7843, upload-time = "2026-02-13T00:34:02.691Z" }, +] + +[[package]] +name = "notebook" +version = "7.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-builder" }, + { name = "jupyter-server" }, + { name = "jupyterlab" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/44/d5c65783f490298473bb1c05722e05ee2256231389559c2c5ae0a3e5d975/notebook-7.6.0.tar.gz", hash = "sha256:ea13e79e601bf273074895fdfb17dd3f2da916d3c045e0b9c47d18b16ab62481", size = 5497344, upload-time = "2026-06-18T16:18:55.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d1/e617c40db57ff40e75f43a7d4d1c305e3a54c053ab5cb0534a6c314664f9/notebook-7.6.0-py3-none-any.whl", hash = "sha256:98aa2811b54ac191321d5dfce12ca700f8a511a33a26e4de2fa106a357c43d6a", size = 5544575, upload-time = "2026-06-18T16:18:52.551Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, +] + +[[package]] +name = "numba" +version = "0.65.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz", hash = "sha256:19357146c32fe9ed25059ab915e8465fb13951cf6b0aace3826b76886373ab23", size = 2765600, upload-time = "2026-04-24T02:02:56.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/bc/76f8f8c5cf9adee47fdb7bbb03be8900f76f902d451d7477cf12b845e1de/numba-0.65.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ac3f1e77c352dd0ea9712732c2d8f9ca507717435eec5b5013bf138ac33c4a08", size = 2681371, upload-time = "2026-04-24T02:02:26.105Z" }, + { url = "https://files.pythonhosted.org/packages/69/47/a415af0283e4db0398104c6d1c11c9861a98dc67a7aa442a7769ed5d6196/numba-0.65.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:52bc6f3ceb8fcaff9b2ae26b4c6b1e9fee39db8d355534c0fe4f39a901246b84", size = 3802467, upload-time = "2026-04-24T02:02:27.712Z" }, + { url = "https://files.pythonhosted.org/packages/46/36/246f73ec99cfeab2f2cb2ce7d4218766cc36a2da418901223f4f4da9c813/numba-0.65.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90ca10b3463bae0bd70589726fe3c77d01d6b5fc86bee54bcdf9fb6b47c28977", size = 3502628, upload-time = "2026-04-24T02:02:29.763Z" }, + { url = "https://files.pythonhosted.org/packages/db/9e/3c679b2ee078425b9e99a91e44f8d132a6830d8ccce5227bc5e9181aeed8/numba-0.65.1-cp312-cp312-win_amd64.whl", hash = "sha256:5971c632be2a2351500431f46213821dba8d02b18a9f7d02fd36bd2743e41a6a", size = 2750611, upload-time = "2026-04-24T02:02:31.477Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/14a4579049c1eb673afd0de0cb4842982acd55b9ce2643e763db858bcea0/numba-0.65.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1735c15c1134a5108b4d6a5c77fc0947924ea066a738dc09a52008c13df9cad3", size = 2681344, upload-time = "2026-04-24T02:02:33.65Z" }, + { url = "https://files.pythonhosted.org/packages/a0/22/b8d873f6466b20aa563fc9b33acd48dec89a07803ddaa2f1c8ca1cd33126/numba-0.65.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c09f49117ef255e1f1c6dad0c7a1ed39868243862a73be5706793241a3755f1b", size = 3810619, upload-time = "2026-04-24T02:02:36.041Z" }, + { url = "https://files.pythonhosted.org/packages/62/08/e16a8b5d9a018962ebb5c66be662317cde32b9f5dab08441f90bed5522fb/numba-0.65.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:594a8680b3fadac99e97e489b1fd89007177e5336713745c3b769528c635a464", size = 3509783, upload-time = "2026-04-24T02:02:38.245Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a5/03c970d57f4c1741354837353ce39fb5206952ae1dba8922d29c86f64805/numba-0.65.1-cp313-cp313-win_amd64.whl", hash = "sha256:85be74c0d036842699a30058f82fb88fc5ffdc59f7615cab5792ea92914c9b62", size = 2750534, upload-time = "2026-04-24T02:02:39.903Z" }, +] + +[[package]] +name = "numba-cuda" +version = "0.30.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-bindings" }, + { name = "cuda-core" }, + { name = "cuda-pathfinder" }, + { name = "numba" }, + { name = "packaging" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/56/9a98585665531ee32c355422f7bbd22f20da56bfbea3f565373c1382c40b/numba_cuda-0.30.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0ce7bc6c740e76ae14e6c2e81e129ae3fdc34556850ad805dc44e5d21314e5e", size = 1901731, upload-time = "2026-05-12T22:49:52.256Z" }, + { url = "https://files.pythonhosted.org/packages/6f/be/7d2159a318ebdba835e57ae4df13a799f199a3416a15b37a3fac4f8ce400/numba_cuda-0.30.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6214cefb42636c667139c5e897a5ee92cf8bf7177ef907580eea5f2368eee9d9", size = 1899235, upload-time = "2026-05-12T22:49:53.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a3/e08df78e34310acc0f184eae7e80134e83d4c7498a71f9a2657f47d5b894/numba_cuda-0.30.2-cp312-cp312-win_amd64.whl", hash = "sha256:c87beb3a96b3caa554d1c5a9c08aae455114b2f43a4b1453963dccfe981f8b62", size = 1878539, upload-time = "2026-05-12T22:49:55.792Z" }, + { url = "https://files.pythonhosted.org/packages/30/72/16d08487179d6c329774d6b56bee012624e7b47ad7a4eea9a00358354f68/numba_cuda-0.30.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:81238e8ee92a27f4bdb9b152c3c352737cb059925d6ea2e6bae03dd5bf4ad16e", size = 1908933, upload-time = "2026-05-12T22:49:57.914Z" }, + { url = "https://files.pythonhosted.org/packages/60/c6/b76d0115f49350ab4cc9c7f5d9de63418075dfdd7e483f33e6a017e58a61/numba_cuda-0.30.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a2f851b14d49c494ff642249d1d5622ef684049c1b4efe1ca531e10e37baf19", size = 1906530, upload-time = "2026-05-12T22:50:00.053Z" }, + { url = "https://files.pythonhosted.org/packages/09/93/1216c31d39ce2e6c4b670ac55de40422d7d00b04bbdb16cfdbaf08a0884f/numba_cuda-0.30.2-cp313-cp313-win_amd64.whl", hash = "sha256:e27b42a31a5fac51c0297217eacbbc305ea2db0e4f981808f7e73ac1159a281f", size = 1878628, upload-time = "2026-05-12T22:50:01.866Z" }, +] + +[package.optional-dependencies] +cu13 = [ + { name = "cuda-bindings" }, + { name = "cuda-toolkit", extra = ["cccl", "cudart", "nvrtc", "nvvm"] }, + { name = "nvidia-nvjitlink" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, +] + +[[package]] +name = "nvidia-cuda-cccl" +version = "13.3.3.3.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/7a/9cb8a7fb87a85b11e8753548ae1422be847c5dddf3ca9ff5b080b309e271/nvidia_cuda_cccl-13.3.3.3.1-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4dbc9dd84fbaeae267cbd80a9ed76d35171dba78639695dbdff0bae50e4503fa", size = 3453010, upload-time = "2026-05-26T16:27:45.179Z" }, + { url = "https://files.pythonhosted.org/packages/fe/fb/195d50d25ab68a76b817ffc68c45b1fb828598ce35a8e5c1736060628dab/nvidia_cuda_cccl-13.3.3.3.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40ba1fa0b2c694ddc06cc791ed5c8bdad4638e2735b784960d68ac3086399c97", size = 3453013, upload-time = "2026-05-26T16:28:08.209Z" }, + { url = "https://files.pythonhosted.org/packages/57/44/37cf1596880e7712f357b3f4991cd34d0f322c26e2bc814d1bdeffb2f420/nvidia_cuda_cccl-13.3.3.3.1-py3-none-win_amd64.whl", hash = "sha256:d1ac746f57ab83403f01e64e2b292101caf5b3445babca9f1c1c34f344766adf", size = 3452993, upload-time = "2026-05-26T16:58:59.166Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc" +version = "13.3.33" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/2c/86916c8a34dcdb0c3ddd1c0e30545041bd781184e437b9cb76fcda70560b/nvidia_cuda_nvrtc-13.3.33-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:82530788b8c6164a54d3fd9ae8bcca8893d397c4aeb998861982a03bbe41e204", size = 51110910, upload-time = "2026-05-26T16:38:16.116Z" }, + { url = "https://files.pythonhosted.org/packages/e7/b6/60a3641111d39ebfcfcd8b8bfd0290d7623c4b8b5f90952c2d84776f8ca4/nvidia_cuda_nvrtc-13.3.33-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7b05ecda494c6dabc44231a608b060a71008a730d9dfda932cc508e6d29159e0", size = 49260054, upload-time = "2026-05-26T16:37:51.177Z" }, + { url = "https://files.pythonhosted.org/packages/a1/42/edce72f2c5a0f587168109c867f25f4a9a6cd7289ecf0d68ed2b1070f273/nvidia_cuda_nvrtc-13.3.33-py3-none-win_amd64.whl", hash = "sha256:7d2af818851c0c224d5f92221e9226e51ee23c236df4b51f9194563979c888be", size = 45319163, upload-time = "2026-05-26T17:02:49.217Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime" +version = "13.3.29" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/e5/c1a221c8e6fecd071b80ea44c20fc253ae24f56e15e3f77cfbc3fb76e724/nvidia_cuda_runtime-13.3.29-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73291e19c9dd919c140c91bda2f80b0eca487da5ee30a086ef7bc4918ecb90ea", size = 2356574, upload-time = "2026-05-26T16:29:56.333Z" }, + { url = "https://files.pythonhosted.org/packages/97/be/5699b6e642b372f7d24c59c2f41383e2696825e20bab85f7399c7c6a56f7/nvidia_cuda_runtime-13.3.29-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e04420616e72f563167a7733272992d7e6df6dc5cb54b2f94f9f1520ea9e30c1", size = 2339786, upload-time = "2026-05-26T16:30:21.584Z" }, + { url = "https://files.pythonhosted.org/packages/d2/27/b53a5e0397842a5c11f0e1a39d4e5b2f22638a4126e83b3c4e196f62c969/nvidia_cuda_runtime-13.3.29-py3-none-win_amd64.whl", hash = "sha256:0667ec61c3d897388efa305ed4f7609ace88849a753ba9c6311d06dca55fff4f", size = 2630354, upload-time = "2026-05-26T17:00:05.389Z" }, +] + +[[package]] +name = "nvidia-nvjitlink" +version = "13.3.33" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/ee/580ca6f29dcab0221db8706badca1bbbb084f1975c4d4e83329c3a7e31f0/nvidia_nvjitlink-13.3.33-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:26a6de7fb4c8fdaa7703d3dad720d6d427ddfea5c48a528fd97c11733ad830e5", size = 40742423, upload-time = "2026-05-26T16:54:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/69/30/45414e35ff2eee7db3da037e5707037ccf9d2b5218ffbdb055ea4d5aa98a/nvidia_nvjitlink-13.3.33-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ce48b37dfeb3cb1eae4cf85adacb47d7a6539ea2272870c9a3628ce275c2037e", size = 39168635, upload-time = "2026-05-26T16:54:13.906Z" }, + { url = "https://files.pythonhosted.org/packages/67/f2/ec9c05a108095828dfc58840978c627b3c313fdf2a567c6de9ffbbb46901/nvidia_nvjitlink-13.3.33-py3-none-win_amd64.whl", hash = "sha256:4297ee49639b4f2e07255a1d69b3acc7ab2d011bb892b403e91ac98368962e3b", size = 37766359, upload-time = "2026-05-26T17:11:28.96Z" }, +] + +[[package]] +name = "nvidia-nvvm" +version = "13.3.33" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/8a/f767031dcd0d24c2bbab4b696dbcf004da4f3284e5e4649fc47bc0e2bb78/nvidia_nvvm-13.3.33-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:aafaf73246b6126bc88f521e5dab1d196395ee87739d9f5b7c39c9fee0ead9c7", size = 69250604, upload-time = "2026-05-26T16:57:56.875Z" }, + { url = "https://files.pythonhosted.org/packages/83/36/ce0d42d3a4465c858c379932f0080d29d22f04383ab79119c7c4f4cdd5ef/nvidia_nvvm-13.3.33-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd74a1c5ef284ba04c1ba75f886404dff953c54731a3a9c7b45e9aedaf1a226b", size = 66984524, upload-time = "2026-05-26T16:57:30.778Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/4de7a37803d168337ab36f81ecbc496c7c21c9b06ec68ce0ecc381af88d4/nvidia_nvvm-13.3.33-py3-none-win_amd64.whl", hash = "sha256:b1c63cf8972d8a1ff153c5ac4cc7038fe6ef705aa38415f12007b0e5e4c31b79", size = 60175824, upload-time = "2026-05-26T17:13:27.588Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-json-logger" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, +] + +[[package]] +name = "pywinpty" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/ef/2d27f30c59a67be7025b2d7858c8c2d282b74d66544b2384730b82de74fd/pywinpty-3.0.5.tar.gz", hash = "sha256:61db0db063de9865adbea66db294628f8577f608d9764a4c7d3384eeacc4e81b", size = 16223484, upload-time = "2026-06-11T00:11:58.93Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/34/942cc95ca4e26489875aa8a95192766247a687379ec29543eebe73ec945f/pywinpty-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:d62946adf14b15b54c0b8d785f93fe18b04da23f4ad59e2e8c4612646e9abd23", size = 2090915, upload-time = "2026-06-10T23:43:14.98Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/5b9053004844139ea8bd86209c57ade12b134b2782f383a095784c8531ec/pywinpty-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:e9391c05fbfa7a992a97e831fc6849887b4014a614192e3d984a7ca59592b376", size = 815934, upload-time = "2026-06-10T23:41:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f4/2a464b9893cceb3b3f416356e94fdc3e1bca9476993927e4e6d99fe95382/pywinpty-3.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:48db1b0ad9d0a1b81dcaaa7163a99a7808deaceb0c1b2344716dc1fc090c3c4c", size = 2090471, upload-time = "2026-06-10T23:42:11.071Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2c/a138491a0afbdb50eb79395577bd326d4b0fbde7209417d1a8087ff2493a/pywinpty-3.0.5-cp313-cp313-win_arm64.whl", hash = "sha256:2c6008fb2d3774b48693b2fcb7f2cc317ade9dc581289a964ffeeaf81307c9b5", size = 815518, upload-time = "2026-06-10T23:42:02.363Z" }, + { url = "https://files.pythonhosted.org/packages/6f/15/54400049a380582acd1282665c70fcf11e0bd3713679aca78e24c3aae738/pywinpty-3.0.5-cp313-cp313t-win_amd64.whl", hash = "sha256:22ce1b780d89821cc52daf6eac0708af22d93d000ce9c7c07e37489db8594598", size = 2089920, upload-time = "2026-06-10T23:44:13.395Z" }, + { url = "https://files.pythonhosted.org/packages/94/0c/6f24f3c0799f502259b24bdf841a99ad2b0d59df5c2525b4e2a286d14be2/pywinpty-3.0.5-cp313-cp313t-win_arm64.whl", hash = "sha256:9c2919a81bc5cfb09b86fc5a002112b2de95ca4304a07413cbeeb746a1307a5c", size = 814520, upload-time = "2026-06-10T23:43:28.588Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + +[[package]] +name = "roman-numerals" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", hash = "sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256", size = 64459, upload-time = "2026-05-28T12:02:13.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/e7/a78582dc57caa592dcc7d4fb69b61390561e908eb3d2f5df5928a8e354c0/rpds_py-2026.5.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3abe24a66e57adcfa645d718063a5fa5103ecc71ddbf26d78af8f9368018ff1d", size = 353040, upload-time = "2026-05-28T11:59:12.531Z" }, + { url = "https://files.pythonhosted.org/packages/a3/43/35e3f136343aef451e545ce8c38d36c2f93c0ed88703db8b64ba2b205c68/rpds_py-2026.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b1d94308ddf0b1982f61f2eb54bf92997c9ece8a8093ef014250f4a517906c", size = 345775, upload-time = "2026-05-28T11:59:13.827Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/0f2160c5982d3157734d5cb3ed63d8b2d583a73c9864f77b666449f32cf8/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa92420128dadce7f54bd73ba1825a273e9268fe9e35dbf7e6362890efa4e08", size = 376329, upload-time = "2026-05-28T11:59:15.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/11/ee0ba42aff83bf4effdbc576673c6be64c5e173978c3f6d537e94482f77d/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca653c6546386227cd9800d1bef6a348099acf8db4250341da6d90f663d6dfcb", size = 383539, upload-time = "2026-05-28T11:59:16.665Z" }, + { url = "https://files.pythonhosted.org/packages/11/df/d94aa6a499d4ac40afe2d7620f2c597fd3c0f182e854ad7cf3f596a81cb6/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66c93681c4729e4e3ecba31b8179fae083ff3118841672835140338b4b9867c1", size = 494674, upload-time = "2026-05-28T11:59:17.991Z" }, + { url = "https://files.pythonhosted.org/packages/1f/75/33d30f43bb2f458de11979486a591b1bf6e5651765ed1704c6197c2dc773/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ff257542e04796880e011e15cd4dc21c2599975df2aaa8f2c8495ca574e1a5", size = 389268, upload-time = "2026-05-28T11:59:19.434Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1e/2c9096fc19d5fd084b0184ca2b651e659aa0a37e6fdbecf6ece47f147fe1/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6825cc329b290e93c5f6a9be2393118a763f6ccf6abd83704e0c102ca583644", size = 376280, upload-time = "2026-05-28T11:59:21Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e5/61ec9f8be8211ea7f48448195549e4aaf02004083475493b0e137702ecb2/rpds_py-2026.5.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:de42116e69cb53b911cc34aee5ab98f36c597b822545045d49e938818b99e5e4", size = 387233, upload-time = "2026-05-28T11:59:22.454Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/bcec1005c4f4a234f92a29078631fee49206c7265ccae966f18fd332e80e/rpds_py-2026.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0f920015df2a504bebaba6d4c31ccf3fcf942f92655c086da30b671aad19aa6", size = 405009, upload-time = "2026-05-28T11:59:23.845Z" }, + { url = "https://files.pythonhosted.org/packages/72/e6/4d5718c5cf26c522dc7c9999e238da1e77380b81d0c5d1df11e271ddfeb1/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0408a24e44feb919423dc6d9da677cb5cddb894d2ca9e763967d156d9c60fab4", size = 553113, upload-time = "2026-05-28T11:59:25.184Z" }, + { url = "https://files.pythonhosted.org/packages/d4/25/2ee807bdb3e1f0b7eddf7782acd5665a8b5205a331a7d7244a52c4812fd9/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cea68bcd53467561ae2f96a6bdad1544299ba97b5b0ddcd5ac3d376e5c781c24", size = 618838, upload-time = "2026-05-28T11:59:26.749Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c1/7d4c26f167f8c41501cc073d30ee22082b16ce358cf5b00ec97cbc7804ea/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4be8b1d2a705cc37d08256004e1d07de143fa0075c8e85a3df020b776f62b732", size = 582436, upload-time = "2026-05-28T11:59:28.11Z" }, + { url = "https://files.pythonhosted.org/packages/04/1d/9d12b0a337bab46f4769f8857f4007e3b2d639e14f9a44a0efe157696e64/rpds_py-2026.5.1-cp312-cp312-win32.whl", hash = "sha256:6736718bd4fc49cbcb538ba30516fdbef161522acefb739657d48b97bd864fed", size = 212734, upload-time = "2026-05-28T11:59:29.689Z" }, + { url = "https://files.pythonhosted.org/packages/c5/93/e4116f2de7f56bc7406a76033dc501811ddeb22b7f056b92d632871ebb0c/rpds_py-2026.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:0a7d1eec967df0e9b22614a5e177622e0c89611d03727fa0cb48e45028907870", size = 229045, upload-time = "2026-05-28T11:59:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/53/6c3419d85eb2ec5938a37627c585b42d76a63bb731d6e42ed4b079ebf486/rpds_py-2026.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1841d067089e117142d79b98aa0df2f08b52f2ecc1819dd2700636c0db74a473", size = 223967, upload-time = "2026-05-28T11:59:32.318Z" }, + { url = "https://files.pythonhosted.org/packages/6c/32/14c961ad295f490eb0849ada8b79683e93a59b9de3afdd983eaf55fa6867/rpds_py-2026.5.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:efef4ac29c6ff495531eb17ee705b62841ecaa291b7c7077e848ea03e237164d", size = 352787, upload-time = "2026-05-28T11:59:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/ca/bb/d1b85117967c11191441a7274ae616c65d93901d082c588f89a50a8da5ae/rpds_py-2026.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c39f5b67a8a2e67179ada2a954227d670fe65fa9098457f698f56ddf248709b3", size = 345179, upload-time = "2026-05-28T11:59:35Z" }, + { url = "https://files.pythonhosted.org/packages/7c/46/d84105f062e626a1b233f863907288a4708c2d833b8b4c6fb2764bc080c0/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5c30f3f04eef4fbd362226a6f31d7c8895ca4fbb6e0b790f6890a98d8da8559", size = 376173, upload-time = "2026-05-28T11:59:36.43Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/469d7959ce5b1201e1de135dc735b86db3b35dd0d1734f6a44246d5f061c/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:277f6c82f0580848796c7ecc8a7173aa3bfb928e4ff831261c2f60a81dc270db", size = 383162, upload-time = "2026-05-28T11:59:37.995Z" }, + { url = "https://files.pythonhosted.org/packages/dc/a2/57853d31a1116a561aa072794602ad3f6341e18d70a8523f1bd5b9fc1e5a/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63c2c4c213f1a4e3f3de28ecab029dbdee976324e729c0d7a55211be72576b02", size = 495093, upload-time = "2026-05-28T11:59:39.453Z" }, + { url = "https://files.pythonhosted.org/packages/99/63/3a8eabcad9314b7daf5c65f451d2c33d989235cd8a5762186cf2c3f5a4f8/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3350ec808fb538fe71a1f94dfaa0e29c598dfad805ce49f0caec5ae3183c652b", size = 389829, upload-time = "2026-05-28T11:59:40.896Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/05678d97fc25e2622df14dc530fb82023174ecfff6733991ed0d78f167bd/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b964e3ab599e718dc46c018d104b1ebc007cbc6567d827c94a687fca56d77e", size = 374786, upload-time = "2026-05-28T11:59:42.626Z" }, + { url = "https://files.pythonhosted.org/packages/88/d1/8c90b6431e80a3b91b284a5c7c8c0c4f9c006444d90477a740d6e0f9c694/rpds_py-2026.5.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:19cb09fab7b7fc96b2a6e28f2e34b72a3705ff27b37edb77455316e5d3f3dc9b", size = 386920, upload-time = "2026-05-28T11:59:44.124Z" }, + { url = "https://files.pythonhosted.org/packages/ff/99/4638f672ab356682d633ee0da9255f5b67ce6efd0b85eb94ad3e255e65a5/rpds_py-2026.5.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abe76bcdba31e576cb83eeb8797aa0d882b738fef6dc65d0601fc753806a5b46", size = 405059, upload-time = "2026-05-28T11:59:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/66/3f/3546524b6eb4cc2e1f363a3d638fa52f6c24faae3500c25fb488b02f1740/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bff7073db3899158fff55ebf57b113a67030af26f80a18978f9f0aa60250ddf", size = 553030, upload-time = "2026-05-28T11:59:48.603Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c3/7b3388c796fcf471bd17194242d4dc1a7608567c0fa422bcc1c5e79f9c1e/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8ba264fa49be666cd9cc56bf34ec7002fb3d27a4aee5bcb4d43d0d18feb1bb6f", size = 618975, upload-time = "2026-05-28T11:59:50.314Z" }, + { url = "https://files.pythonhosted.org/packages/61/1e/a3cb07f2795075d1d88efddae2f541359fde5f08c81ee114c29c2949c90a/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4860b603ddda0475a8885499b3729e90229d480105b42651962a5397d995fa89", size = 581178, upload-time = "2026-05-28T11:59:51.673Z" }, + { url = "https://files.pythonhosted.org/packages/a1/74/e758c03a5ef46f04c37f2651a2893db846d569ba8a7bca469d4b58939bcd/rpds_py-2026.5.1-cp313-cp313-win32.whl", hash = "sha256:7944270ae71383f6e2657dd7d5ce4eeb4ac2d0059a6738f0510583d462ab4842", size = 212481, upload-time = "2026-05-28T11:59:53.148Z" }, + { url = "https://files.pythonhosted.org/packages/70/ec/a2aca432db9c7359b40fa393eeeaa0d166c2f70175be956e75fa24197c44/rpds_py-2026.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:88647f43a73c4e01be19b04ceef0c8d3a1958153604d13c773becd8016f2a0cf", size = 228519, upload-time = "2026-05-28T11:59:54.505Z" }, + { url = "https://files.pythonhosted.org/packages/29/60/a73bfdd45b096574556acf303bbd9fa9eed36ca8a818b514e2a5d5fe2b9d/rpds_py-2026.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:453895624ecf7db7063b1004e44037522bbaef9ff6a945e59bc71662d7a03abd", size = 223446, upload-time = "2026-05-28T11:59:56.081Z" }, + { url = "https://files.pythonhosted.org/packages/18/e2/408105fd611823f00882aea810f3989a30d26b1bab8b6beb20f98c724e0e/rpds_py-2026.5.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:b4e4bc98639ec915f512fde3aa7a95e0041d95d9c3cc86eea841fa63cb1e8600", size = 355287, upload-time = "2026-05-28T11:59:57.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/58/5c4a43436843c90d0f6d19f82c200c80e3843ca9fa07b237623327f6d384/rpds_py-2026.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cacedb7a6e167680acba45ad5716e89067d225dc80da0d7040cae8c81d4572fa", size = 347033, upload-time = "2026-05-28T11:59:58.881Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c2/1a71acdacaf4e259b10278fb87b039ded3cf80041bcd89dd8a3ea702ded6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68700371c5d7ae1412862ddfa719090925c93ecf351c566d66f09d04b136ea00", size = 376891, upload-time = "2026-05-28T12:00:00.516Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c8/535f3d9b65addd8e28aa87b83c6e526799c3717a88273db8ea795beeef7a/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296c799becfa849c779c8725494fe9ed94959ed886787df4364b058465bad7f0", size = 385646, upload-time = "2026-05-28T12:00:02.394Z" }, + { url = "https://files.pythonhosted.org/packages/1c/91/dc033f313345c354ade914dbe73cdb90b615a4409ea02430d5356794f3d8/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3858b908218ee108d0bbfb2095ccc237648053c9bf98affad7cb079acaf1d97", size = 498830, upload-time = "2026-05-28T12:00:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/27/fc/90fcbea459dbb8ddc18a2e0fd1de9412b48bc84ffff2db771cf714bacfd6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4fb8d2e7cb2f850b169806d61d1b991738acec96500a75c30f49caf064ce7cef", size = 392830, upload-time = "2026-05-28T12:00:05.797Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1d/46cd11a228c9750684a798d98f878be6f614aa762438da7378f035e79e35/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b74c10ed6a8f190f4287f53bcfea348b92a84a9c9f70d30183d1e6172d580d", size = 379613, upload-time = "2026-05-28T12:00:07.433Z" }, + { url = "https://files.pythonhosted.org/packages/24/4a/d9b0c6af3a1de03eb93741bbe8be2bdce84d8fda8224f3005451d86df389/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b9a6528956191c48c52294a592dbd4a8386d7048bdb25c0efcb6b966466c6d83", size = 388183, upload-time = "2026-05-28T12:00:09.227Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b4/db7aaabdda6d020afc87d981bcc2f57a434c7dec60ecfc2ab3dd50b20351/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af03e34e860047bc7a352b842856fcf78798fbb81132cc98bd2f907ab4eb9cd2", size = 408578, upload-time = "2026-05-28T12:00:10.779Z" }, + { url = "https://files.pythonhosted.org/packages/08/d6/070f6a41cbb343e2ac4171859bf3f3623e0ab002f72619d6d505313ec2de/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fea6e836d10abbe191d557d33bd58bd5987725fe63aa1eefe557d230209855bd", size = 553573, upload-time = "2026-05-28T12:00:12.443Z" }, + { url = "https://files.pythonhosted.org/packages/75/ab/1a71ea3589c4345dac0a0518f0e6a031cb42689277851b683c46d27463a5/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:fc0c0f878ea770a0a8a462456c5ad36fc9fe6358e6b76fdadc7f17575e0b8bf1", size = 620861, upload-time = "2026-05-28T12:00:14.09Z" }, + { url = "https://files.pythonhosted.org/packages/8a/22/9bf80a56069c0c443fcfefac639a86a744550a2898817a6dfd3e26654924/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e0b360f316d966b048b085857630b3cc51f3db2f07b06f440eac8f695374d1e3", size = 585633, upload-time = "2026-05-28T12:00:15.66Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/3b2c0a75c9e04125696f84ebdbbf304acf5a40b58ba4481cdb98a922c3ba/rpds_py-2026.5.1-cp313-cp313t-win32.whl", hash = "sha256:a2999883eedf72fdfb7520b92c7d4ec2572a71ff40239377aa604cc529eecafc", size = 210074, upload-time = "2026-05-28T12:00:17.291Z" }, + { url = "https://files.pythonhosted.org/packages/e7/8b/609157d5a25d37d4f29f92840ba531f416907c34ae5c5739dd21fc2bef98/rpds_py-2026.5.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e07be2a9d7122bd6e82dea89814ef8dc893feb1aae97fec1630f3263bbb30e55", size = 228635, upload-time = "2026-05-28T12:00:18.73Z" }, +] + +[[package]] +name = "send2trash" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/f0/184b4b5f8d00f2a92cf96eec8967a3d550b52cf94362dad1100df9e48d57/send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459", size = 17255, upload-time = "2026-01-14T06:27:36.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260", size = 123314, upload-time = "2026-06-03T00:56:40.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, +] + +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, +] + +[[package]] +name = "sphinx-rtd-theme" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "sphinx" }, + { name = "sphinxcontrib-jquery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/68/a1bfbf38c0f7bccc9b10bbf76b94606f64acb1552ae394f0b8285bfaea25/sphinx_rtd_theme-3.1.0.tar.gz", hash = "sha256:b44276f2c276e909239a4f6c955aa667aaafeb78597923b1c60babc76db78e4c", size = 7620915, upload-time = "2026-01-12T16:03:31.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/c7/b5c8015d823bfda1a346adb2c634a2101d50bb75d421eb6dcb31acd25ebc/sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl", hash = "sha256:1785824ae8e6632060490f67cf3a72d404a85d2d9fc26bce3619944de5682b89", size = 7655617, upload-time = "2026-01-12T16:03:28.101Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/f3/aa67467e051df70a6330fe7770894b3e4f09436dea6881ae0b4f3d87cad8/sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", size = 122331, upload-time = "2023-03-14T15:01:01.944Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae", size = 121104, upload-time = "2023-03-14T15:01:00.356Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" }, + { url = "https://files.pythonhosted.org/packages/92/4f/090b1431e5a43df696feceffc268c5383cc079ecb5f08ce58f917109aafe/tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100", size = 446707, upload-time = "2026-06-08T17:34:39.594Z" }, + { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, + { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, + { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5f0e56c01e8d9d36f4e23f367b85ae6cae0c1ecddd5e6977d8388ad27488/tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4", size = 451047, upload-time = "2026-06-08T17:34:46.784Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/b393076ffb21b469eec5b328a0534cf03a3b90bfc6b1f09507cdd075d938/tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4", size = 451485, upload-time = "2026-06-08T17:34:48.248Z" }, + { url = "https://files.pythonhosted.org/packages/71/2e/7b1c769803121b809112cf9a00681c472eae1d80e32d7ec0e0bd61d0d0e1/tornado-6.5.7-cp39-abi3-win_arm64.whl", hash = "sha256:ff934fce95643af5f11efdae618eaa73d469dc588641e5c8d19295a0c65c4796", size = 450506, upload-time = "2026-06-08T17:34:49.702Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/a9/a2584b8313b89f94869ddb3c4074617a691de1812a614d2d50e32ca5a7a6/traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722", size = 163344, upload-time = "2026-06-03T12:26:06.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92", size = 85858, upload-time = "2026-06-03T12:26:04.395Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/b4/51fe890511f0f242d07cb1ebe6a5b6db417262b9d2568b460347c57d95cc/wcwidth-0.8.1.tar.gz", hash = "sha256:faf5b4a5366a72dc49cad48cdf21f52bdf63bdda995178e483ba247ff79089b9", size = 1466072, upload-time = "2026-06-08T05:57:23.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/6e/95b0e537de1f4d4301f76f944642c6da50d1511cc7b3d64dc418a66c7509/wcwidth-0.8.1-py3-none-any.whl", hash = "sha256:f453740b1e4a4f3291faa37944c555d71056c4da08d59809b307ef4feba695c8", size = 323092, upload-time = "2026-06-08T05:57:21.413Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +]