From 7194bcfa2f5fe8dd09835ea1d5e3d69c04838871 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:21:55 -0800 Subject: [PATCH 01/31] Update against aind-behavior-services --- docs/conf.py | 4 +- examples/task_mcm.py | 2 +- examples/task_patch_foraging.py | 12 +- examples/test_single_site_patch.py | 6 +- pyproject.toml | 9 +- .../launcher.py => scripts/aind.py | 42 +- scripts/launcher.ps1 | 2 +- src/aind_behavior_vr_foraging/cli.py | 4 - .../data_contract/v0_5_0.py | 21 +- .../data_contract/v0_6_0.py | 4 +- .../data_mappers/_rig.py | 26 +- .../data_mappers/_session.py | 31 +- .../data_mappers/_utils.py | 25 +- src/aind_behavior_vr_foraging/regenerate.py | 14 +- src/aind_behavior_vr_foraging/rig.py | 65 +- src/aind_behavior_vr_foraging/task_logic.py | 58 +- tests/test_bonsai.py | 12 +- uv.lock | 989 +++++++++--------- 18 files changed, 692 insertions(+), 634 deletions(-) rename src/aind_behavior_vr_foraging/launcher.py => scripts/aind.py (88%) diff --git a/docs/conf.py b/docs/conf.py index 323ce512..1071ef14 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -3,6 +3,8 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html +from typing import Type + import erdantic as erd from pydantic import BaseModel @@ -81,7 +83,7 @@ def linkcode_resolve(domain, info): _static_path = "_static" -def export_model_diagram(model: BaseModel, root: str = _static_path) -> None: +def export_model_diagram(model: Type[BaseModel], root: str = _static_path) -> None: diagram = erd.create(model) diagram.draw(f"{root}/{model.__name__}.svg") diff --git a/examples/task_mcm.py b/examples/task_mcm.py index 9de7adb5..5664c1b8 100644 --- a/examples/task_mcm.py +++ b/examples/task_mcm.py @@ -1,7 +1,7 @@ import os from typing import cast -import aind_behavior_services.task_logic.distributions as distributions +import aind_behavior_services.task.distributions as distributions import numpy as np from aind_behavior_curriculum import Stage, TrainerState from scipy.linalg import expm diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 70582382..283dd389 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -1,13 +1,9 @@ import os -import aind_behavior_services.task_logic.distributions as distributions +import aind_behavior_services.task.distributions as distributions from aind_behavior_curriculum import Stage, TrainerState -import aind_behavior_vr_foraging.task_logic as vr_task_logic -from aind_behavior_vr_foraging.task_logic import ( - AindVrForagingTaskLogic, - AindVrForagingTaskParameters, -) +import aind_behavior_vr_foraging.task as vr_task_logic def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimum, maximum): @@ -157,8 +153,8 @@ def PostPatchVirtualSiteGeneratorHelper(contrast: float = 1, friction: float = 0 first_state_occupancy=[1, 0], transition_matrix=[[1, 0], [0, 1]], patches=[patch1, patch2] ) -task_logic = AindVrForagingTaskLogic( - task_parameters=AindVrForagingTaskParameters( +task_logic = vr_task_logic.AindVrForagingTaskLogic( + task_parameters=vr_task_logic.AindVrForagingTaskParameters( rng_seed=42, updaters=updaters, environment=vr_task_logic.BlockStructure( diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index 032d9751..32ef8890 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -1,11 +1,11 @@ import os from typing import Optional -import aind_behavior_services.task_logic.distributions as distributions +import aind_behavior_services.task.distributions as distributions from aind_behavior_curriculum import Stage, TrainerState -import aind_behavior_vr_foraging.task_logic as vr_task_logic -from aind_behavior_vr_foraging.task_logic import ( +import aind_behavior_vr_foraging.task as vr_task_logic +from aind_behavior_vr_foraging.task import ( AindVrForagingTaskLogic, AindVrForagingTaskParameters, ) diff --git a/pyproject.toml b/pyproject.toml index 98b45eb4..91c216ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.6.5" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.12, <0.13", + "aind_behavior_services@git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@refactor-class-names", "pydantic-settings" ] @@ -31,10 +31,9 @@ Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/rel data = ["contraqctor>=0.5.3, <0.6.0"] launcher = [ - "aind-clabe[aind-services]>=0.9.1", - "aind-data-schema>=2.2", + "aind-clabe[aind-services]@git+https://github.com/AllenNeuralDynamics/clabe@refactor-against-aind-behavior-services-breaking", + "aind-data-schema>=2.4", "aind_behavior_vr_foraging[data]", - "aind-watchdog-service==0.1.6.dev8" ] [dependency-groups] @@ -42,6 +41,8 @@ launcher = [ dev = [ "aind_behavior_vr_foraging[launcher]", "aind_behavior_vr_foraging[data]", + "aind-data-schema@git+https://github.com/AllenNeuralDynamics/aind-data-schema@dev", + "aind-data-schema-models@git+https://github.com/AllenNeuralDynamics/aind-data-schema-models@main", "ruff", "codespell", ] diff --git a/src/aind_behavior_vr_foraging/launcher.py b/scripts/aind.py similarity index 88% rename from src/aind_behavior_vr_foraging/launcher.py rename to scripts/aind.py index d56f80c2..43f8ab31 100644 --- a/src/aind_behavior_vr_foraging/launcher.py +++ b/scripts/aind.py @@ -2,9 +2,10 @@ from pathlib import Path from typing import Any, cast -from aind_behavior_services.calibration.aind_manipulator import ManipulatorPosition -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.rig.aind_manipulator import ManipulatorPosition +from aind_behavior_services.session import Session from aind_behavior_services.utils import utcnow +from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from clabe import resource_monitor from clabe.apps import ( AindBehaviorServicesBonsaiApp, @@ -13,7 +14,7 @@ CurriculumSuggestion, ) from clabe.data_transfer.aind_watchdog import WatchdogDataTransferService, WatchdogSettings -from clabe.launcher import Launcher, LauncherCliArgs +from clabe.launcher import Launcher, LauncherCliArgs, experiment from clabe.pickers import ByAnimalModifier, DefaultBehaviorPickerSettings from clabe.pickers.dataverse import DataversePicker from contraqctor.contract.json import SoftwareEvents @@ -22,39 +23,38 @@ from aind_behavior_vr_foraging import data_contract from aind_behavior_vr_foraging.data_mappers import DataMapperCli from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic logger = logging.getLogger(__name__) -async def experiment(launcher: Launcher) -> None: - monitor = resource_monitor.ResourceMonitor( - constrains=[ - resource_monitor.available_storage_constraint_factory(launcher.settings.data_dir, 2e11), - ] - ) - - # Validate resources - monitor.run() - +@experiment() +async def aind_experiment_protocol(launcher: Launcher) -> None: # Start experiment setup picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) # Pick and register session - session = picker.pick_session(AindBehaviorSessionModel) - launcher.register_session(session) + session = picker.pick_session(Session) # Fetch the task settings trainer_state, task_logic = picker.pick_trainer_state(AindVrForagingTaskLogic) - input_trainer_state_path = launcher.save_temp_model(trainer_state) # Fetch rig settings rig = picker.pick_rig(AindVrForagingRig) + launcher.register_session(session, rig.data_directory) + + resource_monitor.ResourceMonitor( + constrains=[ + resource_monitor.available_storage_constraint_factory(rig.data_directory, 2e11), + ] + ).run() + + input_trainer_state_path = launcher.save_temp_model(trainer_state) + # Post-fetching modifications manipulator_modifier = ByAnimalManipulatorModifier( - subject_db_path=picker.subject_dir / picker.session.subject, - model_path="manipulator.calibration.input.initial_position", + subject_db_path=picker.subject_dir / session.subject, + model_path="manipulator.calibration.initial_position", model_name="manipulator_init.json", launcher=launcher, ) @@ -114,7 +114,7 @@ async def experiment(launcher: Launcher) -> None: from contraqctor.qc.reporters import HtmlReporter - from .data_qc.data_qc import make_qc_runner + from ..src.aind_behavior_vr_foraging.data_qc.data_qc import make_qc_runner vr_dataset = data_contract.dataset(launcher.session_directory) runner = make_qc_runner(vr_dataset) @@ -173,7 +173,7 @@ def _process_before_dump(self) -> ManipulatorPosition: class ClabeCli(LauncherCliArgs): def cli_cmd(self): launcher = Launcher(settings=self) - launcher.run_experiment(experiment) + launcher.run_experiment(aind_experiment_protocol) return None diff --git a/scripts/launcher.ps1 b/scripts/launcher.ps1 index ce04aba0..a36181aa 100644 --- a/scripts/launcher.ps1 +++ b/scripts/launcher.ps1 @@ -1,3 +1,3 @@ $scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path Set-Location -Path (Split-Path -Parent $scriptPath) -&uv run vr-foraging clabe +&uv run clabe run ./scripts/aind.py @args diff --git a/src/aind_behavior_vr_foraging/cli.py b/src/aind_behavior_vr_foraging/cli.py index 5aac0b35..c4487cdd 100644 --- a/src/aind_behavior_vr_foraging/cli.py +++ b/src/aind_behavior_vr_foraging/cli.py @@ -6,7 +6,6 @@ from aind_behavior_vr_foraging import __semver__, regenerate from aind_behavior_vr_foraging.data_mappers import DataMapperCli from aind_behavior_vr_foraging.data_qc import DataQcCli -from aind_behavior_vr_foraging.launcher import ClabeCli class VersionCli(RootModel): @@ -32,9 +31,6 @@ class VrForagingCli(BaseSettings, cli_prog_name="vr-foraging", cli_kebab_case=Tr regenerate: CliSubCommand[DslRegenerateCli] = Field( description="Regenerate the vr-foraging dsl dependencies.", ) - clabe: CliSubCommand[ClabeCli] = Field( - description="Run the Clabe CLI.", - ) def cli_cmd(self): return CliApp().run_subcommand(self) diff --git a/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py b/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py index 4a3c1af5..cdb8a8d0 100644 --- a/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py +++ b/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py @@ -1,6 +1,5 @@ from pathlib import Path -from aind_behavior_services.session import AindBehaviorSessionModel from contraqctor.contract import Dataset, DataStreamCollection from contraqctor.contract.camera import Camera from contraqctor.contract.csv import Csv @@ -8,13 +7,10 @@ DeviceYmlByFile, HarpDevice, ) -from contraqctor.contract.json import PydanticModel, SoftwareEvents +from contraqctor.contract.json import Json, SoftwareEvents from contraqctor.contract.mux import MapFromPaths from contraqctor.contract.text import Text -from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic - def dataset( root_path: Path, @@ -378,24 +374,21 @@ def dataset( name="InputSchemas", description="Configuration files for the behavior rig, task_logic and session.", data_streams=[ - PydanticModel( + Json( name="Rig", - reader_params=PydanticModel.make_params( - model=AindVrForagingRig, + reader_params=Json.make_params( path=root_path / "behavior/Logs/rig_input.json", ), ), - PydanticModel( + Json( name="TaskLogic", - reader_params=PydanticModel.make_params( - model=AindVrForagingTaskLogic, + reader_params=Json.make_params( path=root_path / "behavior/Logs/tasklogic_input.json", ), ), - PydanticModel( + Json( name="Session", - reader_params=PydanticModel.make_params( - model=AindBehaviorSessionModel, + reader_params=Json.make_params( path=root_path / "behavior/Logs/session_input.json", ), ), diff --git a/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py b/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py index 35e7087f..aa996792 100644 --- a/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py +++ b/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py @@ -1,6 +1,6 @@ from pathlib import Path -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.session import Session from contraqctor.contract import Dataset, DataStreamCollection from contraqctor.contract.camera import Camera from contraqctor.contract.csv import Csv @@ -423,7 +423,7 @@ def dataset( PydanticModel( name="Session", reader_params=PydanticModel.make_params( - model=AindBehaviorSessionModel, + model=Session, path=root_path / "behavior/Logs/session_output.json", ), ), diff --git a/src/aind_behavior_vr_foraging/data_mappers/_rig.py b/src/aind_behavior_vr_foraging/data_mappers/_rig.py index 39567466..3d5872a6 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_rig.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_rig.py @@ -6,8 +6,8 @@ from pathlib import Path from typing import Optional, cast -import aind_behavior_services.rig as AbsRig -from aind_behavior_services import calibration as AbsCalibration +from aind_behavior_services.common import Vector3 +from aind_behavior_services.rig import cameras, olfactometer, visual_stimulation from aind_behavior_services.utils import model_from_json_file from aind_data_schema.base import GenericModel from aind_data_schema.components import connections, coordinates, devices, measurements @@ -328,18 +328,18 @@ def _get_harp_clock_generate_node(rig: AindVrForagingRig, components: list[devic def _get_wheel( rig: AindVrForagingRig, encoder: devices.Device, magnetic_brake: devices.Device, torque_sensor: devices.Device ) -> devices.Wheel: - if rig.harp_treadmill.calibration is None or rig.harp_treadmill.calibration.output is None: + if rig.harp_treadmill.calibration is None: raise ValueError("Treadmill calibration is not set.") return devices.Wheel( name=TrackedDevices.WHEEL, manufacturer=devices.Organization.AIND, - radius=Decimal(str(rig.harp_treadmill.calibration.output.wheel_diameter)) / 2, + radius=Decimal(str(rig.harp_treadmill.calibration.wheel_diameter)) / 2, width=Decimal("3.5"), size_unit=units.SizeUnit.CM, encoder=encoder, magnetic_brake=magnetic_brake, torque_sensor=torque_sensor, - pulse_per_revolution=rig.harp_treadmill.calibration.output.pulses_per_revolution, + pulse_per_revolution=rig.harp_treadmill.calibration.pulses_per_revolution, notes="https://tinyurl.com/AI-RunningWheel", ) @@ -447,11 +447,11 @@ def _get_monitors(rig: AindVrForagingRig) -> list[devices.Monitor]: ], } - def distance_from_vector(vector: AbsRig.visual_stimulation.Vector3): + def distance_from_vector(vector: Vector3): return (vector.x**2 + vector.y**2 + vector.z**2) ** 0.5 def _get_monitors(display_name: str): - display = cast(AbsRig.visual_stimulation.DisplayCalibration, getattr(rig.screen.calibration, display_name)) + display = cast(visual_stimulation.DisplayCalibration, getattr(rig.screen.calibration, display_name)) return devices.Monitor( name=f"{str(TrackedDevices.SCREEN)}_{display_name}", manufacturer=devices.Organization.LG, @@ -524,7 +524,7 @@ def _get_lickspout_assembly( @staticmethod def _get_olfactometer(rig: AindVrForagingRig) -> devices.Olfactometer: olf_calibration = rig.harp_olfactometer.calibration - if olf_calibration is None or (calibration := olf_calibration.input) is None: + if olf_calibration is None: raise ValueError("Olfactometer calibration is not set.") return devices.Olfactometer( @@ -532,7 +532,7 @@ def _get_olfactometer(rig: AindVrForagingRig) -> devices.Olfactometer: harp_device_type=devices.HarpDeviceType.OLFACTOMETER, manufacturer=devices.Organization.CHAMPALIMAUD, is_clock_generator=False, - channels=list(map(_get_olfactometer_channel, calibration.channel_config.values())), + channels=list(map(_get_olfactometer_channel, olf_calibration.channel_config.values())), ) @staticmethod @@ -654,7 +654,7 @@ class _PartialCameraAssembly: } -def _get_camera(name: str, camera: AbsRig.cameras.SpinnakerCamera, fps: float) -> devices.Camera: +def _get_camera(name: str, camera: cameras.SpinnakerCamera, fps: float) -> devices.Camera: return devices.Camera( name=name, manufacturer=devices.Organization.FLIR, @@ -694,11 +694,11 @@ def _get_camera_assembly(camera: devices.Camera) -> devices.CameraAssembly: def _get_olfactometer_channel( - ch: AbsCalibration.olfactometer.OlfactometerChannelConfig, + ch: olfactometer.OlfactometerChannelConfig, ) -> devices.OlfactometerChannel: ch_type_to_ch_type = { - AbsCalibration.olfactometer.OlfactometerChannelType.CARRIER: devices.OlfactometerChannelType.CARRIER, - AbsCalibration.olfactometer.OlfactometerChannelType.ODOR: devices.OlfactometerChannelType.ODOR, + olfactometer.OlfactometerChannelType.CARRIER: devices.OlfactometerChannelType.CARRIER, + olfactometer.OlfactometerChannelType.ODOR: devices.OlfactometerChannelType.ODOR, } return devices.OlfactometerChannel( channel_index=ch.channel_index, diff --git a/src/aind_behavior_vr_foraging/data_mappers/_session.py b/src/aind_behavior_vr_foraging/data_mappers/_session.py index 6e45f01d..4432aeb9 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_session.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_session.py @@ -8,7 +8,8 @@ import aind_behavior_services.rig as AbsRig import git import pydantic -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.rig import cameras, visual_stimulation +from aind_behavior_services.session import Session from aind_behavior_services.utils import get_fields_of_type, model_from_json_file, utcnow from aind_data_schema.components import configs from aind_data_schema.core import acquisition @@ -41,9 +42,9 @@ def __init__( self._session_end_time = session_end_time abs_schemas_path = Path(self._data_path) / "Behavior" / "Logs" - self.session_model = model_from_json_file(abs_schemas_path / "session_input.json", AindBehaviorSessionModel) + self.session_model = model_from_json_file(abs_schemas_path / "session_input.json", Session) self.rig_model = model_from_json_file(abs_schemas_path / "rig_input.json", AindVrForagingRig) - self.task_logic_model = model_from_json_file(abs_schemas_path / "tasklogic_input.json", AindVrForagingTaskLogic) + self.task_model = model_from_json_file(abs_schemas_path / "task_input.json", AindVrForagingTaskLogic) if curriculum_suggestion is not None: if isinstance(curriculum_suggestion, CurriculumSuggestion): @@ -116,7 +117,7 @@ def _map(self) -> acquisition.Acquisition: acquisition_end_time=utcnow(), acquisition_start_time=self.session_model.date, experimenters=self.session_model.experimenter, - acquisition_type=self.session_model.experiment or self.task_logic_model.name, + acquisition_type=self.session_model.experiment or self.task_model.name, coordinate_system=None, data_streams=self._get_data_streams(), calibrations=self._get_calibrations(), @@ -138,12 +139,12 @@ def _get_calibrations(self) -> List[acquisition.CALIBRATIONS]: @staticmethod def _include_device(device: AbsRig.Device) -> bool: - if isinstance(device, AbsRig.visual_stimulation.Screen): + if isinstance(device, visual_stimulation.ScreenAssembly): return False - if isinstance(device, AbsRig.cameras.CameraController): + if isinstance(device, cameras.CameraController): return False - if isinstance(device, get_args(AbsRig.cameras.CameraTypes)): - return cast(AbsRig.cameras.CameraTypes, device).video_writer is not None + if isinstance(device, get_args(cameras.CameraTypes)): + return cast(cameras.CameraTypes, device).video_writer is not None return True def _get_data_streams(self) -> List[acquisition.DataStream]: @@ -255,7 +256,7 @@ def _get_stimulus_epochs(self) -> List[acquisition.StimulusEpoch]: stimulus_start_time=self.session_model.date, stimulus_end_time=self.session_end_time, configurations=stimulus_epoch_configurations, - stimulus_name=self.session_model.experiment or self.task_logic_model.name, + stimulus_name=self.session_model.experiment or self.task_model.name, stimulus_modalities=stimulus_modalities, performance_metrics=performance_metrics, curriculum_status=curriculum_status, @@ -264,7 +265,7 @@ def _get_stimulus_epochs(self) -> List[acquisition.StimulusEpoch]: return stimulus_epochs def _get_cameras_config(self) -> List[acquisition.DetectorConfig]: - def _map_camera(name: str, camera: AbsRig.cameras.CameraTypes) -> acquisition.DetectorConfig: + def _map_camera(name: str, camera: cameras.CameraTypes) -> acquisition.DetectorConfig: assert camera.video_writer is not None, "Camera does not have a video writer configured." return acquisition.DetectorConfig( device_name=name, @@ -274,25 +275,25 @@ def _map_camera(name: str, camera: AbsRig.cameras.CameraTypes) -> acquisition.De compression=_map_compression(camera.video_writer), ) - def _map_compression(compression: AbsRig.cameras.VideoWriter) -> acquisition.Code: + def _map_compression(compression: cameras.VideoWriter) -> acquisition.Code: if compression is None: raise ValueError("Camera does not have a video writer configured.") - if isinstance(compression, AbsRig.cameras.VideoWriterFfmpeg): + if isinstance(compression, cameras.VideoWriterFfmpeg): return acquisition.Code( url="https://ffmpeg.org/", name="FFMPEG", parameters=acquisition.GenericModel.model_validate(compression.model_dump()), ) - elif isinstance(compression, AbsRig.cameras.VideoWriterOpenCv): + elif isinstance(compression, cameras.VideoWriterOpenCv): bonsai = self._get_bonsai_as_code() bonsai.parameters = acquisition.GenericModel.model_validate(compression.model_dump()) return bonsai else: raise ValueError("Camera does not have a valid video writer configured.") - cameras = data_mapper_helpers.get_cameras(self.rig_model, exclude_without_video_writer=True) + _cameras = data_mapper_helpers.get_cameras(self.rig_model, exclude_without_video_writer=True) - return list(map(_map_camera, cameras.keys(), cameras.values())) + return list(map(_map_camera, _cameras.keys(), _cameras.values())) def _get_bonsai_as_code(self) -> acquisition.Code: bonsai_folder = Path(self.bonsai_app.executable).parent diff --git a/src/aind_behavior_vr_foraging/data_mappers/_utils.py b/src/aind_behavior_vr_foraging/data_mappers/_utils.py index 60a713aa..529ae335 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_utils.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_utils.py @@ -1,8 +1,8 @@ import enum import logging -from typing import List, Optional, Type, TypeVar, Union +from typing import List, Type, TypeVar, Union -import aind_behavior_services.calibration as AbsCalibration +import aind_behavior_services.rig.water_valve as water_valve import pydantic from aind_behavior_services.utils import get_fields_of_type, utcnow from aind_data_schema.components import coordinates, measurements @@ -32,31 +32,26 @@ def coerce_to_aind_data_schema(value: Union[pydantic.BaseModel, dict], target_ty def _get_water_calibration(rig_model: AindVrForagingRig) -> List[measurements.VolumeCalibration]: def _mapper( - device_name: Optional[str], water_calibration: AbsCalibration.water_valve.WaterValveCalibration + device_name: str, water_calibration: water_valve.WaterValveCalibration ) -> measurements.VolumeCalibration: - device_name = device_name or water_calibration.device_name if device_name is None: raise ValueError("Device name is not set.") - c = water_calibration.output - if c is None: - c = water_calibration.input.calibrate_output() - c.interval_average = c.interval_average or {} + interval_average = water_calibration.interval_average if water_calibration.interval_average else {} return measurements.VolumeCalibration( device_name=device_name, calibration_date=water_calibration.date if water_calibration.date else utcnow(), - notes=water_calibration.notes, - input=list(c.interval_average.keys()), - output=list(c.interval_average.values()), + input=list(interval_average.keys()), + output=list(interval_average.values()), input_unit=units.TimeUnit.S, output_unit=units.VolumeUnit.ML, fit=measurements.CalibrationFit( fit_type=measurements.FitType.LINEAR, - fit_parameters=acquisition.GenericModel.model_validate(c.model_dump()), + fit_parameters=acquisition.GenericModel.model_validate(water_calibration.model_dump()), ), ) - water_calibration = get_fields_of_type(rig_model, AbsCalibration.water_valve.WaterValveCalibration) + water_calibration = get_fields_of_type(rig_model, water_valve.WaterValveCalibration) return ( list(map(lambda tup: _mapper(TrackedDevices.WATER_VALVE_SOLENOID, tup[1]), water_calibration)) if len(water_calibration) > 0 @@ -68,11 +63,11 @@ def _get_treadmill_brake_calibration(rig_model: AindVrForagingRig) -> List[measu treadmill = rig_model.harp_treadmill if treadmill.calibration is None: raise ValueError("Treadmill calibration is not set.") - calibration = treadmill.calibration.output.brake_lookup_calibration + calibration = treadmill.calibration.brake_lookup_calibration calibration_ads = measurements.Calibration( device_name=TrackedDevices.MAGNETIC_BRAKE, calibration_date=treadmill.calibration.date if treadmill.calibration.date else utcnow(), - description=type(treadmill.calibration.output).model_fields["brake_lookup_calibration"].description + description=type(treadmill.calibration).model_fields["brake_lookup_calibration"].description or "brake calibration", input=[pair[0] for pair in calibration], input_unit=units.MassUnit.G, # torque in gram-force cm diff --git a/src/aind_behavior_vr_foraging/regenerate.py b/src/aind_behavior_vr_foraging/regenerate.py index e3ee8cb2..5dbaac59 100644 --- a/src/aind_behavior_vr_foraging/regenerate.py +++ b/src/aind_behavior_vr_foraging/regenerate.py @@ -2,11 +2,11 @@ from typing import Union import pydantic -from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_services.utils import BonsaiSgenSerializers, convert_pydantic_to_bonsai +from aind_behavior_services.schema import BonsaiSgenSerializers, convert_pydantic_to_bonsai +from aind_behavior_services.session import Session import aind_behavior_vr_foraging.rig -import aind_behavior_vr_foraging.task_logic +import aind_behavior_vr_foraging.task SCHEMA_ROOT = Path("./src/DataSchemas/") EXTENSIONS_ROOT = Path("./src/Extensions/") @@ -15,11 +15,11 @@ def main(): models = [ - aind_behavior_vr_foraging.task_logic.AindVrForagingTaskLogic, + aind_behavior_vr_foraging.task.AindVrForagingTaskLogic, aind_behavior_vr_foraging.rig.AindVrForagingRig, - AindBehaviorSessionModel, - aind_behavior_vr_foraging.task_logic.VirtualSite, - aind_behavior_vr_foraging.task_logic.VisualCorridor, + Session, + aind_behavior_vr_foraging.task.VirtualSite, + aind_behavior_vr_foraging.task.VisualCorridor, ] model = pydantic.RootModel[Union[tuple(models)]] diff --git a/src/aind_behavior_vr_foraging/rig.py b/src/aind_behavior_vr_foraging/rig.py index 92e53498..c1b11635 100644 --- a/src/aind_behavior_vr_foraging/rig.py +++ b/src/aind_behavior_vr_foraging/rig.py @@ -1,61 +1,50 @@ -# Import core types -from __future__ import annotations - -# Import core types from typing import Literal, Optional -import aind_behavior_services.calibration.aind_manipulator as man -import aind_behavior_services.calibration.olfactometer as oc -import aind_behavior_services.calibration.treadmill as treadmill -import aind_behavior_services.calibration.water_valve as wvc import aind_behavior_services.rig as rig +import aind_behavior_services.rig.cameras as cameras +import aind_behavior_services.rig.harp as harp +import aind_behavior_services.rig.olfactometer as oc +import aind_behavior_services.rig.treadmill as treadmill +import aind_behavior_services.rig.visual_stimulation as visual_stimulation +import aind_behavior_services.rig.water_valve as wvc +from aind_behavior_services.rig import aind_manipulator as man from pydantic import BaseModel, Field from aind_behavior_vr_foraging import __semver__ -class AindManipulatorAdditionalSettings(BaseModel): - """Additional settings for the manipulator device""" +class AindManipulatorDevice(man.AindManipulator): + """Appends a task specific configuration to the base manipulator model.""" spout_axis: man.Axis = Field(default=man.Axis.Y1, description="Spout axis") -class AindManipulatorDevice(man.AindManipulatorDevice): - """Overrides the default settings for the manipulator device by spec'ing additional_settings field""" - - additional_settings: AindManipulatorAdditionalSettings = Field( - default=AindManipulatorAdditionalSettings(), description="Additional settings" - ) - - class RigCalibration(BaseModel): - """Container class for calibration models. In a future release these will be moved to the respective devices""" + """Container class for calibration models.""" - water_valve: wvc.WaterValveCalibration = Field(..., description="Water valve calibration") + water_valve: wvc.WaterValveCalibration = Field(description="Water valve calibration") -class AindVrForagingRig(rig.AindBehaviorRigModel): +class AindVrForagingRig(rig.Rig): version: Literal[__semver__] = __semver__ - triggered_camera_controller: rig.cameras.CameraController[rig.cameras.SpinnakerCamera] = Field( - ..., description="Required camera controller to triggered cameras." + triggered_camera_controller: cameras.CameraController[cameras.SpinnakerCamera] = Field( + description="Required camera controller to triggered cameras." ) - monitoring_camera_controller: Optional[rig.cameras.CameraController[rig.cameras.WebCamera]] = Field( + monitoring_camera_controller: Optional[cameras.CameraController[cameras.WebCamera]] = Field( default=None, description="Optional camera controller for monitoring cameras." ) - harp_behavior: rig.harp.HarpBehavior = Field(..., description="Harp behavior") - harp_olfactometer: oc.Olfactometer = Field(..., description="Harp olfactometer") - harp_lickometer: rig.harp.HarpLicketySplit = Field(..., description="Harp lickometer") - harp_clock_generator: rig.harp.HarpWhiteRabbit = Field(..., description="Harp clock generator") - harp_analog_input: Optional[rig.harp.HarpAnalogInput] = Field(default=None, description="Harp analog input") - harp_treadmill: treadmill.Treadmill = Field(..., description="Harp treadmill") - harp_sniff_detector: Optional[rig.harp.HarpSniffDetector] = Field( - default=None, description="Sniff detector settings" - ) - harp_environment_sensor: Optional[rig.harp.HarpEnvironmentSensor] = Field( + harp_behavior: harp.HarpBehavior = Field(description="Harp behavior") + harp_olfactometer: oc.Olfactometer = Field(description="Harp olfactometer") + harp_lickometer: harp.HarpLicketySplit = Field(description="Harp lickometer") + harp_clock_generator: harp.HarpWhiteRabbit = Field(description="Harp clock generator") + harp_analog_input: Optional[harp.HarpAnalogInput] = Field(default=None, description="Harp analog input") + harp_treadmill: treadmill.Treadmill = Field(description="Harp treadmill") + harp_sniff_detector: Optional[harp.HarpSniffDetector] = Field(default=None, description="Sniff detector settings") + harp_environment_sensor: Optional[harp.HarpEnvironmentSensor] = Field( default=None, description="Environment sensor" ) - manipulator: AindManipulatorDevice = Field(..., description="Manipulator") - screen: rig.visual_stimulation.Screen = Field( - default=rig.visual_stimulation.Screen(), description="Screen settings" + manipulator: AindManipulatorDevice = Field(description="Manipulator") + screen: visual_stimulation.ScreenAssembly = Field( + default=visual_stimulation.ScreenAssembly(), description="Screen settings", validate_default=True ) - calibration: RigCalibration = Field(..., description="Calibration models") + calibration: RigCalibration = Field(description="Calibration models") diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index 89a652af..8c577152 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -1,9 +1,9 @@ import logging from enum import Enum -from typing import TYPE_CHECKING, Annotated, Any, Dict, List, Literal, Optional, Self, Union +from typing import TYPE_CHECKING, Annotated, Any, Dict, List, Literal, Optional, Self, Union, cast -import aind_behavior_services.task_logic.distributions as distributions -from aind_behavior_services.task_logic import AindBehaviorTaskLogicModel, TaskParameters +import aind_behavior_services.task.distributions as distributions +from aind_behavior_services.task import Task, TaskParameters from pydantic import BaseModel, Field, NonNegativeFloat, field_validator, model_validator from typing_extensions import TypeAliasType @@ -331,7 +331,12 @@ class CtcmFunction(_PatchUpdateFunction): function_type: Literal["CtcmFunction"] = "CtcmFunction" transition_matrix: List[List[NonNegativeFloat]] = Field(description="Transition matrix between states") - rho: float = Field(description="The underlying value goverining the stochastic process") + rho: float = Field(description="The underlying value governing the stochastic process") + dt: Literal[0.1] = Field(default=0.1, description="Sampling time step (s)") + rate: Optional[float] = Field( + default=None, + description="Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only", + ) minimum: float = Field(default=1, description="Maximum value after update") maximum: float = Field(default=0, description="Minimum value after update") @@ -349,6 +354,49 @@ def validate_transition_matrix(cls, value): col /= row_sum return value + @classmethod + def from_replenishment_rate( + cls, n_states: int, replenishment_rate: float, rho: float, dt: Optional[float] = 0.1 + ) -> "CtcmFunction": + """ + Computes the replenishment transition probability matrix for each patch + Parameters + ----------- + n_states: int + number reward states per patch. + replenishment_rate: float + replenishment rate. + rho: float + The underlying value governing the stochastic process + dt: float + experiment time step + + + Returns + ------- + CtcmFunction + Instance of CtcmFunction with computed transition matrix. + """ + import numpy as np + from scipy.linalg import expm + + if dt is None: + dt = cls.model_fields["dt"].default + q = np.zeros((n_states, n_states)) + np.fill_diagonal(q, -replenishment_rate) + np.fill_diagonal(q[:, 1:], replenishment_rate) + q[-1, -1] = 0 + + p_t = expm(q * dt) + assert p_t.ndim == 2 + transition_matrix = cast(list[list[float]], p_t.tolist()) + return cls( + transition_matrix=transition_matrix, + rho=rho, + dt=dt, + rate=replenishment_rate, + ) + if TYPE_CHECKING: PatchUpdateFunction = Union[ @@ -1042,7 +1090,7 @@ class AindVrForagingTaskParameters(TaskParameters): operation_control: OperationControl = Field(description="Control of the operation") -class AindVrForagingTaskLogic(AindBehaviorTaskLogicModel): +class AindVrForagingTaskLogic(Task): """ Main task logic model for the AIND VR Foraging task. diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index 7c743d35..5935af0e 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -4,20 +4,20 @@ import unittest import warnings from pathlib import Path -from typing import Generic, List, Optional, TypeVar, Union +from typing import Generic, List, Optional, Type, TypeVar, Union -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.session import Session from aind_behavior_services.utils import run_bonsai_process +from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from pydantic import ValidationError from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic sys.path.append(".") from examples import rig, session, task_patch_foraging # isort:skip # pylint: disable=wrong-import-position from tests import JSON_ROOT # isort:skip # pylint: disable=wrong-import-position -TModel = TypeVar("TModel", bound=Union[AindVrForagingRig, AindVrForagingTaskLogic, AindBehaviorSessionModel]) +TModel = TypeVar("TModel", bound=Union[AindVrForagingRig, AindVrForagingTaskLogic, Session]) @unittest.skipUnless(platform.system() == "Windows", "Bonsai tests only run on Windows") @@ -28,7 +28,7 @@ def test_deserialization(self): task_patch_foraging.main("./local/{schema}.json") models_to_test = [ - TestModel(bonsai_property="SessionPath", json_root=JSON_ROOT, model=AindBehaviorSessionModel), + TestModel(bonsai_property="SessionPath", json_root=JSON_ROOT, model=Session), TestModel(bonsai_property="RigPath", json_root=JSON_ROOT, model=AindVrForagingRig), TestModel(bonsai_property="TaskLogicPath", json_root=JSON_ROOT, model=AindVrForagingTaskLogic), ] @@ -59,7 +59,7 @@ def test_deserialization(self): class TestModel(Generic[TModel]): - def __init__(self, bonsai_property: str, json_root: Path, model: TModel): + def __init__(self, bonsai_property: str, json_root: Path, model: Type[TModel]): self.bonsai_property: str = bonsai_property self.json_path: Path = json_root / f"{model.__name__}.json" if not os.path.exists(self.json_path): diff --git a/uv.lock b/uv.lock index 7f54b476..740a7310 100644 --- a/uv.lock +++ b/uv.lock @@ -2,15 +2,15 @@ version = 1 revision = 3 requires-python = ">=3.11" resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'darwin'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'darwin'", - "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux')", - "(python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version < '3.12' and sys_platform == 'darwin'", - "python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.12' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] [[package]] @@ -41,8 +41,8 @@ wheels = [ [[package]] name = "aind-behavior-services" -version = "0.12.5" -source = { registry = "https://pypi.org/simple" } +version = "0.13.0rc2" +source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names#0e3d08a4162afc5d0118dc5c1eb589e983b83c44" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, @@ -50,10 +50,6 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/01/6c71f219f5078d7ec3b0507724c2b63ec0af3c8571024053daa469d32e77/aind_behavior_services-0.12.5.tar.gz", hash = "sha256:ebcb1f56852265b988a777b22eeb1a9e4952c4cc7328b0e8c749844593372ccd", size = 27423, upload-time = "2025-11-06T19:06:26.875Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/3c/3d28d25645df3502f1a708483623e3a225c1f195adf2cef5e1727a7cf8b9/aind_behavior_services-0.12.5-py3-none-any.whl", hash = "sha256:fd6d3b60d07fd5bc31ecade227c68f97122e9591e78919098e06fe72b6e1d679", size = 38243, upload-time = "2025-11-06T19:06:25.67Z" }, -] [[package]] name = "aind-behavior-vr-foraging" @@ -71,13 +67,14 @@ data = [ launcher = [ { name = "aind-clabe", extra = ["aind-services"] }, { name = "aind-data-schema" }, - { name = "aind-watchdog-service" }, { name = "contraqctor" }, ] [package.dev-dependencies] dev = [ { name = "aind-behavior-vr-foraging", extra = ["data", "launcher"] }, + { name = "aind-data-schema" }, + { name = "aind-data-schema-models" }, { name = "codespell" }, { name = "ruff" }, ] @@ -86,18 +83,18 @@ docs = [ { name = "autodoc-pydantic", extra = ["erdantic"] }, { name = "furo" }, { name = "myst-parser" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-jinja" }, { name = "sphinx-jsonschema" }, ] [package.metadata] requires-dist = [ - { name = "aind-behavior-services", specifier = ">=0.12,<0.13" }, + { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9.1" }, - { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.2" }, - { name = "aind-watchdog-service", marker = "extra == 'launcher'", specifier = "==0.1.6.dev8" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking" }, + { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.4" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, ] @@ -107,6 +104,8 @@ provides-extras = ["data", "launcher"] dev = [ { name = "aind-behavior-vr-foraging", extras = ["data"] }, { name = "aind-behavior-vr-foraging", extras = ["launcher"] }, + { name = "aind-data-schema", git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev" }, + { name = "aind-data-schema-models", git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main" }, { name = "codespell" }, { name = "ruff" }, ] @@ -122,8 +121,8 @@ docs = [ [[package]] name = "aind-clabe" -version = "0.9.1" -source = { registry = "https://pypi.org/simple" } +version = "0.10.0rc7" +source = { git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking#c4f6e7c14960981fbaee30b7818f08e0e1f6930c" } dependencies = [ { name = "aind-behavior-services" }, { name = "gitpython" }, @@ -134,10 +133,6 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/ab/7f27c98f4f2bf7062548b4d076ae2ec9d00f7e77640a1573f7a896c44835/aind_clabe-0.9.1.tar.gz", hash = "sha256:c6ae4fb781e5b27af044ffcbd413d7c5532e3a272595b74266ab280d86a90217", size = 66521, upload-time = "2025-12-11T23:04:33.544Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/87/95a2e9d73c7421bdf37c4d67aa0ebd66d455a6d81cb63acc70053334b162/aind_clabe-0.9.1-py3-none-any.whl", hash = "sha256:d7197635c842acafaf83ad4a6eb686a387a85c9ee51d96e2c200857dc635f95d", size = 88869, upload-time = "2025-12-11T23:04:32.451Z" }, -] [package.optional-dependencies] aind-services = [ @@ -156,35 +151,26 @@ aind-services = [ [[package]] name = "aind-data-schema" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } +version = "2.4.0" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#58069c82bd294184d7fd1e49ef2fa810272a0779" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, - { name = "semver" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/80/1e/9e17fb42209ce92a95c4b3e5cafc399fc742255261fc21ddcc3195083d66/aind_data_schema-2.2.0.tar.gz", hash = "sha256:26e749d9b227378cd001dc4b1eff0f1cd0c626147484ddf89cdf18ed7c0c110c", size = 865576, upload-time = "2025-11-25T22:34:47.543Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/e5/904b07d0d0dbac1900026d7cc53d63f280abe495f856c2d5251706c0ff21/aind_data_schema-2.2.0-py3-none-any.whl", hash = "sha256:1416a3c527651078a93251160cfe7d6a0b5cc6f52dbbdc799b19b378f1243138", size = 87890, upload-time = "2025-11-25T22:34:46.171Z" }, ] [[package]] name = "aind-data-schema-models" -version = "4.6.2" -source = { registry = "https://pypi.org/simple" } +version = "5.2.2" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#8bf1da4cde1561bcdb683d9ee15130fd0296c4aa" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b6/c2/7c18782963b33c22e4e05c17e143c38d6d3c8d44fd56c0395141b453ea17/aind_data_schema_models-4.6.2.tar.gz", hash = "sha256:8b3b6bfbfe985b0d1d329f04a57c6d2db9fe18acb5b43e162a3db24dc6df0d7c", size = 338337, upload-time = "2025-12-05T18:45:03.06Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/b2/c904fc2a5a27d7320eeffbdd6b1371cff46fb7cf9d531634d363863bc209/aind_data_schema_models-4.6.2-py3-none-any.whl", hash = "sha256:13d0f60dba66adb5aa296dca3baea0ee9cbb38df00b77412f5c7d924c76efa95", size = 307108, upload-time = "2025-12-05T18:45:01.729Z" }, -] [[package]] name = "aind-data-transfer-service" -version = "1.23.0" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, @@ -192,22 +178,22 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/8e/903f431572c7fe7c98c170fd928110a2212f496274050daa01815bd01fc1/aind_data_transfer_service-1.23.0.tar.gz", hash = "sha256:eb462c642ac9a05576f9f8057a010012afd252e040feef688559a3646982f603", size = 38579, upload-time = "2025-12-09T00:25:50.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/03/60306855616b701cac67c01f552a26a7ebe211fc0168f355520ce14a69da/aind_data_transfer_service-2.0.2.tar.gz", hash = "sha256:753063c1c626ff263f8299a5a7448efa74ce535559d3ad3a80fa812ecd653889", size = 36889, upload-time = "2026-01-27T00:23:56.012Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/9d/1d242e2d1fb2ecc198ab8000fc22ddf7ce29927a9b6b6ccdf02baf4a1bd3/aind_data_transfer_service-1.23.0-py3-none-any.whl", hash = "sha256:a77abb077970c26f196b8eeb4b70e984163679095a4c412889d25917791ed60e", size = 24009, upload-time = "2025-12-09T00:25:49.263Z" }, + { url = "https://files.pythonhosted.org/packages/25/90/e77fff58677299129b685d0a76c7127fa08b18b19d83d057d954eb56b809/aind_data_transfer_service-2.0.2-py3-none-any.whl", hash = "sha256:6771732fc94eeec08792a48fb81a03d6970375f9553b786290b7aecb5cebb32f", size = 23061, upload-time = "2026-01-27T00:23:55.032Z" }, ] [[package]] name = "aind-watchdog-service" -version = "0.1.6.dev8" +version = "0.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-transfer-service" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/7a/133583e96793c98b46ed06e7e591b7364bdb96a557b5a647dee4294961c3/aind_watchdog_service-0.1.6.dev8.tar.gz", hash = "sha256:5636372fba8504ab3679678319183a39361c655593d3f6d5c919ca41ace7f8ab", size = 392177, upload-time = "2025-11-25T17:20:21.887Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/4a/d42d8bc518260b195c5702146af3c5cf4e391ddd61abfe85dc7d48c90eaf/aind_watchdog_service-0.1.6.tar.gz", hash = "sha256:1b1679e37696bf269e646cf943f2a8255f7aaaacc779de0cce61abc3570dc169", size = 390289, upload-time = "2026-01-22T01:54:30.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/cd/3607a1b5bfa8af2cc33f5b44a56c16337a09571d6ee29fbb61fef75d3cd7/aind_watchdog_service-0.1.6.dev8-py3-none-any.whl", hash = "sha256:8f15baf43a2ced64384075d7d3eb88a2a8f96460db020dbd38353a1ee4a2fb4c", size = 48580, upload-time = "2025-11-25T17:20:20.575Z" }, + { url = "https://files.pythonhosted.org/packages/29/1a/8bcc17159e4eef205f4463d2422a66ad685b31717b6416a2b40d60ec0177/aind_watchdog_service-0.1.6-py3-none-any.whl", hash = "sha256:69571b4e50719c6cec38d7d901cdffdcdca296039ebebce8971ef4aef849dee9", size = 47801, upload-time = "2026-01-22T01:54:28.827Z" }, ] [[package]] @@ -278,7 +264,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl", hash = "sha256:8c6a36fbf6ed2700ea9c6d21ea76ad541b621fbdf16b5a80ee04673548af4d95", size = 34001, upload-time = "2024-04-27T10:57:00.542Z" }, @@ -313,11 +300,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, ] [[package]] @@ -690,11 +677,11 @@ wheels = [ [[package]] name = "docutils" -version = "0.21.2" +version = "0.22.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +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/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, + { 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]] @@ -730,67 +717,68 @@ wheels = [ [[package]] name = "fonttools" -version = "4.61.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" }, - { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" }, - { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" }, - { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" }, - { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" }, - { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, - { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, - { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, - { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" }, - { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" }, - { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" }, - { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" }, - { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" }, - { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" }, - { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" }, - { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" }, - { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" }, - { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" }, - { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" }, - { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" }, - { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" }, - { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" }, - { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" }, - { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" }, - { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" }, + { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" }, + { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" }, + { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" }, + { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" }, + { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" }, + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" }, + { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" }, + { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" }, + { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" }, + { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, + { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, + { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, + { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, + { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, ] [[package]] name = "furo" -version = "2025.9.25" +version = "2025.12.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, { name = "beautifulsoup4" }, { name = "pygments" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/29/ff3b83a1ffce74676043ab3e7540d398e0b1ce7660917a00d7c4958b93da/furo-2025.9.25.tar.gz", hash = "sha256:3eac05582768fdbbc2bdfa1cdbcdd5d33cfc8b4bd2051729ff4e026a1d7e0a98", size = 1662007, upload-time = "2025-09-25T21:37:19.221Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/20/5f5ad4da6a5a27c80f2ed2ee9aee3f9e36c66e56e21c00fde467b2f8f88f/furo-2025.12.19.tar.gz", hash = "sha256:188d1f942037d8b37cd3985b955839fea62baa1730087dc29d157677c857e2a7", size = 1661473, upload-time = "2025-12-19T17:34:40.889Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/69/964b55f389c289e16ba2a5dfe587c3c462aac09e24123f09ddf703889584/furo-2025.9.25-py3-none-any.whl", hash = "sha256:2937f68e823b8e37b410c972c371bc2b1d88026709534927158e0cb3fac95afe", size = 340409, upload-time = "2025-09-25T21:37:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b2/50e9b292b5cac13e9e81272c7171301abc753a60460d21505b606e15cf21/furo-2025.12.19-py3-none-any.whl", hash = "sha256:bb0ead5309f9500130665a26bee87693c41ce4dbdff864dbfb6b0dae4673d24f", size = 339262, upload-time = "2025-12-19T17:34:38.905Z" }, ] [[package]] @@ -807,14 +795,14 @@ wheels = [ [[package]] name = "gitpython" -version = "3.1.45" +version = "3.1.46" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/b5/59d16470a1f0dfe8c793f9ef56fd3826093fc52b3bd96d6b9d6c26c7e27b/gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f", size = 215371, upload-time = "2026-01-01T15:37:32.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, + { url = "https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058", size = 208620, upload-time = "2026-01-01T15:37:30.574Z" }, ] [[package]] @@ -1084,14 +1072,14 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] @@ -1272,9 +1260,9 @@ name = "msal" version = "1.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "pyjwt", extra = ["crypto"], marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "requests", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "cryptography" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } wheels = [ @@ -1283,7 +1271,7 @@ wheels = [ [[package]] name = "myst-parser" -version = "4.0.1" +version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1291,259 +1279,265 @@ dependencies = [ { name = "markdown-it-py" }, { name = "mdit-py-plugins" }, { name = "pyyaml" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", size = 98535, upload-time = "2026-01-15T09:08:18.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", size = 84533, upload-time = "2026-01-15T09:08:16.788Z" }, ] [[package]] name = "numpy" -version = "2.3.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, + { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, + { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, + { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, + { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, + { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, + { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, + { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, + { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, + { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, + { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, + { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, + { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, + { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, + { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089, upload-time = "2026-01-10T06:43:27.535Z" }, + { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230, upload-time = "2026-01-10T06:43:29.298Z" }, + { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125, upload-time = "2026-01-10T06:43:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, + { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, + { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, + { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, + { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138, upload-time = "2026-01-10T06:43:48.854Z" }, + { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478, upload-time = "2026-01-10T06:43:50.476Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981, upload-time = "2026-01-10T06:43:52.575Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, + { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, + { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, + { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, + { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, + { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, + { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, + { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, + { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, + { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, + { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, + { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, + { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, + { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, + { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, ] [[package]] name = "opencv-python" -version = "4.11.0.86" +version = "4.13.0.90" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956, upload-time = "2025-01-16T13:52:24.737Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/4d/53b30a2a3ac1f75f65a59eb29cf2ee7207ce64867db47036ad61743d5a23/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", size = 37326322, upload-time = "2025-01-16T13:52:25.887Z" }, - { url = "https://files.pythonhosted.org/packages/3b/84/0a67490741867eacdfa37bc18df96e08a9d579583b419010d7f3da8ff503/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66", size = 56723197, upload-time = "2025-01-16T13:55:21.222Z" }, - { url = "https://files.pythonhosted.org/packages/f3/bd/29c126788da65c1fb2b5fb621b7fed0ed5f9122aa22a0868c5e2c15c6d23/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", size = 42230439, upload-time = "2025-01-16T13:51:35.822Z" }, - { url = "https://files.pythonhosted.org/packages/2c/8b/90eb44a40476fa0e71e05a0283947cfd74a5d36121a11d926ad6f3193cc4/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", size = 62986597, upload-time = "2025-01-16T13:52:08.836Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d7/1d5941a9dde095468b288d989ff6539dd69cd429dbf1b9e839013d21b6f0/opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", size = 29384337, upload-time = "2025-01-16T13:52:13.549Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", size = 39488044, upload-time = "2025-01-16T13:52:21.928Z" }, + { url = "https://files.pythonhosted.org/packages/77/d7/133d5756aef78090f4d8dd4895793aed24942dec6064a15375cfac9175fc/opencv_python-4.13.0.90-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:58803f8b05b51d8a785e2306d83b44173b32536f980342f3bc76d8c122b5938d", size = 46020278, upload-time = "2026-01-18T08:57:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/7b/65/3b8cdbe13fa2436695d00e1d8c1ddf5edb4050a93436f34ed867233d1960/opencv_python-4.13.0.90-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:a5354e8b161409fce7710ba4c1cfe88b7bb460d97f705dc4e714a1636616f87d", size = 32568376, upload-time = "2026-01-18T08:58:47.19Z" }, + { url = "https://files.pythonhosted.org/packages/34/ff/e4d7c165e678563f49505d3d2811fcc16011e929cd00bc4b0070c7ee82b0/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d557cbf0c7818081c9acf56585b68e781af4f00638971f75eaa3de70904a6314", size = 47685110, upload-time = "2026-01-18T08:59:58.045Z" }, + { url = "https://files.pythonhosted.org/packages/cf/02/d9b73dbce28712204e85ae4c1e179505e9a771f95b33743a97e170caedde/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9911581e37b24169e4842069ff01d6645ea2bc4af7e10a022d9ebe340fd035ec", size = 70460479, upload-time = "2026-01-18T09:01:16.377Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1c/87fa71968beb71481ed359e21772061ceff7c9b45a61b3e7daa71e5b0b66/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1150b8f1947761b848bbfa9c96ceba8877743ffef157c08a04af6f7717ddd709", size = 46707819, upload-time = "2026-01-18T09:02:48.049Z" }, + { url = "https://files.pythonhosted.org/packages/af/16/915a94e5b537c328fa3e96b769c7d4eed3b67d1be978e0af658a3d3faed8/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d6716f16149b04eea52f953b8ca983d60dd9cd4872c1fd5113f6e2fcebb90e93", size = 72926629, upload-time = "2026-01-18T09:04:29.23Z" }, + { url = "https://files.pythonhosted.org/packages/bf/84/9c63c84be013943dd4c5fff36157f1ec0ec894b69a2fc3026fd4e3c9280a/opencv_python-4.13.0.90-cp37-abi3-win32.whl", hash = "sha256:458a00f2ba47a877eca385be3e7bcc45e6d30a4361d107ce73c1800f516dab09", size = 30932151, upload-time = "2026-01-18T09:05:22.181Z" }, + { url = "https://files.pythonhosted.org/packages/13/de/291cbb17f44242ed6bfd3450fc2535d6bd298115c0ccd6f01cd51d4a11d7/opencv_python-4.13.0.90-cp37-abi3-win_amd64.whl", hash = "sha256:526bde4c33a86808a751e2bb57bf4921beb49794621810971926c472897f6433", size = 40211706, upload-time = "2026-01-18T09:06:06.749Z" }, ] [[package]] name = "packaging" -version = "25.0" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] name = "pandas" -version = "2.3.3" +version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, - { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, - { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, - { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/da/b1dc0481ab8d55d0f46e343cfe67d4551a0e14fcee52bd38ca1bd73258d8/pandas-3.0.0.tar.gz", hash = "sha256:0facf7e87d38f721f0af46fe70d97373a37701b1c09f7ed7aeeb292ade5c050f", size = 4633005, upload-time = "2026-01-21T15:52:04.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/1e/b184654a856e75e975a6ee95d6577b51c271cd92cb2b020c9378f53e0032/pandas-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d64ce01eb9cdca96a15266aa679ae50212ec52757c79204dbc7701a222401850", size = 10313247, upload-time = "2026-01-21T15:50:15.775Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/e04a547ad0f0183bf151fd7c7a477468e3b85ff2ad231c566389e6cc9587/pandas-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:613e13426069793aa1ec53bdcc3b86e8d32071daea138bbcf4fa959c9cdaa2e2", size = 9913131, upload-time = "2026-01-21T15:50:18.611Z" }, + { url = "https://files.pythonhosted.org/packages/a2/93/bb77bfa9fc2aba9f7204db807d5d3fb69832ed2854c60ba91b4c65ba9219/pandas-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0192fee1f1a8e743b464a6607858ee4b071deb0b118eb143d71c2a1d170996d5", size = 10741925, upload-time = "2026-01-21T15:50:21.058Z" }, + { url = "https://files.pythonhosted.org/packages/62/fb/89319812eb1d714bfc04b7f177895caeba8ab4a37ef6712db75ed786e2e0/pandas-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b853319dec8d5e0c8b875374c078ef17f2269986a78168d9bd57e49bf650ae", size = 11245979, upload-time = "2026-01-21T15:50:23.413Z" }, + { url = "https://files.pythonhosted.org/packages/a9/63/684120486f541fc88da3862ed31165b3b3e12b6a1c7b93be4597bc84e26c/pandas-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:707a9a877a876c326ae2cb640fbdc4ef63b0a7b9e2ef55c6df9942dcee8e2af9", size = 11756337, upload-time = "2026-01-21T15:50:25.932Z" }, + { url = "https://files.pythonhosted.org/packages/39/92/7eb0ad232312b59aec61550c3c81ad0743898d10af5df7f80bc5e5065416/pandas-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:afd0aa3d0b5cda6e0b8ffc10dbcca3b09ef3cbcd3fe2b27364f85fdc04e1989d", size = 12325517, upload-time = "2026-01-21T15:50:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/51/27/bf9436dd0a4fc3130acec0828951c7ef96a0631969613a9a35744baf27f6/pandas-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:113b4cca2614ff7e5b9fee9b6f066618fe73c5a83e99d721ffc41217b2bf57dd", size = 9881576, upload-time = "2026-01-21T15:50:30.149Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/c618b871fce0159fd107516336e82891b404e3f340821853c2fc28c7830f/pandas-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c14837eba8e99a8da1527c0280bba29b0eb842f64aa94982c5e21227966e164b", size = 9140807, upload-time = "2026-01-21T15:50:32.308Z" }, + { url = "https://files.pythonhosted.org/packages/0b/38/db33686f4b5fa64d7af40d96361f6a4615b8c6c8f1b3d334eee46ae6160e/pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9803b31f5039b3c3b10cc858c5e40054adb4b29b4d81cb2fd789f4121c8efbcd", size = 10334013, upload-time = "2026-01-21T15:50:34.771Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7b/9254310594e9774906bacdd4e732415e1f86ab7dbb4b377ef9ede58cd8ec/pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14c2a4099cd38a1d18ff108168ea417909b2dea3bd1ebff2ccf28ddb6a74d740", size = 9874154, upload-time = "2026-01-21T15:50:36.67Z" }, + { url = "https://files.pythonhosted.org/packages/63/d4/726c5a67a13bc66643e66d2e9ff115cead482a44fc56991d0c4014f15aaf/pandas-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d257699b9a9960e6125686098d5714ac59d05222bef7a5e6af7a7fd87c650801", size = 10384433, upload-time = "2026-01-21T15:50:39.132Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2e/9211f09bedb04f9832122942de8b051804b31a39cfbad199a819bb88d9f3/pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69780c98f286076dcafca38d8b8eee1676adf220199c0a39f0ecbf976b68151a", size = 10864519, upload-time = "2026-01-21T15:50:41.043Z" }, + { url = "https://files.pythonhosted.org/packages/00/8d/50858522cdc46ac88b9afdc3015e298959a70a08cd21e008a44e9520180c/pandas-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4a66384f017240f3858a4c8a7cf21b0591c3ac885cddb7758a589f0f71e87ebb", size = 11394124, upload-time = "2026-01-21T15:50:43.377Z" }, + { url = "https://files.pythonhosted.org/packages/86/3f/83b2577db02503cd93d8e95b0f794ad9d4be0ba7cb6c8bcdcac964a34a42/pandas-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8c515c9bc33989d97b89db66ea0cececb0f6e3c2a87fcc8b69443a6923e95f", size = 11920444, upload-time = "2026-01-21T15:50:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/64/2d/4f8a2f192ed12c90a0aab47f5557ece0e56b0370c49de9454a09de7381b2/pandas-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a453aad8c4f4e9f166436994a33884442ea62aa8b27d007311e87521b97246e1", size = 9730970, upload-time = "2026-01-21T15:50:47.962Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/ff571be435cf1e643ca98d0945d76732c0b4e9c37191a89c8550b105eed1/pandas-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:da768007b5a33057f6d9053563d6b74dd6d029c337d93c6d0d22a763a5c2ecc0", size = 9041950, upload-time = "2026-01-21T15:50:50.422Z" }, + { url = "https://files.pythonhosted.org/packages/6f/fa/7f0ac4ca8877c57537aaff2a842f8760e630d8e824b730eb2e859ffe96ca/pandas-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b78d646249b9a2bc191040988c7bb524c92fa8534fb0898a0741d7e6f2ffafa6", size = 10307129, upload-time = "2026-01-21T15:50:52.877Z" }, + { url = "https://files.pythonhosted.org/packages/6f/11/28a221815dcea4c0c9414dfc845e34a84a6a7dabc6da3194498ed5ba4361/pandas-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc9cba7b355cb4162442a88ce495e01cb605f17ac1e27d6596ac963504e0305f", size = 9850201, upload-time = "2026-01-21T15:50:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/ba/da/53bbc8c5363b7e5bd10f9ae59ab250fc7a382ea6ba08e4d06d8694370354/pandas-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c9a1a149aed3b6c9bf246033ff91e1b02d529546c5d6fb6b74a28fea0cf4c70", size = 10354031, upload-time = "2026-01-21T15:50:57.463Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a3/51e02ebc2a14974170d51e2410dfdab58870ea9bcd37cda15bd553d24dc4/pandas-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95683af6175d884ee89471842acfca29172a85031fccdabc35e50c0984470a0e", size = 10861165, upload-time = "2026-01-21T15:50:59.32Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/05a51e3cac11d161472b8297bd41723ea98013384dd6d76d115ce3482f9b/pandas-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1fbbb5a7288719e36b76b4f18d46ede46e7f916b6c8d9915b756b0a6c3f792b3", size = 11359359, upload-time = "2026-01-21T15:51:02.014Z" }, + { url = "https://files.pythonhosted.org/packages/ee/56/ba620583225f9b85a4d3e69c01df3e3870659cc525f67929b60e9f21dcd1/pandas-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e8b9808590fa364416b49b2a35c1f4cf2785a6c156935879e57f826df22038e", size = 11912907, upload-time = "2026-01-21T15:51:05.175Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8c/c6638d9f67e45e07656b3826405c5cc5f57f6fd07c8b2572ade328c86e22/pandas-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:98212a38a709feb90ae658cb6227ea3657c22ba8157d4b8f913cd4c950de5e7e", size = 9732138, upload-time = "2026-01-21T15:51:07.569Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bf/bd1335c3bf1770b6d8fed2799993b11c4971af93bb1b729b9ebbc02ca2ec/pandas-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:177d9df10b3f43b70307a149d7ec49a1229a653f907aa60a48f1877d0e6be3be", size = 9033568, upload-time = "2026-01-21T15:51:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c6/f5e2171914d5e29b9171d495344097d54e3ffe41d2d85d8115baba4dc483/pandas-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2713810ad3806767b89ad3b7b69ba153e1c6ff6d9c20f9c2140379b2a98b6c98", size = 10741936, upload-time = "2026-01-21T15:51:11.693Z" }, + { url = "https://files.pythonhosted.org/packages/51/88/9a0164f99510a1acb9f548691f022c756c2314aad0d8330a24616c14c462/pandas-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:15d59f885ee5011daf8335dff47dcb8a912a27b4ad7826dc6cbe809fd145d327", size = 10393884, upload-time = "2026-01-21T15:51:14.197Z" }, + { url = "https://files.pythonhosted.org/packages/e0/53/b34d78084d88d8ae2b848591229da8826d1e65aacf00b3abe34023467648/pandas-3.0.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24e6547fb64d2c92665dd2adbfa4e85fa4fd70a9c070e7cfb03b629a0bbab5eb", size = 10310740, upload-time = "2026-01-21T15:51:16.093Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d3/bee792e7c3d6930b74468d990604325701412e55d7aaf47460a22311d1a5/pandas-3.0.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48ee04b90e2505c693d3f8e8f524dab8cb8aaf7ddcab52c92afa535e717c4812", size = 10700014, upload-time = "2026-01-21T15:51:18.818Z" }, + { url = "https://files.pythonhosted.org/packages/55/db/2570bc40fb13aaed1cbc3fbd725c3a60ee162477982123c3adc8971e7ac1/pandas-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66f72fb172959af42a459e27a8d8d2c7e311ff4c1f7db6deb3b643dbc382ae08", size = 11323737, upload-time = "2026-01-21T15:51:20.784Z" }, + { url = "https://files.pythonhosted.org/packages/bc/2e/297ac7f21c8181b62a4cccebad0a70caf679adf3ae5e83cb676194c8acc3/pandas-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4a4a400ca18230976724a5066f20878af785f36c6756e498e94c2a5e5d57779c", size = 11771558, upload-time = "2026-01-21T15:51:22.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/46/e1c6876d71c14332be70239acce9ad435975a80541086e5ffba2f249bcf6/pandas-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:940eebffe55528074341a5a36515f3e4c5e25e958ebbc764c9502cfc35ba3faa", size = 10473771, upload-time = "2026-01-21T15:51:25.285Z" }, + { url = "https://files.pythonhosted.org/packages/c0/db/0270ad9d13c344b7a36fa77f5f8344a46501abf413803e885d22864d10bf/pandas-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:597c08fb9fef0edf1e4fa2f9828dd27f3d78f9b8c9b4a748d435ffc55732310b", size = 10312075, upload-time = "2026-01-21T15:51:28.5Z" }, + { url = "https://files.pythonhosted.org/packages/09/9f/c176f5e9717f7c91becfe0f55a52ae445d3f7326b4a2cf355978c51b7913/pandas-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:447b2d68ac5edcbf94655fe909113a6dba6ef09ad7f9f60c80477825b6c489fe", size = 9900213, upload-time = "2026-01-21T15:51:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e7/63ad4cc10b257b143e0a5ebb04304ad806b4e1a61c5da25f55896d2ca0f4/pandas-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:debb95c77ff3ed3ba0d9aa20c3a2f19165cc7956362f9873fce1ba0a53819d70", size = 10428768, upload-time = "2026-01-21T15:51:33.018Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0e/4e4c2d8210f20149fd2248ef3fff26623604922bd564d915f935a06dd63d/pandas-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fedabf175e7cd82b69b74c30adbaa616de301291a5231138d7242596fc296a8d", size = 10882954, upload-time = "2026-01-21T15:51:35.287Z" }, + { url = "https://files.pythonhosted.org/packages/c6/60/c9de8ac906ba1f4d2250f8a951abe5135b404227a55858a75ad26f84db47/pandas-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:412d1a89aab46889f3033a386912efcdfa0f1131c5705ff5b668dda88305e986", size = 11430293, upload-time = "2026-01-21T15:51:37.57Z" }, + { url = "https://files.pythonhosted.org/packages/a1/69/806e6637c70920e5787a6d6896fd707f8134c2c55cd761e7249a97b7dc5a/pandas-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e979d22316f9350c516479dd3a92252be2937a9531ed3a26ec324198a99cdd49", size = 11952452, upload-time = "2026-01-21T15:51:39.618Z" }, + { url = "https://files.pythonhosted.org/packages/cb/de/918621e46af55164c400ab0ef389c9d969ab85a43d59ad1207d4ddbe30a5/pandas-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:083b11415b9970b6e7888800c43c82e81a06cd6b06755d84804444f0007d6bb7", size = 9851081, upload-time = "2026-01-21T15:51:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/a1/3562a18dd0bd8c73344bfa26ff90c53c72f827df119d6d6b1dacc84d13e3/pandas-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:5db1e62cb99e739fa78a28047e861b256d17f88463c76b8dafc7c1338086dca8", size = 9174610, upload-time = "2026-01-21T15:51:44.312Z" }, + { url = "https://files.pythonhosted.org/packages/ce/26/430d91257eaf366f1737d7a1c158677caaf6267f338ec74e3a1ec444111c/pandas-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:697b8f7d346c68274b1b93a170a70974cdc7d7354429894d5927c1effdcccd73", size = 10761999, upload-time = "2026-01-21T15:51:46.899Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1a/954eb47736c2b7f7fe6a9d56b0cb6987773c00faa3c6451a43db4beb3254/pandas-3.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8cb3120f0d9467ed95e77f67a75e030b67545bcfa08964e349252d674171def2", size = 10410279, upload-time = "2026-01-21T15:51:48.89Z" }, + { url = "https://files.pythonhosted.org/packages/20/fc/b96f3a5a28b250cd1b366eb0108df2501c0f38314a00847242abab71bb3a/pandas-3.0.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fd3e6baa72899746b820c31e4b9688c8e1b7864d7aec2de7ab5035c285277a", size = 10330198, upload-time = "2026-01-21T15:51:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/90/b3/d0e2952f103b4fbef1ef22d0c2e314e74fc9064b51cee30890b5e3286ee6/pandas-3.0.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8942e333dc67ceda1095227ad0febb05a3b36535e520154085db632c40ad084", size = 10728513, upload-time = "2026-01-21T15:51:53.387Z" }, + { url = "https://files.pythonhosted.org/packages/76/81/832894f286df828993dc5fd61c63b231b0fb73377e99f6c6c369174cf97e/pandas-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:783ac35c4d0fe0effdb0d67161859078618b1b6587a1af15928137525217a721", size = 11345550, upload-time = "2026-01-21T15:51:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/34/a0/ed160a00fb4f37d806406bc0a79a8b62fe67f29d00950f8d16203ff3409b/pandas-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:125eb901e233f155b268bbef9abd9afb5819db74f0e677e89a61b246228c71ac", size = 11799386, upload-time = "2026-01-21T15:51:57.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/c8/2ac00d7255252c5e3cf61b35ca92ca25704b0188f7454ca4aec08a33cece/pandas-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b86d113b6c109df3ce0ad5abbc259fe86a1bd4adfd4a31a89da42f84f65509bb", size = 10873041, upload-time = "2026-01-21T15:52:00.034Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/a80ac00acbc6b35166b42850e98a4f466e2c0d9c64054161ba9620f95680/pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa", size = 9441003, upload-time = "2026-01-21T15:52:02.281Z" }, ] [[package]] name = "pillow" -version = "12.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, - { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, - { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, - { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, - { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, - { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, - { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, - { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, - { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, - { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, - { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, - { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, - { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, - { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, - { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, - { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, - { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, - { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, - { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, - { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, - { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, - { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, - { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, - { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, - { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, - { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, - { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, - { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, - { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, - { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, - { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, - { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, - { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, - { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, - { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, - { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, - { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, - { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, - { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, - { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, - { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, - { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, - { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, - { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, - { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, - { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, - { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, - { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, - { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, - { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, - { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, - { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, - { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, - { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, - { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +version = "12.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" }, + { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" }, + { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" }, + { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" }, + { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" }, + { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" }, + { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" }, + { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" }, + { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, + { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, + { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, + { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c7/2530a4aa28248623e9d7f27316b42e27c32ec410f695929696f2e0e4a778/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1", size = 4062543, upload-time = "2026-01-02T09:11:31.566Z" }, + { url = "https://files.pythonhosted.org/packages/8f/1f/40b8eae823dc1519b87d53c30ed9ef085506b05281d313031755c1705f73/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179", size = 4138373, upload-time = "2026-01-02T09:11:33.367Z" }, + { url = "https://files.pythonhosted.org/packages/d4/77/6fa60634cf06e52139fd0e89e5bbf055e8166c691c42fb162818b7fda31d/pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0", size = 3601241, upload-time = "2026-01-02T09:11:35.011Z" }, + { url = "https://files.pythonhosted.org/packages/4f/bf/28ab865de622e14b747f0cd7877510848252d950e43002e224fb1c9ababf/pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587", size = 5262410, upload-time = "2026-01-02T09:11:36.682Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/583420a1b55e715937a85bd48c5c0991598247a1fd2eb5423188e765ea02/pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac", size = 4657312, upload-time = "2026-01-02T09:11:38.535Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fd/f5a0896839762885b3376ff04878f86ab2b097c2f9a9cdccf4eda8ba8dc0/pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b", size = 6232605, upload-time = "2026-01-02T09:11:40.602Z" }, + { url = "https://files.pythonhosted.org/packages/98/aa/938a09d127ac1e70e6ed467bd03834350b33ef646b31edb7452d5de43792/pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea", size = 8041617, upload-time = "2026-01-02T09:11:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/17/e8/538b24cb426ac0186e03f80f78bc8dc7246c667f58b540bdd57c71c9f79d/pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c", size = 6346509, upload-time = "2026-01-02T09:11:44.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/632e58ec89a32738cabfd9ec418f0e9898a2b4719afc581f07c04a05e3c9/pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc", size = 7038117, upload-time = "2026-01-02T09:11:46.736Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a2/d40308cf86eada842ca1f3ffa45d0ca0df7e4ab33c83f81e73f5eaed136d/pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644", size = 6460151, upload-time = "2026-01-02T09:11:48.625Z" }, + { url = "https://files.pythonhosted.org/packages/f1/88/f5b058ad6453a085c5266660a1417bdad590199da1b32fb4efcff9d33b05/pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c", size = 7164534, upload-time = "2026-01-02T09:11:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/19/ce/c17334caea1db789163b5d855a5735e47995b0b5dc8745e9a3605d5f24c0/pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171", size = 6332551, upload-time = "2026-01-02T09:11:52.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/07/74a9d941fa45c90a0d9465098fe1ec85de3e2afbdc15cc4766622d516056/pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a", size = 7040087, upload-time = "2026-01-02T09:11:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/88/09/c99950c075a0e9053d8e880595926302575bc742b1b47fe1bbcc8d388d50/pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45", size = 2452470, upload-time = "2026-01-02T09:11:56.522Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ba/970b7d85ba01f348dee4d65412476321d40ee04dcb51cd3735b9dc94eb58/pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d", size = 5264816, upload-time = "2026-01-02T09:11:58.227Z" }, + { url = "https://files.pythonhosted.org/packages/10/60/650f2fb55fdba7a510d836202aa52f0baac633e50ab1cf18415d332188fb/pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0", size = 4660472, upload-time = "2026-01-02T09:12:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/5273a99478956a099d533c4f46cbaa19fd69d606624f4334b85e50987a08/pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554", size = 6268974, upload-time = "2026-01-02T09:12:02.572Z" }, + { url = "https://files.pythonhosted.org/packages/b4/26/0bf714bc2e73d5267887d47931d53c4ceeceea6978148ed2ab2a4e6463c4/pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e", size = 8073070, upload-time = "2026-01-02T09:12:04.75Z" }, + { url = "https://files.pythonhosted.org/packages/43/cf/1ea826200de111a9d65724c54f927f3111dc5ae297f294b370a670c17786/pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82", size = 6380176, upload-time = "2026-01-02T09:12:06.626Z" }, + { url = "https://files.pythonhosted.org/packages/03/e0/7938dd2b2013373fd85d96e0f38d62b7a5a262af21ac274250c7ca7847c9/pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4", size = 7067061, upload-time = "2026-01-02T09:12:08.624Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/a2aa97d37272a929a98437a8c0ac37b3cf012f4f8721e1bd5154699b2518/pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0", size = 6491824, upload-time = "2026-01-02T09:12:10.488Z" }, + { url = "https://files.pythonhosted.org/packages/a4/44/80e46611b288d51b115826f136fb3465653c28f491068a72d3da49b54cd4/pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b", size = 7190911, upload-time = "2026-01-02T09:12:12.772Z" }, + { url = "https://files.pythonhosted.org/packages/86/77/eacc62356b4cf81abe99ff9dbc7402750044aed02cfd6a503f7c6fc11f3e/pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65", size = 6336445, upload-time = "2026-01-02T09:12:14.775Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3c/57d81d0b74d218706dafccb87a87ea44262c43eef98eb3b164fd000e0491/pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0", size = 7045354, upload-time = "2026-01-02T09:12:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/ac/82/8b9b97bba2e3576a340f93b044a3a3a09841170ab4c1eb0d5c93469fd32f/pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8", size = 2454547, upload-time = "2026-01-02T09:12:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, + { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, + { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, + { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, + { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, + { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, + { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, + { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, + { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, + { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, + { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" }, + { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" }, + { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" }, + { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" }, + { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, ] [[package]] @@ -1560,20 +1554,20 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.1" +version = "0.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, ] [[package]] name = "pycparser" -version = "2.23" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +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/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { 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]] @@ -1770,7 +1764,7 @@ wheels = [ [package.optional-dependencies] crypto = [ - { name = "cryptography", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "cryptography" }, ] [[package]] @@ -1800,11 +1794,11 @@ wheels = [ [[package]] name = "pyparsing" -version = "3.2.5" +version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] [[package]] @@ -1921,36 +1915,36 @@ wheels = [ [[package]] name = "rich" -version = "14.2.0" +version = "14.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, ] [[package]] -name = "roman-numerals-py" -version = "3.1.0" +name = "roman-numerals" +version = "4.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +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/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, + { 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 = "ruamel-yaml" -version = "0.18.16" +version = "0.18.17" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.15' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/c7/ee630b29e04a672ecfc9b63227c87fd7a37eb67c1bf30fe95376437f897c/ruamel.yaml-0.18.16.tar.gz", hash = "sha256:a6e587512f3c998b2225d68aa1f35111c29fad14aed561a26e73fab729ec5e5a", size = 147269, upload-time = "2025-10-22T17:54:02.346Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/2b/7a1f1ebcd6b3f14febdc003e658778d81e76b40df2267904ee6b13f0c5c6/ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c", size = 149602, upload-time = "2025-12-17T20:02:55.757Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/73/bb1bc2529f852e7bf64a2dec885e89ff9f5cc7bbf6c9340eed30ff2c69c5/ruamel.yaml-0.18.16-py3-none-any.whl", hash = "sha256:048f26d64245bae57a4f9ef6feb5b552a386830ef7a826f235ffb804c59efbba", size = 119858, upload-time = "2025-10-22T17:53:59.012Z" }, + { url = "https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d", size = 121594, upload-time = "2025-12-17T20:02:07.657Z" }, ] [[package]] @@ -2003,99 +1997,99 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/1b/ab712a9d5044435be8e9a2beb17cbfa4c241aa9b5e4413febac2a8b79ef2/ruff-0.14.9.tar.gz", hash = "sha256:35f85b25dd586381c0cc053f48826109384c81c00ad7ef1bd977bfcc28119d5b", size = 5809165, upload-time = "2025-12-11T21:39:47.381Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/1c/d1b1bba22cffec02351c78ab9ed4f7d7391876e12720298448b29b7229c1/ruff-0.14.9-py3-none-linux_armv6l.whl", hash = "sha256:f1ec5de1ce150ca6e43691f4a9ef5c04574ad9ca35c8b3b0e18877314aba7e75", size = 13576541, upload-time = "2025-12-11T21:39:14.806Z" }, - { url = "https://files.pythonhosted.org/packages/94/ab/ffe580e6ea1fca67f6337b0af59fc7e683344a43642d2d55d251ff83ceae/ruff-0.14.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ed9d7417a299fc6030b4f26333bf1117ed82a61ea91238558c0268c14e00d0c2", size = 13779363, upload-time = "2025-12-11T21:39:20.29Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f8/2be49047f929d6965401855461e697ab185e1a6a683d914c5c19c7962d9e/ruff-0.14.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d5dc3473c3f0e4a1008d0ef1d75cee24a48e254c8bed3a7afdd2b4392657ed2c", size = 12925292, upload-time = "2025-12-11T21:39:38.757Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e9/08840ff5127916bb989c86f18924fd568938b06f58b60e206176f327c0fe/ruff-0.14.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84bf7c698fc8f3cb8278830fb6b5a47f9bcc1ed8cb4f689b9dd02698fa840697", size = 13362894, upload-time = "2025-12-11T21:39:02.524Z" }, - { url = "https://files.pythonhosted.org/packages/31/1c/5b4e8e7750613ef43390bb58658eaf1d862c0cc3352d139cd718a2cea164/ruff-0.14.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa733093d1f9d88a5d98988d8834ef5d6f9828d03743bf5e338bf980a19fce27", size = 13311482, upload-time = "2025-12-11T21:39:17.51Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3a/459dce7a8cb35ba1ea3e9c88f19077667a7977234f3b5ab197fad240b404/ruff-0.14.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a1cfb04eda979b20c8c19550c8b5f498df64ff8da151283311ce3199e8b3648", size = 14016100, upload-time = "2025-12-11T21:39:41.948Z" }, - { url = "https://files.pythonhosted.org/packages/a6/31/f064f4ec32524f9956a0890fc6a944e5cf06c63c554e39957d208c0ffc45/ruff-0.14.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1e5cb521e5ccf0008bd74d5595a4580313844a42b9103b7388eca5a12c970743", size = 15477729, upload-time = "2025-12-11T21:39:23.279Z" }, - { url = "https://files.pythonhosted.org/packages/7a/6d/f364252aad36ccd443494bc5f02e41bf677f964b58902a17c0b16c53d890/ruff-0.14.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd429a8926be6bba4befa8cdcf3f4dd2591c413ea5066b1e99155ed245ae42bb", size = 15122386, upload-time = "2025-12-11T21:39:33.125Z" }, - { url = "https://files.pythonhosted.org/packages/20/02/e848787912d16209aba2799a4d5a1775660b6a3d0ab3944a4ccc13e64a02/ruff-0.14.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab208c1b7a492e37caeaf290b1378148f75e13c2225af5d44628b95fd7834273", size = 14497124, upload-time = "2025-12-11T21:38:59.33Z" }, - { url = "https://files.pythonhosted.org/packages/f3/51/0489a6a5595b7760b5dbac0dd82852b510326e7d88d51dbffcd2e07e3ff3/ruff-0.14.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72034534e5b11e8a593f517b2f2f2b273eb68a30978c6a2d40473ad0aaa4cb4a", size = 14195343, upload-time = "2025-12-11T21:39:44.866Z" }, - { url = "https://files.pythonhosted.org/packages/f6/53/3bb8d2fa73e4c2f80acc65213ee0830fa0c49c6479313f7a68a00f39e208/ruff-0.14.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:712ff04f44663f1b90a1195f51525836e3413c8a773574a7b7775554269c30ed", size = 14346425, upload-time = "2025-12-11T21:39:05.927Z" }, - { url = "https://files.pythonhosted.org/packages/ad/04/bdb1d0ab876372da3e983896481760867fc84f969c5c09d428e8f01b557f/ruff-0.14.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a111fee1db6f1d5d5810245295527cda1d367c5aa8f42e0fca9a78ede9b4498b", size = 13258768, upload-time = "2025-12-11T21:39:08.691Z" }, - { url = "https://files.pythonhosted.org/packages/40/d9/8bf8e1e41a311afd2abc8ad12be1b6c6c8b925506d9069b67bb5e9a04af3/ruff-0.14.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8769efc71558fecc25eb295ddec7d1030d41a51e9dcf127cbd63ec517f22d567", size = 13326939, upload-time = "2025-12-11T21:39:53.842Z" }, - { url = "https://files.pythonhosted.org/packages/f4/56/a213fa9edb6dd849f1cfbc236206ead10913693c72a67fb7ddc1833bf95d/ruff-0.14.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:347e3bf16197e8a2de17940cd75fd6491e25c0aa7edf7d61aa03f146a1aa885a", size = 13578888, upload-time = "2025-12-11T21:39:35.988Z" }, - { url = "https://files.pythonhosted.org/packages/33/09/6a4a67ffa4abae6bf44c972a4521337ffce9cbc7808faadede754ef7a79c/ruff-0.14.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7715d14e5bccf5b660f54516558aa94781d3eb0838f8e706fb60e3ff6eff03a8", size = 14314473, upload-time = "2025-12-11T21:39:50.78Z" }, - { url = "https://files.pythonhosted.org/packages/12/0d/15cc82da5d83f27a3c6b04f3a232d61bc8c50d38a6cd8da79228e5f8b8d6/ruff-0.14.9-py3-none-win32.whl", hash = "sha256:df0937f30aaabe83da172adaf8937003ff28172f59ca9f17883b4213783df197", size = 13202651, upload-time = "2025-12-11T21:39:26.628Z" }, - { url = "https://files.pythonhosted.org/packages/32/f7/c78b060388eefe0304d9d42e68fab8cffd049128ec466456cef9b8d4f06f/ruff-0.14.9-py3-none-win_amd64.whl", hash = "sha256:c0b53a10e61df15a42ed711ec0bda0c582039cf6c754c49c020084c55b5b0bc2", size = 14702079, upload-time = "2025-12-11T21:39:11.954Z" }, - { url = "https://files.pythonhosted.org/packages/26/09/7a9520315decd2334afa65ed258fed438f070e31f05a2e43dd480a5e5911/ruff-0.14.9-py3-none-win_arm64.whl", hash = "sha256:8e821c366517a074046d92f0e9213ed1c13dbc5b37a7fc20b07f79b64d62cc84", size = 13744730, upload-time = "2025-12-11T21:39:29.659Z" }, +version = "0.14.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, ] [[package]] name = "scipy" -version = "1.16.3" +version = "1.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881, upload-time = "2025-10-28T17:31:47.104Z" }, - { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012, upload-time = "2025-10-28T17:31:53.411Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935, upload-time = "2025-10-28T17:31:57.361Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466, upload-time = "2025-10-28T17:32:01.875Z" }, - { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618, upload-time = "2025-10-28T17:32:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798, upload-time = "2025-10-28T17:32:12.665Z" }, - { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154, upload-time = "2025-10-28T17:32:17.961Z" }, - { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540, upload-time = "2025-10-28T17:32:23.907Z" }, - { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107, upload-time = "2025-10-28T17:32:29.921Z" }, - { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272, upload-time = "2025-10-28T17:32:34.577Z" }, - { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, - { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, - { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, - { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, - { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, - { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, - { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, - { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, - { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, - { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, - { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, - { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, - { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, - { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, - { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, - { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, - { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, - { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, - { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, - { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, - { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, - { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, - { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, - { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, - { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, - { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, - { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, - { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, - { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, - { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, - { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, - { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, - { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, - { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, - { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, - { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, - { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, - { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/4b/c89c131aa87cad2b77a54eb0fb94d633a842420fa7e919dc2f922037c3d8/scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd", size = 31381316, upload-time = "2026-01-10T21:24:33.42Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5f/a6b38f79a07d74989224d5f11b55267714707582908a5f1ae854cf9a9b84/scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558", size = 27966760, upload-time = "2026-01-10T21:24:38.911Z" }, + { url = "https://files.pythonhosted.org/packages/c1/20/095ad24e031ee8ed3c5975954d816b8e7e2abd731e04f8be573de8740885/scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7", size = 20138701, upload-time = "2026-01-10T21:24:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/89/11/4aad2b3858d0337756f3323f8960755704e530b27eb2a94386c970c32cbe/scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6", size = 22480574, upload-time = "2026-01-10T21:24:47.266Z" }, + { url = "https://files.pythonhosted.org/packages/85/bd/f5af70c28c6da2227e510875cadf64879855193a687fb19951f0f44cfd6b/scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042", size = 32862414, upload-time = "2026-01-10T21:24:52.566Z" }, + { url = "https://files.pythonhosted.org/packages/ef/df/df1457c4df3826e908879fe3d76bc5b6e60aae45f4ee42539512438cfd5d/scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4", size = 35112380, upload-time = "2026-01-10T21:24:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/5f/bb/88e2c16bd1dd4de19d80d7c5e238387182993c2fb13b4b8111e3927ad422/scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0", size = 34922676, upload-time = "2026-01-10T21:25:04.287Z" }, + { url = "https://files.pythonhosted.org/packages/02/ba/5120242cc735f71fc002cff0303d536af4405eb265f7c60742851e7ccfe9/scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449", size = 37507599, upload-time = "2026-01-10T21:25:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/52/c8/08629657ac6c0da198487ce8cd3de78e02cfde42b7f34117d56a3fe249dc/scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea", size = 36380284, upload-time = "2026-01-10T21:25:15.632Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4a/465f96d42c6f33ad324a40049dfd63269891db9324aa66c4a1c108c6f994/scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379", size = 24370427, upload-time = "2026-01-10T21:25:20.514Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, + { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, + { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, + { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, + { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b6/8ac583d6da79e7b9e520579f03007cb006f063642afd6b2eeb16b890bf93/scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812", size = 36287211, upload-time = "2026-01-10T21:28:43.122Z" }, + { url = "https://files.pythonhosted.org/packages/55/fb/7db19e0b3e52f882b420417644ec81dd57eeef1bd1705b6f689d8ff93541/scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2", size = 24312646, upload-time = "2026-01-10T21:28:49.893Z" }, + { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, + { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, + { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, + { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, + { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, + { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/f9/cc/2bd59140ed3b2fa2882fb15da0a9cb1b5a6443d67cfd0d98d4cec83a57ec/scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0", size = 36328593, upload-time = "2026-01-10T21:28:28.007Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/c87cc44a0d2c7aaf0f003aef2904c3d097b422a96c7e7c07f5efd9073c1b/scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67", size = 24625083, upload-time = "2026-01-10T21:28:35.188Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, + { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, + { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, + { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, + { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, + { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, + { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, ] [[package]] @@ -2168,39 +2162,80 @@ wheels = [ [[package]] name = "soupsieve" -version = "2.8" +version = "2.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] [[package]] name = "sphinx" -version = "8.2.3" +version = "9.0.4" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] 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-py" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, + { name = "alabaster", marker = "python_full_version < '3.12'" }, + { name = "babel", marker = "python_full_version < '3.12'" }, + { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, + { name = "docutils", marker = "python_full_version < '3.12'" }, + { name = "imagesize", marker = "python_full_version < '3.12'" }, + { name = "jinja2", marker = "python_full_version < '3.12'" }, + { name = "packaging", marker = "python_full_version < '3.12'" }, + { name = "pygments", marker = "python_full_version < '3.12'" }, + { name = "requests", marker = "python_full_version < '3.12'" }, + { name = "roman-numerals", marker = "python_full_version < '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, + +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "alabaster", marker = "python_full_version >= '3.12'" }, + { name = "babel", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "docutils", marker = "python_full_version >= '3.12'" }, + { name = "imagesize", marker = "python_full_version >= '3.12'" }, + { name = "jinja2", marker = "python_full_version >= '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.12'" }, + { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "requests", marker = "python_full_version >= '3.12'" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, +] +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]] @@ -2208,7 +2243,8 @@ name = "sphinx-basic-ng" version = "1.0.0b2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload-time = "2023-07-08T18:40:54.166Z" } wheels = [ @@ -2222,7 +2258,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "jinja2" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ea/90/7cf0e91aadcb5b3ff4796acbaf2c7887a55434df360914af9fc067c753c1/sphinx-jinja-2.0.2.tar.gz", hash = "sha256:c6232b59a894139770be1dc6d0b00a379e4288ce78157904e1f8473dea3e0718", size = 4587, upload-time = "2022-07-05T11:57:49.579Z" } wheels = [ @@ -2306,7 +2343,7 @@ wheels = [ [[package]] name = "typer" -version = "0.20.0" +version = "0.21.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2314,9 +2351,9 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/28/7c85c8032b91dbe79725b6f17d2fffc595dff06a35c7a30a37bef73a1ab4/typer-0.20.0.tar.gz", hash = "sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37", size = 106492, upload-time = "2025-10-20T17:03:49.445Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/bf/8825b5929afd84d0dabd606c67cd57b8388cb3ec385f7ef19c5cc2202069/typer-0.21.1.tar.gz", hash = "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d", size = 110371, upload-time = "2026-01-06T11:21:10.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/64/7713ffe4b5983314e9d436a90d5bd4f63b6054e2aca783a3cfc44cb95bbf/typer-0.20.0-py3-none-any.whl", hash = "sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a", size = 47028, upload-time = "2025-10-20T17:03:47.617Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/d9257dd49ff2ca23ea5f132edf1281a0c4f9de8a762b9ae399b670a59235/typer-0.21.1-py3-none-any.whl", hash = "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", size = 47381, upload-time = "2026-01-06T11:21:09.824Z" }, ] [[package]] @@ -2342,29 +2379,29 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] name = "urllib3" -version = "2.6.2" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" }, + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/6e/62daec357285b927e82263a81f3b4c1790215bc77c42530ce4a69d501a43/wcwidth-0.5.0.tar.gz", hash = "sha256:f89c103c949a693bf563377b2153082bf58e309919dfb7f27b04d862a0089333", size = 246585, upload-time = "2026-01-27T01:31:44.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, ] [[package]] From fc0b038ced203a9a431051574c0cb015909b29dc Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 10:54:29 -0800 Subject: [PATCH 02/31] Add annotations to the contract --- src/aind_behavior_vr_foraging/data_contract/v0_6_0.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py b/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py index aa996792..a6da7fb2 100644 --- a/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py +++ b/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py @@ -344,6 +344,13 @@ def dataset( root_path / "behavior/SoftwareEvents/PatchStateAtReward.json" ), ), + SoftwareEvents( + name="Annotations", + description="An event emitted whenever an annotation is made during the session.", + reader_params=SoftwareEvents.make_params( + root_path / "behavior/Annotations/Annotations.json" + ), + ), ], ), DataStreamCollection( From 2ec20e2d1f51ce90a7c001076c0cba2147be675f Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 11:00:46 -0800 Subject: [PATCH 03/31] Surface annotations in QC --- .../data_qc/data_qc.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/aind_behavior_vr_foraging/data_qc/data_qc.py b/src/aind_behavior_vr_foraging/data_qc/data_qc.py index 8a58d716..f21f9d3f 100644 --- a/src/aind_behavior_vr_foraging/data_qc/data_qc.py +++ b/src/aind_behavior_vr_foraging/data_qc/data_qc.py @@ -28,6 +28,23 @@ def test_end_session_exists(self): else: return self.pass_test(None, "EndSession event exists with data.") + def test_has_annotations(self): + """Check that the session has annotations and surfaces them in the context if they exist.""" + annotations = self.dataset["Behavior"]["Logs"]["Annotations"] + if not annotations.has_data: + return self.pass_test( + None, "No annotations found. This may be expected if no manual annotations were made." + ) + + annotations_made = t.cast(pd.DataFrame, annotations.data) + if annotations_made.empty: + return self.pass_test( + None, "No annotations found. This may be expected if no manual annotations were made." + ) + + data = annotations_made["data"].to_dict() # this will be a series of strings + return self.warn_test(None, "Annotations found", context=data) + class Rendering(qc.Suite): def __init__(self, render_sync_state: contract.csv.Csv, photodiode_events: pd.Series, expected_fps: float): From 2d1adce035065fb59b22aaeea2f5dba5c615d38d Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 11:03:03 -0800 Subject: [PATCH 04/31] Linting --- examples/task_patch_foraging.py | 3 +-- examples/test_single_site_patch.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 283dd389..7198a72e 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -1,9 +1,8 @@ import os import aind_behavior_services.task.distributions as distributions -from aind_behavior_curriculum import Stage, TrainerState - import aind_behavior_vr_foraging.task as vr_task_logic +from aind_behavior_curriculum import Stage, TrainerState def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimum, maximum): diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index 32ef8890..233f3116 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -2,9 +2,8 @@ from typing import Optional import aind_behavior_services.task.distributions as distributions -from aind_behavior_curriculum import Stage, TrainerState - import aind_behavior_vr_foraging.task as vr_task_logic +from aind_behavior_curriculum import Stage, TrainerState from aind_behavior_vr_foraging.task import ( AindVrForagingTaskLogic, AindVrForagingTaskParameters, From 3fde85c2ae8802a50f9a5597933158e15a2d1d4b Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 12:07:29 -0800 Subject: [PATCH 05/31] Update references to aind-behavior-services 0.13 release --- examples/rig.py | 144 +- examples/session.py | 6 +- examples/task_patch_foraging.py | 3 +- examples/test_single_site_patch.py | 5 +- pyproject.toml | 6 +- scripts/aind.py | 2 +- .../aind_behavior_vr_foraging.json | 1247 ++--- .../AindBehaviorVrForaging.Generated.cs | 4428 ++++++----------- .../data_mappers/_session.py | 2 +- src/aind_behavior_vr_foraging/regenerate.py | 8 +- src/main.bonsai | 109 +- src/test_deserialization.bonsai | 26 +- tests/test_bonsai.py | 2 +- uv.lock | 565 ++- 14 files changed, 2373 insertions(+), 4180 deletions(-) diff --git a/examples/rig.py b/examples/rig.py index b55ccf99..33ab84d1 100644 --- a/examples/rig.py +++ b/examples/rig.py @@ -1,41 +1,31 @@ import datetime import os -import aind_behavior_services.rig as rig -from aind_behavior_services.calibration.aind_manipulator import ( +from aind_behavior_services.rig import cameras, visual_stimulation +from aind_behavior_services.rig.aind_manipulator import ( AindManipulatorCalibration, - AindManipulatorCalibrationInput, - AindManipulatorCalibrationOutput, Axis, AxisConfiguration, ManipulatorPosition, ) -from aind_behavior_services.calibration.olfactometer import ( +from aind_behavior_services.rig.harp import ( + HarpBehavior, + HarpLicketySplit, + HarpSniffDetector, + HarpWhiteRabbit, +) +from aind_behavior_services.rig.olfactometer import ( Olfactometer, OlfactometerCalibration, - OlfactometerCalibrationInput, - OlfactometerCalibrationOutput, OlfactometerChannel, OlfactometerChannelConfig, OlfactometerChannelType, ) -from aind_behavior_services.calibration.treadmill import ( +from aind_behavior_services.rig.treadmill import ( Treadmill, TreadmillCalibration, - TreadmillCalibrationInput, - TreadmillCalibrationOutput, -) -from aind_behavior_services.calibration.water_valve import ( - Measurement, - WaterValveCalibration, - WaterValveCalibrationInput, -) -from aind_behavior_services.rig.harp import ( - HarpBehavior, - HarpLicketySplit, - HarpSniffDetector, - HarpWhiteRabbit, ) +from aind_behavior_services.rig.water_valve import Measurement, calibrate_water_valves from aind_behavior_vr_foraging.rig import ( AindManipulatorDevice, @@ -44,85 +34,78 @@ ) manipulator_calibration = AindManipulatorCalibration( - output=AindManipulatorCalibrationOutput(), - input=AindManipulatorCalibrationInput( - full_step_to_mm=(ManipulatorPosition(x=0.010, y1=0.010, y2=0.010, z=0.010)), - axis_configuration=[ - AxisConfiguration(axis=Axis.Y1, min_limit=-0.01, max_limit=25), - AxisConfiguration(axis=Axis.Y2, min_limit=-0.01, max_limit=25), - AxisConfiguration(axis=Axis.X, min_limit=-0.01, max_limit=25), - AxisConfiguration(axis=Axis.Z, min_limit=-0.01, max_limit=25), - ], - homing_order=[Axis.Y1, Axis.Y2, Axis.X, Axis.Z], - initial_position=ManipulatorPosition(y1=0, y2=0, x=0, z=0), - ), + full_step_to_mm=(ManipulatorPosition(x=0.010, y1=0.010, y2=0.010, z=0.010)), + axis_configuration=[ + AxisConfiguration(axis=Axis.Y1, min_limit=-0.01, max_limit=25), + AxisConfiguration(axis=Axis.Y2, min_limit=-0.01, max_limit=25), + AxisConfiguration(axis=Axis.X, min_limit=-0.01, max_limit=25), + AxisConfiguration(axis=Axis.Z, min_limit=-0.01, max_limit=25), + ], + homing_order=[Axis.Y1, Axis.Y2, Axis.X, Axis.Z], + initial_position=ManipulatorPosition(y1=0, y2=0, x=0, z=0), ) olfactometer_calibration = OlfactometerCalibration( - output=OlfactometerCalibrationOutput(), date=datetime.datetime.now(), - input=OlfactometerCalibrationInput( - channel_config={ - OlfactometerChannel.Channel0: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel0, - channel_type=OlfactometerChannelType.ODOR, - flow_rate_capacity=100, - flow_rate=100, - odorant="Amyl Acetate", - odorant_dilution=1.5, - ), - OlfactometerChannel.Channel1: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel1, - channel_type=OlfactometerChannelType.ODOR, - flow_rate_capacity=100, - flow_rate=100, - odorant="Banana", - odorant_dilution=1.5, - ), - OlfactometerChannel.Channel2: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel2, - channel_type=OlfactometerChannelType.ODOR, - flow_rate_capacity=100, - flow_rate=100, - odorant="Apple", - odorant_dilution=1.5, - ), - OlfactometerChannel.Channel3: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel3, - channel_type=OlfactometerChannelType.CARRIER, - flow_rate_capacity=1000, - ), - } - ), + channel_config={ + OlfactometerChannel.Channel0: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel0, + channel_type=OlfactometerChannelType.ODOR, + flow_rate_capacity=100, + flow_rate=100, + odorant="Amyl Acetate", + odorant_dilution=1.5, + ), + OlfactometerChannel.Channel1: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel1, + channel_type=OlfactometerChannelType.ODOR, + flow_rate_capacity=100, + flow_rate=100, + odorant="Banana", + odorant_dilution=1.5, + ), + OlfactometerChannel.Channel2: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel2, + channel_type=OlfactometerChannelType.ODOR, + flow_rate_capacity=100, + flow_rate=100, + odorant="Apple", + odorant_dilution=1.5, + ), + OlfactometerChannel.Channel3: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel3, + channel_type=OlfactometerChannelType.CARRIER, + flow_rate_capacity=1000, + ), + }, ) -water_valve_input = WaterValveCalibrationInput( +water_valve_calibration = calibrate_water_valves( measurements=[ Measurement(valve_open_interval=0.2, valve_open_time=0.01, water_weight=[0.6, 0.6], repeat_count=200), Measurement(valve_open_interval=0.2, valve_open_time=0.02, water_weight=[1.2, 1.2], repeat_count=200), ] ) -water_valve_calibration = WaterValveCalibration( - input=water_valve_input, output=water_valve_input.calibrate_output(), date=datetime.datetime.now() -) -video_writer = rig.cameras.VideoWriterFfmpeg(frame_rate=120, container_extension="mp4") +video_writer = cameras.VideoWriterFfmpeg(frame_rate=120, container_extension="mp4") rig = AindVrForagingRig( + data_directory=r"C:/data", + computer_name="TestRigComputer", rig_name="test_rig", - triggered_camera_controller=rig.cameras.CameraController[rig.cameras.SpinnakerCamera]( + triggered_camera_controller=cameras.CameraController[cameras.SpinnakerCamera]( frame_rate=120, cameras={ - "FaceCamera": rig.cameras.SpinnakerCamera( + "FaceCamera": cameras.SpinnakerCamera( serial_number="SerialNumber", binning=1, exposure=5000, gain=0, video_writer=video_writer ), - "SideCamera": rig.cameras.SpinnakerCamera( + "SideCamera": cameras.SpinnakerCamera( serial_number="SerialNumber", binning=1, exposure=5000, gain=0, video_writer=video_writer ), }, ), - monitoring_camera_controller=rig.cameras.CameraController[rig.cameras.WebCamera]( - cameras={"WebCam0": rig.cameras.WebCamera(index=0)} + monitoring_camera_controller=cameras.CameraController[cameras.WebCamera]( + cameras={"WebCam0": cameras.WebCamera(index=0)} ), harp_behavior=HarpBehavior(port_name="COM3"), harp_olfactometer=Olfactometer(port_name="COM4", calibration=olfactometer_calibration), @@ -133,14 +116,11 @@ harp_treadmill=Treadmill( port_name="COM8", calibration=TreadmillCalibration( - input=TreadmillCalibrationInput(), - output=TreadmillCalibrationOutput( - wheel_diameter=15, pulses_per_revolution=28800, brake_lookup_calibration=[[0, 0], [1, 65535]] - ), + wheel_diameter=15, pulses_per_revolution=28800, brake_lookup_calibration=[[0, 0], [1, 65535]] ), ), manipulator=AindManipulatorDevice(port_name="COM9", calibration=manipulator_calibration), - screen=rig.visual_stimulation.Screen(display_index=1), + screen=visual_stimulation.ScreenAssembly(display_index=1), calibration=RigCalibration(water_valve=water_valve_calibration), ) diff --git a/examples/session.py b/examples/session.py index 3fed0bf1..d8e9c512 100644 --- a/examples/session.py +++ b/examples/session.py @@ -1,15 +1,13 @@ import datetime import os -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.session import Session -session = AindBehaviorSessionModel( +session = Session( date=datetime.datetime.now(tz=datetime.timezone.utc), experiment="AindVrForaging", - root_path="c://", subject="test", notes="test session", - experiment_version="0.1.0", allow_dirty_repo=True, skip_hardware_validation=False, experimenter=["Foo", "Bar"], diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 7198a72e..25d0c0d9 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -1,9 +1,10 @@ import os import aind_behavior_services.task.distributions as distributions -import aind_behavior_vr_foraging.task as vr_task_logic from aind_behavior_curriculum import Stage, TrainerState +import aind_behavior_vr_foraging.task_logic as vr_task_logic + def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimum, maximum): return vr_task_logic.NumericalUpdaterParameters( diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index 233f3116..ce424ccd 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -2,9 +2,10 @@ from typing import Optional import aind_behavior_services.task.distributions as distributions -import aind_behavior_vr_foraging.task as vr_task_logic from aind_behavior_curriculum import Stage, TrainerState -from aind_behavior_vr_foraging.task import ( + +import aind_behavior_vr_foraging.task_logic as vr_task_logic +from aind_behavior_vr_foraging.task_logic import ( AindVrForagingTaskLogic, AindVrForagingTaskParameters, ) diff --git a/pyproject.toml b/pyproject.toml index 91c216ad..92755008 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,11 +12,11 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Operating System :: Microsoft :: Windows", ] -version = "0.6.5" +version = "0.7.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services@git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@refactor-class-names", + "aind_behavior_services>=0.13", "pydantic-settings" ] @@ -31,7 +31,7 @@ Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/rel data = ["contraqctor>=0.5.3, <0.6.0"] launcher = [ - "aind-clabe[aind-services]@git+https://github.com/AllenNeuralDynamics/clabe@refactor-against-aind-behavior-services-breaking", + "aind-clabe[aind-services]>=0.9", "aind-data-schema>=2.4", "aind_behavior_vr_foraging[data]", ] diff --git a/scripts/aind.py b/scripts/aind.py index 43f8ab31..4315aba1 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -5,7 +5,6 @@ from aind_behavior_services.rig.aind_manipulator import ManipulatorPosition from aind_behavior_services.session import Session from aind_behavior_services.utils import utcnow -from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from clabe import resource_monitor from clabe.apps import ( AindBehaviorServicesBonsaiApp, @@ -23,6 +22,7 @@ from aind_behavior_vr_foraging import data_contract from aind_behavior_vr_foraging.data_mappers import DataMapperCli from aind_behavior_vr_foraging.rig import AindVrForagingRig +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic logger = logging.getLogger(__name__) diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index 6c214c71..365cb979 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -1,193 +1,14 @@ { "$defs": { - "AindBehaviorSessionModel": { - "properties": { - "aind_behavior_services_pkg_version": { - "default": "0.12.5", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", - "title": "aind_behavior_services package version", - "type": "string" - }, - "version": { - "const": "0.12.5", - "default": "0.12.5", - "title": "Version", - "type": "string" - }, - "experiment": { - "default": null, - "description": "Name of the experiment", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Experiment" - }, - "experimenter": { - "default": [], - "description": "Name of the experimenter", - "items": { - "type": "string" - }, - "title": "Experimenter", - "type": "array" - }, - "date": { - "description": "Date of the experiment", - "format": "date-time", - "title": "Date", - "type": "string" - }, - "root_path": { - "description": "Root path where data will be logged", - "title": "Root Path", - "type": "string" - }, - "session_name": { - "default": null, - "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Session Name" - }, - "subject": { - "description": "Name of the subject", - "title": "Subject", - "type": "string" - }, - "experiment_version": { - "default": "", - "deprecated": true, - "description": "Version of the experiment", - "title": "Experiment Version", - "type": "string" - }, - "notes": { - "default": null, - "description": "Notes about the experiment", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - }, - "commit_hash": { - "default": null, - "description": "Commit hash of the repository", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Commit Hash" - }, - "allow_dirty_repo": { - "default": false, - "description": "Allow running from a dirty repository", - "title": "Allow Dirty Repo", - "type": "boolean" - }, - "skip_hardware_validation": { - "default": false, - "description": "Skip hardware validation", - "title": "Skip Hardware Validation", - "type": "boolean" - } - }, - "required": [ - "root_path", - "subject" - ], - "title": "AindBehaviorSessionModel", - "type": "object" - }, - "AindManipulatorAdditionalSettings": { - "description": "Additional settings for the manipulator device", - "properties": { - "spout_axis": { - "$ref": "#/$defs/Axis", - "default": 2, - "description": "Spout axis" - } - }, - "title": "AindManipulatorAdditionalSettings", - "type": "object" - }, "AindManipulatorCalibration": { - "description": "Aind manipulator calibration class", + "description": "AindManipulator calibration class", "properties": { - "device_name": { - "default": "AindManipulator", - "description": "Must match a device name in rig/instrument", - "title": "Device name", - "type": "string" - }, - "input": { - "$ref": "#/$defs/AindManipulatorCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/AindManipulatorCalibrationOutput", - "title": "Output of the calibration." - }, - "date": { - "default": null, - "oneOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date" - }, "description": { - "const": "Calibration of the load cells system", - "default": "Calibration of the load cells system", + "const": "AindManipulator calibration and settings", + "default": "AindManipulator calibration and settings", "title": "Description", "type": "string" }, - "notes": { - "default": null, - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - } - }, - "required": [ - "input", - "output" - ], - "title": "AindManipulatorCalibration", - "type": "object" - }, - "AindManipulatorCalibrationInput": { - "properties": { "full_step_to_mm": { "$ref": "#/$defs/ManipulatorPosition", "default": { @@ -270,16 +91,11 @@ } } }, - "title": "AindManipulatorCalibrationInput", - "type": "object" - }, - "AindManipulatorCalibrationOutput": { - "properties": {}, - "title": "AindManipulatorCalibrationOutput", + "title": "AindManipulatorCalibration", "type": "object" }, "AindManipulatorDevice": { - "description": "Overrides the default settings for the manipulator device by spec'ing additional_settings field", + "description": "Appends a task specific configuration to the base manipulator model.", "properties": { "device_type": { "const": "StepperDriver", @@ -287,37 +103,72 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "$ref": "#/$defs/AindManipulatorAdditionalSettings", - "default": { - "spout_axis": 2 - }, - "description": "Additional settings" - }, "calibration": { - "default": null, - "oneOf": [ - { - "$ref": "#/$defs/AindManipulatorCalibration" - }, - { - "type": "null" + "$ref": "#/$defs/AindManipulatorCalibration", + "default": { + "description": "AindManipulator calibration and settings", + "full_step_to_mm": { + "x": 0.01, + "y1": 0.01, + "y2": 0.01, + "z": 0.01 + }, + "axis_configuration": [ + { + "axis": 2, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + }, + { + "axis": 3, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + }, + { + "axis": 1, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + }, + { + "axis": 4, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + } + ], + "homing_order": [ + 2, + 3, + 1, + 4 + ], + "initial_position": { + "x": 0.0, + "y1": 0.0, + "y2": 0.0, + "z": 0.0 } - ], - "title": "Calibration of the manipulator" + }, + "description": "Calibration for the device." }, "who_am_i": { "const": 1130, @@ -342,6 +193,11 @@ "description": "Device port name", "title": "Port Name", "type": "string" + }, + "spout_axis": { + "$ref": "#/$defs/Axis", + "default": 2, + "description": "Spout axis" } }, "required": [ @@ -353,14 +209,14 @@ "AindVrForagingRig": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.12.5", + "default": "0.13.0", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" }, "version": { - "const": "0.6.5", - "default": "0.6.5", + "const": "0.7.0-rc0", + "default": "0.7.0-rc0", "title": "Version", "type": "string" }, @@ -374,6 +230,12 @@ "title": "Rig Name", "type": "string" }, + "data_directory": { + "description": "Directory where data will be saved to", + "format": "path", + "title": "Data Directory", + "type": "string" + }, "triggered_camera_controller": { "$ref": "#/$defs/CameraController_SpinnakerCamera_", "description": "Required camera controller to triggered cameras." @@ -451,11 +313,9 @@ "description": "Manipulator" }, "screen": { - "$ref": "#/$defs/Screen", + "$ref": "#/$defs/ScreenAssembly", "default": { - "device_type": "Screen", - "device_name": "Screen", - "additional_settings": null, + "device_type": "ScreenAssembly", "calibration": { "center": { "extrinsics": { @@ -533,7 +393,9 @@ } }, "required": [ + "computer_name", "rig_name", + "data_directory", "triggered_camera_controller", "harp_behavior", "harp_olfactometer", @@ -568,8 +430,8 @@ "description": "Parameters of the task logic" }, "version": { - "const": "0.6.5", - "default": "0.6.5", + "const": "0.7.0-rc0", + "default": "0.7.0-rc0", "title": "Version", "type": "string" }, @@ -611,7 +473,7 @@ "title": "Rng Seed" }, "aind_behavior_services_pkg_version": { - "default": "0.12.5", + "default": "0.13.0", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -1082,34 +944,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1156,34 +993,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1364,10 +1176,30 @@ "type": "array" }, "rho": { - "description": "The underlying value goverining the stochastic process", + "description": "The underlying value governing the stochastic process", "title": "Rho", "type": "number" }, + "dt": { + "const": 0.1, + "default": 0.1, + "description": "Sampling time step (s)", + "title": "Dt", + "type": "number" + }, + "rate": { + "default": null, + "description": "Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only", + "oneOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Rate" + }, "minimum": { "default": 1, "description": "Maximum value after update", @@ -1389,6 +1221,7 @@ "type": "object" }, "DisplayCalibration": { + "description": "Represents the calibration parameters of a display.", "properties": { "intrinsics": { "$ref": "#/$defs/DisplayIntrinsics", @@ -1421,9 +1254,10 @@ "type": "object" }, "DisplayExtrinsics": { + "description": "Represents the extrinsic parameters of a display.", "properties": { "rotation": { - "$ref": "#/$defs/aind_behavior_services__rig__visual_stimulation__Vector3", + "$ref": "#/$defs/aind_behavior_services__common__Vector3", "default": { "x": 0.0, "y": 0.0, @@ -1432,7 +1266,7 @@ "description": "Rotation vector (radians)" }, "translation": { - "$ref": "#/$defs/aind_behavior_services__rig__visual_stimulation__Vector3", + "$ref": "#/$defs/aind_behavior_services__common__Vector3", "default": { "x": 0.0, "y": 1.309016, @@ -1445,6 +1279,7 @@ "type": "object" }, "DisplayIntrinsics": { + "description": "Represents the intrinsic parameters of a display.", "properties": { "frame_width": { "default": 1920, @@ -1478,84 +1313,6 @@ "title": "DisplayIntrinsics", "type": "object" }, - "DisplaysCalibration": { - "properties": { - "left": { - "$ref": "#/$defs/DisplayCalibration", - "default": { - "intrinsics": { - "display_height": 15.0, - "display_width": 20.0, - "frame_height": 1080, - "frame_width": 1920 - }, - "extrinsics": { - "rotation": { - "x": 0.0, - "y": 1.0472, - "z": 0.0 - }, - "translation": { - "x": -16.6917756, - "y": 1.309016, - "z": -3.575264 - } - } - }, - "description": "Left display calibration" - }, - "center": { - "$ref": "#/$defs/DisplayCalibration", - "default": { - "intrinsics": { - "display_height": 15.0, - "display_width": 20.0, - "frame_height": 1080, - "frame_width": 1920 - }, - "extrinsics": { - "rotation": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "translation": { - "x": 0.0, - "y": 1.309016, - "z": -13.27 - } - } - }, - "description": "Center display calibration" - }, - "right": { - "$ref": "#/$defs/DisplayCalibration", - "default": { - "intrinsics": { - "display_height": 15.0, - "display_width": 20.0, - "frame_height": 1080, - "frame_width": 1920 - }, - "extrinsics": { - "rotation": { - "x": 0.0, - "y": -1.0472, - "z": 0.0 - }, - "translation": { - "x": 16.6917756, - "y": 1.309016, - "z": -3.575264 - } - } - }, - "description": "Right display calibration" - } - }, - "title": "DisplaysCalibration", - "type": "object" - }, "Distribution": { "description": "Available distributions", "discriminator": { @@ -1803,34 +1560,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1879,34 +1611,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1955,34 +1662,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2031,34 +1713,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2107,34 +1764,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2183,34 +1815,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2367,6 +1974,7 @@ "type": "object" }, "ManipulatorPosition": { + "description": "Represents a position in the manipulator coordinate system", "properties": { "x": { "title": "X coordinate", @@ -2436,6 +2044,7 @@ "type": "object" }, "MicrostepResolution": { + "description": "Microstep resolution available", "enum": [ 0, 1, @@ -2452,6 +2061,7 @@ ] }, "MotorOperationMode": { + "description": "Motor operation mode", "enum": [ 0, 1 @@ -2710,6 +2320,7 @@ "type": "object" }, "Olfactometer": { + "description": "A calibrated olfactometer device", "properties": { "device_type": { "const": "Olfactometer", @@ -2717,41 +2328,12 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { - "default": null, - "oneOf": [ - { - "$ref": "#/$defs/OlfactometerCalibration" - }, - { - "type": "null" - } - ], + "$ref": "#/$defs/OlfactometerCalibration", + "default": { + "date": "2026-02-14T19:48:12.752548Z", + "channel_config": {} + }, "title": "Calibration of the olfactometer" }, "who_am_i": { @@ -2786,63 +2368,14 @@ "type": "object" }, "OlfactometerCalibration": { - "description": "Olfactometer calibration class", + "description": "Olfactometer device configuration model", "properties": { - "device_name": { - "default": "Olfactometer", - "description": "Name of the device being calibrated", - "title": "Device name", - "type": "string" - }, - "input": { - "$ref": "#/$defs/OlfactometerCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/OlfactometerCalibrationOutput", - "title": "Output of the calibration" - }, "date": { - "default": null, - "oneOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date" - }, - "description": { - "const": "Calibration of the harp olfactometer device", - "default": "Calibration of the harp olfactometer device", - "title": "Description", + "description": "Date of the calibration", + "format": "date-time", + "title": "Date", "type": "string" }, - "notes": { - "default": null, - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - } - }, - "required": [ - "input", - "output" - ], - "title": "OlfactometerCalibration", - "type": "object" - }, - "OlfactometerCalibrationInput": { - "properties": { "channel_config": { "additionalProperties": { "$ref": "#/$defs/OlfactometerChannelConfig" @@ -2856,12 +2389,7 @@ "type": "object" } }, - "title": "OlfactometerCalibrationInput", - "type": "object" - }, - "OlfactometerCalibrationOutput": { - "properties": {}, - "title": "OlfactometerCalibrationOutput", + "title": "OlfactometerCalibration", "type": "object" }, "OlfactometerChannel": { @@ -2882,15 +2410,16 @@ ] }, "OlfactometerChannelConfig": { + "description": "Configuration for a single olfactometer channel", "properties": { "channel_index": { - "title": "Channel index", + "title": "Odor channel index", "type": "integer" }, "channel_type": { "$ref": "#/$defs/OlfactometerChannelType", "default": "Odor", - "title": "Channel type" + "title": "Olfactometer channel type" }, "flow_rate_capacity": { "default": 100, @@ -2939,7 +2468,7 @@ "type": "object" }, "OlfactometerChannelType": { - "description": "Channel type", + "description": "Olfactometer channel type", "enum": [ "Odor", "Carrier" @@ -3895,6 +3424,7 @@ "type": "object" }, "Rect": { + "description": "Represents a rectangle defined by its top-left corner, width, and height.", "properties": { "x": { "default": 0, @@ -4056,7 +3586,7 @@ "type": "object" }, "RigCalibration": { - "description": "Container class for calibration models. In a future release these will be moved to the respective devices", + "description": "Container class for calibration models.", "properties": { "water_valve": { "$ref": "#/$defs/WaterValveCalibration", @@ -4140,42 +3670,17 @@ "title": "ScalingParameters", "type": "object" }, - "Screen": { + "ScreenAssembly": { + "description": "Represents a screen assembly (left, center and right screens) and respective configuration.", "properties": { "device_type": { - "const": "Screen", - "default": "Screen", - "description": "Device type", + "const": "ScreenAssembly", + "default": "ScreenAssembly", "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { - "$ref": "#/$defs/DisplaysCalibration", + "$ref": "#/$defs/ScreenAssemblyCalibration", "default": { "left": { "extrinsics": { @@ -4238,7 +3743,7 @@ } } }, - "description": "Screen calibration" + "description": "Screen assembly calibration" }, "display_index": { "default": 1, @@ -4281,7 +3786,191 @@ "type": "number" } }, - "title": "Screen", + "title": "ScreenAssembly", + "type": "object" + }, + "ScreenAssemblyCalibration": { + "description": "Represents the calibration parameters for a screen assembly with three displays.", + "properties": { + "left": { + "$ref": "#/$defs/DisplayCalibration", + "default": { + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + }, + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 1.0472, + "z": 0.0 + }, + "translation": { + "x": -16.6917756, + "y": 1.309016, + "z": -3.575264 + } + } + }, + "description": "Left display calibration" + }, + "center": { + "$ref": "#/$defs/DisplayCalibration", + "default": { + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + }, + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "translation": { + "x": 0.0, + "y": 1.309016, + "z": -13.27 + } + } + }, + "description": "Center display calibration" + }, + "right": { + "$ref": "#/$defs/DisplayCalibration", + "default": { + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + }, + "extrinsics": { + "rotation": { + "x": 0.0, + "y": -1.0472, + "z": 0.0 + }, + "translation": { + "x": 16.6917756, + "y": 1.309016, + "z": -3.575264 + } + } + }, + "description": "Right display calibration" + } + }, + "title": "ScreenAssemblyCalibration", + "type": "object" + }, + "Session": { + "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.13.0", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, + "version": { + "const": "0.13.0", + "default": "0.13.0", + "title": "Version", + "type": "string" + }, + "experiment": { + "default": null, + "description": "Name of the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Experiment" + }, + "experimenter": { + "default": [], + "description": "Name of the experimenter", + "items": { + "type": "string" + }, + "title": "Experimenter", + "type": "array" + }, + "date": { + "description": "Date of the experiment", + "format": "date-time", + "title": "Date", + "type": "string" + }, + "session_name": { + "default": null, + "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Name" + }, + "subject": { + "description": "Name of the subject", + "title": "Subject", + "type": "string" + }, + "notes": { + "default": null, + "description": "Notes about the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Notes" + }, + "commit_hash": { + "default": null, + "description": "Commit hash of the repository", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Hash" + }, + "allow_dirty_repo": { + "default": false, + "description": "Allow running from a dirty repository", + "title": "Allow Dirty Repo", + "type": "boolean" + }, + "skip_hardware_validation": { + "default": false, + "description": "Skip hardware validation", + "title": "Skip Hardware Validation", + "type": "boolean" + } + }, + "required": [ + "subject" + ], + "title": "Session", "type": "object" }, "SetValueFunction": { @@ -4324,42 +4013,17 @@ "type": "object" }, "SpinnakerCamera": { + "description": "Spinnaker camera device configuration.", "properties": { "device_type": { "const": "SpinnakerCamera", "default": "SpinnakerCamera", - "description": "Device type", "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -4473,6 +4137,7 @@ "type": "object" }, "SpinnakerCameraAdcBitDepth": { + "description": "ADC bit depth options for Spinnaker cameras.", "enum": [ 0, 1, @@ -4487,6 +4152,7 @@ ] }, "SpinnakerCameraPixelFormat": { + "description": "Pixel format options for Spinnaker cameras.", "enum": [ 0, 1, @@ -4804,6 +4470,7 @@ "type": "object" }, "Treadmill": { + "description": "A calibrated treadmill device", "properties": { "device_type": { "const": "Treadmill", @@ -4811,41 +4478,24 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { - "default": null, - "oneOf": [ - { - "$ref": "#/$defs/TreadmillCalibration" - }, - { - "type": "null" - } - ], + "$ref": "#/$defs/TreadmillCalibration", + "default": { + "date": "2026-02-14T19:48:12.755298Z", + "wheel_diameter": 15.0, + "pulses_per_revolution": 28800, + "invert_direction": false, + "brake_lookup_calibration": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 65535.0 + ] + ] + }, "title": "Calibration of the treadmill" }, "who_am_i": { @@ -4882,66 +4532,12 @@ "TreadmillCalibration": { "description": "Treadmill calibration class", "properties": { - "device_name": { - "default": "Treadmill", - "description": "Must match a device name in rig/instrument", - "title": "Device name", - "type": "string" - }, - "input": { - "$ref": "#/$defs/TreadmillCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/TreadmillCalibrationOutput", - "title": "Output of the calibration." - }, "date": { - "default": null, - "oneOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date" - }, - "description": { - "const": "Calibration of the treadmill system", - "default": "Calibration of the treadmill system", - "title": "Description", + "description": "Date of the calibration", + "format": "date-time", + "title": "Date", "type": "string" }, - "notes": { - "default": null, - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - } - }, - "required": [ - "input", - "output" - ], - "title": "TreadmillCalibration", - "type": "object" - }, - "TreadmillCalibrationInput": { - "properties": {}, - "title": "TreadmillCalibrationInput", - "type": "object" - }, - "TreadmillCalibrationOutput": { - "properties": { "wheel_diameter": { "default": 15, "description": "Wheel diameter", @@ -4963,6 +4559,16 @@ "type": "boolean" }, "brake_lookup_calibration": { + "default": [ + [ + 0, + 0 + ], + [ + 1, + 65535 + ] + ], "description": "Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16])", "items": { "items": { @@ -4977,10 +4583,7 @@ "type": "array" } }, - "required": [ - "brake_lookup_calibration" - ], - "title": "TreadmillCalibrationOutput", + "title": "TreadmillCalibration", "type": "object" }, "TreadmillSpecification": { @@ -5130,6 +4733,7 @@ ] }, "VideoWriterFfmpeg": { + "description": "FFMPEG video writer configuration.", "properties": { "video_writer_type": { "const": "FFMPEG", @@ -5167,6 +4771,7 @@ "type": "object" }, "VideoWriterOpenCv": { + "description": "OpenCV video writer configuration.", "properties": { "video_writer_type": { "const": "OPENCV", @@ -5428,63 +5033,14 @@ "type": "object" }, "WaterValveCalibration": { - "description": "Water valve calibration class", + "description": "Represents a water valve calibration.", "properties": { - "device_name": { - "default": "WaterValve", - "description": "Name of the device being calibrated", - "title": "Device name", - "type": "string" - }, - "input": { - "$ref": "#/$defs/WaterValveCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/WaterValveCalibrationOutput", - "title": "Output of the calibration." - }, "date": { - "default": null, - "oneOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date" - }, - "description": { - "const": "Calibration of the water valve delivery system", - "default": "Calibration of the water valve delivery system", - "title": "Description", + "description": "Date of the calibration", + "format": "date-time", + "title": "Date", "type": "string" }, - "notes": { - "default": null, - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - } - }, - "required": [ - "input", - "output" - ], - "title": "WaterValveCalibration", - "type": "object" - }, - "WaterValveCalibrationInput": { - "properties": { "measurements": { "default": [], "description": "List of measurements", @@ -5493,14 +5049,7 @@ }, "title": "Measurements", "type": "array" - } - }, - "title": "WaterValveCalibrationInput", - "type": "object" - }, - "WaterValveCalibrationOutput": { - "description": "Output for water valve calibration class", - "properties": { + }, "interval_average": { "default": null, "description": "Dictionary keyed by measured valve interval and corresponding average single event volume.", @@ -5566,46 +5115,21 @@ "slope", "offset" ], - "title": "WaterValveCalibrationOutput", + "title": "WaterValveCalibration", "type": "object" }, "WebCamera": { + "description": "Web camera device configuration.", "properties": { "device_type": { "const": "WebCamera", "default": "WebCamera", - "description": "Device type", "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -5638,23 +5162,24 @@ "title": "WebCamera", "type": "object" }, - "aind_behavior_services__rig__visual_stimulation__Vector3": { + "aind_behavior_services__common__Vector3": { + "description": "Represents a 3D vector with float coordinates.", "properties": { "x": { "default": 0, - "description": "X coordinate of the point", + "description": "X coordinate of the vector", "title": "X", "type": "number" }, "y": { "default": 0, - "description": "Y coordinate of the point", + "description": "Y coordinate of the vector", "title": "Y", "type": "number" }, "z": { "default": 0, - "description": "Z coordinate of the point", + "description": "Z coordinate of the vector", "title": "Z", "type": "number" } diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 924972de..ab075c46 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -9,873 +9,285 @@ namespace AindVrForagingDataSchema { #pragma warning disable // Disable all warnings + /// + /// AindManipulator calibration class + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("AindManipulator calibration class")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorSessionModel + public partial class AindManipulatorCalibration { - private string _aindBehaviorServicesPkgVersion; - - private string _version; - - private string _experiment; - - private System.Collections.Generic.List _experimenter; - - private System.DateTimeOffset _date; - - private string _rootPath; - - private string _sessionName; - - private string _subject; - - private string _experimentVersion; + private string _description; - private string _notes; + private ManipulatorPosition _fullStepToMm; - private string _commitHash; + private System.Collections.Generic.List _axisConfiguration; - private bool _allowDirtyRepo; + private System.Collections.Generic.List _homingOrder; - private bool _skipHardwareValidation; + private ManipulatorPosition _initialPosition; - public AindBehaviorSessionModel() + public AindManipulatorCalibration() { - _aindBehaviorServicesPkgVersion = "0.12.5"; - _version = "0.12.5"; - _experimenter = new System.Collections.Generic.List(); - _experimentVersion = ""; - _allowDirtyRepo = false; - _skipHardwareValidation = false; + _description = "AindManipulator calibration and settings"; + _fullStepToMm = new ManipulatorPosition(); + _axisConfiguration = new System.Collections.Generic.List(); + _homingOrder = new System.Collections.Generic.List(); + _initialPosition = new ManipulatorPosition(); } - protected AindBehaviorSessionModel(AindBehaviorSessionModel other) + protected AindManipulatorCalibration(AindManipulatorCalibration other) { - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _experiment = other._experiment; - _experimenter = other._experimenter; - _date = other._date; - _rootPath = other._rootPath; - _sessionName = other._sessionName; - _subject = other._subject; - _experimentVersion = other._experimentVersion; - _notes = other._notes; - _commitHash = other._commitHash; - _allowDirtyRepo = other._allowDirtyRepo; - _skipHardwareValidation = other._skipHardwareValidation; + _description = other._description; + _fullStepToMm = other._fullStepToMm; + _axisConfiguration = other._axisConfiguration; + _homingOrder = other._homingOrder; + _initialPosition = other._initialPosition; } - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion + [Newtonsoft.Json.JsonPropertyAttribute("description")] + public string Description { get { - return _aindBehaviorServicesPkgVersion; + return _description; } set { - _aindBehaviorServicesPkgVersion = value; + _description = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("full_step_to_mm")] + public ManipulatorPosition FullStepToMm { get { - return _version; + return _fullStepToMm; } set { - _version = value; + _fullStepToMm = value; } } - /// - /// Name of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment")] - [System.ComponentModel.DescriptionAttribute("Name of the experiment")] - public string Experiment + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("axis_configuration")] + public System.Collections.Generic.List AxisConfiguration { get { - return _experiment; + return _axisConfiguration; } set { - _experiment = value; + _axisConfiguration = value; } } - /// - /// Name of the experimenter - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] - [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] - public System.Collections.Generic.List Experimenter + [Newtonsoft.Json.JsonPropertyAttribute("homing_order")] + public System.Collections.Generic.List HomingOrder { get { - return _experimenter; + return _homingOrder; } set { - _experimenter = value; + _homingOrder = value; } } - /// - /// Date of the experiment - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the experiment")] - public System.DateTimeOffset Date + [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] + public ManipulatorPosition InitialPosition { get { - return _date; + return _initialPosition; } set { - _date = value; + _initialPosition = value; } } - /// - /// Root path where data will be logged - /// - [Newtonsoft.Json.JsonPropertyAttribute("root_path", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Root path where data will be logged")] - public string RootPath + public System.IObservable Generate() { - get - { - return _rootPath; - } - set + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibration(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibration(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Description = " + _description + ", "); + stringBuilder.Append("FullStepToMm = " + _fullStepToMm + ", "); + stringBuilder.Append("AxisConfiguration = " + _axisConfiguration + ", "); + stringBuilder.Append("HomingOrder = " + _homingOrder + ", "); + stringBuilder.Append("InitialPosition = " + _initialPosition); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _rootPath = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + /// + /// Appends a task specific configuration to the base manipulator model. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Appends a task specific configuration to the base manipulator model.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class AindManipulatorDevice + { - /// - /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. - /// - [Newtonsoft.Json.JsonPropertyAttribute("session_name")] - [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + - "t provided, it will be generated using subject and date.")] - public string SessionName + private string _deviceType; + + private AindManipulatorCalibration _calibration; + + private int _whoAmI; + + private string _serialNumber; + + private string _portName; + + private Axis _spoutAxis; + + public AindManipulatorDevice() + { + _deviceType = "StepperDriver"; + _calibration = new AindManipulatorCalibration(); + _whoAmI = 1130; + _spoutAxis = AindVrForagingDataSchema.Axis.Y1; + } + + protected AindManipulatorDevice(AindManipulatorDevice other) + { + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + _spoutAxis = other._spoutAxis; + } + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _sessionName; + return _deviceType; } set { - _sessionName = value; + _deviceType = value; } } /// - /// Name of the subject + /// Calibration for the device. /// - [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Name of the subject")] - public string Subject + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public AindManipulatorCalibration Calibration { get { - return _subject; + return _calibration; } set { - _subject = value; + _calibration = value; } } - /// - /// Version of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment_version")] - [System.ComponentModel.DescriptionAttribute("Version of the experiment")] - public string ExperimentVersion + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _experimentVersion; + return _whoAmI; } set { - _experimentVersion = value; + _whoAmI = value; } } /// - /// Notes about the experiment + /// Device serial number /// - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] - public string Notes + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _notes; + return _serialNumber; } set { - _notes = value; + _serialNumber = value; } } /// - /// Commit hash of the repository + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] - [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] - public string CommitHash + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _commitHash; + return _portName; } set { - _commitHash = value; + _portName = value; } } /// - /// Allow running from a dirty repository + /// Spout axis /// - [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] - [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] - public bool AllowDirtyRepo + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("spout_axis")] + [System.ComponentModel.DescriptionAttribute("Spout axis")] + public Axis SpoutAxis { get { - return _allowDirtyRepo; + return _spoutAxis; } set { - _allowDirtyRepo = value; + _spoutAxis = value; } } - /// - /// Skip hardware validation - /// - [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] - [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] - public bool SkipHardwareValidation - { - get - { - return _skipHardwareValidation; - } - set - { - _skipHardwareValidation = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorSessionModel(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorSessionModel(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("Version = " + _version + ", "); - stringBuilder.Append("Experiment = " + _experiment + ", "); - stringBuilder.Append("Experimenter = " + _experimenter + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("RootPath = " + _rootPath + ", "); - stringBuilder.Append("SessionName = " + _sessionName + ", "); - stringBuilder.Append("Subject = " + _subject + ", "); - stringBuilder.Append("ExperimentVersion = " + _experimentVersion + ", "); - stringBuilder.Append("Notes = " + _notes + ", "); - stringBuilder.Append("CommitHash = " + _commitHash + ", "); - stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); - stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Additional settings for the manipulator device - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Additional settings for the manipulator device")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorAdditionalSettings - { - - private Axis _spoutAxis; - - public AindManipulatorAdditionalSettings() - { - _spoutAxis = AindVrForagingDataSchema.Axis.Y1; - } - - protected AindManipulatorAdditionalSettings(AindManipulatorAdditionalSettings other) - { - _spoutAxis = other._spoutAxis; - } - - /// - /// Spout axis - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("spout_axis")] - [System.ComponentModel.DescriptionAttribute("Spout axis")] - public Axis SpoutAxis - { - get - { - return _spoutAxis; - } - set - { - _spoutAxis = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorAdditionalSettings(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorAdditionalSettings(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("SpoutAxis = " + _spoutAxis); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Aind manipulator calibration class - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Aind manipulator calibration class")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorCalibration - { - - private string _deviceName; - - private AindManipulatorCalibrationInput _input; - - private AindManipulatorCalibrationOutput _output; - - private System.DateTimeOffset? _date; - - private string _description; - - private string _notes; - - public AindManipulatorCalibration() - { - _deviceName = "AindManipulator"; - _input = new AindManipulatorCalibrationInput(); - _output = new AindManipulatorCalibrationOutput(); - _description = "Calibration of the load cells system"; - } - - protected AindManipulatorCalibration(AindManipulatorCalibration other) - { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; - } - - /// - /// Must match a device name in rig/instrument - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Must match a device name in rig/instrument")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public AindManipulatorCalibrationInput Input - { - get - { - return _input; - } - set - { - _input = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public AindManipulatorCalibrationOutput Output - { - get - { - return _output; - } - set - { - _output = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description - { - get - { - return _description; - } - set - { - _description = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes - { - get - { - return _notes; - } - set - { - _notes = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("Input = " + _input + ", "); - stringBuilder.Append("Output = " + _output + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("Notes = " + _notes); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorCalibrationInput - { - - private ManipulatorPosition _fullStepToMm; - - private System.Collections.Generic.List _axisConfiguration; - - private System.Collections.Generic.List _homingOrder; - - private ManipulatorPosition _initialPosition; - - public AindManipulatorCalibrationInput() - { - _fullStepToMm = new ManipulatorPosition(); - _axisConfiguration = new System.Collections.Generic.List(); - _homingOrder = new System.Collections.Generic.List(); - _initialPosition = new ManipulatorPosition(); - } - - protected AindManipulatorCalibrationInput(AindManipulatorCalibrationInput other) - { - _fullStepToMm = other._fullStepToMm; - _axisConfiguration = other._axisConfiguration; - _homingOrder = other._homingOrder; - _initialPosition = other._initialPosition; - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("full_step_to_mm")] - public ManipulatorPosition FullStepToMm - { - get - { - return _fullStepToMm; - } - set - { - _fullStepToMm = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("axis_configuration")] - public System.Collections.Generic.List AxisConfiguration - { - get - { - return _axisConfiguration; - } - set - { - _axisConfiguration = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("homing_order")] - public System.Collections.Generic.List HomingOrder - { - get - { - return _homingOrder; - } - set - { - _homingOrder = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] - public ManipulatorPosition InitialPosition - { - get - { - return _initialPosition; - } - set - { - _initialPosition = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibrationInput(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibrationInput(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("FullStepToMm = " + _fullStepToMm + ", "); - stringBuilder.Append("AxisConfiguration = " + _axisConfiguration + ", "); - stringBuilder.Append("HomingOrder = " + _homingOrder + ", "); - stringBuilder.Append("InitialPosition = " + _initialPosition); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorCalibrationOutput - { - - public AindManipulatorCalibrationOutput() - { - } - - protected AindManipulatorCalibrationOutput(AindManipulatorCalibrationOutput other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibrationOutput(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibrationOutput(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Overrides the default settings for the manipulator device by spec'ing additional_settings field - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Overrides the default settings for the manipulator device by spec\'ing additional_" + - "settings field")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorDevice - { - - private string _deviceType; - - private string _deviceName; - - private AindManipulatorAdditionalSettings _additionalSettings; - - private AindManipulatorCalibration _calibration; - - private int _whoAmI; - - private string _serialNumber; - - private string _portName; - - public AindManipulatorDevice() - { - _deviceType = "StepperDriver"; - _additionalSettings = new AindManipulatorAdditionalSettings(); - _whoAmI = 1130; - } - - protected AindManipulatorDevice(AindManipulatorDevice other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public AindManipulatorAdditionalSettings AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - public AindManipulatorCalibration Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI - { - get - { - return _whoAmI; - } - set - { - _whoAmI = value; - } - } - - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber - { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } - } - - /// - /// Device port name - /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName - { - get - { - return _portName; - } - set - { - _portName = value; - } - } - - public System.IObservable Generate() + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorDevice(this))); } @@ -888,12 +300,11 @@ public System.IObservable Generate(System.IObser protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("PortName = " + _portName + ", "); + stringBuilder.Append("SpoutAxis = " + _spoutAxis); return true; } @@ -926,6 +337,8 @@ public partial class AindVrForagingRig private string _rigName; + private string _dataDirectory; + private CameraControllerSpinnakerCamera _triggeredCameraController; private CameraControllerWebCamera _monitoringCameraController; @@ -948,14 +361,14 @@ public partial class AindVrForagingRig private AindManipulatorDevice _manipulator; - private Screen _screen; + private ScreenAssembly _screen; private RigCalibration _calibration; public AindVrForagingRig() { - _aindBehaviorServicesPkgVersion = "0.12.5"; - _version = "0.6.5"; + _aindBehaviorServicesPkgVersion = "0.13.0"; + _version = "0.7.0-rc0"; _triggeredCameraController = new CameraControllerSpinnakerCamera(); _harpBehavior = new HarpBehavior(); _harpOlfactometer = new Olfactometer(); @@ -963,7 +376,7 @@ public AindVrForagingRig() _harpClockGenerator = new HarpWhiteRabbit(); _harpTreadmill = new Treadmill(); _manipulator = new AindManipulatorDevice(); - _screen = new Screen(); + _screen = new ScreenAssembly(); _calibration = new RigCalibration(); } @@ -973,6 +386,7 @@ protected AindVrForagingRig(AindVrForagingRig other) _version = other._version; _computerName = other._computerName; _rigName = other._rigName; + _dataDirectory = other._dataDirectory; _triggeredCameraController = other._triggeredCameraController; _monitoringCameraController = other._monitoringCameraController; _harpBehavior = other._harpBehavior; @@ -1017,7 +431,7 @@ public string Version /// /// Computer name /// - [Newtonsoft.Json.JsonPropertyAttribute("computer_name")] + [Newtonsoft.Json.JsonPropertyAttribute("computer_name", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("Computer name")] public string ComputerName { @@ -1048,6 +462,23 @@ public string RigName } } + /// + /// Directory where data will be saved to + /// + [Newtonsoft.Json.JsonPropertyAttribute("data_directory", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Directory where data will be saved to")] + public string DataDirectory + { + get + { + return _dataDirectory; + } + set + { + _dataDirectory = value; + } + } + /// /// Required camera controller to triggered cameras. /// @@ -1252,7 +683,7 @@ public AindManipulatorDevice Manipulator [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("screen")] [System.ComponentModel.DescriptionAttribute("Screen settings")] - public Screen Screen + public ScreenAssembly Screen { get { @@ -1298,6 +729,7 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("Version = " + _version + ", "); stringBuilder.Append("ComputerName = " + _computerName + ", "); stringBuilder.Append("RigName = " + _rigName + ", "); + stringBuilder.Append("DataDirectory = " + _dataDirectory + ", "); stringBuilder.Append("TriggeredCameraController = " + _triggeredCameraController + ", "); stringBuilder.Append("MonitoringCameraController = " + _monitoringCameraController + ", "); stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); @@ -1362,7 +794,7 @@ public AindVrForagingTaskLogic() _name = "AindVrForaging"; _description = ""; _taskParameters = new AindVrForagingTaskParameters(); - _version = "0.6.5"; + _version = "0.7.0-rc0"; } protected AindVrForagingTaskLogic(AindVrForagingTaskLogic other) @@ -1521,7 +953,7 @@ public partial class AindVrForagingTaskParameters public AindVrForagingTaskParameters() { - _aindBehaviorServicesPkgVersion = "0.12.5"; + _aindBehaviorServicesPkgVersion = "0.13.0"; _environment = new BlockStructure(); _operationControl = new OperationControl(); } @@ -3063,10 +2495,6 @@ public partial class CameraControllerSpinnakerCamera private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private System.Collections.Generic.Dictionary _cameras; @@ -3082,8 +2510,6 @@ public CameraControllerSpinnakerCamera() protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _cameras = other._cameras; _frameRate = other._frameRate; @@ -3103,46 +2529,11 @@ public string DeviceType } /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -3204,8 +2595,6 @@ public System.IObservable Generate(Sys protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("Cameras = " + _cameras + ", "); stringBuilder.Append("FrameRate = " + _frameRate); @@ -3235,10 +2624,6 @@ public partial class CameraControllerWebCamera private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private System.Collections.Generic.Dictionary _cameras; @@ -3254,67 +2639,30 @@ public CameraControllerWebCamera() protected CameraControllerWebCamera(CameraControllerWebCamera other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _cameras = other._cameras; - _frameRate = other._frameRate; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } + _frameRate = other._frameRate; } - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _additionalSettings; + return _deviceType; } set { - _additionalSettings = value; + _deviceType = value; } } /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -3376,8 +2724,6 @@ public System.IObservable Generate(System.IO protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("Cameras = " + _cameras + ", "); stringBuilder.Append("FrameRate = " + _frameRate); @@ -3741,6 +3087,10 @@ public partial class CtcmFunction : PatchUpdateFunction private double _rho; + private double _dt; + + private double? _rate; + private double _minimum; private double _maximum; @@ -3748,6 +3098,7 @@ public partial class CtcmFunction : PatchUpdateFunction public CtcmFunction() { _transitionMatrix = new System.Collections.Generic.List>(); + _dt = 0.1D; _minimum = 1D; _maximum = 0D; } @@ -3757,6 +3108,8 @@ protected CtcmFunction(CtcmFunction other) : { _transitionMatrix = other._transitionMatrix; _rho = other._rho; + _dt = other._dt; + _rate = other._rate; _minimum = other._minimum; _maximum = other._maximum; } @@ -3780,10 +3133,10 @@ public System.Collections.Generic.List> } /// - /// The underlying value goverining the stochastic process + /// The underlying value governing the stochastic process /// [Newtonsoft.Json.JsonPropertyAttribute("rho", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The underlying value goverining the stochastic process")] + [System.ComponentModel.DescriptionAttribute("The underlying value governing the stochastic process")] public double Rho { get @@ -3796,6 +3149,42 @@ public double Rho } } + /// + /// Sampling time step (s) + /// + [Newtonsoft.Json.JsonPropertyAttribute("dt")] + [System.ComponentModel.DescriptionAttribute("Sampling time step (s)")] + public double Dt + { + get + { + return _dt; + } + set + { + _dt = value; + } + } + + /// + /// Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("rate")] + [System.ComponentModel.DescriptionAttribute("Rate of the replenishment used to generate the matrix. This value is used for met" + + "adata keep sake only")] + public double? Rate + { + get + { + return _rate; + } + set + { + _rate = value; + } + } + /// /// Maximum value after update /// @@ -3848,6 +3237,8 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); stringBuilder.Append("Rho = " + _rho + ", "); + stringBuilder.Append("Dt = " + _dt + ", "); + stringBuilder.Append("Rate = " + _rate + ", "); stringBuilder.Append("Minimum = " + _minimum + ", "); stringBuilder.Append("Maximum = " + _maximum); return true; @@ -3855,7 +3246,11 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } + /// + /// Represents the calibration parameters of a display. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class DisplayCalibration @@ -3945,20 +3340,24 @@ public override string ToString() } + /// + /// Represents the extrinsic parameters of a display. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the extrinsic parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class DisplayExtrinsics { - private AindBehaviorServicesRigVisualStimulationVector3 _rotation; + private AindBehaviorServicesCommonVector3 _rotation; - private AindBehaviorServicesRigVisualStimulationVector3 _translation; + private AindBehaviorServicesCommonVector3 _translation; public DisplayExtrinsics() { - _rotation = new AindBehaviorServicesRigVisualStimulationVector3(); - _translation = new AindBehaviorServicesRigVisualStimulationVector3(); + _rotation = new AindBehaviorServicesCommonVector3(); + _translation = new AindBehaviorServicesCommonVector3(); } protected DisplayExtrinsics(DisplayExtrinsics other) @@ -3973,7 +3372,7 @@ protected DisplayExtrinsics(DisplayExtrinsics other) [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("rotation")] [System.ComponentModel.DescriptionAttribute("Rotation vector (radians)")] - public AindBehaviorServicesRigVisualStimulationVector3 Rotation + public AindBehaviorServicesCommonVector3 Rotation { get { @@ -3991,7 +3390,7 @@ public AindBehaviorServicesRigVisualStimulationVector3 Rotation [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("translation")] [System.ComponentModel.DescriptionAttribute("Translation (in cm)")] - public AindBehaviorServicesRigVisualStimulationVector3 Translation + public AindBehaviorServicesCommonVector3 Translation { get { @@ -4035,7 +3434,11 @@ public override string ToString() } + /// + /// Represents the intrinsic parameters of a display. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the intrinsic parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class DisplayIntrinsics @@ -4167,119 +3570,6 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplaysCalibration - { - - private DisplayCalibration _left; - - private DisplayCalibration _center; - - private DisplayCalibration _right; - - public DisplaysCalibration() - { - _left = new DisplayCalibration(); - _center = new DisplayCalibration(); - _right = new DisplayCalibration(); - } - - protected DisplaysCalibration(DisplaysCalibration other) - { - _left = other._left; - _center = other._center; - _right = other._right; - } - - /// - /// Left display calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("left")] - [System.ComponentModel.DescriptionAttribute("Left display calibration")] - public DisplayCalibration Left - { - get - { - return _left; - } - set - { - _left = value; - } - } - - /// - /// Center display calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("center")] - [System.ComponentModel.DescriptionAttribute("Center display calibration")] - public DisplayCalibration Center - { - get - { - return _center; - } - set - { - _center = value; - } - } - - /// - /// Right display calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("right")] - [System.ComponentModel.DescriptionAttribute("Right display calibration")] - public DisplayCalibration Right - { - get - { - return _right; - } - set - { - _right = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplaysCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new DisplaysCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Left = " + _left + ", "); - stringBuilder.Append("Center = " + _center + ", "); - stringBuilder.Append("Right = " + _right); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] [JsonInheritanceAttribute("Scalar", typeof(Scalar))] @@ -4894,10 +4184,6 @@ public partial class HarpAnalogInput private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private int _whoAmI; @@ -4915,8 +4201,6 @@ public HarpAnalogInput() protected HarpAnalogInput(HarpAnalogInput other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -4937,46 +4221,11 @@ public string DeviceType } /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -5049,8 +4298,6 @@ public System.IObservable Generate(System.IObservable< protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); @@ -5081,10 +4328,6 @@ public partial class HarpBehavior private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private int _whoAmI; @@ -5102,8 +4345,6 @@ public HarpBehavior() protected HarpBehavior(HarpBehavior other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -5124,46 +4365,11 @@ public string DeviceType } /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -5236,8 +4442,6 @@ public System.IObservable Generate(System.IObservable - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -5423,8 +4586,6 @@ public System.IObservable Generate(System.IObser protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); @@ -5455,10 +4616,6 @@ public partial class HarpLicketySplit private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private int _whoAmI; @@ -5474,70 +4631,33 @@ public HarpLicketySplit() } protected HarpLicketySplit(HarpLicketySplit other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } + { + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _additionalSettings; + return _deviceType; } set { - _additionalSettings = value; + _deviceType = value; } } /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -5610,8 +4730,6 @@ public System.IObservable Generate(System.IObservable protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); @@ -5642,10 +4760,6 @@ public partial class HarpSniffDetector private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private int _whoAmI; @@ -5663,8 +4777,6 @@ public HarpSniffDetector() protected HarpSniffDetector(HarpSniffDetector other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -5685,46 +4797,11 @@ public string DeviceType } /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -5797,8 +4874,6 @@ public System.IObservable Generate(System.IObservabl protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); @@ -5829,10 +4904,6 @@ public partial class HarpWhiteRabbit private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private int _whoAmI; @@ -5853,8 +4924,6 @@ public HarpWhiteRabbit() protected HarpWhiteRabbit(HarpWhiteRabbit other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -5876,46 +4945,11 @@ public string DeviceType } /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -6006,8 +5040,6 @@ public System.IObservable Generate(System.IObservable< protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); @@ -6352,7 +5384,11 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } + /// + /// Represents a position in the manipulator coordinate system + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a position in the manipulator coordinate system")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class ManipulatorPosition @@ -6598,6 +5634,9 @@ public override string ToString() } + /// + /// Microstep resolution available + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum MicrostepResolution { @@ -6616,6 +5655,9 @@ public enum MicrostepResolution } + /// + /// Motor operation mode + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum MotorOperationMode { @@ -7546,7 +6588,11 @@ public override string ToString() } + /// + /// A calibrated olfactometer device + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A calibrated olfactometer device")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class Olfactometer @@ -7554,10 +6600,6 @@ public partial class Olfactometer private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private OlfactometerCalibration _calibration; private int _whoAmI; @@ -7569,14 +6611,13 @@ public partial class Olfactometer public Olfactometer() { _deviceType = "Olfactometer"; + _calibration = new OlfactometerCalibration(); _whoAmI = 1140; } protected Olfactometer(Olfactometer other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -7596,41 +6637,6 @@ public string DeviceType } } - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] public OlfactometerCalibration Calibration @@ -7705,8 +6711,6 @@ public System.IObservable Generate(System.IObservable - /// Olfactometer calibration class + /// Olfactometer device configuration model /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Olfactometer calibration class")] + [System.ComponentModel.DescriptionAttribute("Olfactometer device configuration model")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class OlfactometerCalibration { - private string _deviceName; - - private OlfactometerCalibrationInput _input; - - private OlfactometerCalibrationOutput _output; - - private System.DateTimeOffset? _date; - - private string _description; + private System.DateTimeOffset _date; - private string _notes; + private System.Collections.Generic.Dictionary _channelConfig; public OlfactometerCalibration() { - _deviceName = "Olfactometer"; - _input = new OlfactometerCalibrationInput(); - _output = new OlfactometerCalibrationOutput(); - _description = "Calibration of the harp olfactometer device"; + _channelConfig = new System.Collections.Generic.Dictionary(); } protected OlfactometerCalibration(OlfactometerCalibration other) { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; _date = other._date; - _description = other._description; - _notes = other._notes; + _channelConfig = other._channelConfig; } /// - /// Name of the device being calibrated + /// Date of the calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Name of the device being calibrated")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public OlfactometerCalibrationInput Input - { - get - { - return _input; - } - set - { - _input = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public OlfactometerCalibrationOutput Output - { - get - { - return _output; - } - set - { - _output = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset Date { get { @@ -7828,86 +6776,6 @@ public System.DateTimeOffset? Date } } - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description - { - get - { - return _description; - } - set - { - _description = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes - { - get - { - return _notes; - } - set - { - _notes = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("Input = " + _input + ", "); - stringBuilder.Append("Output = " + _output + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("Notes = " + _notes); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerCalibrationInput - { - - private System.Collections.Generic.Dictionary _channelConfig; - - public OlfactometerCalibrationInput() - { - _channelConfig = new System.Collections.Generic.Dictionary(); - } - - protected OlfactometerCalibrationInput(OlfactometerCalibrationInput other) - { - _channelConfig = other._channelConfig; - } - /// /// Configuration of olfactometer channels /// @@ -7917,73 +6785,30 @@ protected OlfactometerCalibrationInput(OlfactometerCalibrationInput other) public System.Collections.Generic.Dictionary ChannelConfig { get - { - return _channelConfig; - } - set - { - _channelConfig = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationInput(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationInput(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("ChannelConfig = " + _channelConfig); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerCalibrationOutput - { - - public OlfactometerCalibrationOutput() - { - } - - protected OlfactometerCalibrationOutput(OlfactometerCalibrationOutput other) - { + { + return _channelConfig; + } + set + { + _channelConfig = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationOutput(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationOutput(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("ChannelConfig = " + _channelConfig); + return true; } public override string ToString() @@ -8022,7 +6847,11 @@ public enum OlfactometerChannel } + /// + /// Configuration for a single olfactometer channel + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Configuration for a single olfactometer channel")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class OlfactometerChannelConfig @@ -8175,7 +7004,7 @@ public override string ToString() /// - /// Channel type + /// Olfactometer channel type /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] @@ -10357,7 +9186,11 @@ public override string ToString() } + /// + /// Represents a rectangle defined by its top-left corner, width, and height. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a rectangle defined by its top-left corner, width, and height.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class Rect @@ -10539,14 +9372,256 @@ public System.IObservable Generate() return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RenderSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RenderSpecification(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Contrast = " + _contrast); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] + [JsonInheritanceAttribute("PatchRewardFunction", typeof(PatchRewardFunction))] + [JsonInheritanceAttribute("OnThisPatchEntryRewardFunction", typeof(OnThisPatchEntryRewardFunction))] + [JsonInheritanceAttribute("OutsideRewardFunction", typeof(OutsideRewardFunction))] + [JsonInheritanceAttribute("PersistentRewardFunction", typeof(PersistentRewardFunction))] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class RewardFunction + { + + public RewardFunction() + { + } + + protected RewardFunction(RewardFunction other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardFunction(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RewardFunction(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Specifies reward parameters and behavior for a patch. + /// + ///This class defines all aspects of reward delivery including amounts, probabilities, + ///delays, operant logic, and dynamic update functions. It serves as the complete + ///specification for how rewards are managed in a given Patch. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Specifies reward parameters and behavior for a patch. + + This class defines all aspects of reward delivery including amounts, probabilities, + delays, operant logic, and dynamic update functions. It serves as the complete + specification for how rewards are managed in a given Patch.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class RewardSpecification + { + + private OperantLogic _operantLogic; + + private Distribution _delay; + + private Distribution _amount; + + private Distribution _probability; + + private Distribution _available; + + private System.Collections.Generic.List _rewardFunction; + + public RewardSpecification() + { + _delay = new Distribution(); + _amount = new Distribution(); + _probability = new Distribution(); + _available = new Distribution(); + _rewardFunction = new System.Collections.Generic.List(); + } + + protected RewardSpecification(RewardSpecification other) + { + _operantLogic = other._operantLogic; + _delay = other._delay; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rewardFunction = other._rewardFunction; + } + + /// + /// The optional operant logic of the reward + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("operant_logic")] + [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] + public OperantLogic OperantLogic + { + get + { + return _operantLogic; + } + set + { + _operantLogic = value; + } + } + + /// + /// The optional distribution where the delay to reward will be drawn from + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] + public Distribution Delay + { + get + { + return _delay; + } + set + { + _delay = value; + } + } + + /// + /// Initial amount of reward in microliters + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Initial amount of reward in microliters")] + public Distribution Amount + { + get + { + return _amount; + } + set + { + _amount = value; + } + } + + /// + /// Initial probability of reward delivery + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Initial probability of reward delivery")] + public Distribution Probability + { + get + { + return _probability; + } + set + { + _probability = value; + } + } + + /// + /// Initial amount of reward available in the patch in microliters + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Initial amount of reward available in the patch in microliters")] + public Distribution Available + { + get + { + return _available; + } + set + { + _available = value; + } + } + + /// + /// Reward function of the patch + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_function")] + [System.ComponentModel.DescriptionAttribute("Reward function of the patch")] + public System.Collections.Generic.List RewardFunction + { + get + { + return _rewardFunction; + } + set + { + _rewardFunction = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardSpecification(this))); + } + + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new RenderSpecification(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new RewardSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Contrast = " + _contrast); + stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); + stringBuilder.Append("Delay = " + _delay + ", "); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("RewardFunction = " + _rewardFunction); return true; } @@ -10565,38 +9640,60 @@ public override string ToString() } + /// + /// Container class for calibration models. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] - [JsonInheritanceAttribute("PatchRewardFunction", typeof(PatchRewardFunction))] - [JsonInheritanceAttribute("OnThisPatchEntryRewardFunction", typeof(OnThisPatchEntryRewardFunction))] - [JsonInheritanceAttribute("OutsideRewardFunction", typeof(OutsideRewardFunction))] - [JsonInheritanceAttribute("PersistentRewardFunction", typeof(PersistentRewardFunction))] + [System.ComponentModel.DescriptionAttribute("Container class for calibration models.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RewardFunction + public partial class RigCalibration { - public RewardFunction() + private WaterValveCalibration _waterValve; + + public RigCalibration() { + _waterValve = new WaterValveCalibration(); } - protected RewardFunction(RewardFunction other) + protected RigCalibration(RigCalibration other) { + _waterValve = other._waterValve; } - public System.IObservable Generate() + /// + /// Water valve calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("water_valve", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Water valve calibration")] + public WaterValveCalibration WaterValve { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardFunction(this))); + get + { + return _waterValve; + } + set + { + _waterValve = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new RewardFunction(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("WaterValve = " + _waterValve); + return true; } public override string ToString() @@ -10615,180 +9712,180 @@ public override string ToString() /// - /// Specifies reward parameters and behavior for a patch. + /// A scalar distribution that returns a constant value. /// - ///This class defines all aspects of reward delivery including amounts, probabilities, - ///delays, operant logic, and dynamic update functions. It serves as the complete - ///specification for how rewards are managed in a given Patch. + ///Useful for fixed parameters that don't vary across trials or samples. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Specifies reward parameters and behavior for a patch. - - This class defines all aspects of reward delivery including amounts, probabilities, - delays, operant logic, and dynamic update functions. It serves as the complete - specification for how rewards are managed in a given Patch.")] + [System.ComponentModel.DescriptionAttribute("A scalar distribution that returns a constant value.\n\nUseful for fixed parameters" + + " that don\'t vary across trials or samples.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RewardSpecification + public partial class Scalar : Distribution { - private OperantLogic _operantLogic; - - private Distribution _delay; - - private Distribution _amount; - - private Distribution _probability; + private ScalarDistributionParameter _distributionParameters; - private Distribution _available; + private TruncationParameters2 _truncationParameters; - private System.Collections.Generic.List _rewardFunction; + private ScalingParameters2 _scalingParameters; - public RewardSpecification() + public Scalar() { - _delay = new Distribution(); - _amount = new Distribution(); - _probability = new Distribution(); - _available = new Distribution(); - _rewardFunction = new System.Collections.Generic.List(); + _distributionParameters = new ScalarDistributionParameter(); } - protected RewardSpecification(RewardSpecification other) + protected Scalar(Scalar other) : + base(other) { - _operantLogic = other._operantLogic; - _delay = other._delay; - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rewardFunction = other._rewardFunction; + _distributionParameters = other._distributionParameters; + _truncationParameters = other._truncationParameters; + _scalingParameters = other._scalingParameters; } /// - /// The optional operant logic of the reward + /// Parameters of the distribution /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operant_logic")] - [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] - public OperantLogic OperantLogic + [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] + [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] + public ScalarDistributionParameter DistributionParameters { get { - return _operantLogic; + return _distributionParameters; } set { - _operantLogic = value; + _distributionParameters = value; } } - /// - /// The optional distribution where the delay to reward will be drawn from - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] - public Distribution Delay + [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] + public TruncationParameters2 TruncationParameters { get { - return _delay; + return _truncationParameters; } set { - _delay = value; + _truncationParameters = value; } } - /// - /// Initial amount of reward in microliters - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Initial amount of reward in microliters")] - public Distribution Amount + [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] + public ScalingParameters2 ScalingParameters { get { - return _amount; + return _scalingParameters; } set { - _amount = value; + _scalingParameters = value; } } - /// - /// Initial probability of reward delivery - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Initial probability of reward delivery")] - public Distribution Probability + public System.IObservable Generate() { - get - { - return _probability; - } - set + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Scalar(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Scalar(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - _probability = value; + stringBuilder.Append(", "); } + stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); + stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); + stringBuilder.Append("ScalingParameters = " + _scalingParameters); + return true; } + } + + + /// + /// Parameters for a scalar (constant) distribution. + /// + ///Represents a deterministic value that always returns the same number. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Parameters for a scalar (constant) distribution.\n\nRepresents a deterministic valu" + + "e that always returns the same number.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class ScalarDistributionParameter + { - /// - /// Initial amount of reward available in the patch in microliters - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Initial amount of reward available in the patch in microliters")] - public Distribution Available + private string _family; + + private double _value; + + public ScalarDistributionParameter() + { + _family = "Scalar"; + _value = 0D; + } + + protected ScalarDistributionParameter(ScalarDistributionParameter other) + { + _family = other._family; + _value = other._value; + } + + [Newtonsoft.Json.JsonPropertyAttribute("family")] + public string Family { get { - return _available; + return _family; } set { - _available = value; + _family = value; } } /// - /// Reward function of the patch + /// The static value of the distribution /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_function")] - [System.ComponentModel.DescriptionAttribute("Reward function of the patch")] - public System.Collections.Generic.List RewardFunction + [Newtonsoft.Json.JsonPropertyAttribute("value")] + [System.ComponentModel.DescriptionAttribute("The static value of the distribution")] + public double Value { get { - return _rewardFunction; + return _value; } set { - _rewardFunction = value; + _value = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardSpecification(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalarDistributionParameter(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new RewardSpecification(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ScalarDistributionParameter(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); - stringBuilder.Append("Delay = " + _delay + ", "); - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("RewardFunction = " + _rewardFunction); + stringBuilder.Append("Family = " + _family + ", "); + stringBuilder.Append("Value = " + _value); return true; } @@ -10808,59 +9905,84 @@ public override string ToString() /// - /// Container class for calibration models. In a future release these will be moved to the respective devices + /// Parameters for scaling and offsetting sampled distribution values. + ///Scaling is applied as (value * scale + offset). + /// + ///Applies linear transformation: result = (value * scale) + offset. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Container class for calibration models. In a future release these will be moved t" + - "o the respective devices")] + [System.ComponentModel.DescriptionAttribute("Parameters for scaling and offsetting sampled distribution values.\nScaling is app" + + "lied as (value * scale + offset).\n\nApplies linear transformation: result = (valu" + + "e * scale) + offset.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RigCalibration + public partial class ScalingParameters { - private WaterValveCalibration _waterValve; + private double _scale; + + private double _offset; + + public ScalingParameters() + { + _scale = 1D; + _offset = 0D; + } - public RigCalibration() + protected ScalingParameters(ScalingParameters other) { - _waterValve = new WaterValveCalibration(); + _scale = other._scale; + _offset = other._offset; } - protected RigCalibration(RigCalibration other) + /// + /// Scaling factor to apply on the sampled distribution + /// + [Newtonsoft.Json.JsonPropertyAttribute("scale")] + [System.ComponentModel.DescriptionAttribute("Scaling factor to apply on the sampled distribution")] + public double Scale { - _waterValve = other._waterValve; + get + { + return _scale; + } + set + { + _scale = value; + } } /// - /// Water valve calibration + /// Offset factor to apply on the sampled distribution /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("water_valve", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Water valve calibration")] - public WaterValveCalibration WaterValve + [Newtonsoft.Json.JsonPropertyAttribute("offset")] + [System.ComponentModel.DescriptionAttribute("Offset factor to apply on the sampled distribution")] + public double Offset { get { - return _waterValve; + return _offset; } set { - _waterValve = value; + _offset = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalingParameters(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ScalingParameters(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("WaterValve = " + _waterValve); + stringBuilder.Append("Scale = " + _scale + ", "); + stringBuilder.Append("Offset = " + _offset); return true; } @@ -10880,180 +10002,209 @@ public override string ToString() /// - /// A scalar distribution that returns a constant value. - /// - ///Useful for fixed parameters that don't vary across trials or samples. + /// Represents a screen assembly (left, center and right screens) and respective configuration. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A scalar distribution that returns a constant value.\n\nUseful for fixed parameters" + - " that don\'t vary across trials or samples.")] + [System.ComponentModel.DescriptionAttribute("Represents a screen assembly (left, center and right screens) and respective conf" + + "iguration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Scalar : Distribution + public partial class ScreenAssembly { - private ScalarDistributionParameter _distributionParameters; + private string _deviceType; - private TruncationParameters2 _truncationParameters; + private ScreenAssemblyCalibration _calibration; - private ScalingParameters2 _scalingParameters; + private int _displayIndex; - public Scalar() + private double _targetRenderFrequency; + + private double _targetUpdateFrequency; + + private string _textureAssetsDirectory; + + private double _brightness; + + private double _contrast; + + public ScreenAssembly() { - _distributionParameters = new ScalarDistributionParameter(); + _deviceType = "ScreenAssembly"; + _calibration = new ScreenAssemblyCalibration(); + _displayIndex = 1; + _targetRenderFrequency = 60D; + _targetUpdateFrequency = 120D; + _textureAssetsDirectory = "Textures"; + _brightness = 0D; + _contrast = 1D; } - protected Scalar(Scalar other) : - base(other) + protected ScreenAssembly(ScreenAssembly other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _deviceType = other._deviceType; + _calibration = other._calibration; + _displayIndex = other._displayIndex; + _targetRenderFrequency = other._targetRenderFrequency; + _targetUpdateFrequency = other._targetUpdateFrequency; + _textureAssetsDirectory = other._textureAssetsDirectory; + _brightness = other._brightness; + _contrast = other._contrast; } - /// - /// Parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public ScalarDistributionParameter DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _distributionParameters; + return _deviceType; } set { - _distributionParameters = value; + _deviceType = value; } } + /// + /// Screen assembly calibration + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - public TruncationParameters2 TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Screen assembly calibration")] + public ScreenAssemblyCalibration Calibration { get { - return _truncationParameters; + return _calibration; } set { - _truncationParameters = value; + _calibration = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - public ScalingParameters2 ScalingParameters + /// + /// Display index + /// + [Newtonsoft.Json.JsonPropertyAttribute("display_index")] + [System.ComponentModel.DescriptionAttribute("Display index")] + public int DisplayIndex { get { - return _scalingParameters; + return _displayIndex; } set { - _scalingParameters = value; + _displayIndex = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Scalar(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Scalar(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Target render frequency + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_render_frequency")] + [System.ComponentModel.DescriptionAttribute("Target render frequency")] + public double TargetRenderFrequency { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _targetRenderFrequency; + } + set + { + _targetRenderFrequency = value; } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; } - } - - - /// - /// Parameters for a scalar (constant) distribution. - /// - ///Represents a deterministic value that always returns the same number. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a scalar (constant) distribution.\n\nRepresents a deterministic valu" + - "e that always returns the same number.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalarDistributionParameter - { - - private string _family; - - private double _value; - public ScalarDistributionParameter() + /// + /// Target update frequency + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_update_frequency")] + [System.ComponentModel.DescriptionAttribute("Target update frequency")] + public double TargetUpdateFrequency { - _family = "Scalar"; - _value = 0D; + get + { + return _targetUpdateFrequency; + } + set + { + _targetUpdateFrequency = value; + } } - protected ScalarDistributionParameter(ScalarDistributionParameter other) + /// + /// Calibration directory + /// + [Newtonsoft.Json.JsonPropertyAttribute("texture_assets_directory")] + [System.ComponentModel.DescriptionAttribute("Calibration directory")] + public string TextureAssetsDirectory { - _family = other._family; - _value = other._value; + get + { + return _textureAssetsDirectory; + } + set + { + _textureAssetsDirectory = value; + } } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// Brightness + /// + [Newtonsoft.Json.JsonPropertyAttribute("brightness")] + [System.ComponentModel.DescriptionAttribute("Brightness")] + public double Brightness { get { - return _family; + return _brightness; } set { - _family = value; + _brightness = value; } } /// - /// The static value of the distribution + /// Contrast /// - [Newtonsoft.Json.JsonPropertyAttribute("value")] - [System.ComponentModel.DescriptionAttribute("The static value of the distribution")] - public double Value + [Newtonsoft.Json.JsonPropertyAttribute("contrast")] + [System.ComponentModel.DescriptionAttribute("Contrast")] + public double Contrast { get { - return _value; + return _contrast; } set { - _value = value; + _contrast = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalarDistributionParameter(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScreenAssembly(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalarDistributionParameter(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssembly(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Value = " + _value); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("DisplayIndex = " + _displayIndex + ", "); + stringBuilder.Append("TargetRenderFrequency = " + _targetRenderFrequency + ", "); + stringBuilder.Append("TargetUpdateFrequency = " + _targetUpdateFrequency + ", "); + stringBuilder.Append("TextureAssetsDirectory = " + _textureAssetsDirectory + ", "); + stringBuilder.Append("Brightness = " + _brightness + ", "); + stringBuilder.Append("Contrast = " + _contrast); return true; } @@ -11073,84 +10224,104 @@ public override string ToString() /// - /// Parameters for scaling and offsetting sampled distribution values. - ///Scaling is applied as (value * scale + offset). - /// - ///Applies linear transformation: result = (value * scale) + offset. + /// Represents the calibration parameters for a screen assembly with three displays. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for scaling and offsetting sampled distribution values.\nScaling is app" + - "lied as (value * scale + offset).\n\nApplies linear transformation: result = (valu" + - "e * scale) + offset.")] + [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters for a screen assembly with three displays.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalingParameters + public partial class ScreenAssemblyCalibration { - private double _scale; + private DisplayCalibration _left; - private double _offset; + private DisplayCalibration _center; - public ScalingParameters() + private DisplayCalibration _right; + + public ScreenAssemblyCalibration() { - _scale = 1D; - _offset = 0D; + _left = new DisplayCalibration(); + _center = new DisplayCalibration(); + _right = new DisplayCalibration(); } - protected ScalingParameters(ScalingParameters other) + protected ScreenAssemblyCalibration(ScreenAssemblyCalibration other) { - _scale = other._scale; - _offset = other._offset; + _left = other._left; + _center = other._center; + _right = other._right; } /// - /// Scaling factor to apply on the sampled distribution + /// Left display calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("scale")] - [System.ComponentModel.DescriptionAttribute("Scaling factor to apply on the sampled distribution")] - public double Scale + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("left")] + [System.ComponentModel.DescriptionAttribute("Left display calibration")] + public DisplayCalibration Left { get { - return _scale; + return _left; } set { - _scale = value; + _left = value; } } /// - /// Offset factor to apply on the sampled distribution + /// Center display calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("offset")] - [System.ComponentModel.DescriptionAttribute("Offset factor to apply on the sampled distribution")] - public double Offset + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("center")] + [System.ComponentModel.DescriptionAttribute("Center display calibration")] + public DisplayCalibration Center { get { - return _offset; + return _center; } set { - _offset = value; + _center = value; } } - public System.IObservable Generate() + /// + /// Right display calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("right")] + [System.ComponentModel.DescriptionAttribute("Right display calibration")] + public DisplayCalibration Right { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalingParameters(this))); + get + { + return _right; + } + set + { + _right = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalingParameters(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScreenAssemblyCalibration(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssemblyCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Scale = " + _scale + ", "); - stringBuilder.Append("Offset = " + _offset); + stringBuilder.Append("Left = " + _left + ", "); + stringBuilder.Append("Center = " + _center + ", "); + stringBuilder.Append("Right = " + _right); return true; } @@ -11172,249 +10343,260 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Screen + public partial class Session { - private string _deviceType; + private string _aindBehaviorServicesPkgVersion; - private string _deviceName; + private string _version; - private BaseModel _additionalSettings; + private string _experiment; - private DisplaysCalibration _calibration; + private System.Collections.Generic.List _experimenter; - private int _displayIndex; + private System.DateTimeOffset _date; - private double _targetRenderFrequency; + private string _sessionName; - private double _targetUpdateFrequency; + private string _subject; - private string _textureAssetsDirectory; + private string _notes; - private double _brightness; + private string _commitHash; - private double _contrast; + private bool _allowDirtyRepo; - public Screen() + private bool _skipHardwareValidation; + + public Session() { - _deviceType = "Screen"; - _calibration = new DisplaysCalibration(); - _displayIndex = 1; - _targetRenderFrequency = 60D; - _targetUpdateFrequency = 120D; - _textureAssetsDirectory = "Textures"; - _brightness = 0D; - _contrast = 1D; + _aindBehaviorServicesPkgVersion = "0.13.0"; + _version = "0.13.0"; + _experimenter = new System.Collections.Generic.List(); + _allowDirtyRepo = false; + _skipHardwareValidation = false; } - protected Screen(Screen other) + protected Session(Session other) { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _displayIndex = other._displayIndex; - _targetRenderFrequency = other._targetRenderFrequency; - _targetUpdateFrequency = other._targetUpdateFrequency; - _textureAssetsDirectory = other._textureAssetsDirectory; - _brightness = other._brightness; - _contrast = other._contrast; + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _experiment = other._experiment; + _experimenter = other._experimenter; + _date = other._date; + _sessionName = other._sessionName; + _subject = other._subject; + _notes = other._notes; + _commitHash = other._commitHash; + _allowDirtyRepo = other._allowDirtyRepo; + _skipHardwareValidation = other._skipHardwareValidation; } - /// - /// Device type - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] - public string DeviceType + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion { get { - return _deviceType; + return _aindBehaviorServicesPkgVersion; } set { - _deviceType = value; + _aindBehaviorServicesPkgVersion = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version + { + get + { + return _version; + } + set + { + _version = value; } } /// - /// Device name + /// Name of the experiment /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("experiment")] + [System.ComponentModel.DescriptionAttribute("Name of the experiment")] + public string Experiment { get { - return _deviceName; + return _experiment; } set { - _deviceName = value; + _experiment = value; } } /// - /// Additional settings + /// Name of the experimenter /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] + [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] + public System.Collections.Generic.List Experimenter { get { - return _additionalSettings; + return _experimenter; } set { - _additionalSettings = value; + _experimenter = value; } } /// - /// Screen calibration + /// Date of the experiment /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Screen calibration")] - public DisplaysCalibration Calibration + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the experiment")] + public System.DateTimeOffset Date { get { - return _calibration; + return _date; } set { - _calibration = value; + _date = value; } } /// - /// Display index + /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. /// - [Newtonsoft.Json.JsonPropertyAttribute("display_index")] - [System.ComponentModel.DescriptionAttribute("Display index")] - public int DisplayIndex + [Newtonsoft.Json.JsonPropertyAttribute("session_name")] + [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + + "t provided, it will be generated using subject and date.")] + public string SessionName { get { - return _displayIndex; + return _sessionName; } set { - _displayIndex = value; + _sessionName = value; } } /// - /// Target render frequency + /// Name of the subject /// - [Newtonsoft.Json.JsonPropertyAttribute("target_render_frequency")] - [System.ComponentModel.DescriptionAttribute("Target render frequency")] - public double TargetRenderFrequency + [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Name of the subject")] + public string Subject { get { - return _targetRenderFrequency; + return _subject; } set { - _targetRenderFrequency = value; + _subject = value; } } /// - /// Target update frequency + /// Notes about the experiment /// - [Newtonsoft.Json.JsonPropertyAttribute("target_update_frequency")] - [System.ComponentModel.DescriptionAttribute("Target update frequency")] - public double TargetUpdateFrequency + [Newtonsoft.Json.JsonPropertyAttribute("notes")] + [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] + public string Notes { get { - return _targetUpdateFrequency; + return _notes; } set { - _targetUpdateFrequency = value; + _notes = value; } } /// - /// Calibration directory + /// Commit hash of the repository /// - [Newtonsoft.Json.JsonPropertyAttribute("texture_assets_directory")] - [System.ComponentModel.DescriptionAttribute("Calibration directory")] - public string TextureAssetsDirectory + [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] + [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] + public string CommitHash { get { - return _textureAssetsDirectory; + return _commitHash; } set { - _textureAssetsDirectory = value; + _commitHash = value; } } /// - /// Brightness + /// Allow running from a dirty repository /// - [Newtonsoft.Json.JsonPropertyAttribute("brightness")] - [System.ComponentModel.DescriptionAttribute("Brightness")] - public double Brightness + [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] + [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] + public bool AllowDirtyRepo { get { - return _brightness; + return _allowDirtyRepo; } set { - _brightness = value; + _allowDirtyRepo = value; } } /// - /// Contrast + /// Skip hardware validation /// - [Newtonsoft.Json.JsonPropertyAttribute("contrast")] - [System.ComponentModel.DescriptionAttribute("Contrast")] - public double Contrast + [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] + [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] + public bool SkipHardwareValidation { get { - return _contrast; + return _skipHardwareValidation; } set { - _contrast = value; + _skipHardwareValidation = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Screen(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Session(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Screen(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Session(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("DisplayIndex = " + _displayIndex + ", "); - stringBuilder.Append("TargetRenderFrequency = " + _targetRenderFrequency + ", "); - stringBuilder.Append("TargetUpdateFrequency = " + _targetUpdateFrequency + ", "); - stringBuilder.Append("TextureAssetsDirectory = " + _textureAssetsDirectory + ", "); - stringBuilder.Append("Brightness = " + _brightness + ", "); - stringBuilder.Append("Contrast = " + _contrast); + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("Experiment = " + _experiment + ", "); + stringBuilder.Append("Experimenter = " + _experimenter + ", "); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("SessionName = " + _sessionName + ", "); + stringBuilder.Append("Subject = " + _subject + ", "); + stringBuilder.Append("Notes = " + _notes + ", "); + stringBuilder.Append("CommitHash = " + _commitHash + ", "); + stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); + stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); return true; } @@ -11601,7 +10783,11 @@ public override string ToString() } + /// + /// Spinnaker camera device configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Spinnaker camera device configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class SpinnakerCamera @@ -11609,10 +10795,6 @@ public partial class SpinnakerCamera private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private string _serialNumber; @@ -11650,8 +10832,6 @@ public SpinnakerCamera() protected SpinnakerCamera(SpinnakerCamera other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _serialNumber = other._serialNumber; _binning = other._binning; @@ -11665,11 +10845,7 @@ protected SpinnakerCamera(SpinnakerCamera other) _videoWriter = other._videoWriter; } - /// - /// Device type - /// [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] public string DeviceType { get @@ -11683,46 +10859,11 @@ public string DeviceType } /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -11924,8 +11065,6 @@ public System.IObservable Generate(System.IObservable< protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); stringBuilder.Append("Binning = " + _binning + ", "); @@ -11955,6 +11094,9 @@ public override string ToString() } + /// + /// ADC bit depth options for Spinnaker cameras. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum SpinnakerCameraAdcBitDepth { @@ -11970,6 +11112,9 @@ public enum SpinnakerCameraAdcBitDepth } + /// + /// Pixel format options for Spinnaker cameras. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] public enum SpinnakerCameraPixelFormat { @@ -12511,7 +11656,11 @@ public override string ToString() } + /// + /// A calibrated treadmill device + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A calibrated treadmill device")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class Treadmill @@ -12519,10 +11668,6 @@ public partial class Treadmill private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private TreadmillCalibration _calibration; private int _whoAmI; @@ -12534,14 +11679,13 @@ public partial class Treadmill public Treadmill() { _deviceType = "Treadmill"; + _calibration = new TreadmillCalibration(); _whoAmI = 1402; } protected Treadmill(Treadmill other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; @@ -12561,41 +11705,6 @@ public string DeviceType } } - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] public TreadmillCalibration Calibration @@ -12631,257 +11740,50 @@ public int WhoAmI public string SerialNumber { get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } - } - - /// - /// Device port name - /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName - { - get - { - return _portName; - } - set - { - _portName = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Treadmill calibration class - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Treadmill calibration class")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillCalibration - { - - private string _deviceName; - - private TreadmillCalibrationInput _input; - - private TreadmillCalibrationOutput _output; - - private System.DateTimeOffset? _date; - - private string _description; - - private string _notes; - - public TreadmillCalibration() - { - _deviceName = "Treadmill"; - _input = new TreadmillCalibrationInput(); - _output = new TreadmillCalibrationOutput(); - _description = "Calibration of the treadmill system"; - } - - protected TreadmillCalibration(TreadmillCalibration other) - { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; - } - - /// - /// Must match a device name in rig/instrument - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Must match a device name in rig/instrument")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public TreadmillCalibrationInput Input - { - get - { - return _input; - } - set - { - _input = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public TreadmillCalibrationOutput Output - { - get - { - return _output; - } - set - { - _output = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description - { - get - { - return _description; - } - set - { - _description = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes - { - get - { - return _notes; - } - set - { - _notes = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("Input = " + _input + ", "); - stringBuilder.Append("Output = " + _output + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("Notes = " + _notes); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillCalibrationInput - { - - public TreadmillCalibrationInput() - { + { + return _serialNumber; + } + set + { + _serialNumber = value; + } } - protected TreadmillCalibrationInput(TreadmillCalibrationInput other) + /// + /// Device port name + /// + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { + get + { + return _portName; + } + set + { + _portName = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibrationInput(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibrationInput(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); + return true; } public override string ToString() @@ -12899,12 +11801,18 @@ public override string ToString() } + /// + /// Treadmill calibration class + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Treadmill calibration class")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillCalibrationOutput + public partial class TreadmillCalibration { + private System.DateTimeOffset _date; + private double _wheelDiameter; private int _pulsesPerRevolution; @@ -12913,7 +11821,7 @@ public partial class TreadmillCalibrationOutput private System.Collections.Generic.List> _brakeLookupCalibration; - public TreadmillCalibrationOutput() + public TreadmillCalibration() { _wheelDiameter = 15D; _pulsesPerRevolution = 28800; @@ -12921,14 +11829,33 @@ public TreadmillCalibrationOutput() _brakeLookupCalibration = new System.Collections.Generic.List>(); } - protected TreadmillCalibrationOutput(TreadmillCalibrationOutput other) + protected TreadmillCalibration(TreadmillCalibration other) { + _date = other._date; _wheelDiameter = other._wheelDiameter; _pulsesPerRevolution = other._pulsesPerRevolution; _invertDirection = other._invertDirection; _brakeLookupCalibration = other._brakeLookupCalibration; } + /// + /// Date of the calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset Date + { + get + { + return _date; + } + set + { + _date = value; + } + } + /// /// Wheel diameter /// @@ -12984,7 +11911,7 @@ public bool InvertDirection /// Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16]) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("brake_lookup_calibration", Required=Newtonsoft.Json.Required.Always)] + [Newtonsoft.Json.JsonPropertyAttribute("brake_lookup_calibration")] [System.ComponentModel.DescriptionAttribute("Brake lookup calibration. Each pair of values define (input [torque], output [bra" + "ke set-point U16])")] public System.Collections.Generic.List> BrakeLookupCalibration @@ -12999,18 +11926,19 @@ public System.Collections.Generic.List> } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibrationOutput(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibrationOutput(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { + stringBuilder.Append("Date = " + _date + ", "); stringBuilder.Append("WheelDiameter = " + _wheelDiameter + ", "); stringBuilder.Append("PulsesPerRevolution = " + _pulsesPerRevolution + ", "); stringBuilder.Append("InvertDirection = " + _invertDirection + ", "); @@ -13486,10 +12414,14 @@ public enum UpdaterTarget } + /// + /// FFMPEG video writer configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriter @@ -13533,7 +12465,11 @@ public override string ToString() } + /// + /// FFMPEG video writer configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriterFfmpeg : VideoWriter @@ -13657,7 +12593,11 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } + /// + /// OpenCV video writer configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("OpenCV video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class VideoWriterOpenCv : VideoWriter @@ -13905,361 +12845,84 @@ public OdorSpecification OdorSpecification } set { - _odorSpecification = value; - } - } - - /// - /// The optional reward specification of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] - [System.ComponentModel.DescriptionAttribute("The optional reward specification of the virtual site")] - public VirtualSiteRewardSpecification RewardSpecification - { - get - { - return _rewardSpecification; - } - set - { - _rewardSpecification = value; - } - } - - /// - /// The optional render specification of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] - [System.ComponentModel.DescriptionAttribute("The optional render specification of the virtual site")] - public RenderSpecification RenderSpecification - { - get - { - return _renderSpecification; - } - set - { - _renderSpecification = value; - } - } - - /// - /// Treadmill specification - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] - [System.ComponentModel.DescriptionAttribute("Treadmill specification")] - public TreadmillSpecification TreadmillSpecification - { - get - { - return _treadmillSpecification; - } - set - { - _treadmillSpecification = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSite(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSite(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Id = " + _id + ", "); - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("Length = " + _length + ", "); - stringBuilder.Append("StartPosition = " + _startPosition + ", "); - stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); - stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); - stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); - stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Generates virtual site specifications with randomized properties. - /// - ///This class defines templates for creating virtual sites with variable properties - ///like length and rendering specifications. It's used to generate diverse virtual - ///environments for the foraging task. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Generates virtual site specifications with randomized properties. - - This class defines templates for creating virtual sites with variable properties - like length and rendering specifications. It's used to generate diverse virtual - environments for the foraging task.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSiteGenerator - { - - private RenderSpecification _renderSpecification; - - private VirtualSiteLabels _label; - - private Distribution _lengthDistribution; - - private TreadmillSpecification _treadmillSpecification; - - public VirtualSiteGenerator() - { - _renderSpecification = new RenderSpecification(); - _label = AindVrForagingDataSchema.VirtualSiteLabels.Unspecified; - _lengthDistribution = new Distribution(); - } - - protected VirtualSiteGenerator(VirtualSiteGenerator other) - { - _renderSpecification = other._renderSpecification; - _label = other._label; - _lengthDistribution = other._lengthDistribution; - _treadmillSpecification = other._treadmillSpecification; - } - - /// - /// Contrast of the environment - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] - [System.ComponentModel.DescriptionAttribute("Contrast of the environment")] - public RenderSpecification RenderSpecification - { - get - { - return _renderSpecification; - } - set - { - _renderSpecification = value; - } - } - - /// - /// Label of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("label")] - [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] - public VirtualSiteLabels Label - { - get - { - return _label; - } - set - { - _label = value; - } - } - - /// - /// Distribution of the length of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("length_distribution")] - [System.ComponentModel.DescriptionAttribute("Distribution of the length of the virtual site")] - public Distribution LengthDistribution - { - get - { - return _lengthDistribution; - } - set - { - _lengthDistribution = value; + _odorSpecification = value; } } /// - /// Treadmill specification + /// The optional reward specification of the virtual site /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] - [System.ComponentModel.DescriptionAttribute("Treadmill specification")] - public TreadmillSpecification TreadmillSpecification + [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] + [System.ComponentModel.DescriptionAttribute("The optional reward specification of the virtual site")] + public VirtualSiteRewardSpecification RewardSpecification { get { - return _treadmillSpecification; + return _rewardSpecification; } set { - _treadmillSpecification = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteGenerator(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteGenerator(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("LengthDistribution = " + _lengthDistribution + ", "); - stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); + _rewardSpecification = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Enumeration of virtual site types in the VR foraging environment. - /// - ///These labels categorize different regions of the virtual environment, - ///each serving different functional roles in the foraging task. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum VirtualSiteLabels - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="Unspecified")] - Unspecified = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="InterPatch")] - InterPatch = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="PostPatch")] - PostPatch = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardSite")] - RewardSite = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="InterSite")] - InterSite = 4, - } - - - /// - /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - ///Specifies reward parameters and behavior for a virtual site. - /// - ///Note: This class is primarily used internally for runtime site generation - ///and is not meant to be directly instantiated in task configuration DSL. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - Specifies reward parameters and behavior for a virtual site. - - Note: This class is primarily used internally for runtime site generation - and is not meant to be directly instantiated in task configuration DSL.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSiteRewardSpecification - { - - private OperantLogic _operantLogic; - - private Distribution _delay; - - public VirtualSiteRewardSpecification() - { - _operantLogic = new OperantLogic(); - _delay = new Distribution(); - } - - protected VirtualSiteRewardSpecification(VirtualSiteRewardSpecification other) - { - _operantLogic = other._operantLogic; - _delay = other._delay; } /// - /// The optional operant logic of the reward + /// The optional render specification of the virtual site /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operant_logic", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] - public OperantLogic OperantLogic + [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] + [System.ComponentModel.DescriptionAttribute("The optional render specification of the virtual site")] + public RenderSpecification RenderSpecification { get { - return _operantLogic; + return _renderSpecification; } set { - _operantLogic = value; + _renderSpecification = value; } } /// - /// The optional distribution where the delay to reward will be drawn from + /// Treadmill specification /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] - public Distribution Delay + [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] + [System.ComponentModel.DescriptionAttribute("Treadmill specification")] + public TreadmillSpecification TreadmillSpecification { get { - return _delay; + return _treadmillSpecification; } set { - _delay = value; + _treadmillSpecification = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteRewardSpecification(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSite(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteRewardSpecification(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSite(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); - stringBuilder.Append("Delay = " + _delay); + stringBuilder.Append("Id = " + _id + ", "); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("Length = " + _length + ", "); + stringBuilder.Append("StartPosition = " + _startPosition + ", "); + stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); + stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); + stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); + stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); return true; } @@ -14279,152 +12942,134 @@ public override string ToString() /// - /// Defines a visual corridor segment in the VR environment. + /// Generates virtual site specifications with randomized properties. /// - ///Visual corridors are the basic building blocks of the VR environment, - ///defining spatial regions with specific textures, dimensions, and positions. + ///This class defines templates for creating virtual sites with variable properties + ///like length and rendering specifications. It's used to generate diverse virtual + ///environments for the foraging task. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines a visual corridor segment in the VR environment.\n\nVisual corridors are th" + - "e basic building blocks of the VR environment,\ndefining spatial regions with spe" + - "cific textures, dimensions, and positions.")] + [System.ComponentModel.DescriptionAttribute(@"Generates virtual site specifications with randomized properties. + + This class defines templates for creating virtual sites with variable properties + like length and rendering specifications. It's used to generate diverse virtual + environments for the foraging task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VisualCorridor + public partial class VirtualSiteGenerator { - private int _id; - - private Size _size; - - private double _startPosition; + private RenderSpecification _renderSpecification; - private double _length; + private VirtualSiteLabels _label; - private WallTextures _textures; + private Distribution _lengthDistribution; - public VisualCorridor() - { - _id = 0; - _size = new Size(); - _startPosition = 0D; - _length = 120D; - _textures = new WallTextures(); - } + private TreadmillSpecification _treadmillSpecification; - protected VisualCorridor(VisualCorridor other) + public VirtualSiteGenerator() { - _id = other._id; - _size = other._size; - _startPosition = other._startPosition; - _length = other._length; - _textures = other._textures; + _renderSpecification = new RenderSpecification(); + _label = AindVrForagingDataSchema.VirtualSiteLabels.Unspecified; + _lengthDistribution = new Distribution(); } - /// - /// Id of the visual corridor object - /// - [Newtonsoft.Json.JsonPropertyAttribute("id")] - [System.ComponentModel.DescriptionAttribute("Id of the visual corridor object")] - public int Id + protected VirtualSiteGenerator(VirtualSiteGenerator other) { - get - { - return _id; - } - set - { - _id = value; - } + _renderSpecification = other._renderSpecification; + _label = other._label; + _lengthDistribution = other._lengthDistribution; + _treadmillSpecification = other._treadmillSpecification; } /// - /// Size of the corridor (cm) + /// Contrast of the environment /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("size")] - [System.ComponentModel.DescriptionAttribute("Size of the corridor (cm)")] - public Size Size + [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] + [System.ComponentModel.DescriptionAttribute("Contrast of the environment")] + public RenderSpecification RenderSpecification { get { - return _size; + return _renderSpecification; } set { - _size = value; + _renderSpecification = value; } } /// - /// Start position of the corridor (cm) + /// Label of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("start_position")] - [System.ComponentModel.DescriptionAttribute("Start position of the corridor (cm)")] - public double StartPosition + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("label")] + [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] + public VirtualSiteLabels Label { get { - return _startPosition; + return _label; } set { - _startPosition = value; + _label = value; } } /// - /// Length of the corridor site (cm) + /// Distribution of the length of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("length")] - [System.ComponentModel.DescriptionAttribute("Length of the corridor site (cm)")] - public double Length + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("length_distribution")] + [System.ComponentModel.DescriptionAttribute("Distribution of the length of the virtual site")] + public Distribution LengthDistribution { get { - return _length; + return _lengthDistribution; } set { - _length = value; + _lengthDistribution = value; } } /// - /// The textures of the corridor + /// Treadmill specification /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("textures", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The textures of the corridor")] - public WallTextures Textures + [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] + [System.ComponentModel.DescriptionAttribute("Treadmill specification")] + public TreadmillSpecification TreadmillSpecification { get { - return _textures; + return _treadmillSpecification; } set { - _textures = value; + _treadmillSpecification = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VisualCorridor(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteGenerator(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new VisualCorridor(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteGenerator(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Id = " + _id + ", "); - stringBuilder.Append("Size = " + _size + ", "); - stringBuilder.Append("StartPosition = " + _startPosition + ", "); - stringBuilder.Append("Length = " + _length + ", "); - stringBuilder.Append("Textures = " + _textures); + stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("LengthDistribution = " + _lengthDistribution + ", "); + stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); return true; } @@ -14444,135 +13089,117 @@ public override string ToString() /// - /// Defines textures for all walls of a visual corridor in the VR environment. + /// Enumeration of virtual site types in the VR foraging environment. /// - ///This class specifies the visual appearance of corridor surfaces including - ///floor, ceiling, and side walls, allowing for complex visual environments - ///with different textures on each surface. + ///These labels categorize different regions of the virtual environment, + ///each serving different functional roles in the foraging task. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines textures for all walls of a visual corridor in the VR environment. - - This class specifies the visual appearance of corridor surfaces including - floor, ceiling, and side walls, allowing for complex visual environments - with different textures on each surface.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WallTextures + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum VirtualSiteLabels { - private Texture _floor; + [System.Runtime.Serialization.EnumMemberAttribute(Value="Unspecified")] + Unspecified = 0, - private Texture _ceiling; + [System.Runtime.Serialization.EnumMemberAttribute(Value="InterPatch")] + InterPatch = 1, - private Texture _left; + [System.Runtime.Serialization.EnumMemberAttribute(Value="PostPatch")] + PostPatch = 2, - private Texture _right; + [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardSite")] + RewardSite = 3, - public WallTextures() - { - _floor = new Texture(); - _ceiling = new Texture(); - _left = new Texture(); - _right = new Texture(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="InterSite")] + InterSite = 4, + } + + + /// + /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + ///Specifies reward parameters and behavior for a virtual site. + /// + ///Note: This class is primarily used internally for runtime site generation + ///and is not meant to be directly instantiated in task configuration DSL. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + Specifies reward parameters and behavior for a virtual site. + + Note: This class is primarily used internally for runtime site generation + and is not meant to be directly instantiated in task configuration DSL.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class VirtualSiteRewardSpecification + { - protected WallTextures(WallTextures other) - { - _floor = other._floor; - _ceiling = other._ceiling; - _left = other._left; - _right = other._right; - } + private OperantLogic _operantLogic; - /// - /// The texture of the floor - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("floor", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the floor")] - public Texture Floor + private Distribution _delay; + + public VirtualSiteRewardSpecification() { - get - { - return _floor; - } - set - { - _floor = value; - } + _operantLogic = new OperantLogic(); + _delay = new Distribution(); } - /// - /// The texture of the ceiling - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("ceiling", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the ceiling")] - public Texture Ceiling + protected VirtualSiteRewardSpecification(VirtualSiteRewardSpecification other) { - get - { - return _ceiling; - } - set - { - _ceiling = value; - } + _operantLogic = other._operantLogic; + _delay = other._delay; } /// - /// The texture of the left + /// The optional operant logic of the reward /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("left", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the left")] - public Texture Left + [Newtonsoft.Json.JsonPropertyAttribute("operant_logic", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] + public OperantLogic OperantLogic { get { - return _left; + return _operantLogic; } set { - _left = value; + _operantLogic = value; } } /// - /// The texture of the right + /// The optional distribution where the delay to reward will be drawn from /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("right", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the right")] - public Texture Right + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] + public Distribution Delay { get { - return _right; + return _delay; } set { - _right = value; + _delay = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WallTextures(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteRewardSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WallTextures(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteRewardSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Floor = " + _floor + ", "); - stringBuilder.Append("Ceiling = " + _ceiling + ", "); - stringBuilder.Append("Left = " + _left + ", "); - stringBuilder.Append("Right = " + _right); + stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); + stringBuilder.Append("Delay = " + _delay); return true; } @@ -14592,148 +13219,152 @@ public override string ToString() /// - /// Water valve calibration class + /// Defines a visual corridor segment in the VR environment. + /// + ///Visual corridors are the basic building blocks of the VR environment, + ///defining spatial regions with specific textures, dimensions, and positions. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Water valve calibration class")] + [System.ComponentModel.DescriptionAttribute("Defines a visual corridor segment in the VR environment.\n\nVisual corridors are th" + + "e basic building blocks of the VR environment,\ndefining spatial regions with spe" + + "cific textures, dimensions, and positions.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WaterValveCalibration + public partial class VisualCorridor { - private string _deviceName; - - private WaterValveCalibrationInput _input; + private int _id; - private WaterValveCalibrationOutput _output; + private Size _size; - private System.DateTimeOffset? _date; + private double _startPosition; - private string _description; + private double _length; - private string _notes; + private WallTextures _textures; - public WaterValveCalibration() + public VisualCorridor() { - _deviceName = "WaterValve"; - _input = new WaterValveCalibrationInput(); - _output = new WaterValveCalibrationOutput(); - _description = "Calibration of the water valve delivery system"; + _id = 0; + _size = new Size(); + _startPosition = 0D; + _length = 120D; + _textures = new WallTextures(); } - protected WaterValveCalibration(WaterValveCalibration other) + protected VisualCorridor(VisualCorridor other) { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; + _id = other._id; + _size = other._size; + _startPosition = other._startPosition; + _length = other._length; + _textures = other._textures; } /// - /// Name of the device being calibrated + /// Id of the visual corridor object /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Name of the device being calibrated")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public WaterValveCalibrationInput Input + [Newtonsoft.Json.JsonPropertyAttribute("id")] + [System.ComponentModel.DescriptionAttribute("Id of the visual corridor object")] + public int Id { get { - return _input; + return _id; } set { - _input = value; + _id = value; } } + /// + /// Size of the corridor (cm) + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public WaterValveCalibrationOutput Output + [Newtonsoft.Json.JsonPropertyAttribute("size")] + [System.ComponentModel.DescriptionAttribute("Size of the corridor (cm)")] + public Size Size { get { - return _output; + return _size; } set { - _output = value; + _size = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date + /// + /// Start position of the corridor (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("start_position")] + [System.ComponentModel.DescriptionAttribute("Start position of the corridor (cm)")] + public double StartPosition { get { - return _date; + return _startPosition; } set { - _date = value; + _startPosition = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description + /// + /// Length of the corridor site (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("length")] + [System.ComponentModel.DescriptionAttribute("Length of the corridor site (cm)")] + public double Length { get { - return _description; + return _length; } set { - _description = value; + _length = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes + /// + /// The textures of the corridor + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("textures", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The textures of the corridor")] + public WallTextures Textures { get { - return _notes; + return _textures; } set { - _notes = value; + _textures = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VisualCorridor(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VisualCorridor(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("Input = " + _input + ", "); - stringBuilder.Append("Output = " + _output + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("Notes = " + _notes); + stringBuilder.Append("Id = " + _id + ", "); + stringBuilder.Append("Size = " + _size + ", "); + stringBuilder.Append("StartPosition = " + _startPosition + ", "); + stringBuilder.Append("Length = " + _length + ", "); + stringBuilder.Append("Textures = " + _textures); return true; } @@ -14752,55 +13383,136 @@ public override string ToString() } + /// + /// Defines textures for all walls of a visual corridor in the VR environment. + /// + ///This class specifies the visual appearance of corridor surfaces including + ///floor, ceiling, and side walls, allowing for complex visual environments + ///with different textures on each surface. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines textures for all walls of a visual corridor in the VR environment. + + This class specifies the visual appearance of corridor surfaces including + floor, ceiling, and side walls, allowing for complex visual environments + with different textures on each surface.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WaterValveCalibrationInput + public partial class WallTextures { - private System.Collections.Generic.List _measurements; + private Texture _floor; + + private Texture _ceiling; + + private Texture _left; + + private Texture _right; - public WaterValveCalibrationInput() + public WallTextures() { - _measurements = new System.Collections.Generic.List(); + _floor = new Texture(); + _ceiling = new Texture(); + _left = new Texture(); + _right = new Texture(); } - protected WaterValveCalibrationInput(WaterValveCalibrationInput other) + protected WallTextures(WallTextures other) { - _measurements = other._measurements; + _floor = other._floor; + _ceiling = other._ceiling; + _left = other._left; + _right = other._right; } /// - /// List of measurements + /// The texture of the floor /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("measurements")] - [System.ComponentModel.DescriptionAttribute("List of measurements")] - public System.Collections.Generic.List Measurements + [Newtonsoft.Json.JsonPropertyAttribute("floor", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the floor")] + public Texture Floor { get { - return _measurements; + return _floor; } set { - _measurements = value; + _floor = value; + } + } + + /// + /// The texture of the ceiling + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("ceiling", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the ceiling")] + public Texture Ceiling + { + get + { + return _ceiling; + } + set + { + _ceiling = value; + } + } + + /// + /// The texture of the left + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("left", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the left")] + public Texture Left + { + get + { + return _left; + } + set + { + _left = value; + } + } + + /// + /// The texture of the right + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("right", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the right")] + public Texture Right + { + get + { + return _right; + } + set + { + _right = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibrationInput(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WallTextures(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibrationInput(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new WallTextures(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Measurements = " + _measurements); + stringBuilder.Append("Floor = " + _floor + ", "); + stringBuilder.Append("Ceiling = " + _ceiling + ", "); + stringBuilder.Append("Left = " + _left + ", "); + stringBuilder.Append("Right = " + _right); return true; } @@ -14820,15 +13532,19 @@ public override string ToString() /// - /// Output for water valve calibration class + /// Represents a water valve calibration. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Output for water valve calibration class")] + [System.ComponentModel.DescriptionAttribute("Represents a water valve calibration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WaterValveCalibrationOutput + public partial class WaterValveCalibration { + private System.DateTimeOffset _date; + + private System.Collections.Generic.List _measurements; + private System.Collections.Generic.Dictionary _intervalAverage; private double _slope; @@ -14839,12 +13555,15 @@ public partial class WaterValveCalibrationOutput private System.Collections.Generic.List _validDomain; - public WaterValveCalibrationOutput() + public WaterValveCalibration() { + _measurements = new System.Collections.Generic.List(); } - protected WaterValveCalibrationOutput(WaterValveCalibrationOutput other) + protected WaterValveCalibration(WaterValveCalibration other) { + _date = other._date; + _measurements = other._measurements; _intervalAverage = other._intervalAverage; _slope = other._slope; _offset = other._offset; @@ -14852,6 +13571,42 @@ protected WaterValveCalibrationOutput(WaterValveCalibrationOutput other) _validDomain = other._validDomain; } + /// + /// Date of the calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset Date + { + get + { + return _date; + } + set + { + _date = value; + } + } + + /// + /// List of measurements + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("measurements")] + [System.ComponentModel.DescriptionAttribute("List of measurements")] + public System.Collections.Generic.List Measurements + { + get + { + return _measurements; + } + set + { + _measurements = value; + } + } + /// /// Dictionary keyed by measured valve interval and corresponding average single event volume. /// @@ -14941,18 +13696,20 @@ public System.Collections.Generic.List ValidDomain } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibrationOutput(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibrationOutput(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("Measurements = " + _measurements + ", "); stringBuilder.Append("IntervalAverage = " + _intervalAverage + ", "); stringBuilder.Append("Slope = " + _slope + ", "); stringBuilder.Append("Offset = " + _offset + ", "); @@ -14976,7 +13733,11 @@ public override string ToString() } + /// + /// Web camera device configuration. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Web camera device configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class WebCamera @@ -14984,10 +13745,6 @@ public partial class WebCamera private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; private int _index; @@ -15003,18 +13760,12 @@ public WebCamera() protected WebCamera(WebCamera other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; _index = other._index; _videoWriter = other._videoWriter; } - /// - /// Device type - /// [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] public string DeviceType { get @@ -15028,46 +13779,11 @@ public string DeviceType } /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings - { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } - } - - /// - /// Calibration + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] public BaseModel Calibration { get @@ -15128,8 +13844,6 @@ public System.IObservable Generate(System.IObservable - /// X coordinate of the point + /// X coordinate of the vector /// [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the point")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the vector")] public double X { get @@ -15195,10 +13913,10 @@ public double X } /// - /// Y coordinate of the point + /// Y coordinate of the vector /// [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the point")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the vector")] public double Y { get @@ -15212,10 +13930,10 @@ public double Y } /// - /// Z coordinate of the point + /// Z coordinate of the vector /// [Newtonsoft.Json.JsonPropertyAttribute("z")] - [System.ComponentModel.DescriptionAttribute("Z coordinate of the point")] + [System.ComponentModel.DescriptionAttribute("Z coordinate of the vector")] public double Z { get @@ -15228,14 +13946,14 @@ public double Z } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorServicesRigVisualStimulationVector3(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorServicesCommonVector3(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorServicesRigVisualStimulationVector3(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorServicesCommonVector3(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -16695,31 +15413,11 @@ private System.IObservable Process(System.IObservable source) return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value, formatting)); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -16860,11 +15558,6 @@ public System.IObservable Process(System.IObservable return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -16995,16 +15688,6 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -17150,9 +15833,19 @@ public System.IObservable Process(System.IObservable return Process(source); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } public System.IObservable Process(System.IObservable source) @@ -17185,16 +15878,6 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -17260,24 +15943,14 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } public System.IObservable Process(System.IObservable source) @@ -17344,11 +16017,7 @@ public System.IObservable Process(System.IObservable [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -17377,7 +16046,6 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -17404,8 +16072,6 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -17435,15 +16101,15 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -17457,10 +16123,8 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -17477,7 +16141,7 @@ public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpr public DeserializeFromJson() { - Type = new Bonsai.Expressions.TypeMapping(); + Type = new Bonsai.Expressions.TypeMapping(); } public Bonsai.Expressions.TypeMapping Type { get; set; } diff --git a/src/aind_behavior_vr_foraging/data_mappers/_session.py b/src/aind_behavior_vr_foraging/data_mappers/_session.py index 4432aeb9..92cecd92 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_session.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_session.py @@ -44,7 +44,7 @@ def __init__( abs_schemas_path = Path(self._data_path) / "Behavior" / "Logs" self.session_model = model_from_json_file(abs_schemas_path / "session_input.json", Session) self.rig_model = model_from_json_file(abs_schemas_path / "rig_input.json", AindVrForagingRig) - self.task_model = model_from_json_file(abs_schemas_path / "task_input.json", AindVrForagingTaskLogic) + self.task_model = model_from_json_file(abs_schemas_path / "tasklogic_input.json", AindVrForagingTaskLogic) if curriculum_suggestion is not None: if isinstance(curriculum_suggestion, CurriculumSuggestion): diff --git a/src/aind_behavior_vr_foraging/regenerate.py b/src/aind_behavior_vr_foraging/regenerate.py index 5dbaac59..5fd3ef44 100644 --- a/src/aind_behavior_vr_foraging/regenerate.py +++ b/src/aind_behavior_vr_foraging/regenerate.py @@ -6,7 +6,7 @@ from aind_behavior_services.session import Session import aind_behavior_vr_foraging.rig -import aind_behavior_vr_foraging.task +import aind_behavior_vr_foraging.task_logic SCHEMA_ROOT = Path("./src/DataSchemas/") EXTENSIONS_ROOT = Path("./src/Extensions/") @@ -15,11 +15,11 @@ def main(): models = [ - aind_behavior_vr_foraging.task.AindVrForagingTaskLogic, + aind_behavior_vr_foraging.task_logic.AindVrForagingTaskLogic, aind_behavior_vr_foraging.rig.AindVrForagingRig, Session, - aind_behavior_vr_foraging.task.VirtualSite, - aind_behavior_vr_foraging.task.VisualCorridor, + aind_behavior_vr_foraging.task_logic.VirtualSite, + aind_behavior_vr_foraging.task_logic.VisualCorridor, ] model = pydantic.RootModel[Union[tuple(models)]] diff --git a/src/main.bonsai b/src/main.bonsai index 61bc7f8d..cbd759f1 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -53,7 +53,7 @@ RawSessionSchema - + @@ -489,9 +489,6 @@ Item3 as Right) Calibration - - Input - None @@ -617,33 +614,32 @@ Item3 as Right) - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + @@ -1288,10 +1284,20 @@ Item3 as Right) - + + RigSchema + + + DataDirectory + + + + + + @@ -1327,7 +1333,10 @@ Item3 as Right) - + + + + @@ -3048,9 +3057,6 @@ Item3 as Right) Calibration.WaterValve - - Output - @@ -3134,21 +3140,20 @@ Item3 as Right) - + - - - - - + + + + + - + - + - @@ -3241,7 +3246,7 @@ Item3 as Right) Manipulator - AdditionalSettings.SpoutAxis + SpoutAxis @@ -4107,9 +4112,6 @@ Item3 as Right) HarpTreadmill.Calibration - - Output - WheelDiameter @@ -4141,17 +4143,16 @@ Item3 as Right) + + - - - - - - - - + + + + + + - @@ -4240,9 +4241,6 @@ Item1 as Displacement, HarpTreadmill.Calibration - - Output - BrakeLookupCalibration @@ -4275,13 +4273,12 @@ Item1 as Displacement, - + - - + + - @@ -6161,9 +6158,6 @@ it.Item3 as SiteHasChoice) Calibration - - Input - None @@ -6304,7 +6298,6 @@ it.Item3 as SiteHasChoice) - diff --git a/src/test_deserialization.bonsai b/src/test_deserialization.bonsai index 228f1c1b..771d5e70 100644 --- a/src/test_deserialization.bonsai +++ b/src/test_deserialization.bonsai @@ -1,10 +1,8 @@  - @@ -27,7 +25,7 @@ RawSessionSchema - + @@ -40,8 +38,8 @@ RawRigSchema - - + + @@ -54,8 +52,8 @@ RawTaskLogicSchema - - + + @@ -91,19 +89,25 @@ SubjectSchema - + + None + TaskLogicSchema - + + None + RigSchema - + + None + diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index 5935af0e..502cd0c3 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -8,10 +8,10 @@ from aind_behavior_services.session import Session from aind_behavior_services.utils import run_bonsai_process -from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from pydantic import ValidationError from aind_behavior_vr_foraging.rig import AindVrForagingRig +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic sys.path.append(".") from examples import rig, session, task_patch_foraging # isort:skip # pylint: disable=wrong-import-position diff --git a/uv.lock b/uv.lock index 740a7310..16e376c1 100644 --- a/uv.lock +++ b/uv.lock @@ -41,8 +41,8 @@ wheels = [ [[package]] name = "aind-behavior-services" -version = "0.13.0rc2" -source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names#0e3d08a4162afc5d0118dc5c1eb589e983b83c44" } +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, @@ -50,10 +50,14 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/e8/52/169fe25fb69cb249ac86408cad77bcce0950e60cc6491e0117c26f206e91/aind_behavior_services-0.13.0.tar.gz", hash = "sha256:21874c1a4555ab2a3c2afef895f279dda48ea0cc3dbc6a7a2ee6fbd7139dc544", size = 25839, upload-time = "2026-01-29T17:13:41.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/35/6df8230287d3747ff04192b16bd61aec4bbf4867271c619960f5f66ea222/aind_behavior_services-0.13.0-py3-none-any.whl", hash = "sha256:9b0fe77c0a4ecddf9fcf1b1d8e791de2e16ad36425d053fc587f195f88bb7286", size = 35478, upload-time = "2026-01-29T17:13:40.979Z" }, +] [[package]] name = "aind-behavior-vr-foraging" -version = "0.6.5" +version = "0.7.0rc0" source = { editable = "." } dependencies = [ { name = "aind-behavior-services" }, @@ -91,9 +95,9 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names" }, + { name = "aind-behavior-services", specifier = ">=0.13" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9" }, { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.4" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, @@ -121,8 +125,8 @@ docs = [ [[package]] name = "aind-clabe" -version = "0.10.0rc7" -source = { git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking#c4f6e7c14960981fbaee30b7818f08e0e1f6930c" } +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-services" }, { name = "gitpython" }, @@ -133,6 +137,10 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/41/e1/adad7bfdaa645adedcc675b42e21bb79d91bf04a41fe8ca5f639f10bc05a/aind_clabe-0.10.0.tar.gz", hash = "sha256:0d4331c25c1842b07fbabbb9a9724e393ff2eb7f3ee91ca30fab7af12993fc0b", size = 70824, upload-time = "2026-01-29T17:41:10.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/8a/4389a0ef7e8958a5a8001ef5f7f00ea121ad0feda92571c0947e85a99d58/aind_clabe-0.10.0-py3-none-any.whl", hash = "sha256:dabe20924c236303613a31c4166579f838441060958029e8dca530aa2d3056ad", size = 94256, upload-time = "2026-01-29T17:41:12.205Z" }, +] [package.optional-dependencies] aind-services = [ @@ -152,16 +160,17 @@ aind-services = [ [[package]] name = "aind-data-schema" version = "2.4.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#58069c82bd294184d7fd1e49ef2fa810272a0779" } +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#81638e92bd131e871b8c95e60225e4c65494f552" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, + { name = "pydantic-extra-types" }, ] [[package]] name = "aind-data-schema-models" -version = "5.2.2" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#8bf1da4cde1561bcdb683d9ee15130fd0296c4aa" } +version = "5.3.0" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#049f4319ab0c69874cc88bc04257c505bdb52ec5" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, @@ -205,6 +214,15 @@ 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 = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -278,11 +296,11 @@ erdantic = [ [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +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/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { 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]] @@ -597,64 +615,61 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, - { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, - { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, - { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, - { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, - { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, + { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, + { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, + { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, + { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605, upload-time = "2026-02-10T19:18:29.233Z" }, ] [[package]] @@ -1289,99 +1304,99 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, - { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, - { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, - { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, - { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, - { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, - { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, - { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, - { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, - { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, - { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, - { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, - { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, - { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, - { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, - { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, - { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, - { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, - { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, - { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, - { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, - { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, - { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089, upload-time = "2026-01-10T06:43:27.535Z" }, - { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230, upload-time = "2026-01-10T06:43:29.298Z" }, - { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125, upload-time = "2026-01-10T06:43:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, - { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, - { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, - { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, - { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, - { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, - { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138, upload-time = "2026-01-10T06:43:48.854Z" }, - { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478, upload-time = "2026-01-10T06:43:50.476Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981, upload-time = "2026-01-10T06:43:52.575Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, - { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, - { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, - { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, - { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, - { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, - { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, - { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, - { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, - { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, - { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, - { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, - { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, - { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, - { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, - { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, - { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, + { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, + { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, + { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, + { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, + { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, + { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, + { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, + { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, + { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, + { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, + { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, + { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, + { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, + { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, + { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, + { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, + { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, + { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, + { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, + { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, + { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, + { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, + { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, + { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, + { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, + { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, ] [[package]] name = "opencv-python" -version = "4.13.0.90" +version = "4.13.0.92" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/77/d7/133d5756aef78090f4d8dd4895793aed24942dec6064a15375cfac9175fc/opencv_python-4.13.0.90-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:58803f8b05b51d8a785e2306d83b44173b32536f980342f3bc76d8c122b5938d", size = 46020278, upload-time = "2026-01-18T08:57:42.539Z" }, - { url = "https://files.pythonhosted.org/packages/7b/65/3b8cdbe13fa2436695d00e1d8c1ddf5edb4050a93436f34ed867233d1960/opencv_python-4.13.0.90-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:a5354e8b161409fce7710ba4c1cfe88b7bb460d97f705dc4e714a1636616f87d", size = 32568376, upload-time = "2026-01-18T08:58:47.19Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/e4d7c165e678563f49505d3d2811fcc16011e929cd00bc4b0070c7ee82b0/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d557cbf0c7818081c9acf56585b68e781af4f00638971f75eaa3de70904a6314", size = 47685110, upload-time = "2026-01-18T08:59:58.045Z" }, - { url = "https://files.pythonhosted.org/packages/cf/02/d9b73dbce28712204e85ae4c1e179505e9a771f95b33743a97e170caedde/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9911581e37b24169e4842069ff01d6645ea2bc4af7e10a022d9ebe340fd035ec", size = 70460479, upload-time = "2026-01-18T09:01:16.377Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1c/87fa71968beb71481ed359e21772061ceff7c9b45a61b3e7daa71e5b0b66/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1150b8f1947761b848bbfa9c96ceba8877743ffef157c08a04af6f7717ddd709", size = 46707819, upload-time = "2026-01-18T09:02:48.049Z" }, - { url = "https://files.pythonhosted.org/packages/af/16/915a94e5b537c328fa3e96b769c7d4eed3b67d1be978e0af658a3d3faed8/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d6716f16149b04eea52f953b8ca983d60dd9cd4872c1fd5113f6e2fcebb90e93", size = 72926629, upload-time = "2026-01-18T09:04:29.23Z" }, - { url = "https://files.pythonhosted.org/packages/bf/84/9c63c84be013943dd4c5fff36157f1ec0ec894b69a2fc3026fd4e3c9280a/opencv_python-4.13.0.90-cp37-abi3-win32.whl", hash = "sha256:458a00f2ba47a877eca385be3e7bcc45e6d30a4361d107ce73c1800f516dab09", size = 30932151, upload-time = "2026-01-18T09:05:22.181Z" }, - { url = "https://files.pythonhosted.org/packages/13/de/291cbb17f44242ed6bfd3450fc2535d6bd298115c0ccd6f01cd51d4a11d7/opencv_python-4.13.0.90-cp37-abi3-win_amd64.whl", hash = "sha256:526bde4c33a86808a751e2bb57bf4921beb49794621810971926c472897f6433", size = 40211706, upload-time = "2026-01-18T09:06:06.749Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6f/5a28fef4c4a382be06afe3938c64cc168223016fa520c5abaf37e8862aa5/opencv_python-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:caf60c071ec391ba51ed00a4a920f996d0b64e3e46068aac1f646b5de0326a19", size = 46247052, upload-time = "2026-02-05T07:01:25.046Z" }, + { url = "https://files.pythonhosted.org/packages/08/ac/6c98c44c650b8114a0fb901691351cfb3956d502e8e9b5cd27f4ee7fbf2f/opencv_python-4.13.0.92-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:5868a8c028a0b37561579bfb8ac1875babdc69546d236249fff296a8c010ccf9", size = 32568781, upload-time = "2026-02-05T07:01:41.379Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/82fed528b45173bf629fa44effb76dff8bc9f4eeaee759038362dfa60237/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bc2596e68f972ca452d80f444bc404e08807d021fbba40df26b61b18e01838a", size = 47685527, upload-time = "2026-02-05T06:59:11.24Z" }, + { url = "https://files.pythonhosted.org/packages/db/07/90b34a8e2cf9c50fe8ed25cac9011cde0676b4d9d9c973751ac7616223a2/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:402033cddf9d294693094de5ef532339f14ce821da3ad7df7c9f6e8316da32cf", size = 70460872, upload-time = "2026-02-05T06:59:19.162Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/7a9cc719b3eaf4377b9c2e3edeb7ed3a81de41f96421510c0a169ca3cfd4/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bccaabf9eb7f897ca61880ce2869dcd9b25b72129c28478e7f2a5e8dee945616", size = 46708208, upload-time = "2026-02-05T06:59:15.419Z" }, + { url = "https://files.pythonhosted.org/packages/fd/55/b3b49a1b97aabcfbbd6c7326df9cb0b6fa0c0aefa8e89d500939e04aa229/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:620d602b8f7d8b8dab5f4b99c6eb353e78d3fb8b0f53db1bd258bb1aa001c1d5", size = 72927042, upload-time = "2026-02-05T06:59:23.389Z" }, + { url = "https://files.pythonhosted.org/packages/fb/17/de5458312bcb07ddf434d7bfcb24bb52c59635ad58c6e7c751b48949b009/opencv_python-4.13.0.92-cp37-abi3-win32.whl", hash = "sha256:372fe164a3148ac1ca51e5f3ad0541a4a276452273f503441d718fab9c5e5f59", size = 30932638, upload-time = "2026-02-05T07:02:14.98Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a5/1be1516390333ff9be3a9cb648c9f33df79d5096e5884b5df71a588af463/opencv_python-4.13.0.92-cp37-abi3-win_amd64.whl", hash = "sha256:423d934c9fafb91aad38edf26efb46da91ffbc05f3f59c4b0c72e699720706f5", size = 40212062, upload-time = "2026-02-05T07:02:12.724Z" }, ] [[package]] @@ -1455,89 +1470,89 @@ wheels = [ [[package]] name = "pillow" -version = "12.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" }, - { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" }, - { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" }, - { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" }, - { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" }, - { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" }, - { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" }, - { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" }, - { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" }, - { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, - { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, - { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, - { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, - { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, - { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, - { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c7/2530a4aa28248623e9d7f27316b42e27c32ec410f695929696f2e0e4a778/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1", size = 4062543, upload-time = "2026-01-02T09:11:31.566Z" }, - { url = "https://files.pythonhosted.org/packages/8f/1f/40b8eae823dc1519b87d53c30ed9ef085506b05281d313031755c1705f73/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179", size = 4138373, upload-time = "2026-01-02T09:11:33.367Z" }, - { url = "https://files.pythonhosted.org/packages/d4/77/6fa60634cf06e52139fd0e89e5bbf055e8166c691c42fb162818b7fda31d/pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0", size = 3601241, upload-time = "2026-01-02T09:11:35.011Z" }, - { url = "https://files.pythonhosted.org/packages/4f/bf/28ab865de622e14b747f0cd7877510848252d950e43002e224fb1c9ababf/pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587", size = 5262410, upload-time = "2026-01-02T09:11:36.682Z" }, - { url = "https://files.pythonhosted.org/packages/1c/34/583420a1b55e715937a85bd48c5c0991598247a1fd2eb5423188e765ea02/pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac", size = 4657312, upload-time = "2026-01-02T09:11:38.535Z" }, - { url = "https://files.pythonhosted.org/packages/1d/fd/f5a0896839762885b3376ff04878f86ab2b097c2f9a9cdccf4eda8ba8dc0/pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b", size = 6232605, upload-time = "2026-01-02T09:11:40.602Z" }, - { url = "https://files.pythonhosted.org/packages/98/aa/938a09d127ac1e70e6ed467bd03834350b33ef646b31edb7452d5de43792/pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea", size = 8041617, upload-time = "2026-01-02T09:11:42.721Z" }, - { url = "https://files.pythonhosted.org/packages/17/e8/538b24cb426ac0186e03f80f78bc8dc7246c667f58b540bdd57c71c9f79d/pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c", size = 6346509, upload-time = "2026-01-02T09:11:44.955Z" }, - { url = "https://files.pythonhosted.org/packages/01/9a/632e58ec89a32738cabfd9ec418f0e9898a2b4719afc581f07c04a05e3c9/pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc", size = 7038117, upload-time = "2026-01-02T09:11:46.736Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a2/d40308cf86eada842ca1f3ffa45d0ca0df7e4ab33c83f81e73f5eaed136d/pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644", size = 6460151, upload-time = "2026-01-02T09:11:48.625Z" }, - { url = "https://files.pythonhosted.org/packages/f1/88/f5b058ad6453a085c5266660a1417bdad590199da1b32fb4efcff9d33b05/pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c", size = 7164534, upload-time = "2026-01-02T09:11:50.445Z" }, - { url = "https://files.pythonhosted.org/packages/19/ce/c17334caea1db789163b5d855a5735e47995b0b5dc8745e9a3605d5f24c0/pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171", size = 6332551, upload-time = "2026-01-02T09:11:52.234Z" }, - { url = "https://files.pythonhosted.org/packages/e5/07/74a9d941fa45c90a0d9465098fe1ec85de3e2afbdc15cc4766622d516056/pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a", size = 7040087, upload-time = "2026-01-02T09:11:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/88/09/c99950c075a0e9053d8e880595926302575bc742b1b47fe1bbcc8d388d50/pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45", size = 2452470, upload-time = "2026-01-02T09:11:56.522Z" }, - { url = "https://files.pythonhosted.org/packages/b5/ba/970b7d85ba01f348dee4d65412476321d40ee04dcb51cd3735b9dc94eb58/pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d", size = 5264816, upload-time = "2026-01-02T09:11:58.227Z" }, - { url = "https://files.pythonhosted.org/packages/10/60/650f2fb55fdba7a510d836202aa52f0baac633e50ab1cf18415d332188fb/pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0", size = 4660472, upload-time = "2026-01-02T09:12:00.798Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c0/5273a99478956a099d533c4f46cbaa19fd69d606624f4334b85e50987a08/pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554", size = 6268974, upload-time = "2026-01-02T09:12:02.572Z" }, - { url = "https://files.pythonhosted.org/packages/b4/26/0bf714bc2e73d5267887d47931d53c4ceeceea6978148ed2ab2a4e6463c4/pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e", size = 8073070, upload-time = "2026-01-02T09:12:04.75Z" }, - { url = "https://files.pythonhosted.org/packages/43/cf/1ea826200de111a9d65724c54f927f3111dc5ae297f294b370a670c17786/pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82", size = 6380176, upload-time = "2026-01-02T09:12:06.626Z" }, - { url = "https://files.pythonhosted.org/packages/03/e0/7938dd2b2013373fd85d96e0f38d62b7a5a262af21ac274250c7ca7847c9/pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4", size = 7067061, upload-time = "2026-01-02T09:12:08.624Z" }, - { url = "https://files.pythonhosted.org/packages/86/ad/a2aa97d37272a929a98437a8c0ac37b3cf012f4f8721e1bd5154699b2518/pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0", size = 6491824, upload-time = "2026-01-02T09:12:10.488Z" }, - { url = "https://files.pythonhosted.org/packages/a4/44/80e46611b288d51b115826f136fb3465653c28f491068a72d3da49b54cd4/pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b", size = 7190911, upload-time = "2026-01-02T09:12:12.772Z" }, - { url = "https://files.pythonhosted.org/packages/86/77/eacc62356b4cf81abe99ff9dbc7402750044aed02cfd6a503f7c6fc11f3e/pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65", size = 6336445, upload-time = "2026-01-02T09:12:14.775Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3c/57d81d0b74d218706dafccb87a87ea44262c43eef98eb3b164fd000e0491/pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0", size = 7045354, upload-time = "2026-01-02T09:12:16.599Z" }, - { url = "https://files.pythonhosted.org/packages/ac/82/8b9b97bba2e3576a340f93b044a3a3a09841170ab4c1eb0d5c93469fd32f/pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8", size = 2454547, upload-time = "2026-01-02T09:12:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, - { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, - { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, - { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, - { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, - { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, - { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, - { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, - { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, - { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, - { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, - { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, - { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, - { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, - { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, - { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, - { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, - { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" }, - { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" }, - { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" }, - { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" }, - { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" }, - { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, + { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, + { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, ] [[package]] @@ -1710,6 +1725,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] +[[package]] +name = "pydantic-extra-types" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/35/2fee58b1316a73e025728583d3b1447218a97e621933fc776fb8c0f2ebdd/pydantic_extra_types-2.11.0.tar.gz", hash = "sha256:4e9991959d045b75feb775683437a97991d02c138e00b59176571db9ce634f0e", size = 157226, upload-time = "2025-12-31T16:18:27.944Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/17/fabd56da47096d240dd45ba627bead0333b0cf0ee8ada9bec579287dadf3/pydantic_extra_types-2.11.0-py3-none-any.whl", hash = "sha256:84b864d250a0fc62535b7ec591e36f2c5b4d1325fa0017eb8cda9aeb63b374a6", size = 74296, upload-time = "2025-12-31T16:18:26.38Z" }, +] + [[package]] name = "pydantic-settings" version = "2.12.0" @@ -1755,11 +1783,11 @@ sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b0 [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.11.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload-time = "2026-01-30T19:59:55.694Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload-time = "2026-01-30T19:59:54.539Z" }, ] [package.optional-dependencies] @@ -1915,15 +1943,15 @@ wheels = [ [[package]] name = "rich" -version = "14.3.1" +version = "14.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, + { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, ] [[package]] @@ -1997,28 +2025,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, - { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, - { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, - { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, - { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, - { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, - { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, - { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, - { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, - { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, - { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, - { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" }, + { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" }, + { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" }, + { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" }, + { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" }, + { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" }, + { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" }, + { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" }, + { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" }, + { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" }, ] [[package]] @@ -2343,17 +2370,17 @@ wheels = [ [[package]] name = "typer" -version = "0.21.1" +version = "0.23.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-doc" }, { name = "click" }, { name = "rich" }, { name = "shellingham" }, - { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/bf/8825b5929afd84d0dabd606c67cd57b8388cb3ec385f7ef19c5cc2202069/typer-0.21.1.tar.gz", hash = "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d", size = 110371, upload-time = "2026-01-06T11:21:10.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/07/b822e1b307d40e263e8253d2384cf98c51aa2368cc7ba9a07e523a1d964b/typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134", size = 120047, upload-time = "2026-02-13T10:04:30.984Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/1d/d9257dd49ff2ca23ea5f132edf1281a0c4f9de8a762b9ae399b670a59235/typer-0.21.1-py3-none-any.whl", hash = "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", size = 47381, upload-time = "2026-01-06T11:21:09.824Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e", size = 56813, upload-time = "2026-02-13T10:04:32.008Z" }, ] [[package]] @@ -2397,11 +2424,11 @@ wheels = [ [[package]] name = "wcwidth" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/6e/62daec357285b927e82263a81f3b4c1790215bc77c42530ce4a69d501a43/wcwidth-0.5.0.tar.gz", hash = "sha256:f89c103c949a693bf563377b2153082bf58e309919dfb7f27b04d862a0089333", size = 246585, upload-time = "2026-01-27T01:31:44.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, ] [[package]] From 2fdedd651e07e79b5e90cfb72eb0576ba421ca2e Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:21:55 -0800 Subject: [PATCH 06/31] Update against aind-behavior-services --- examples/task_patch_foraging.py | 2 +- examples/test_single_site_patch.py | 4 +- pyproject.toml | 4 +- scripts/aind.py | 2 +- .../data_mappers/_session.py | 2 +- src/aind_behavior_vr_foraging/regenerate.py | 8 +- tests/test_bonsai.py | 2 +- uv.lock | 565 +++++++++--------- 8 files changed, 281 insertions(+), 308 deletions(-) diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 25d0c0d9..283dd389 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -3,7 +3,7 @@ import aind_behavior_services.task.distributions as distributions from aind_behavior_curriculum import Stage, TrainerState -import aind_behavior_vr_foraging.task_logic as vr_task_logic +import aind_behavior_vr_foraging.task as vr_task_logic def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimum, maximum): diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index ce424ccd..32ef8890 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -4,8 +4,8 @@ import aind_behavior_services.task.distributions as distributions from aind_behavior_curriculum import Stage, TrainerState -import aind_behavior_vr_foraging.task_logic as vr_task_logic -from aind_behavior_vr_foraging.task_logic import ( +import aind_behavior_vr_foraging.task as vr_task_logic +from aind_behavior_vr_foraging.task import ( AindVrForagingTaskLogic, AindVrForagingTaskParameters, ) diff --git a/pyproject.toml b/pyproject.toml index 92755008..8ff026af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.7.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.13", + "aind_behavior_services@git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@refactor-class-names", "pydantic-settings" ] @@ -31,7 +31,7 @@ Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/rel data = ["contraqctor>=0.5.3, <0.6.0"] launcher = [ - "aind-clabe[aind-services]>=0.9", + "aind-clabe[aind-services]@git+https://github.com/AllenNeuralDynamics/clabe@refactor-against-aind-behavior-services-breaking", "aind-data-schema>=2.4", "aind_behavior_vr_foraging[data]", ] diff --git a/scripts/aind.py b/scripts/aind.py index 4315aba1..43f8ab31 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -5,6 +5,7 @@ from aind_behavior_services.rig.aind_manipulator import ManipulatorPosition from aind_behavior_services.session import Session from aind_behavior_services.utils import utcnow +from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from clabe import resource_monitor from clabe.apps import ( AindBehaviorServicesBonsaiApp, @@ -22,7 +23,6 @@ from aind_behavior_vr_foraging import data_contract from aind_behavior_vr_foraging.data_mappers import DataMapperCli from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic logger = logging.getLogger(__name__) diff --git a/src/aind_behavior_vr_foraging/data_mappers/_session.py b/src/aind_behavior_vr_foraging/data_mappers/_session.py index 92cecd92..4432aeb9 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_session.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_session.py @@ -44,7 +44,7 @@ def __init__( abs_schemas_path = Path(self._data_path) / "Behavior" / "Logs" self.session_model = model_from_json_file(abs_schemas_path / "session_input.json", Session) self.rig_model = model_from_json_file(abs_schemas_path / "rig_input.json", AindVrForagingRig) - self.task_model = model_from_json_file(abs_schemas_path / "tasklogic_input.json", AindVrForagingTaskLogic) + self.task_model = model_from_json_file(abs_schemas_path / "task_input.json", AindVrForagingTaskLogic) if curriculum_suggestion is not None: if isinstance(curriculum_suggestion, CurriculumSuggestion): diff --git a/src/aind_behavior_vr_foraging/regenerate.py b/src/aind_behavior_vr_foraging/regenerate.py index 5fd3ef44..5dbaac59 100644 --- a/src/aind_behavior_vr_foraging/regenerate.py +++ b/src/aind_behavior_vr_foraging/regenerate.py @@ -6,7 +6,7 @@ from aind_behavior_services.session import Session import aind_behavior_vr_foraging.rig -import aind_behavior_vr_foraging.task_logic +import aind_behavior_vr_foraging.task SCHEMA_ROOT = Path("./src/DataSchemas/") EXTENSIONS_ROOT = Path("./src/Extensions/") @@ -15,11 +15,11 @@ def main(): models = [ - aind_behavior_vr_foraging.task_logic.AindVrForagingTaskLogic, + aind_behavior_vr_foraging.task.AindVrForagingTaskLogic, aind_behavior_vr_foraging.rig.AindVrForagingRig, Session, - aind_behavior_vr_foraging.task_logic.VirtualSite, - aind_behavior_vr_foraging.task_logic.VisualCorridor, + aind_behavior_vr_foraging.task.VirtualSite, + aind_behavior_vr_foraging.task.VisualCorridor, ] model = pydantic.RootModel[Union[tuple(models)]] diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index 502cd0c3..5935af0e 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -8,10 +8,10 @@ from aind_behavior_services.session import Session from aind_behavior_services.utils import run_bonsai_process +from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from pydantic import ValidationError from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic sys.path.append(".") from examples import rig, session, task_patch_foraging # isort:skip # pylint: disable=wrong-import-position diff --git a/uv.lock b/uv.lock index 16e376c1..ac033737 100644 --- a/uv.lock +++ b/uv.lock @@ -41,8 +41,8 @@ wheels = [ [[package]] name = "aind-behavior-services" -version = "0.13.0" -source = { registry = "https://pypi.org/simple" } +version = "0.13.0rc2" +source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names#0e3d08a4162afc5d0118dc5c1eb589e983b83c44" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, @@ -50,14 +50,10 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/52/169fe25fb69cb249ac86408cad77bcce0950e60cc6491e0117c26f206e91/aind_behavior_services-0.13.0.tar.gz", hash = "sha256:21874c1a4555ab2a3c2afef895f279dda48ea0cc3dbc6a7a2ee6fbd7139dc544", size = 25839, upload-time = "2026-01-29T17:13:41.928Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/35/6df8230287d3747ff04192b16bd61aec4bbf4867271c619960f5f66ea222/aind_behavior_services-0.13.0-py3-none-any.whl", hash = "sha256:9b0fe77c0a4ecddf9fcf1b1d8e791de2e16ad36425d053fc587f195f88bb7286", size = 35478, upload-time = "2026-01-29T17:13:40.979Z" }, -] [[package]] name = "aind-behavior-vr-foraging" -version = "0.7.0rc0" +version = "0.6.4" source = { editable = "." } dependencies = [ { name = "aind-behavior-services" }, @@ -95,9 +91,9 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", specifier = ">=0.13" }, + { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking" }, { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.4" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, @@ -125,8 +121,8 @@ docs = [ [[package]] name = "aind-clabe" -version = "0.10.0" -source = { registry = "https://pypi.org/simple" } +version = "0.10.0rc7" +source = { git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking#c4f6e7c14960981fbaee30b7818f08e0e1f6930c" } dependencies = [ { name = "aind-behavior-services" }, { name = "gitpython" }, @@ -137,10 +133,6 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/e1/adad7bfdaa645adedcc675b42e21bb79d91bf04a41fe8ca5f639f10bc05a/aind_clabe-0.10.0.tar.gz", hash = "sha256:0d4331c25c1842b07fbabbb9a9724e393ff2eb7f3ee91ca30fab7af12993fc0b", size = 70824, upload-time = "2026-01-29T17:41:10.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/8a/4389a0ef7e8958a5a8001ef5f7f00ea121ad0feda92571c0947e85a99d58/aind_clabe-0.10.0-py3-none-any.whl", hash = "sha256:dabe20924c236303613a31c4166579f838441060958029e8dca530aa2d3056ad", size = 94256, upload-time = "2026-01-29T17:41:12.205Z" }, -] [package.optional-dependencies] aind-services = [ @@ -160,17 +152,16 @@ aind-services = [ [[package]] name = "aind-data-schema" version = "2.4.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#81638e92bd131e871b8c95e60225e4c65494f552" } +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#58069c82bd294184d7fd1e49ef2fa810272a0779" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, - { name = "pydantic-extra-types" }, ] [[package]] name = "aind-data-schema-models" -version = "5.3.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#049f4319ab0c69874cc88bc04257c505bdb52ec5" } +version = "5.2.2" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#8bf1da4cde1561bcdb683d9ee15130fd0296c4aa" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, @@ -214,15 +205,6 @@ 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 = "annotated-doc" -version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, -] - [[package]] name = "annotated-types" version = "0.7.0" @@ -296,11 +278,11 @@ erdantic = [ [[package]] name = "babel" -version = "2.18.0" +version = "2.17.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" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } 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" }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] [[package]] @@ -615,61 +597,64 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.5" +version = "46.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, - { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, - { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, - { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, - { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, - { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, - { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, - { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, - { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, - { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, - { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, - { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, - { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, - { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, - { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, - { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, - { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, - { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, - { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, - { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, - { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, - { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, - { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, - { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, - { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, - { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, - { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, - { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605, upload-time = "2026-02-10T19:18:29.233Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, + { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, + { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, + { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, + { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, ] [[package]] @@ -1304,99 +1289,99 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, - { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, - { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, - { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, - { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, - { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, - { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, - { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, - { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, - { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, - { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, - { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, - { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, - { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, - { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, - { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, - { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, - { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, - { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, - { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, - { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, - { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, - { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, - { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, - { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, - { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, - { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, - { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, - { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, - { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, - { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, - { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, - { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, - { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, - { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, - { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, - { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, - { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, - { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, - { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, - { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, - { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, - { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, - { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, - { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, - { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, - { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, - { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, - { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, - { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, - { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, - { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, - { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, - { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, - { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, + { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, + { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, + { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, + { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, + { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, + { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, + { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, + { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, + { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, + { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, + { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, + { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, + { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, + { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089, upload-time = "2026-01-10T06:43:27.535Z" }, + { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230, upload-time = "2026-01-10T06:43:29.298Z" }, + { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125, upload-time = "2026-01-10T06:43:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, + { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, + { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, + { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, + { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138, upload-time = "2026-01-10T06:43:48.854Z" }, + { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478, upload-time = "2026-01-10T06:43:50.476Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981, upload-time = "2026-01-10T06:43:52.575Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, + { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, + { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, + { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, + { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, + { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, + { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, + { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, + { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, + { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, + { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, + { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, + { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, + { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, + { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, ] [[package]] name = "opencv-python" -version = "4.13.0.92" +version = "4.13.0.90" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/6f/5a28fef4c4a382be06afe3938c64cc168223016fa520c5abaf37e8862aa5/opencv_python-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:caf60c071ec391ba51ed00a4a920f996d0b64e3e46068aac1f646b5de0326a19", size = 46247052, upload-time = "2026-02-05T07:01:25.046Z" }, - { url = "https://files.pythonhosted.org/packages/08/ac/6c98c44c650b8114a0fb901691351cfb3956d502e8e9b5cd27f4ee7fbf2f/opencv_python-4.13.0.92-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:5868a8c028a0b37561579bfb8ac1875babdc69546d236249fff296a8c010ccf9", size = 32568781, upload-time = "2026-02-05T07:01:41.379Z" }, - { url = "https://files.pythonhosted.org/packages/3e/51/82fed528b45173bf629fa44effb76dff8bc9f4eeaee759038362dfa60237/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bc2596e68f972ca452d80f444bc404e08807d021fbba40df26b61b18e01838a", size = 47685527, upload-time = "2026-02-05T06:59:11.24Z" }, - { url = "https://files.pythonhosted.org/packages/db/07/90b34a8e2cf9c50fe8ed25cac9011cde0676b4d9d9c973751ac7616223a2/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:402033cddf9d294693094de5ef532339f14ce821da3ad7df7c9f6e8316da32cf", size = 70460872, upload-time = "2026-02-05T06:59:19.162Z" }, - { url = "https://files.pythonhosted.org/packages/02/6d/7a9cc719b3eaf4377b9c2e3edeb7ed3a81de41f96421510c0a169ca3cfd4/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bccaabf9eb7f897ca61880ce2869dcd9b25b72129c28478e7f2a5e8dee945616", size = 46708208, upload-time = "2026-02-05T06:59:15.419Z" }, - { url = "https://files.pythonhosted.org/packages/fd/55/b3b49a1b97aabcfbbd6c7326df9cb0b6fa0c0aefa8e89d500939e04aa229/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:620d602b8f7d8b8dab5f4b99c6eb353e78d3fb8b0f53db1bd258bb1aa001c1d5", size = 72927042, upload-time = "2026-02-05T06:59:23.389Z" }, - { url = "https://files.pythonhosted.org/packages/fb/17/de5458312bcb07ddf434d7bfcb24bb52c59635ad58c6e7c751b48949b009/opencv_python-4.13.0.92-cp37-abi3-win32.whl", hash = "sha256:372fe164a3148ac1ca51e5f3ad0541a4a276452273f503441d718fab9c5e5f59", size = 30932638, upload-time = "2026-02-05T07:02:14.98Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a5/1be1516390333ff9be3a9cb648c9f33df79d5096e5884b5df71a588af463/opencv_python-4.13.0.92-cp37-abi3-win_amd64.whl", hash = "sha256:423d934c9fafb91aad38edf26efb46da91ffbc05f3f59c4b0c72e699720706f5", size = 40212062, upload-time = "2026-02-05T07:02:12.724Z" }, + { url = "https://files.pythonhosted.org/packages/77/d7/133d5756aef78090f4d8dd4895793aed24942dec6064a15375cfac9175fc/opencv_python-4.13.0.90-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:58803f8b05b51d8a785e2306d83b44173b32536f980342f3bc76d8c122b5938d", size = 46020278, upload-time = "2026-01-18T08:57:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/7b/65/3b8cdbe13fa2436695d00e1d8c1ddf5edb4050a93436f34ed867233d1960/opencv_python-4.13.0.90-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:a5354e8b161409fce7710ba4c1cfe88b7bb460d97f705dc4e714a1636616f87d", size = 32568376, upload-time = "2026-01-18T08:58:47.19Z" }, + { url = "https://files.pythonhosted.org/packages/34/ff/e4d7c165e678563f49505d3d2811fcc16011e929cd00bc4b0070c7ee82b0/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d557cbf0c7818081c9acf56585b68e781af4f00638971f75eaa3de70904a6314", size = 47685110, upload-time = "2026-01-18T08:59:58.045Z" }, + { url = "https://files.pythonhosted.org/packages/cf/02/d9b73dbce28712204e85ae4c1e179505e9a771f95b33743a97e170caedde/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9911581e37b24169e4842069ff01d6645ea2bc4af7e10a022d9ebe340fd035ec", size = 70460479, upload-time = "2026-01-18T09:01:16.377Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1c/87fa71968beb71481ed359e21772061ceff7c9b45a61b3e7daa71e5b0b66/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1150b8f1947761b848bbfa9c96ceba8877743ffef157c08a04af6f7717ddd709", size = 46707819, upload-time = "2026-01-18T09:02:48.049Z" }, + { url = "https://files.pythonhosted.org/packages/af/16/915a94e5b537c328fa3e96b769c7d4eed3b67d1be978e0af658a3d3faed8/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d6716f16149b04eea52f953b8ca983d60dd9cd4872c1fd5113f6e2fcebb90e93", size = 72926629, upload-time = "2026-01-18T09:04:29.23Z" }, + { url = "https://files.pythonhosted.org/packages/bf/84/9c63c84be013943dd4c5fff36157f1ec0ec894b69a2fc3026fd4e3c9280a/opencv_python-4.13.0.90-cp37-abi3-win32.whl", hash = "sha256:458a00f2ba47a877eca385be3e7bcc45e6d30a4361d107ce73c1800f516dab09", size = 30932151, upload-time = "2026-01-18T09:05:22.181Z" }, + { url = "https://files.pythonhosted.org/packages/13/de/291cbb17f44242ed6bfd3450fc2535d6bd298115c0ccd6f01cd51d4a11d7/opencv_python-4.13.0.90-cp37-abi3-win_amd64.whl", hash = "sha256:526bde4c33a86808a751e2bb57bf4921beb49794621810971926c472897f6433", size = 40211706, upload-time = "2026-01-18T09:06:06.749Z" }, ] [[package]] @@ -1470,89 +1455,89 @@ wheels = [ [[package]] name = "pillow" -version = "12.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, - { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, - { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, - { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, - { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, - { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, - { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, - { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, - { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, - { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, - { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, - { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, - { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, - { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, - { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, - { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, - { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, - { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, - { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, - { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, - { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, - { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, - { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, - { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, - { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, - { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, - { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, - { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, - { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, - { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, - { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, - { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, - { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, - { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, - { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, - { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, - { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, - { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, - { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, - { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, - { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, - { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, - { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, - { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, - { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, - { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, - { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, - { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, - { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, - { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, - { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, - { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, - { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, - { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, - { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, - { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, - { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, - { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, - { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, - { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, - { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, - { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, +version = "12.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" }, + { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" }, + { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" }, + { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" }, + { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" }, + { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" }, + { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" }, + { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" }, + { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, + { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, + { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, + { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c7/2530a4aa28248623e9d7f27316b42e27c32ec410f695929696f2e0e4a778/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1", size = 4062543, upload-time = "2026-01-02T09:11:31.566Z" }, + { url = "https://files.pythonhosted.org/packages/8f/1f/40b8eae823dc1519b87d53c30ed9ef085506b05281d313031755c1705f73/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179", size = 4138373, upload-time = "2026-01-02T09:11:33.367Z" }, + { url = "https://files.pythonhosted.org/packages/d4/77/6fa60634cf06e52139fd0e89e5bbf055e8166c691c42fb162818b7fda31d/pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0", size = 3601241, upload-time = "2026-01-02T09:11:35.011Z" }, + { url = "https://files.pythonhosted.org/packages/4f/bf/28ab865de622e14b747f0cd7877510848252d950e43002e224fb1c9ababf/pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587", size = 5262410, upload-time = "2026-01-02T09:11:36.682Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/583420a1b55e715937a85bd48c5c0991598247a1fd2eb5423188e765ea02/pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac", size = 4657312, upload-time = "2026-01-02T09:11:38.535Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fd/f5a0896839762885b3376ff04878f86ab2b097c2f9a9cdccf4eda8ba8dc0/pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b", size = 6232605, upload-time = "2026-01-02T09:11:40.602Z" }, + { url = "https://files.pythonhosted.org/packages/98/aa/938a09d127ac1e70e6ed467bd03834350b33ef646b31edb7452d5de43792/pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea", size = 8041617, upload-time = "2026-01-02T09:11:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/17/e8/538b24cb426ac0186e03f80f78bc8dc7246c667f58b540bdd57c71c9f79d/pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c", size = 6346509, upload-time = "2026-01-02T09:11:44.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/632e58ec89a32738cabfd9ec418f0e9898a2b4719afc581f07c04a05e3c9/pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc", size = 7038117, upload-time = "2026-01-02T09:11:46.736Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a2/d40308cf86eada842ca1f3ffa45d0ca0df7e4ab33c83f81e73f5eaed136d/pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644", size = 6460151, upload-time = "2026-01-02T09:11:48.625Z" }, + { url = "https://files.pythonhosted.org/packages/f1/88/f5b058ad6453a085c5266660a1417bdad590199da1b32fb4efcff9d33b05/pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c", size = 7164534, upload-time = "2026-01-02T09:11:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/19/ce/c17334caea1db789163b5d855a5735e47995b0b5dc8745e9a3605d5f24c0/pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171", size = 6332551, upload-time = "2026-01-02T09:11:52.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/07/74a9d941fa45c90a0d9465098fe1ec85de3e2afbdc15cc4766622d516056/pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a", size = 7040087, upload-time = "2026-01-02T09:11:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/88/09/c99950c075a0e9053d8e880595926302575bc742b1b47fe1bbcc8d388d50/pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45", size = 2452470, upload-time = "2026-01-02T09:11:56.522Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ba/970b7d85ba01f348dee4d65412476321d40ee04dcb51cd3735b9dc94eb58/pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d", size = 5264816, upload-time = "2026-01-02T09:11:58.227Z" }, + { url = "https://files.pythonhosted.org/packages/10/60/650f2fb55fdba7a510d836202aa52f0baac633e50ab1cf18415d332188fb/pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0", size = 4660472, upload-time = "2026-01-02T09:12:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/5273a99478956a099d533c4f46cbaa19fd69d606624f4334b85e50987a08/pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554", size = 6268974, upload-time = "2026-01-02T09:12:02.572Z" }, + { url = "https://files.pythonhosted.org/packages/b4/26/0bf714bc2e73d5267887d47931d53c4ceeceea6978148ed2ab2a4e6463c4/pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e", size = 8073070, upload-time = "2026-01-02T09:12:04.75Z" }, + { url = "https://files.pythonhosted.org/packages/43/cf/1ea826200de111a9d65724c54f927f3111dc5ae297f294b370a670c17786/pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82", size = 6380176, upload-time = "2026-01-02T09:12:06.626Z" }, + { url = "https://files.pythonhosted.org/packages/03/e0/7938dd2b2013373fd85d96e0f38d62b7a5a262af21ac274250c7ca7847c9/pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4", size = 7067061, upload-time = "2026-01-02T09:12:08.624Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/a2aa97d37272a929a98437a8c0ac37b3cf012f4f8721e1bd5154699b2518/pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0", size = 6491824, upload-time = "2026-01-02T09:12:10.488Z" }, + { url = "https://files.pythonhosted.org/packages/a4/44/80e46611b288d51b115826f136fb3465653c28f491068a72d3da49b54cd4/pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b", size = 7190911, upload-time = "2026-01-02T09:12:12.772Z" }, + { url = "https://files.pythonhosted.org/packages/86/77/eacc62356b4cf81abe99ff9dbc7402750044aed02cfd6a503f7c6fc11f3e/pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65", size = 6336445, upload-time = "2026-01-02T09:12:14.775Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3c/57d81d0b74d218706dafccb87a87ea44262c43eef98eb3b164fd000e0491/pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0", size = 7045354, upload-time = "2026-01-02T09:12:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/ac/82/8b9b97bba2e3576a340f93b044a3a3a09841170ab4c1eb0d5c93469fd32f/pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8", size = 2454547, upload-time = "2026-01-02T09:12:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, + { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, + { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, + { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, + { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, + { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, + { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, + { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, + { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, + { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, + { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" }, + { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" }, + { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" }, + { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" }, + { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, ] [[package]] @@ -1725,19 +1710,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] -[[package]] -name = "pydantic-extra-types" -version = "2.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/35/2fee58b1316a73e025728583d3b1447218a97e621933fc776fb8c0f2ebdd/pydantic_extra_types-2.11.0.tar.gz", hash = "sha256:4e9991959d045b75feb775683437a97991d02c138e00b59176571db9ce634f0e", size = 157226, upload-time = "2025-12-31T16:18:27.944Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/17/fabd56da47096d240dd45ba627bead0333b0cf0ee8ada9bec579287dadf3/pydantic_extra_types-2.11.0-py3-none-any.whl", hash = "sha256:84b864d250a0fc62535b7ec591e36f2c5b4d1325fa0017eb8cda9aeb63b374a6", size = 74296, upload-time = "2025-12-31T16:18:26.38Z" }, -] - [[package]] name = "pydantic-settings" version = "2.12.0" @@ -1783,11 +1755,11 @@ sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b0 [[package]] name = "pyjwt" -version = "2.11.0" +version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload-time = "2026-01-30T19:59:55.694Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload-time = "2026-01-30T19:59:54.539Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, ] [package.optional-dependencies] @@ -1943,15 +1915,15 @@ wheels = [ [[package]] name = "rich" -version = "14.3.2" +version = "14.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, + { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, ] [[package]] @@ -2025,27 +1997,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" }, - { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" }, - { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" }, - { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" }, - { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" }, - { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" }, - { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" }, - { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" }, - { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" }, - { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" }, - { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" }, - { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" }, - { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" }, +version = "0.14.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, ] [[package]] @@ -2370,17 +2343,17 @@ wheels = [ [[package]] name = "typer" -version = "0.23.1" +version = "0.21.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "annotated-doc" }, { name = "click" }, { name = "rich" }, { name = "shellingham" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/07/b822e1b307d40e263e8253d2384cf98c51aa2368cc7ba9a07e523a1d964b/typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134", size = 120047, upload-time = "2026-02-13T10:04:30.984Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/bf/8825b5929afd84d0dabd606c67cd57b8388cb3ec385f7ef19c5cc2202069/typer-0.21.1.tar.gz", hash = "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d", size = 110371, upload-time = "2026-01-06T11:21:10.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e", size = 56813, upload-time = "2026-02-13T10:04:32.008Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/d9257dd49ff2ca23ea5f132edf1281a0c4f9de8a762b9ae399b670a59235/typer-0.21.1-py3-none-any.whl", hash = "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", size = 47381, upload-time = "2026-01-06T11:21:09.824Z" }, ] [[package]] @@ -2424,11 +2397,11 @@ wheels = [ [[package]] name = "wcwidth" -version = "0.6.0" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/6e/62daec357285b927e82263a81f3b4c1790215bc77c42530ce4a69d501a43/wcwidth-0.5.0.tar.gz", hash = "sha256:f89c103c949a693bf563377b2153082bf58e309919dfb7f27b04d862a0089333", size = 246585, upload-time = "2026-01-27T01:31:44.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, ] [[package]] From b08ab4733c2c8a52fe04ba59576fb35795446ccc Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 11:03:03 -0800 Subject: [PATCH 07/31] Linting --- examples/task_patch_foraging.py | 3 +-- examples/test_single_site_patch.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 283dd389..7198a72e 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -1,9 +1,8 @@ import os import aind_behavior_services.task.distributions as distributions -from aind_behavior_curriculum import Stage, TrainerState - import aind_behavior_vr_foraging.task as vr_task_logic +from aind_behavior_curriculum import Stage, TrainerState def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimum, maximum): diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index 32ef8890..233f3116 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -2,9 +2,8 @@ from typing import Optional import aind_behavior_services.task.distributions as distributions -from aind_behavior_curriculum import Stage, TrainerState - import aind_behavior_vr_foraging.task as vr_task_logic +from aind_behavior_curriculum import Stage, TrainerState from aind_behavior_vr_foraging.task import ( AindVrForagingTaskLogic, AindVrForagingTaskParameters, From c5e74a9b8addaacba4936d23ac80c39eb1b60f94 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 12:07:29 -0800 Subject: [PATCH 08/31] Update references to aind-behavior-services 0.13 release --- examples/task_patch_foraging.py | 3 +- examples/test_single_site_patch.py | 5 +- pyproject.toml | 4 +- scripts/aind.py | 2 +- .../data_mappers/_session.py | 2 +- src/aind_behavior_vr_foraging/regenerate.py | 8 +- tests/test_bonsai.py | 2 +- uv.lock | 565 +++++++++--------- 8 files changed, 310 insertions(+), 281 deletions(-) diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 7198a72e..25d0c0d9 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -1,9 +1,10 @@ import os import aind_behavior_services.task.distributions as distributions -import aind_behavior_vr_foraging.task as vr_task_logic from aind_behavior_curriculum import Stage, TrainerState +import aind_behavior_vr_foraging.task_logic as vr_task_logic + def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimum, maximum): return vr_task_logic.NumericalUpdaterParameters( diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index 233f3116..ce424ccd 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -2,9 +2,10 @@ from typing import Optional import aind_behavior_services.task.distributions as distributions -import aind_behavior_vr_foraging.task as vr_task_logic from aind_behavior_curriculum import Stage, TrainerState -from aind_behavior_vr_foraging.task import ( + +import aind_behavior_vr_foraging.task_logic as vr_task_logic +from aind_behavior_vr_foraging.task_logic import ( AindVrForagingTaskLogic, AindVrForagingTaskParameters, ) diff --git a/pyproject.toml b/pyproject.toml index 8ff026af..92755008 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.7.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services@git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@refactor-class-names", + "aind_behavior_services>=0.13", "pydantic-settings" ] @@ -31,7 +31,7 @@ Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/rel data = ["contraqctor>=0.5.3, <0.6.0"] launcher = [ - "aind-clabe[aind-services]@git+https://github.com/AllenNeuralDynamics/clabe@refactor-against-aind-behavior-services-breaking", + "aind-clabe[aind-services]>=0.9", "aind-data-schema>=2.4", "aind_behavior_vr_foraging[data]", ] diff --git a/scripts/aind.py b/scripts/aind.py index 43f8ab31..4315aba1 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -5,7 +5,6 @@ from aind_behavior_services.rig.aind_manipulator import ManipulatorPosition from aind_behavior_services.session import Session from aind_behavior_services.utils import utcnow -from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from clabe import resource_monitor from clabe.apps import ( AindBehaviorServicesBonsaiApp, @@ -23,6 +22,7 @@ from aind_behavior_vr_foraging import data_contract from aind_behavior_vr_foraging.data_mappers import DataMapperCli from aind_behavior_vr_foraging.rig import AindVrForagingRig +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic logger = logging.getLogger(__name__) diff --git a/src/aind_behavior_vr_foraging/data_mappers/_session.py b/src/aind_behavior_vr_foraging/data_mappers/_session.py index 4432aeb9..92cecd92 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_session.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_session.py @@ -44,7 +44,7 @@ def __init__( abs_schemas_path = Path(self._data_path) / "Behavior" / "Logs" self.session_model = model_from_json_file(abs_schemas_path / "session_input.json", Session) self.rig_model = model_from_json_file(abs_schemas_path / "rig_input.json", AindVrForagingRig) - self.task_model = model_from_json_file(abs_schemas_path / "task_input.json", AindVrForagingTaskLogic) + self.task_model = model_from_json_file(abs_schemas_path / "tasklogic_input.json", AindVrForagingTaskLogic) if curriculum_suggestion is not None: if isinstance(curriculum_suggestion, CurriculumSuggestion): diff --git a/src/aind_behavior_vr_foraging/regenerate.py b/src/aind_behavior_vr_foraging/regenerate.py index 5dbaac59..5fd3ef44 100644 --- a/src/aind_behavior_vr_foraging/regenerate.py +++ b/src/aind_behavior_vr_foraging/regenerate.py @@ -6,7 +6,7 @@ from aind_behavior_services.session import Session import aind_behavior_vr_foraging.rig -import aind_behavior_vr_foraging.task +import aind_behavior_vr_foraging.task_logic SCHEMA_ROOT = Path("./src/DataSchemas/") EXTENSIONS_ROOT = Path("./src/Extensions/") @@ -15,11 +15,11 @@ def main(): models = [ - aind_behavior_vr_foraging.task.AindVrForagingTaskLogic, + aind_behavior_vr_foraging.task_logic.AindVrForagingTaskLogic, aind_behavior_vr_foraging.rig.AindVrForagingRig, Session, - aind_behavior_vr_foraging.task.VirtualSite, - aind_behavior_vr_foraging.task.VisualCorridor, + aind_behavior_vr_foraging.task_logic.VirtualSite, + aind_behavior_vr_foraging.task_logic.VisualCorridor, ] model = pydantic.RootModel[Union[tuple(models)]] diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index 5935af0e..502cd0c3 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -8,10 +8,10 @@ from aind_behavior_services.session import Session from aind_behavior_services.utils import run_bonsai_process -from aind_behavior_vr_foraging.task import AindVrForagingTaskLogic from pydantic import ValidationError from aind_behavior_vr_foraging.rig import AindVrForagingRig +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic sys.path.append(".") from examples import rig, session, task_patch_foraging # isort:skip # pylint: disable=wrong-import-position diff --git a/uv.lock b/uv.lock index ac033737..16e376c1 100644 --- a/uv.lock +++ b/uv.lock @@ -41,8 +41,8 @@ wheels = [ [[package]] name = "aind-behavior-services" -version = "0.13.0rc2" -source = { git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names#0e3d08a4162afc5d0118dc5c1eb589e983b83c44" } +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-curriculum" }, { name = "gitpython" }, @@ -50,10 +50,14 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/e8/52/169fe25fb69cb249ac86408cad77bcce0950e60cc6491e0117c26f206e91/aind_behavior_services-0.13.0.tar.gz", hash = "sha256:21874c1a4555ab2a3c2afef895f279dda48ea0cc3dbc6a7a2ee6fbd7139dc544", size = 25839, upload-time = "2026-01-29T17:13:41.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/35/6df8230287d3747ff04192b16bd61aec4bbf4867271c619960f5f66ea222/aind_behavior_services-0.13.0-py3-none-any.whl", hash = "sha256:9b0fe77c0a4ecddf9fcf1b1d8e791de2e16ad36425d053fc587f195f88bb7286", size = 35478, upload-time = "2026-01-29T17:13:40.979Z" }, +] [[package]] name = "aind-behavior-vr-foraging" -version = "0.6.4" +version = "0.7.0rc0" source = { editable = "." } dependencies = [ { name = "aind-behavior-services" }, @@ -91,9 +95,9 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", git = "https://github.com/AllenNeuralDynamics/Aind.Behavior.Services?rev=refactor-class-names" }, + { name = "aind-behavior-services", specifier = ">=0.13" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9" }, { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.4" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, @@ -121,8 +125,8 @@ docs = [ [[package]] name = "aind-clabe" -version = "0.10.0rc7" -source = { git = "https://github.com/AllenNeuralDynamics/clabe?rev=refactor-against-aind-behavior-services-breaking#c4f6e7c14960981fbaee30b7818f08e0e1f6930c" } +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-services" }, { name = "gitpython" }, @@ -133,6 +137,10 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/41/e1/adad7bfdaa645adedcc675b42e21bb79d91bf04a41fe8ca5f639f10bc05a/aind_clabe-0.10.0.tar.gz", hash = "sha256:0d4331c25c1842b07fbabbb9a9724e393ff2eb7f3ee91ca30fab7af12993fc0b", size = 70824, upload-time = "2026-01-29T17:41:10.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/8a/4389a0ef7e8958a5a8001ef5f7f00ea121ad0feda92571c0947e85a99d58/aind_clabe-0.10.0-py3-none-any.whl", hash = "sha256:dabe20924c236303613a31c4166579f838441060958029e8dca530aa2d3056ad", size = 94256, upload-time = "2026-01-29T17:41:12.205Z" }, +] [package.optional-dependencies] aind-services = [ @@ -152,16 +160,17 @@ aind-services = [ [[package]] name = "aind-data-schema" version = "2.4.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#58069c82bd294184d7fd1e49ef2fa810272a0779" } +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#81638e92bd131e871b8c95e60225e4c65494f552" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, + { name = "pydantic-extra-types" }, ] [[package]] name = "aind-data-schema-models" -version = "5.2.2" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#8bf1da4cde1561bcdb683d9ee15130fd0296c4aa" } +version = "5.3.0" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#049f4319ab0c69874cc88bc04257c505bdb52ec5" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, @@ -205,6 +214,15 @@ 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 = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -278,11 +296,11 @@ erdantic = [ [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +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/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { 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]] @@ -597,64 +615,61 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, - { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, - { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, - { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, - { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, - { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, + { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, + { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, + { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, + { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605, upload-time = "2026-02-10T19:18:29.233Z" }, ] [[package]] @@ -1289,99 +1304,99 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, - { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, - { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, - { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, - { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, - { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, - { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, - { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, - { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, - { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, - { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, - { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, - { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, - { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, - { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, - { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, - { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, - { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, - { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, - { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, - { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, - { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, - { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089, upload-time = "2026-01-10T06:43:27.535Z" }, - { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230, upload-time = "2026-01-10T06:43:29.298Z" }, - { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125, upload-time = "2026-01-10T06:43:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, - { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, - { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, - { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, - { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, - { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, - { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138, upload-time = "2026-01-10T06:43:48.854Z" }, - { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478, upload-time = "2026-01-10T06:43:50.476Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981, upload-time = "2026-01-10T06:43:52.575Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, - { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, - { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, - { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, - { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, - { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, - { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, - { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, - { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, - { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, - { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, - { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, - { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, - { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, - { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, - { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, - { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, + { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, + { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, + { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, + { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, + { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, + { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, + { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, + { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, + { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, + { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, + { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, + { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, + { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, + { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, + { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, + { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, + { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, + { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, + { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, + { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, + { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, + { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, + { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, + { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, + { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, + { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, ] [[package]] name = "opencv-python" -version = "4.13.0.90" +version = "4.13.0.92" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/77/d7/133d5756aef78090f4d8dd4895793aed24942dec6064a15375cfac9175fc/opencv_python-4.13.0.90-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:58803f8b05b51d8a785e2306d83b44173b32536f980342f3bc76d8c122b5938d", size = 46020278, upload-time = "2026-01-18T08:57:42.539Z" }, - { url = "https://files.pythonhosted.org/packages/7b/65/3b8cdbe13fa2436695d00e1d8c1ddf5edb4050a93436f34ed867233d1960/opencv_python-4.13.0.90-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:a5354e8b161409fce7710ba4c1cfe88b7bb460d97f705dc4e714a1636616f87d", size = 32568376, upload-time = "2026-01-18T08:58:47.19Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/e4d7c165e678563f49505d3d2811fcc16011e929cd00bc4b0070c7ee82b0/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d557cbf0c7818081c9acf56585b68e781af4f00638971f75eaa3de70904a6314", size = 47685110, upload-time = "2026-01-18T08:59:58.045Z" }, - { url = "https://files.pythonhosted.org/packages/cf/02/d9b73dbce28712204e85ae4c1e179505e9a771f95b33743a97e170caedde/opencv_python-4.13.0.90-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9911581e37b24169e4842069ff01d6645ea2bc4af7e10a022d9ebe340fd035ec", size = 70460479, upload-time = "2026-01-18T09:01:16.377Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1c/87fa71968beb71481ed359e21772061ceff7c9b45a61b3e7daa71e5b0b66/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1150b8f1947761b848bbfa9c96ceba8877743ffef157c08a04af6f7717ddd709", size = 46707819, upload-time = "2026-01-18T09:02:48.049Z" }, - { url = "https://files.pythonhosted.org/packages/af/16/915a94e5b537c328fa3e96b769c7d4eed3b67d1be978e0af658a3d3faed8/opencv_python-4.13.0.90-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d6716f16149b04eea52f953b8ca983d60dd9cd4872c1fd5113f6e2fcebb90e93", size = 72926629, upload-time = "2026-01-18T09:04:29.23Z" }, - { url = "https://files.pythonhosted.org/packages/bf/84/9c63c84be013943dd4c5fff36157f1ec0ec894b69a2fc3026fd4e3c9280a/opencv_python-4.13.0.90-cp37-abi3-win32.whl", hash = "sha256:458a00f2ba47a877eca385be3e7bcc45e6d30a4361d107ce73c1800f516dab09", size = 30932151, upload-time = "2026-01-18T09:05:22.181Z" }, - { url = "https://files.pythonhosted.org/packages/13/de/291cbb17f44242ed6bfd3450fc2535d6bd298115c0ccd6f01cd51d4a11d7/opencv_python-4.13.0.90-cp37-abi3-win_amd64.whl", hash = "sha256:526bde4c33a86808a751e2bb57bf4921beb49794621810971926c472897f6433", size = 40211706, upload-time = "2026-01-18T09:06:06.749Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6f/5a28fef4c4a382be06afe3938c64cc168223016fa520c5abaf37e8862aa5/opencv_python-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:caf60c071ec391ba51ed00a4a920f996d0b64e3e46068aac1f646b5de0326a19", size = 46247052, upload-time = "2026-02-05T07:01:25.046Z" }, + { url = "https://files.pythonhosted.org/packages/08/ac/6c98c44c650b8114a0fb901691351cfb3956d502e8e9b5cd27f4ee7fbf2f/opencv_python-4.13.0.92-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:5868a8c028a0b37561579bfb8ac1875babdc69546d236249fff296a8c010ccf9", size = 32568781, upload-time = "2026-02-05T07:01:41.379Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/82fed528b45173bf629fa44effb76dff8bc9f4eeaee759038362dfa60237/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bc2596e68f972ca452d80f444bc404e08807d021fbba40df26b61b18e01838a", size = 47685527, upload-time = "2026-02-05T06:59:11.24Z" }, + { url = "https://files.pythonhosted.org/packages/db/07/90b34a8e2cf9c50fe8ed25cac9011cde0676b4d9d9c973751ac7616223a2/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:402033cddf9d294693094de5ef532339f14ce821da3ad7df7c9f6e8316da32cf", size = 70460872, upload-time = "2026-02-05T06:59:19.162Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/7a9cc719b3eaf4377b9c2e3edeb7ed3a81de41f96421510c0a169ca3cfd4/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bccaabf9eb7f897ca61880ce2869dcd9b25b72129c28478e7f2a5e8dee945616", size = 46708208, upload-time = "2026-02-05T06:59:15.419Z" }, + { url = "https://files.pythonhosted.org/packages/fd/55/b3b49a1b97aabcfbbd6c7326df9cb0b6fa0c0aefa8e89d500939e04aa229/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:620d602b8f7d8b8dab5f4b99c6eb353e78d3fb8b0f53db1bd258bb1aa001c1d5", size = 72927042, upload-time = "2026-02-05T06:59:23.389Z" }, + { url = "https://files.pythonhosted.org/packages/fb/17/de5458312bcb07ddf434d7bfcb24bb52c59635ad58c6e7c751b48949b009/opencv_python-4.13.0.92-cp37-abi3-win32.whl", hash = "sha256:372fe164a3148ac1ca51e5f3ad0541a4a276452273f503441d718fab9c5e5f59", size = 30932638, upload-time = "2026-02-05T07:02:14.98Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a5/1be1516390333ff9be3a9cb648c9f33df79d5096e5884b5df71a588af463/opencv_python-4.13.0.92-cp37-abi3-win_amd64.whl", hash = "sha256:423d934c9fafb91aad38edf26efb46da91ffbc05f3f59c4b0c72e699720706f5", size = 40212062, upload-time = "2026-02-05T07:02:12.724Z" }, ] [[package]] @@ -1455,89 +1470,89 @@ wheels = [ [[package]] name = "pillow" -version = "12.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" }, - { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" }, - { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" }, - { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" }, - { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" }, - { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" }, - { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" }, - { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" }, - { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" }, - { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, - { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, - { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, - { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, - { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, - { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, - { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c7/2530a4aa28248623e9d7f27316b42e27c32ec410f695929696f2e0e4a778/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1", size = 4062543, upload-time = "2026-01-02T09:11:31.566Z" }, - { url = "https://files.pythonhosted.org/packages/8f/1f/40b8eae823dc1519b87d53c30ed9ef085506b05281d313031755c1705f73/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179", size = 4138373, upload-time = "2026-01-02T09:11:33.367Z" }, - { url = "https://files.pythonhosted.org/packages/d4/77/6fa60634cf06e52139fd0e89e5bbf055e8166c691c42fb162818b7fda31d/pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0", size = 3601241, upload-time = "2026-01-02T09:11:35.011Z" }, - { url = "https://files.pythonhosted.org/packages/4f/bf/28ab865de622e14b747f0cd7877510848252d950e43002e224fb1c9ababf/pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587", size = 5262410, upload-time = "2026-01-02T09:11:36.682Z" }, - { url = "https://files.pythonhosted.org/packages/1c/34/583420a1b55e715937a85bd48c5c0991598247a1fd2eb5423188e765ea02/pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac", size = 4657312, upload-time = "2026-01-02T09:11:38.535Z" }, - { url = "https://files.pythonhosted.org/packages/1d/fd/f5a0896839762885b3376ff04878f86ab2b097c2f9a9cdccf4eda8ba8dc0/pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b", size = 6232605, upload-time = "2026-01-02T09:11:40.602Z" }, - { url = "https://files.pythonhosted.org/packages/98/aa/938a09d127ac1e70e6ed467bd03834350b33ef646b31edb7452d5de43792/pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea", size = 8041617, upload-time = "2026-01-02T09:11:42.721Z" }, - { url = "https://files.pythonhosted.org/packages/17/e8/538b24cb426ac0186e03f80f78bc8dc7246c667f58b540bdd57c71c9f79d/pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c", size = 6346509, upload-time = "2026-01-02T09:11:44.955Z" }, - { url = "https://files.pythonhosted.org/packages/01/9a/632e58ec89a32738cabfd9ec418f0e9898a2b4719afc581f07c04a05e3c9/pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc", size = 7038117, upload-time = "2026-01-02T09:11:46.736Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a2/d40308cf86eada842ca1f3ffa45d0ca0df7e4ab33c83f81e73f5eaed136d/pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644", size = 6460151, upload-time = "2026-01-02T09:11:48.625Z" }, - { url = "https://files.pythonhosted.org/packages/f1/88/f5b058ad6453a085c5266660a1417bdad590199da1b32fb4efcff9d33b05/pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c", size = 7164534, upload-time = "2026-01-02T09:11:50.445Z" }, - { url = "https://files.pythonhosted.org/packages/19/ce/c17334caea1db789163b5d855a5735e47995b0b5dc8745e9a3605d5f24c0/pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171", size = 6332551, upload-time = "2026-01-02T09:11:52.234Z" }, - { url = "https://files.pythonhosted.org/packages/e5/07/74a9d941fa45c90a0d9465098fe1ec85de3e2afbdc15cc4766622d516056/pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a", size = 7040087, upload-time = "2026-01-02T09:11:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/88/09/c99950c075a0e9053d8e880595926302575bc742b1b47fe1bbcc8d388d50/pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45", size = 2452470, upload-time = "2026-01-02T09:11:56.522Z" }, - { url = "https://files.pythonhosted.org/packages/b5/ba/970b7d85ba01f348dee4d65412476321d40ee04dcb51cd3735b9dc94eb58/pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d", size = 5264816, upload-time = "2026-01-02T09:11:58.227Z" }, - { url = "https://files.pythonhosted.org/packages/10/60/650f2fb55fdba7a510d836202aa52f0baac633e50ab1cf18415d332188fb/pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0", size = 4660472, upload-time = "2026-01-02T09:12:00.798Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c0/5273a99478956a099d533c4f46cbaa19fd69d606624f4334b85e50987a08/pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554", size = 6268974, upload-time = "2026-01-02T09:12:02.572Z" }, - { url = "https://files.pythonhosted.org/packages/b4/26/0bf714bc2e73d5267887d47931d53c4ceeceea6978148ed2ab2a4e6463c4/pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e", size = 8073070, upload-time = "2026-01-02T09:12:04.75Z" }, - { url = "https://files.pythonhosted.org/packages/43/cf/1ea826200de111a9d65724c54f927f3111dc5ae297f294b370a670c17786/pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82", size = 6380176, upload-time = "2026-01-02T09:12:06.626Z" }, - { url = "https://files.pythonhosted.org/packages/03/e0/7938dd2b2013373fd85d96e0f38d62b7a5a262af21ac274250c7ca7847c9/pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4", size = 7067061, upload-time = "2026-01-02T09:12:08.624Z" }, - { url = "https://files.pythonhosted.org/packages/86/ad/a2aa97d37272a929a98437a8c0ac37b3cf012f4f8721e1bd5154699b2518/pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0", size = 6491824, upload-time = "2026-01-02T09:12:10.488Z" }, - { url = "https://files.pythonhosted.org/packages/a4/44/80e46611b288d51b115826f136fb3465653c28f491068a72d3da49b54cd4/pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b", size = 7190911, upload-time = "2026-01-02T09:12:12.772Z" }, - { url = "https://files.pythonhosted.org/packages/86/77/eacc62356b4cf81abe99ff9dbc7402750044aed02cfd6a503f7c6fc11f3e/pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65", size = 6336445, upload-time = "2026-01-02T09:12:14.775Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3c/57d81d0b74d218706dafccb87a87ea44262c43eef98eb3b164fd000e0491/pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0", size = 7045354, upload-time = "2026-01-02T09:12:16.599Z" }, - { url = "https://files.pythonhosted.org/packages/ac/82/8b9b97bba2e3576a340f93b044a3a3a09841170ab4c1eb0d5c93469fd32f/pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8", size = 2454547, upload-time = "2026-01-02T09:12:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, - { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, - { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, - { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, - { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, - { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, - { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, - { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, - { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, - { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, - { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, - { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, - { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, - { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, - { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, - { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, - { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, - { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" }, - { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" }, - { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" }, - { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" }, - { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" }, - { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, + { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, + { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, ] [[package]] @@ -1710,6 +1725,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] +[[package]] +name = "pydantic-extra-types" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/35/2fee58b1316a73e025728583d3b1447218a97e621933fc776fb8c0f2ebdd/pydantic_extra_types-2.11.0.tar.gz", hash = "sha256:4e9991959d045b75feb775683437a97991d02c138e00b59176571db9ce634f0e", size = 157226, upload-time = "2025-12-31T16:18:27.944Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/17/fabd56da47096d240dd45ba627bead0333b0cf0ee8ada9bec579287dadf3/pydantic_extra_types-2.11.0-py3-none-any.whl", hash = "sha256:84b864d250a0fc62535b7ec591e36f2c5b4d1325fa0017eb8cda9aeb63b374a6", size = 74296, upload-time = "2025-12-31T16:18:26.38Z" }, +] + [[package]] name = "pydantic-settings" version = "2.12.0" @@ -1755,11 +1783,11 @@ sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b0 [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.11.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload-time = "2026-01-30T19:59:55.694Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload-time = "2026-01-30T19:59:54.539Z" }, ] [package.optional-dependencies] @@ -1915,15 +1943,15 @@ wheels = [ [[package]] name = "rich" -version = "14.3.1" +version = "14.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, + { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, ] [[package]] @@ -1997,28 +2025,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, - { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, - { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, - { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, - { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, - { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, - { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, - { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, - { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, - { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, - { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, - { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" }, + { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" }, + { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" }, + { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" }, + { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" }, + { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" }, + { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" }, + { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" }, + { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" }, + { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" }, ] [[package]] @@ -2343,17 +2370,17 @@ wheels = [ [[package]] name = "typer" -version = "0.21.1" +version = "0.23.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-doc" }, { name = "click" }, { name = "rich" }, { name = "shellingham" }, - { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/bf/8825b5929afd84d0dabd606c67cd57b8388cb3ec385f7ef19c5cc2202069/typer-0.21.1.tar.gz", hash = "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d", size = 110371, upload-time = "2026-01-06T11:21:10.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/07/b822e1b307d40e263e8253d2384cf98c51aa2368cc7ba9a07e523a1d964b/typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134", size = 120047, upload-time = "2026-02-13T10:04:30.984Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/1d/d9257dd49ff2ca23ea5f132edf1281a0c4f9de8a762b9ae399b670a59235/typer-0.21.1-py3-none-any.whl", hash = "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", size = 47381, upload-time = "2026-01-06T11:21:09.824Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e", size = 56813, upload-time = "2026-02-13T10:04:32.008Z" }, ] [[package]] @@ -2397,11 +2424,11 @@ wheels = [ [[package]] name = "wcwidth" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/6e/62daec357285b927e82263a81f3b4c1790215bc77c42530ce4a69d501a43/wcwidth-0.5.0.tar.gz", hash = "sha256:f89c103c949a693bf563377b2153082bf58e309919dfb7f27b04d862a0089333", size = 246585, upload-time = "2026-01-27T01:31:44.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, ] [[package]] From 985bd18cdb31bfbba5e665bfe89e805f2359dae0 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 12:39:32 -0800 Subject: [PATCH 09/31] Add calibration workflow --- scripts/aind.py | 37 +- src/calibration.bonsai | 3109 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3142 insertions(+), 4 deletions(-) create mode 100644 src/calibration.bonsai diff --git a/scripts/aind.py b/scripts/aind.py index 4315aba1..f3dd6b3b 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -143,12 +143,41 @@ async def aind_experiment_protocol(launcher: Launcher) -> None: return +@experiment() +async def calibration_protocol(launcher: Launcher) -> None: + # Start experiment setup + picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) + + # Pick and register session + session = Session(subject="CALIBRATION", experiment="CALIBRATION", date=utcnow()) + + # Fetch rig settings + rig = picker.pick_rig(AindVrForagingRig) + + launcher.register_session(session, rig.data_directory) + + resource_monitor.ResourceMonitor( + constrains=[ + resource_monitor.available_storage_constraint_factory(rig.data_directory, 2e11), + ] + ).run() + + # Run the task via Bonsai + bonsai_app = AindBehaviorServicesBonsaiApp( + workflow=Path(r"./src/main.bonsai"), + temp_directory=launcher.temp_dir, + rig=rig, + ) + await bonsai_app.run_async() + logger.info("Calibration protocol completed successfully.") + + def _dump_suggestion(suggestion: CurriculumSuggestion, session_directory: Path) -> Path: - logger.info(f"Dumping curriculum suggestion to: {session_directory / 'Behavior' / 'Logs' / 'suggestion.json'}") - suggestion_path = session_directory / "Behavior" / "Logs" / "suggestion.json" - with open(suggestion_path, "w", encoding="utf-8") as f: + path = session_directory / "Behavior" / "Logs" / "suggestion.json" + logger.info("Dumping curriculum suggestion to: %s", path) + with open(path, "w", encoding="utf-8") as f: f.write(suggestion.model_dump_json(indent=2)) - return suggestion_path + return path class ByAnimalManipulatorModifier(ByAnimalModifier[AindVrForagingRig]): diff --git a/src/calibration.bonsai b/src/calibration.bonsai new file mode 100644 index 00000000..3ce518b9 --- /dev/null +++ b/src/calibration.bonsai @@ -0,0 +1,3109 @@ + + + + + + + + + ReadSchemas + + + + + + + + + + + + RawTaskLogicSchema + + + + + + + + + + + RawRigSchema + + + + + + + + + + + RawSessionSchema + + + + + + + + + + + + + + + + + + + + + + LoadSchemas + + + + RawRigSchema + + + + + + + 1 + + + + RigSchema + + + + + + + + + + + + + + Hardware + + + + ScreenConfiguration + + + + RigSchema + + + Screen + + + + + + + + + + + 1000 + 1000 + VrForaging + Off + false + Black + DepthBufferBit ColorBufferBit + false + + Resizable + Fullscreen + Second + 60 + 120 + + + + 8 + 8 + 8 + 8 + + 16 + 0 + 0 + + 0 + 0 + 0 + 0 + + 2 + false + + + + + + + + + + + + + + + + PT2S + + + + HarpDevices + + + + HarpWhiteRabbitEvents + + + + Include + Event + + + + + + + Seconds + + + HarpTimestampSource + + + HarpWhiteRabbitEvents + + + + + + HarpWhiteRabbitHeartbeat + + + TriggerHarpReadDump + + + RigSchema + + + HarpClockGenerator.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpOlfactometer.PortName + + + + + + + + COM6 + TriggerHarpReadDump + true + + + RigSchema + + + HarpLickometer.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpTreadmill + + + PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + Manipulator + + + Calibration + + + + None + + + + + + + RigSchema + + + Manipulator + + + PortName + + + + + + + + COMx + + + RigSchema + + + HarpSniffDetector.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpSniffDetector + + + + + + + RigSchema + + + HarpAnalogInput.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpAnalogInput + + + + + + + RigSchema + + + HarpEnvironmentSensor.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpEnvironmentSensor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cameras + + + + TriggeredCameras + + + + RigSchema + + + + 1 + + + + TriggeredCameraController + + + TriggeredCameraController + + + FrameRate.Value + + + CameraFrameRate + + + TriggeredCameraController + + + Cameras + + + CameraFrameRate + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + Include + Event + + + + + + + Value + + + + FrameAcquired + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + + + Item2.Seconds + + + FrameEvent + + + TriggeredCameraController + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + + true + + + + TriggeredCamerasInitialized + + + + 1 + + + + ThisCamera + + + Value + + + + + + + + + + + + + + + ThisCamera + + + Value + + + RegionOfInterest + + + + + + + + RegionOfInterest + + 0 + 0 + 0 + 0 + + + + + + + + + + + Default + 19000 + 0 + 1 + + Mono8 + + 0 + 0 + 0 + 0 + + + + + + FrameEvent + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SpinnakerApiNote + + + + + PT0S + PT0.1S + + + + + + + Item1 + + + + + + Item2 + Item1 + + + TriggeredCamerasStream + + + + TriggeredCamerasInitialized + + + + 1 + + + + + 0 + + + + + 1 + + + + + + + + TriggeredCameraController + + + Cameras + + + Count + + + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + 1 + + + + + PT0.1S + + + + TriggeredCamerasReady + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MonitoringCameras + + + + RigSchema + + + MonitoringCameraController + + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + ThisCamera + + + Value + + + Index + + + + + + + + + 0 + + + + + HarpTimestampSource + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + Item2 + Item1 + + + MonitoringCamerasStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SessionSettings + + + + + + + Initialization + + + + StartExperiment + + + GlobalActivePatch + + + GlobalActiveSite + + + UpdaterEvents + + + SoftwareEvent + + + RuntimeLogging + + + EndExperiment + + + StartLogging + + + Annotations + + + GlobalPatchState + + + + GlobalPatchState + + + + SoftwareEvent + + + Position + + + + CurrentPosition + + + IsStopped + + + MaxPosition + + + StopVelocityThreshold + + + FilteredCurrentVelocity + + + + + + + + false + + + + + 1 + + + + StartExperiment + + + + 1 + + + + + true + + + + EndExperiment + + + + 1 + + + + + false + + + + + + + ExperimentState + + + StartExperiment + + + + TriggerHarpReadDump + + + + + + + + + + + + + + + + + + + + + + + + OperationControl + + + + RewardControl + + + + WaterValve + + + + ValveOpenTimeMs + + + SetValue + + + + Source1 + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + + + + + + + 0 + + + + + PT0.01S + + + + + 0 + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + TriggerValve + + + TriggerValve + + + Write + + SupplyPort0 + + + + HarpBehaviorCommands + + + + + + + + + + + + + + + + 0 + true + + + + + 1 + + + + GiveReward + + + ForceGiveReward + + + GiveReward + + + HotGiveReward + + + GiveReward + + + ManualReward + + + + ForceGiveReward + + + + + + HasValue + + + + Source1 + + + HasValue + + + + + + + + + + + Value + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + RigSchema + + + Calibration.WaterValve + + + + + + RewardToTime + ((Item1 * 0.001) - Item2.Offset) / Item2.Slope + + + ToMilliseconds + + + + + 1000 + + + + + + + + + + 0 + + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + ValveOpenTimeMs + + + GiveReward + + + + GiveReward + + + + SoftwareEvent + + + ForceGiveReward + + + + ForceGiveReward + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FeedbackControl + + + + ChoiceFeedback + + + ChoiceFeedback + + + HotChoiceFeedback + + + ChoiceFeedback + + + + AudioTrigger + + + + ChoiceFeedback + + + + ChoiceFeedback + + + + SoftwareEvent + + + + + + + + + + + + + + Lickometer + + + + HarpLickometerEvents + + + + + + Value + + + + Channel0 + + + + + 0 + + + + + + + + + + IsLickOnset + + + + Source1 + + + Item1 + + + + + + + + + + + Item2.Seconds + + + LickEvent + + + HarpLickometerEvents + + + Write + + Active + true + false + Off + Off + Enabled + + + + + 1 + + + + HarpLickometerCommands + + + + + + + + + + + + + + + + + + + + + CameraControl + + + + HarpBehaviorEvents + + + + 1 + + + + TriggeredCamerasReady + + + + + + + 1 + + + + + PT2S + + + + + true + + + + CameraState + + + CameraState + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + HarpBehaviorCommands + + + StartLogging + + + + 1 + + + + + false + + + + CameraState + + + StartExperiment + + + + 1 + + + + + true + + + + CameraState + + + EndExperiment + + + + 1 + + + + + false + + + + CameraState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Thermistor/Pressure + + + + HarpSniffDetectorEvents + + + + + + RigSchema + + + HarpSniffDetector + + + + + + + ThermistorData + + + + + + + + + + + + + + AudioControl + + + + AudioDuration + + + + 1000 + + + + Write + + + + HarpBehaviorCommands + + + AudioFrequency + + + Write + + + + HarpBehaviorCommands + + + AudioTrigger + + + Write + + PwmDO2 + + + + HarpBehaviorCommands + + + InitialSettings + + + + HarpBehaviorEvents + + + Write + + 50 + + + + + 1 + + + + HarpBehaviorCommands + + + + 200 + + + + AudioDuration + + + + 9999 + + + + AudioFrequency + + + + + + + + + + + + + HarpBehaviorEvents + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + Visualizers + + + + + + + + true + + + + + 1 + + + + EnableExperimentUI + + + StartExperiment + + + + false + + + + EnableExperimentUI + + + CameraVisualizer + + + + TriggeredCamerasStream + + + + + + + TriggeredCamerasStream + + + + + + + MonitoringCamerasStream + + + + + + + CameraVisualizer + true + true + 3 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + TaskVisualizer + + + + OnlineLabels + + + + QCDiagnosis + + + Heartbeat + + + Harp: {0} + it + + + + + + + + false + true + + true + + + + + + QCDiagnosis + + + TotalReward + + + WaterConsumed: {0} + it + + + + + + + + false + true + + true + + + + + + QCDiagnosis + + + SecondsSinceChoice + + + TSinceChoice: {0:mm\:ss} + it + + + + + + + + false + true + + true + + + + + + Labels + true + true + 1 + 3 + + + + + + + + + + + + TimeStep.ElapsedRealTime + + + + TimeSpan.FromSeconds(it) + + + StartExperiment + + + + + + it.ToString("hh\:mm\:ss") + + + + + + + + ElapsedTime + false + true + + + + + + + TextLabels + true + true + Consolas, 16pt + 2 + 1 + + + + + + + QC + + + + HarpWhiteRabbitHeartbeat + + + SessionAccumulatedReward + + + + HotChoiceFeedback + + + + + + AccumulateTime + + + + + + + TimeStep.ElapsedRealTime + + + + + + + + + + + + + + + + + + + + + + + + + Item1.Seconds,Item2 + + + new( +Item1 as Heartbeat, +Item2.Item1 as TotalReward, +Item2.Item2 as SecondsSinceChoice) + + + + + 0 + + + + GiveReward + + + ForceGiveReward + + + + + + HasValue + + + + Source1 + + + HasValue + + + + + + + + + + + Value + + + + + + + SessionAccumulatedReward + + + + + + + + + + + + + + + + + + + + + + + + + + + + QCDiagnosis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Velocity + + + + FilteredCurrentVelocity + + + + + + StopVelocityThreshold + + + + + + Item1.Item1,Item2 + None + 2 + + 2000 + + + + + + + + + + + + + + + + + + + Thermistor + + + + ThermistorData + + + Seconds + Value + None + 2 + + 2000 + + + + + + + + + + + + + + + + true + true + 2 + 1 + + + + + + + + + Ethogram + + + + GlobalActiveSite + + + GlobalActivePatch + + + StateIndex + + + + + + + ##PatchVirtualSite + + + + SoftwareEvent + + + GiveReward + + + + Source1 + + + Name + + + + + + + GiveReward + + + + + + + + + + + + + + Gt0 + + + + Source1 + + + Data + + + + + + it.HasValue and it.Value>0 + + + + + + + + + + + + + SoftwareEvent + + + ChoiceFeedback + + + + Source1 + + + Name + + + + + + + ChoiceFeedback + + + + + + + + + + + + + + LickEvent + + + + ##Lick + + + + + PT0S + PT0.1S + + + + + ##UpdateTick + + + + + + + HarpTimestampSource + + + + + + + + + + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GlobalPatchState + + + + + + + SoftwareEvent + + + + + + true + true + 2 + 1 + + + + + + + + + DataVisualization + true + true + 1 + 4 + + + + + + + + + SubjectLabel + + + + + CALIBRATION + + + + + + + + + true + true + Microsoft Sans Serif, 20.25pt + + + + + + + + + + + + + + DataVisualization + true + true + 1 + 2 + + + + Percent + 0.94 + + + Percent + 0.06 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ValveGui + + + + true + true + true + true + false + + + + + + RunCalibration + true + true + RunCalibration + + + RunCalibration + + + + + + + false + + + + + 1 + + + + ValveFlushState + + + + + + + + + Source1 + + + + + + + + + + + Close Valves + + + + + + + + Source1 + + + + + + + + + + + Open Valves + + + + + + + + + + + + FlushValves + true + true + Open Valves + false + + + ValveFlushState + + + + + + EnableExperimentUI + + + + + + + + ValveCalibration + true + true + 2 + 2 + + + + + + + + + + + RunCalibration + + + + 1 + + + + + + + + + LoopValve + + + + + + + + PT0.5S + + + + + + + + 100 + + + + ValveOpenTimeMs + + + + TriggerValve + + + + + + + 200 + + + + + Q + Shift + + + + + + + + + + Index + + + + + + + + + + + + + + + + + + + + + + + + + ValveFlushState + + + Flush + + + + Source1 + + + + + + Source1 + + + + + + + + + + + 200 + + + + ValveOpenTimeMs + + + + TriggerValve + + + + PT0.2S + + + + + 300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HwShortcuts + + + + EnableExperimentUI + + + + + + + + TriggerAudio + true + true + TriggerAudio + + + + + + Source1 + + + + AudioTrigger + + + + + + + + + + + + + + + ForceReward + true + true + ForceReward + + + + + + Source1 + + + + 3 + + + + + 1 + + + + + + + Item2 + + + ForceGiveReward + + + + + + + + + + + + + + + + + + HwShortcuts + true + true + Microsoft Sans Serif, 20pt + 5 + 5 + + + + + + + + + + + + + + + + + + + + + + + + VrForaging + true + true + Microsoft Sans Serif, 12pt + + + + VrForaging + true + true + 1 + 2 + + + + Percent + 0.4 + + + Percent + 0.6 + + + + + + VrForaging + true + + + 640 + 480 + + Maximized + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 66ba7aa9a04d23dadb813bf84bcfd2c67b414245 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 12:46:12 -0800 Subject: [PATCH 10/31] Add default keyword to Field Fix #474 --- src/aind_behavior_vr_foraging/task_logic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index 8c577152..9ff88635 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -1053,7 +1053,7 @@ class Block(BaseModel): environment_statistics: EnvironmentStatistics = Field(description="Statistics of the environment") end_conditions: List[BlockEndCondition] = Field( - [], description="List of end conditions that must be true for the block to end." + default=[], description="List of end conditions that must be true for the block to end." ) From c400abc2b7c0930b9e7614f2d51f165c43618082 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 12:54:30 -0800 Subject: [PATCH 11/31] Force computer and rig name --- scripts/aind.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/scripts/aind.py b/scripts/aind.py index f3dd6b3b..8a9a5988 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -1,4 +1,5 @@ import logging +import os from pathlib import Path from typing import Any, cast @@ -40,6 +41,7 @@ async def aind_experiment_protocol(launcher: Launcher) -> None: # Fetch rig settings rig = picker.pick_rig(AindVrForagingRig) + ensure_rig_and_computer_name(rig) launcher.register_session(session, rig.data_directory) @@ -199,6 +201,34 @@ def _process_before_dump(self) -> ManipulatorPosition: return position +def ensure_rig_and_computer_name(rig: AindVrForagingRig) -> None: + """Ensures rig and computer name are set from environment variables if available, otherwise defaults to rig configuration values.""" + rig_name = os.environ.get("aibs_comp_id", None) + computer_name = os.environ.get("hostname", None) + + if rig_name is None: + logger.warning( + "'aibs_comp_id' environment variable not set. Defaulting to rig name from configuration. %s", rig.rig_name + ) + rig_name = rig.rig_name + if computer_name is None: + computer_name = rig.computer_name + logger.warning( + "'hostname' environment variable not set. Defaulting to computer name from configuration. %s", + rig.computer_name, + ) + + if rig_name != rig.rig_name or computer_name != rig.computer_name: + logger.warning( + "Rig name or computer name from environment variables do not match the rig configuration. " + "Forcing rig name: %s and computer name: %s from environment variables.", + rig_name, + computer_name, + ) + rig.rig_name = rig_name + rig.computer_name = computer_name + + class ClabeCli(LauncherCliArgs): def cli_cmd(self): launcher = Launcher(settings=self) From ed5fa8b35683ab5898bb69399eb917bc8f2ed19e Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sat, 14 Feb 2026 13:08:44 -0800 Subject: [PATCH 12/31] Add session recovery script --- scripts/aind.py | 91 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/scripts/aind.py b/scripts/aind.py index 8a9a5988..2ad5e912 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -229,6 +229,97 @@ def ensure_rig_and_computer_name(rig: AindVrForagingRig) -> None: rig.computer_name = computer_name +@experiment() +async def recover_session(launcher: Launcher) -> None: + # Start experiment setup + picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) + session_path = Path(picker.ui_helper.input("Enter the path to the session you want to recover:")) + if not session_path.exists(): + logger.error("Session path does not exist: %s", session_path) + return + session_model = Session.model_validate_json( + (session_path / "behavior/Logs/session_input.json").read_text(encoding="utf-8") + ) + rig_model = AindVrForagingRig.model_validate_json( + (session_path / "behavior/Logs/rig_input.json").read_text(encoding="utf-8") + ) + trainer_state_files = list((session_path / "behavior/Logs/.launcher").glob("TrainerState_*.json")) + if trainer_state_files: + input_trainer_state_path = trainer_state_files[0] + else: + raise FileNotFoundError("Trainer state file not found.") + + ensure_rig_and_computer_name(rig_model) + + launcher.register_session(session_model, rig_model.data_directory) + + # Curriculum + suggestion: CurriculumSuggestion | None = None + suggestion_path: Path | None = None + if not ( + (picker.trainer_state is None) + or (picker.trainer_state.is_on_curriculum is False) + or (picker.trainer_state.stage is None) + ): + trainer = CurriculumApp( + settings=CurriculumSettings( + input_trainer_state=input_trainer_state_path.resolve(), data_directory=launcher.session_directory + ) + ) + # Run the curriculum + await trainer.run_async() + suggestion = trainer.process_suggestion() + # Dump suggestion for debugging (for now, but we will prob remove this later) + suggestion_path = _dump_suggestion(suggestion, launcher.session_directory) + # Push updated trainer state back to the database + picker.push_new_suggestion(suggestion.trainer_state) + + # Mappers + assert launcher.repository.working_tree_dir is not None + + DataMapperCli( + data_path=launcher.session_directory, + repo_path=launcher.repository.working_tree_dir, # type: ignore[arg-type] + curriculum_suggestion=suggestion_path, + session_end_time=utcnow(), + ).cli_cmd() + + # Run data qc + if picker.ui_helper.prompt_yes_no_question("Would you like to generate a qc report?"): + try: + import webbrowser + + from contraqctor.qc.reporters import HtmlReporter + + from ..src.aind_behavior_vr_foraging.data_qc.data_qc import make_qc_runner + + vr_dataset = data_contract.dataset(launcher.session_directory) + runner = make_qc_runner(vr_dataset) + qc_path = launcher.session_directory / "Behavior" / "Logs" / "qc_report.html" + reporter = HtmlReporter(output_path=qc_path) + runner.run_all_with_progress(reporter=reporter) + webbrowser.open(qc_path.as_uri(), new=2) + except Exception as e: + logger.error(f"Failed to run data QC: {e}") + + # Watchdog + is_transfer = picker.ui_helper.prompt_yes_no_question("Would you like to transfer data?") + if not is_transfer: + logger.info("Data transfer skipped by user.") + return + + launcher.copy_logs() + watchdog_settings = WatchdogSettings() + watchdog_settings.destination = Path(watchdog_settings.destination) / launcher.session.subject + WatchdogDataTransferService( + source=launcher.session_directory, + settings=watchdog_settings, + session=session_model, + ).transfer() + + return + + class ClabeCli(LauncherCliArgs): def cli_cmd(self): launcher = Launcher(settings=self) From df40a1866f8c93f2ae0c096b6ff166ca68e6bef4 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Mon, 16 Feb 2026 08:38:21 -0800 Subject: [PATCH 13/31] Skip logs --- scripts/aind.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/aind.py b/scripts/aind.py index 2ad5e912..bbf508d9 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -308,7 +308,6 @@ async def recover_session(launcher: Launcher) -> None: logger.info("Data transfer skipped by user.") return - launcher.copy_logs() watchdog_settings = WatchdogSettings() watchdog_settings.destination = Path(watchdog_settings.destination) / launcher.session.subject WatchdogDataTransferService( From 8b4c5ce4b335147e9ecaff7746a863645bdd4213 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:51:02 -0800 Subject: [PATCH 14/31] Regenerate schema against aind-behavior-service 0.13.2 --- pyproject.toml | 4 +- .../aind_behavior_vr_foraging.json | 60 +++- .../AindBehaviorVrForaging.Generated.cs | 24 +- uv.lock | 322 +++++++++--------- 4 files changed, 217 insertions(+), 193 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 92755008..7cedfeff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.7.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.13", + "aind_behavior_services>=0.13.2", "pydantic-settings" ] @@ -31,7 +31,7 @@ Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/rel data = ["contraqctor>=0.5.3, <0.6.0"] launcher = [ - "aind-clabe[aind-services]>=0.9", + "aind-clabe[aind-services]>=0.10", "aind-data-schema>=2.4", "aind_behavior_vr_foraging[data]", ] diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index 365cb979..b74f6e93 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -209,7 +209,7 @@ "AindVrForagingRig": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.13.0", + "default": "0.13.2", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -473,7 +473,7 @@ "title": "Rng Seed" }, "aind_behavior_services_pkg_version": { - "default": "0.13.0", + "default": "0.13.2", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -2331,7 +2331,7 @@ "calibration": { "$ref": "#/$defs/OlfactometerCalibration", "default": { - "date": "2026-02-14T19:48:12.752548Z", + "date": null, "channel_config": {} }, "title": "Calibration of the olfactometer" @@ -2371,10 +2371,18 @@ "description": "Olfactometer device configuration model", "properties": { "date": { + "default": null, "description": "Date of the calibration", - "format": "date-time", - "title": "Date", - "type": "string" + "oneOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Date" }, "channel_config": { "additionalProperties": { @@ -3871,14 +3879,14 @@ "Session": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.13.0", + "default": "0.13.2", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" }, "version": { - "const": "0.13.0", - "default": "0.13.0", + "const": "0.13.2", + "default": "0.13.2", "title": "Version", "type": "string" }, @@ -4481,7 +4489,7 @@ "calibration": { "$ref": "#/$defs/TreadmillCalibration", "default": { - "date": "2026-02-14T19:48:12.755298Z", + "date": null, "wheel_diameter": 15.0, "pulses_per_revolution": 28800, "invert_direction": false, @@ -4533,10 +4541,18 @@ "description": "Treadmill calibration class", "properties": { "date": { + "default": null, "description": "Date of the calibration", - "format": "date-time", - "title": "Date", - "type": "string" + "oneOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Date" }, "wheel_diameter": { "default": 15, @@ -4749,13 +4765,13 @@ "type": "integer" }, "container_extension": { - "default": "mp4", + "default": "mkv", "description": "Container extension", "title": "Container Extension", "type": "string" }, "output_arguments": { - "default": "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M", + "default": "-vf \"scale=out_range=full,setparams=range=full:colorspace=bt709:color_primaries=bt709:color_trc=linear\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p3 -rc vbr -cq 18 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M -f matroska -write_crc32 0", "description": "Output arguments", "title": "Output Arguments", "type": "string" @@ -5036,10 +5052,18 @@ "description": "Represents a water valve calibration.", "properties": { "date": { + "default": null, "description": "Date of the calibration", - "format": "date-time", - "title": "Date", - "type": "string" + "oneOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Date" }, "measurements": { "default": [], diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index ab075c46..1c0001dc 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -367,7 +367,7 @@ public partial class AindVrForagingRig public AindVrForagingRig() { - _aindBehaviorServicesPkgVersion = "0.13.0"; + _aindBehaviorServicesPkgVersion = "0.13.2"; _version = "0.7.0-rc0"; _triggeredCameraController = new CameraControllerSpinnakerCamera(); _harpBehavior = new HarpBehavior(); @@ -953,7 +953,7 @@ public partial class AindVrForagingTaskParameters public AindVrForagingTaskParameters() { - _aindBehaviorServicesPkgVersion = "0.13.0"; + _aindBehaviorServicesPkgVersion = "0.13.2"; _environment = new BlockStructure(); _operationControl = new OperationControl(); } @@ -6743,7 +6743,7 @@ public override string ToString() public partial class OlfactometerCalibration { - private System.DateTimeOffset _date; + private System.DateTimeOffset? _date; private System.Collections.Generic.Dictionary _channelConfig; @@ -6764,7 +6764,7 @@ protected OlfactometerCalibration(OlfactometerCalibration other) [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("date")] [System.ComponentModel.DescriptionAttribute("Date of the calibration")] - public System.DateTimeOffset Date + public System.DateTimeOffset? Date { get { @@ -10370,8 +10370,8 @@ public partial class Session public Session() { - _aindBehaviorServicesPkgVersion = "0.13.0"; - _version = "0.13.0"; + _aindBehaviorServicesPkgVersion = "0.13.2"; + _version = "0.13.2"; _experimenter = new System.Collections.Generic.List(); _allowDirtyRepo = false; _skipHardwareValidation = false; @@ -11811,7 +11811,7 @@ public override string ToString() public partial class TreadmillCalibration { - private System.DateTimeOffset _date; + private System.DateTimeOffset? _date; private double _wheelDiameter; @@ -11844,7 +11844,7 @@ protected TreadmillCalibration(TreadmillCalibration other) [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("date")] [System.ComponentModel.DescriptionAttribute("Date of the calibration")] - public System.DateTimeOffset Date + public System.DateTimeOffset? Date { get { @@ -12486,8 +12486,8 @@ public partial class VideoWriterFfmpeg : VideoWriter public VideoWriterFfmpeg() { _frameRate = 30; - _containerExtension = "mp4"; - _outputArguments = "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M"; + _containerExtension = "mkv"; + _outputArguments = "-vf \"scale=out_range=full,setparams=range=full:colorspace=bt709:color_primaries=bt709:color_trc=linear\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p3 -rc vbr -cq 18 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M -f matroska -write_crc32 0"; _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; } @@ -13541,7 +13541,7 @@ public override string ToString() public partial class WaterValveCalibration { - private System.DateTimeOffset _date; + private System.DateTimeOffset? _date; private System.Collections.Generic.List _measurements; @@ -13577,7 +13577,7 @@ protected WaterValveCalibration(WaterValveCalibration other) [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("date")] [System.ComponentModel.DescriptionAttribute("Date of the calibration")] - public System.DateTimeOffset Date + public System.DateTimeOffset? Date { get { diff --git a/uv.lock b/uv.lock index 16e376c1..bdfd2726 100644 --- a/uv.lock +++ b/uv.lock @@ -41,7 +41,7 @@ wheels = [ [[package]] name = "aind-behavior-services" -version = "0.13.0" +version = "0.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-curriculum" }, @@ -50,9 +50,9 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/52/169fe25fb69cb249ac86408cad77bcce0950e60cc6491e0117c26f206e91/aind_behavior_services-0.13.0.tar.gz", hash = "sha256:21874c1a4555ab2a3c2afef895f279dda48ea0cc3dbc6a7a2ee6fbd7139dc544", size = 25839, upload-time = "2026-01-29T17:13:41.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/4b/3a5153a56ba92bf4cb8503b3670c58b0ce2dc1a38152a6888a654b2faefc/aind_behavior_services-0.13.2.tar.gz", hash = "sha256:506e9551c74db57026750f085b5f0034ba9896d9d7d496bf17977d4fc55b5f0f", size = 27357, upload-time = "2026-02-27T18:28:45.264Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/35/6df8230287d3747ff04192b16bd61aec4bbf4867271c619960f5f66ea222/aind_behavior_services-0.13.0-py3-none-any.whl", hash = "sha256:9b0fe77c0a4ecddf9fcf1b1d8e791de2e16ad36425d053fc587f195f88bb7286", size = 35478, upload-time = "2026-01-29T17:13:40.979Z" }, + { url = "https://files.pythonhosted.org/packages/49/ad/01b1da25639b2261159975b08e40e3fde74f73c01216cd83c1751ab23829/aind_behavior_services-0.13.2-py3-none-any.whl", hash = "sha256:2003a19aea0b0669088f02c8453c630bb0f0b3eb278c71d1107b972ac9171c8a", size = 37296, upload-time = "2026-02-27T18:28:44.055Z" }, ] [[package]] @@ -95,9 +95,9 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", specifier = ">=0.13" }, + { name = "aind-behavior-services", specifier = ">=0.13.2" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.10" }, { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.4" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, @@ -159,8 +159,8 @@ aind-services = [ [[package]] name = "aind-data-schema" -version = "2.4.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#81638e92bd131e871b8c95e60225e4c65494f552" } +version = "2.5.0" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#219b5511807279cc8e82db4674b3081a72102d84" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, @@ -169,8 +169,8 @@ dependencies = [ [[package]] name = "aind-data-schema-models" -version = "5.3.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#049f4319ab0c69874cc88bc04257c505bdb52ec5" } +version = "5.4.0" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#0ceb561b5053cdea25dd9a00706b04a646490988" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, @@ -318,11 +318,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.2.25" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] [[package]] @@ -714,7 +714,7 @@ wheels = [ [[package]] name = "erdantic" -version = "1.2.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, @@ -725,9 +725,9 @@ dependencies = [ { name = "typer" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/17/5c9709349221b1a972b4470e735570eee3dd2e2ee0ed71f28fb0e8c0d79a/erdantic-1.2.0.tar.gz", hash = "sha256:165979caf26984055e476d0201b24cdf1c5f38b60a6f141e82f9352a40d12b65", size = 920914, upload-time = "2025-09-15T18:07:11.351Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/b3/d814074dc6076a97682dc8a62a3da672fd982a533cc1f29854b6a4433ef2/erdantic-1.2.1.tar.gz", hash = "sha256:9105fc51260ee58b531690d1ef87db81f849257e73e106cd8f2a7f8a26d8d9b0", size = 1152018, upload-time = "2026-02-15T23:56:00.294Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/ee/dc88399e2a872fd7ce5a192cfbcf8bd996574bb6c7470912c8c2fca20527/erdantic-1.2.0-py3-none-any.whl", hash = "sha256:7c67adcf22150b77a24609734c7efc676f71824f8f5662fd21450ec1cdbe0a0c", size = 34428, upload-time = "2025-09-15T18:07:09.766Z" }, + { url = "https://files.pythonhosted.org/packages/84/39/c8982be2f72454ef135f247fd9c0fd800444d8e28767c9c6cb25e2df7c2e/erdantic-1.2.1-py3-none-any.whl", hash = "sha256:f548da3e9933e298f862eb33469ab375a372097ae289a4ca47a06ff69a1a6210", size = 34855, upload-time = "2026-02-15T23:55:58.536Z" }, ] [[package]] @@ -1272,16 +1272,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/d0/a0/da7aaa5c87d155f2a [[package]] name = "msal" -version = "1.34.0" +version = "1.35.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyjwt", extra = ["crypto"] }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/ec/52e6c9ad90ad7eb3035f5e511123e89d1ecc7617f0c94653264848623c12/msal-1.35.0.tar.gz", hash = "sha256:76ab7513dbdac88d76abdc6a50110f082b7ed3ff1080aca938c53fc88bc75b51", size = 164057, upload-time = "2026-02-24T10:58:28.415Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/dc/18d48843499e278538890dc709e9ee3dea8375f8be8e82682851df1b48b5/msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1", size = 116987, upload-time = "2025-09-22T23:05:47.294Z" }, + { url = "https://files.pythonhosted.org/packages/56/26/5463e615de18ad8b80d75d14c612ef3c866fcc07c1c52e8eac7948984214/msal-1.35.0-py3-none-any.whl", hash = "sha256:baf268172d2b736e5d409689424d2f321b4142cab231b4b96594c86762e7e01d", size = 120082, upload-time = "2026-02-24T10:58:27.219Z" }, ] [[package]] @@ -1410,62 +1410,62 @@ wheels = [ [[package]] name = "pandas" -version = "3.0.0" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/da/b1dc0481ab8d55d0f46e343cfe67d4551a0e14fcee52bd38ca1bd73258d8/pandas-3.0.0.tar.gz", hash = "sha256:0facf7e87d38f721f0af46fe70d97373a37701b1c09f7ed7aeeb292ade5c050f", size = 4633005, upload-time = "2026-01-21T15:52:04.726Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/1e/b184654a856e75e975a6ee95d6577b51c271cd92cb2b020c9378f53e0032/pandas-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d64ce01eb9cdca96a15266aa679ae50212ec52757c79204dbc7701a222401850", size = 10313247, upload-time = "2026-01-21T15:50:15.775Z" }, - { url = "https://files.pythonhosted.org/packages/dd/5e/e04a547ad0f0183bf151fd7c7a477468e3b85ff2ad231c566389e6cc9587/pandas-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:613e13426069793aa1ec53bdcc3b86e8d32071daea138bbcf4fa959c9cdaa2e2", size = 9913131, upload-time = "2026-01-21T15:50:18.611Z" }, - { url = "https://files.pythonhosted.org/packages/a2/93/bb77bfa9fc2aba9f7204db807d5d3fb69832ed2854c60ba91b4c65ba9219/pandas-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0192fee1f1a8e743b464a6607858ee4b071deb0b118eb143d71c2a1d170996d5", size = 10741925, upload-time = "2026-01-21T15:50:21.058Z" }, - { url = "https://files.pythonhosted.org/packages/62/fb/89319812eb1d714bfc04b7f177895caeba8ab4a37ef6712db75ed786e2e0/pandas-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b853319dec8d5e0c8b875374c078ef17f2269986a78168d9bd57e49bf650ae", size = 11245979, upload-time = "2026-01-21T15:50:23.413Z" }, - { url = "https://files.pythonhosted.org/packages/a9/63/684120486f541fc88da3862ed31165b3b3e12b6a1c7b93be4597bc84e26c/pandas-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:707a9a877a876c326ae2cb640fbdc4ef63b0a7b9e2ef55c6df9942dcee8e2af9", size = 11756337, upload-time = "2026-01-21T15:50:25.932Z" }, - { url = "https://files.pythonhosted.org/packages/39/92/7eb0ad232312b59aec61550c3c81ad0743898d10af5df7f80bc5e5065416/pandas-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:afd0aa3d0b5cda6e0b8ffc10dbcca3b09ef3cbcd3fe2b27364f85fdc04e1989d", size = 12325517, upload-time = "2026-01-21T15:50:27.952Z" }, - { url = "https://files.pythonhosted.org/packages/51/27/bf9436dd0a4fc3130acec0828951c7ef96a0631969613a9a35744baf27f6/pandas-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:113b4cca2614ff7e5b9fee9b6f066618fe73c5a83e99d721ffc41217b2bf57dd", size = 9881576, upload-time = "2026-01-21T15:50:30.149Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2b/c618b871fce0159fd107516336e82891b404e3f340821853c2fc28c7830f/pandas-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c14837eba8e99a8da1527c0280bba29b0eb842f64aa94982c5e21227966e164b", size = 9140807, upload-time = "2026-01-21T15:50:32.308Z" }, - { url = "https://files.pythonhosted.org/packages/0b/38/db33686f4b5fa64d7af40d96361f6a4615b8c6c8f1b3d334eee46ae6160e/pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9803b31f5039b3c3b10cc858c5e40054adb4b29b4d81cb2fd789f4121c8efbcd", size = 10334013, upload-time = "2026-01-21T15:50:34.771Z" }, - { url = "https://files.pythonhosted.org/packages/a5/7b/9254310594e9774906bacdd4e732415e1f86ab7dbb4b377ef9ede58cd8ec/pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14c2a4099cd38a1d18ff108168ea417909b2dea3bd1ebff2ccf28ddb6a74d740", size = 9874154, upload-time = "2026-01-21T15:50:36.67Z" }, - { url = "https://files.pythonhosted.org/packages/63/d4/726c5a67a13bc66643e66d2e9ff115cead482a44fc56991d0c4014f15aaf/pandas-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d257699b9a9960e6125686098d5714ac59d05222bef7a5e6af7a7fd87c650801", size = 10384433, upload-time = "2026-01-21T15:50:39.132Z" }, - { url = "https://files.pythonhosted.org/packages/bf/2e/9211f09bedb04f9832122942de8b051804b31a39cfbad199a819bb88d9f3/pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69780c98f286076dcafca38d8b8eee1676adf220199c0a39f0ecbf976b68151a", size = 10864519, upload-time = "2026-01-21T15:50:41.043Z" }, - { url = "https://files.pythonhosted.org/packages/00/8d/50858522cdc46ac88b9afdc3015e298959a70a08cd21e008a44e9520180c/pandas-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4a66384f017240f3858a4c8a7cf21b0591c3ac885cddb7758a589f0f71e87ebb", size = 11394124, upload-time = "2026-01-21T15:50:43.377Z" }, - { url = "https://files.pythonhosted.org/packages/86/3f/83b2577db02503cd93d8e95b0f794ad9d4be0ba7cb6c8bcdcac964a34a42/pandas-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8c515c9bc33989d97b89db66ea0cececb0f6e3c2a87fcc8b69443a6923e95f", size = 11920444, upload-time = "2026-01-21T15:50:45.932Z" }, - { url = "https://files.pythonhosted.org/packages/64/2d/4f8a2f192ed12c90a0aab47f5557ece0e56b0370c49de9454a09de7381b2/pandas-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a453aad8c4f4e9f166436994a33884442ea62aa8b27d007311e87521b97246e1", size = 9730970, upload-time = "2026-01-21T15:50:47.962Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/ff571be435cf1e643ca98d0945d76732c0b4e9c37191a89c8550b105eed1/pandas-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:da768007b5a33057f6d9053563d6b74dd6d029c337d93c6d0d22a763a5c2ecc0", size = 9041950, upload-time = "2026-01-21T15:50:50.422Z" }, - { url = "https://files.pythonhosted.org/packages/6f/fa/7f0ac4ca8877c57537aaff2a842f8760e630d8e824b730eb2e859ffe96ca/pandas-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b78d646249b9a2bc191040988c7bb524c92fa8534fb0898a0741d7e6f2ffafa6", size = 10307129, upload-time = "2026-01-21T15:50:52.877Z" }, - { url = "https://files.pythonhosted.org/packages/6f/11/28a221815dcea4c0c9414dfc845e34a84a6a7dabc6da3194498ed5ba4361/pandas-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc9cba7b355cb4162442a88ce495e01cb605f17ac1e27d6596ac963504e0305f", size = 9850201, upload-time = "2026-01-21T15:50:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/ba/da/53bbc8c5363b7e5bd10f9ae59ab250fc7a382ea6ba08e4d06d8694370354/pandas-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c9a1a149aed3b6c9bf246033ff91e1b02d529546c5d6fb6b74a28fea0cf4c70", size = 10354031, upload-time = "2026-01-21T15:50:57.463Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a3/51e02ebc2a14974170d51e2410dfdab58870ea9bcd37cda15bd553d24dc4/pandas-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95683af6175d884ee89471842acfca29172a85031fccdabc35e50c0984470a0e", size = 10861165, upload-time = "2026-01-21T15:50:59.32Z" }, - { url = "https://files.pythonhosted.org/packages/a5/fe/05a51e3cac11d161472b8297bd41723ea98013384dd6d76d115ce3482f9b/pandas-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1fbbb5a7288719e36b76b4f18d46ede46e7f916b6c8d9915b756b0a6c3f792b3", size = 11359359, upload-time = "2026-01-21T15:51:02.014Z" }, - { url = "https://files.pythonhosted.org/packages/ee/56/ba620583225f9b85a4d3e69c01df3e3870659cc525f67929b60e9f21dcd1/pandas-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e8b9808590fa364416b49b2a35c1f4cf2785a6c156935879e57f826df22038e", size = 11912907, upload-time = "2026-01-21T15:51:05.175Z" }, - { url = "https://files.pythonhosted.org/packages/c9/8c/c6638d9f67e45e07656b3826405c5cc5f57f6fd07c8b2572ade328c86e22/pandas-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:98212a38a709feb90ae658cb6227ea3657c22ba8157d4b8f913cd4c950de5e7e", size = 9732138, upload-time = "2026-01-21T15:51:07.569Z" }, - { url = "https://files.pythonhosted.org/packages/7b/bf/bd1335c3bf1770b6d8fed2799993b11c4971af93bb1b729b9ebbc02ca2ec/pandas-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:177d9df10b3f43b70307a149d7ec49a1229a653f907aa60a48f1877d0e6be3be", size = 9033568, upload-time = "2026-01-21T15:51:09.484Z" }, - { url = "https://files.pythonhosted.org/packages/8e/c6/f5e2171914d5e29b9171d495344097d54e3ffe41d2d85d8115baba4dc483/pandas-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2713810ad3806767b89ad3b7b69ba153e1c6ff6d9c20f9c2140379b2a98b6c98", size = 10741936, upload-time = "2026-01-21T15:51:11.693Z" }, - { url = "https://files.pythonhosted.org/packages/51/88/9a0164f99510a1acb9f548691f022c756c2314aad0d8330a24616c14c462/pandas-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:15d59f885ee5011daf8335dff47dcb8a912a27b4ad7826dc6cbe809fd145d327", size = 10393884, upload-time = "2026-01-21T15:51:14.197Z" }, - { url = "https://files.pythonhosted.org/packages/e0/53/b34d78084d88d8ae2b848591229da8826d1e65aacf00b3abe34023467648/pandas-3.0.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24e6547fb64d2c92665dd2adbfa4e85fa4fd70a9c070e7cfb03b629a0bbab5eb", size = 10310740, upload-time = "2026-01-21T15:51:16.093Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d3/bee792e7c3d6930b74468d990604325701412e55d7aaf47460a22311d1a5/pandas-3.0.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48ee04b90e2505c693d3f8e8f524dab8cb8aaf7ddcab52c92afa535e717c4812", size = 10700014, upload-time = "2026-01-21T15:51:18.818Z" }, - { url = "https://files.pythonhosted.org/packages/55/db/2570bc40fb13aaed1cbc3fbd725c3a60ee162477982123c3adc8971e7ac1/pandas-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66f72fb172959af42a459e27a8d8d2c7e311ff4c1f7db6deb3b643dbc382ae08", size = 11323737, upload-time = "2026-01-21T15:51:20.784Z" }, - { url = "https://files.pythonhosted.org/packages/bc/2e/297ac7f21c8181b62a4cccebad0a70caf679adf3ae5e83cb676194c8acc3/pandas-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4a4a400ca18230976724a5066f20878af785f36c6756e498e94c2a5e5d57779c", size = 11771558, upload-time = "2026-01-21T15:51:22.977Z" }, - { url = "https://files.pythonhosted.org/packages/0a/46/e1c6876d71c14332be70239acce9ad435975a80541086e5ffba2f249bcf6/pandas-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:940eebffe55528074341a5a36515f3e4c5e25e958ebbc764c9502cfc35ba3faa", size = 10473771, upload-time = "2026-01-21T15:51:25.285Z" }, - { url = "https://files.pythonhosted.org/packages/c0/db/0270ad9d13c344b7a36fa77f5f8344a46501abf413803e885d22864d10bf/pandas-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:597c08fb9fef0edf1e4fa2f9828dd27f3d78f9b8c9b4a748d435ffc55732310b", size = 10312075, upload-time = "2026-01-21T15:51:28.5Z" }, - { url = "https://files.pythonhosted.org/packages/09/9f/c176f5e9717f7c91becfe0f55a52ae445d3f7326b4a2cf355978c51b7913/pandas-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:447b2d68ac5edcbf94655fe909113a6dba6ef09ad7f9f60c80477825b6c489fe", size = 9900213, upload-time = "2026-01-21T15:51:30.955Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e7/63ad4cc10b257b143e0a5ebb04304ad806b4e1a61c5da25f55896d2ca0f4/pandas-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:debb95c77ff3ed3ba0d9aa20c3a2f19165cc7956362f9873fce1ba0a53819d70", size = 10428768, upload-time = "2026-01-21T15:51:33.018Z" }, - { url = "https://files.pythonhosted.org/packages/9e/0e/4e4c2d8210f20149fd2248ef3fff26623604922bd564d915f935a06dd63d/pandas-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fedabf175e7cd82b69b74c30adbaa616de301291a5231138d7242596fc296a8d", size = 10882954, upload-time = "2026-01-21T15:51:35.287Z" }, - { url = "https://files.pythonhosted.org/packages/c6/60/c9de8ac906ba1f4d2250f8a951abe5135b404227a55858a75ad26f84db47/pandas-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:412d1a89aab46889f3033a386912efcdfa0f1131c5705ff5b668dda88305e986", size = 11430293, upload-time = "2026-01-21T15:51:37.57Z" }, - { url = "https://files.pythonhosted.org/packages/a1/69/806e6637c70920e5787a6d6896fd707f8134c2c55cd761e7249a97b7dc5a/pandas-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e979d22316f9350c516479dd3a92252be2937a9531ed3a26ec324198a99cdd49", size = 11952452, upload-time = "2026-01-21T15:51:39.618Z" }, - { url = "https://files.pythonhosted.org/packages/cb/de/918621e46af55164c400ab0ef389c9d969ab85a43d59ad1207d4ddbe30a5/pandas-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:083b11415b9970b6e7888800c43c82e81a06cd6b06755d84804444f0007d6bb7", size = 9851081, upload-time = "2026-01-21T15:51:41.758Z" }, - { url = "https://files.pythonhosted.org/packages/91/a1/3562a18dd0bd8c73344bfa26ff90c53c72f827df119d6d6b1dacc84d13e3/pandas-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:5db1e62cb99e739fa78a28047e861b256d17f88463c76b8dafc7c1338086dca8", size = 9174610, upload-time = "2026-01-21T15:51:44.312Z" }, - { url = "https://files.pythonhosted.org/packages/ce/26/430d91257eaf366f1737d7a1c158677caaf6267f338ec74e3a1ec444111c/pandas-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:697b8f7d346c68274b1b93a170a70974cdc7d7354429894d5927c1effdcccd73", size = 10761999, upload-time = "2026-01-21T15:51:46.899Z" }, - { url = "https://files.pythonhosted.org/packages/ec/1a/954eb47736c2b7f7fe6a9d56b0cb6987773c00faa3c6451a43db4beb3254/pandas-3.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8cb3120f0d9467ed95e77f67a75e030b67545bcfa08964e349252d674171def2", size = 10410279, upload-time = "2026-01-21T15:51:48.89Z" }, - { url = "https://files.pythonhosted.org/packages/20/fc/b96f3a5a28b250cd1b366eb0108df2501c0f38314a00847242abab71bb3a/pandas-3.0.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fd3e6baa72899746b820c31e4b9688c8e1b7864d7aec2de7ab5035c285277a", size = 10330198, upload-time = "2026-01-21T15:51:51.015Z" }, - { url = "https://files.pythonhosted.org/packages/90/b3/d0e2952f103b4fbef1ef22d0c2e314e74fc9064b51cee30890b5e3286ee6/pandas-3.0.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8942e333dc67ceda1095227ad0febb05a3b36535e520154085db632c40ad084", size = 10728513, upload-time = "2026-01-21T15:51:53.387Z" }, - { url = "https://files.pythonhosted.org/packages/76/81/832894f286df828993dc5fd61c63b231b0fb73377e99f6c6c369174cf97e/pandas-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:783ac35c4d0fe0effdb0d67161859078618b1b6587a1af15928137525217a721", size = 11345550, upload-time = "2026-01-21T15:51:55.329Z" }, - { url = "https://files.pythonhosted.org/packages/34/a0/ed160a00fb4f37d806406bc0a79a8b62fe67f29d00950f8d16203ff3409b/pandas-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:125eb901e233f155b268bbef9abd9afb5819db74f0e677e89a61b246228c71ac", size = 11799386, upload-time = "2026-01-21T15:51:57.457Z" }, - { url = "https://files.pythonhosted.org/packages/36/c8/2ac00d7255252c5e3cf61b35ca92ca25704b0188f7454ca4aec08a33cece/pandas-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b86d113b6c109df3ce0ad5abbc259fe86a1bd4adfd4a31a89da42f84f65509bb", size = 10873041, upload-time = "2026-01-21T15:52:00.034Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3f/a80ac00acbc6b35166b42850e98a4f466e2c0d9c64054161ba9620f95680/pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa", size = 9441003, upload-time = "2026-01-21T15:52:02.281Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2e/0c/b28ed414f080ee0ad153f848586d61d1878f91689950f037f976ce15f6c8/pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8", size = 4641901, upload-time = "2026-02-17T22:20:16.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea", size = 10323380, upload-time = "2026-02-17T22:18:16.133Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796", size = 9923455, upload-time = "2026-02-17T22:18:19.13Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f1/ed17d927f9950643bc7631aa4c99ff0cc83a37864470bc419345b656a41f/pandas-3.0.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:406ce835c55bac912f2a0dcfaf27c06d73c6b04a5dde45f1fd3169ce31337389", size = 10753464, upload-time = "2026-02-17T22:18:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7", size = 11255234, upload-time = "2026-02-17T22:18:24.175Z" }, + { url = "https://files.pythonhosted.org/packages/5c/39/3653fe59af68606282b989c23d1a543ceba6e8099cbcc5f1d506a7bae2aa/pandas-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a64ce8b0f2de1d2efd2ae40b0abe7f8ae6b29fbfb3812098ed5a6f8e235ad9bf", size = 11767299, upload-time = "2026-02-17T22:18:26.824Z" }, + { url = "https://files.pythonhosted.org/packages/9b/31/1daf3c0c94a849c7a8dab8a69697b36d313b229918002ba3e409265c7888/pandas-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9832c2c69da24b602c32e0c7b1b508a03949c18ba08d4d9f1c1033426685b447", size = 12333292, upload-time = "2026-02-17T22:18:28.996Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79", size = 9892176, upload-time = "2026-02-17T22:18:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/79/ab/9c776b14ac4b7b4140788eca18468ea39894bc7340a408f1d1e379856a6b/pandas-3.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:4a68773d5a778afb31d12e34f7dd4612ab90de8c6fb1d8ffe5d4a03b955082a1", size = 9151328, upload-time = "2026-02-17T22:18:35.721Z" }, + { url = "https://files.pythonhosted.org/packages/37/51/b467209c08dae2c624873d7491ea47d2b47336e5403309d433ea79c38571/pandas-3.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:476f84f8c20c9f5bc47252b66b4bb25e1a9fc2fa98cead96744d8116cb85771d", size = 10344357, upload-time = "2026-02-17T22:18:38.262Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f1/e2567ffc8951ab371db2e40b2fe068e36b81d8cf3260f06ae508700e5504/pandas-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ab749dfba921edf641d4036c4c21c0b3ea70fea478165cb98a998fb2a261955", size = 9884543, upload-time = "2026-02-17T22:18:41.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b", size = 10396030, upload-time = "2026-02-17T22:18:43.822Z" }, + { url = "https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4", size = 10876435, upload-time = "2026-02-17T22:18:45.954Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a6/2a75320849dd154a793f69c951db759aedb8d1dd3939eeacda9bdcfa1629/pandas-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:356e5c055ed9b0da1580d465657bc7d00635af4fd47f30afb23025352ba764d1", size = 11405133, upload-time = "2026-02-17T22:18:48.533Z" }, + { url = "https://files.pythonhosted.org/packages/58/53/1d68fafb2e02d7881df66aa53be4cd748d25cbe311f3b3c85c93ea5d30ca/pandas-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d810036895f9ad6345b8f2a338dd6998a74e8483847403582cab67745bff821", size = 11932065, upload-time = "2026-02-17T22:18:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/67cc404b3a966b6df27b38370ddd96b3b023030b572283d035181854aac5/pandas-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:536232a5fe26dd989bd633e7a0c450705fdc86a207fec7254a55e9a22950fe43", size = 9741627, upload-time = "2026-02-17T22:18:53.905Z" }, + { url = "https://files.pythonhosted.org/packages/86/4f/caf9952948fb00d23795f09b893d11f1cacb384e666854d87249530f7cbe/pandas-3.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f463ebfd8de7f326d38037c7363c6dacb857c5881ab8961fb387804d6daf2f7", size = 9052483, upload-time = "2026-02-17T22:18:57.31Z" }, + { url = "https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262", size = 10317509, upload-time = "2026-02-17T22:18:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56", size = 9860561, upload-time = "2026-02-17T22:19:02.265Z" }, + { url = "https://files.pythonhosted.org/packages/fa/80/f01ff54664b6d70fed71475543d108a9b7c888e923ad210795bef04ffb7d/pandas-3.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75e6e292ff898679e47a2199172593d9f6107fd2dd3617c22c2946e97d5df46e", size = 10365506, upload-time = "2026-02-17T22:19:05.017Z" }, + { url = "https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791", size = 10873196, upload-time = "2026-02-17T22:19:07.204Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/9301c83d0b47c23ac5deab91c6b39fd98d5b5db4d93b25df8d381451828f/pandas-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eca8b4510f6763f3d37359c2105df03a7a221a508f30e396a51d0713d462e68a", size = 11370859, upload-time = "2026-02-17T22:19:09.436Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/0c1fc5bd2d29c7db2ab372330063ad555fb83e08422829c785f5ec2176ca/pandas-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06aff2ad6f0b94a17822cf8b83bbb563b090ed82ff4fe7712db2ce57cd50d9b8", size = 11924584, upload-time = "2026-02-17T22:19:11.562Z" }, + { url = "https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25", size = 9742769, upload-time = "2026-02-17T22:19:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/c4/cb/810a22a6af9a4e97c8ab1c946b47f3489c5bca5adc483ce0ffc84c9cc768/pandas-3.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a8d37a43c52917427e897cb2e429f67a449327394396a81034a4449b99afda59", size = 9043855, upload-time = "2026-02-17T22:19:16.09Z" }, + { url = "https://files.pythonhosted.org/packages/92/fa/423c89086cca1f039cf1253c3ff5b90f157b5b3757314aa635f6bf3e30aa/pandas-3.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d54855f04f8246ed7b6fc96b05d4871591143c46c0b6f4af874764ed0d2d6f06", size = 10752673, upload-time = "2026-02-17T22:19:18.304Z" }, + { url = "https://files.pythonhosted.org/packages/22/23/b5a08ec1f40020397f0faba72f1e2c11f7596a6169c7b3e800abff0e433f/pandas-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e1b677accee34a09e0dc2ce5624e4a58a1870ffe56fc021e9caf7f23cd7668f", size = 10404967, upload-time = "2026-02-17T22:19:20.726Z" }, + { url = "https://files.pythonhosted.org/packages/5c/81/94841f1bb4afdc2b52a99daa895ac2c61600bb72e26525ecc9543d453ebc/pandas-3.0.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9cabbdcd03f1b6cd254d6dda8ae09b0252524be1592594c00b7895916cb1324", size = 10320575, upload-time = "2026-02-17T22:19:24.919Z" }, + { url = "https://files.pythonhosted.org/packages/0a/8b/2ae37d66a5342a83adadfd0cb0b4bf9c3c7925424dd5f40d15d6cfaa35ee/pandas-3.0.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ae2ab1f166668b41e770650101e7090824fd34d17915dd9cd479f5c5e0065e9", size = 10710921, upload-time = "2026-02-17T22:19:27.181Z" }, + { url = "https://files.pythonhosted.org/packages/a2/61/772b2e2757855e232b7ccf7cb8079a5711becb3a97f291c953def15a833f/pandas-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6bf0603c2e30e2cafac32807b06435f28741135cb8697eae8b28c7d492fc7d76", size = 11334191, upload-time = "2026-02-17T22:19:29.411Z" }, + { url = "https://files.pythonhosted.org/packages/1b/08/b16c6df3ef555d8495d1d265a7963b65be166785d28f06a350913a4fac78/pandas-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c426422973973cae1f4a23e51d4ae85974f44871b24844e4f7de752dd877098", size = 11782256, upload-time = "2026-02-17T22:19:32.34Z" }, + { url = "https://files.pythonhosted.org/packages/55/80/178af0594890dee17e239fca96d3d8670ba0f5ff59b7d0439850924a9c09/pandas-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b03f91ae8c10a85c1613102c7bef5229b5379f343030a3ccefeca8a33414cf35", size = 10485047, upload-time = "2026-02-17T22:19:34.605Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a", size = 10322465, upload-time = "2026-02-17T22:19:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f", size = 9910632, upload-time = "2026-02-17T22:19:39.001Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f7/b449ffb3f68c11da12fc06fbf6d2fa3a41c41e17d0284d23a79e1c13a7e4/pandas-3.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56cf59638bf24dc9bdf2154c81e248b3289f9a09a6d04e63608c159022352749", size = 10440535, upload-time = "2026-02-17T22:19:41.157Z" }, + { url = "https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249", size = 10893940, upload-time = "2026-02-17T22:19:43.493Z" }, + { url = "https://files.pythonhosted.org/packages/03/30/f1b502a72468c89412c1b882a08f6eed8a4ee9dc033f35f65d0663df6081/pandas-3.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1849f0bba9c8a2fb0f691d492b834cc8dadf617e29015c66e989448d58d011ee", size = 11442711, upload-time = "2026-02-17T22:19:46.074Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f0/ebb6ddd8fc049e98cabac5c2924d14d1dda26a20adb70d41ea2e428d3ec4/pandas-3.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3d288439e11b5325b02ae6e9cc83e6805a62c40c5a6220bea9beb899c073b1c", size = 11963918, upload-time = "2026-02-17T22:19:48.838Z" }, + { url = "https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66", size = 9862099, upload-time = "2026-02-17T22:19:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b7/6af9aac41ef2456b768ef0ae60acf8abcebb450a52043d030a65b4b7c9bd/pandas-3.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:97ca08674e3287c7148f4858b01136f8bdfe7202ad25ad04fec602dd1d29d132", size = 9185333, upload-time = "2026-02-17T22:19:53.266Z" }, + { url = "https://files.pythonhosted.org/packages/66/fc/848bb6710bc6061cb0c5badd65b92ff75c81302e0e31e496d00029fe4953/pandas-3.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:58eeb1b2e0fb322befcf2bbc9ba0af41e616abadb3d3414a6bc7167f6cbfce32", size = 10772664, upload-time = "2026-02-17T22:19:55.806Z" }, + { url = "https://files.pythonhosted.org/packages/69/5c/866a9bbd0f79263b4b0db6ec1a341be13a1473323f05c122388e0f15b21d/pandas-3.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cd9af1276b5ca9e298bd79a26bda32fa9cc87ed095b2a9a60978d2ca058eaf87", size = 10421286, upload-time = "2026-02-17T22:19:58.091Z" }, + { url = "https://files.pythonhosted.org/packages/51/a4/2058fb84fb1cfbfb2d4a6d485e1940bb4ad5716e539d779852494479c580/pandas-3.0.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f87a04984d6b63788327cd9f79dda62b7f9043909d2440ceccf709249ca988", size = 10342050, upload-time = "2026-02-17T22:20:01.376Z" }, + { url = "https://files.pythonhosted.org/packages/22/1b/674e89996cc4be74db3c4eb09240c4bb549865c9c3f5d9b086ff8fcfbf00/pandas-3.0.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85fe4c4df62e1e20f9db6ebfb88c844b092c22cd5324bdcf94bfa2fc1b391221", size = 10740055, upload-time = "2026-02-17T22:20:04.328Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f8/e954b750764298c22fa4614376531fe63c521ef517e7059a51f062b87dca/pandas-3.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:331ca75a2f8672c365ae25c0b29e46f5ac0c6551fdace8eec4cd65e4fac271ff", size = 11357632, upload-time = "2026-02-17T22:20:06.647Z" }, + { url = "https://files.pythonhosted.org/packages/6d/02/c6e04b694ffd68568297abd03588b6d30295265176a5c01b7459d3bc35a3/pandas-3.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15860b1fdb1973fffade772fdb931ccf9b2f400a3f5665aef94a00445d7d8dd5", size = 11810974, upload-time = "2026-02-17T22:20:08.946Z" }, + { url = "https://files.pythonhosted.org/packages/89/41/d7dfb63d2407f12055215070c42fc6ac41b66e90a2946cdc5e759058398b/pandas-3.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:44f1364411d5670efa692b146c748f4ed013df91ee91e9bec5677fb1fd58b937", size = 10884622, upload-time = "2026-02-17T22:20:11.711Z" }, + { url = "https://files.pythonhosted.org/packages/68/b0/34937815889fa982613775e4b97fddd13250f11012d769949c5465af2150/pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d", size = 9452085, upload-time = "2026-02-17T22:20:14.331Z" }, ] [[package]] @@ -1740,16 +1740,16 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.12.0" +version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/6d/fffca34caecc4a3f97bda81b2098da5e8ab7efc9a66e819074a11955d87e/pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025", size = 223826, upload-time = "2026-02-19T13:45:08.055Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, + { url = "https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237", size = 58929, upload-time = "2026-02-19T13:45:06.034Z" }, ] [[package]] @@ -1943,15 +1943,15 @@ wheels = [ [[package]] name = "rich" -version = "14.3.2" +version = "14.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] [[package]] @@ -2025,98 +2025,98 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" }, - { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" }, - { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" }, - { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" }, - { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" }, - { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" }, - { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" }, - { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" }, - { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" }, - { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" }, - { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" }, - { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" }, - { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" }, +version = "0.15.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/31/d6e536cdebb6568ae75a7f00e4b4819ae0ad2640c3604c305a0428680b0c/ruff-0.15.4.tar.gz", hash = "sha256:3412195319e42d634470cc97aa9803d07e9d5c9223b99bcb1518f0c725f26ae1", size = 4569550, upload-time = "2026-02-26T20:04:14.959Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/82/c11a03cfec3a4d26a0ea1e571f0f44be5993b923f905eeddfc397c13d360/ruff-0.15.4-py3-none-linux_armv6l.whl", hash = "sha256:a1810931c41606c686bae8b5b9a8072adac2f611bb433c0ba476acba17a332e0", size = 10453333, upload-time = "2026-02-26T20:04:20.093Z" }, + { url = "https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5a1632c66672b8b4d3e1d1782859e98d6e0b4e70829530666644286600a33992", size = 10853356, upload-time = "2026-02-26T20:04:05.808Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a4386ba2cd6c0f4ff75252845906acc7c7c8e1ac567b7bc3d373686ac8c222ba", size = 10187434, upload-time = "2026-02-26T20:03:54.656Z" }, + { url = "https://files.pythonhosted.org/packages/85/cc/cc220fd9394eff5db8d94dec199eec56dd6c9f3651d8869d024867a91030/ruff-0.15.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2496488bdfd3732747558b6f95ae427ff066d1fcd054daf75f5a50674411e75", size = 10535456, upload-time = "2026-02-26T20:03:52.738Z" }, + { url = "https://files.pythonhosted.org/packages/fa/0f/bced38fa5cf24373ec767713c8e4cadc90247f3863605fb030e597878661/ruff-0.15.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f1c4893841ff2d54cbda1b2860fa3260173df5ddd7b95d370186f8a5e66a4ac", size = 10287772, upload-time = "2026-02-26T20:04:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/2b/90/58a1802d84fed15f8f281925b21ab3cecd813bde52a8ca033a4de8ab0e7a/ruff-0.15.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:820b8766bd65503b6c30aaa6331e8ef3a6e564f7999c844e9a547c40179e440a", size = 11049051, upload-time = "2026-02-26T20:04:03.53Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ac/b7ad36703c35f3866584564dc15f12f91cb1a26a897dc2fd13d7cb3ae1af/ruff-0.15.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9fb74bab47139c1751f900f857fa503987253c3ef89129b24ed375e72873e85", size = 11890494, upload-time = "2026-02-26T20:04:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/93/3d/3eb2f47a39a8b0da99faf9c54d3eb24720add1e886a5309d4d1be73a6380/ruff-0.15.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f80c98765949c518142b3a50a5db89343aa90f2c2bf7799de9986498ae6176db", size = 11326221, upload-time = "2026-02-26T20:04:12.84Z" }, + { url = "https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451a2e224151729b3b6c9ffb36aed9091b2996fe4bdbd11f47e27d8f2e8888ec", size = 11168459, upload-time = "2026-02-26T20:04:00.969Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e5/a64d27688789b06b5d55162aafc32059bb8c989c61a5139a36e1368285eb/ruff-0.15.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a8f157f2e583c513c4f5f896163a93198297371f34c04220daf40d133fdd4f7f", size = 11104366, upload-time = "2026-02-26T20:03:48.099Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f6/32d1dcb66a2559763fc3027bdd65836cad9eb09d90f2ed6a63d8e9252b02/ruff-0.15.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:917cc68503357021f541e69b35361c99387cdbbf99bd0ea4aa6f28ca99ff5338", size = 10510887, upload-time = "2026-02-26T20:03:45.771Z" }, + { url = "https://files.pythonhosted.org/packages/ff/92/22d1ced50971c5b6433aed166fcef8c9343f567a94cf2b9d9089f6aa80fe/ruff-0.15.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e9737c8161da79fd7cfec19f1e35620375bd8b2a50c3e77fa3d2c16f574105cc", size = 10285939, upload-time = "2026-02-26T20:04:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/e6/f4/7c20aec3143837641a02509a4668fb146a642fd1211846634edc17eb5563/ruff-0.15.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:291258c917539e18f6ba40482fe31d6f5ac023994ee11d7bdafd716f2aab8a68", size = 10765471, upload-time = "2026-02-26T20:03:58.924Z" }, + { url = "https://files.pythonhosted.org/packages/d0/09/6d2f7586f09a16120aebdff8f64d962d7c4348313c77ebb29c566cefc357/ruff-0.15.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3f83c45911da6f2cd5936c436cf86b9f09f09165f033a99dcf7477e34041cbc3", size = 11263382, upload-time = "2026-02-26T20:04:24.424Z" }, + { url = "https://files.pythonhosted.org/packages/1b/fa/2ef715a1cd329ef47c1a050e10dee91a9054b7ce2fcfdd6a06d139afb7ec/ruff-0.15.4-py3-none-win32.whl", hash = "sha256:65594a2d557d4ee9f02834fcdf0a28daa8b3b9f6cb2cb93846025a36db47ef22", size = 10506664, upload-time = "2026-02-26T20:03:50.56Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl", hash = "sha256:04196ad44f0df220c2ece5b0e959c2f37c777375ec744397d21d15b50a75264f", size = 11651048, upload-time = "2026-02-26T20:04:17.191Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0a/9e1be9035b37448ce2e68c978f0591da94389ade5a5abafa4cf99985d1b2/ruff-0.15.4-py3-none-win_arm64.whl", hash = "sha256:60d5177e8cfc70e51b9c5fad936c634872a74209f934c1e79107d11787ad5453", size = 10966776, upload-time = "2026-02-26T20:03:56.908Z" }, ] [[package]] name = "scipy" -version = "1.17.0" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/4b/c89c131aa87cad2b77a54eb0fb94d633a842420fa7e919dc2f922037c3d8/scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd", size = 31381316, upload-time = "2026-01-10T21:24:33.42Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5f/a6b38f79a07d74989224d5f11b55267714707582908a5f1ae854cf9a9b84/scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558", size = 27966760, upload-time = "2026-01-10T21:24:38.911Z" }, - { url = "https://files.pythonhosted.org/packages/c1/20/095ad24e031ee8ed3c5975954d816b8e7e2abd731e04f8be573de8740885/scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7", size = 20138701, upload-time = "2026-01-10T21:24:43.249Z" }, - { url = "https://files.pythonhosted.org/packages/89/11/4aad2b3858d0337756f3323f8960755704e530b27eb2a94386c970c32cbe/scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6", size = 22480574, upload-time = "2026-01-10T21:24:47.266Z" }, - { url = "https://files.pythonhosted.org/packages/85/bd/f5af70c28c6da2227e510875cadf64879855193a687fb19951f0f44cfd6b/scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042", size = 32862414, upload-time = "2026-01-10T21:24:52.566Z" }, - { url = "https://files.pythonhosted.org/packages/ef/df/df1457c4df3826e908879fe3d76bc5b6e60aae45f4ee42539512438cfd5d/scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4", size = 35112380, upload-time = "2026-01-10T21:24:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/5f/bb/88e2c16bd1dd4de19d80d7c5e238387182993c2fb13b4b8111e3927ad422/scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0", size = 34922676, upload-time = "2026-01-10T21:25:04.287Z" }, - { url = "https://files.pythonhosted.org/packages/02/ba/5120242cc735f71fc002cff0303d536af4405eb265f7c60742851e7ccfe9/scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449", size = 37507599, upload-time = "2026-01-10T21:25:09.851Z" }, - { url = "https://files.pythonhosted.org/packages/52/c8/08629657ac6c0da198487ce8cd3de78e02cfde42b7f34117d56a3fe249dc/scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea", size = 36380284, upload-time = "2026-01-10T21:25:15.632Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4a/465f96d42c6f33ad324a40049dfd63269891db9324aa66c4a1c108c6f994/scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379", size = 24370427, upload-time = "2026-01-10T21:25:20.514Z" }, - { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, - { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, - { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, - { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, - { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, - { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, - { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, - { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, - { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, - { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, - { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, - { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, - { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, - { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, - { url = "https://files.pythonhosted.org/packages/b9/b6/8ac583d6da79e7b9e520579f03007cb006f063642afd6b2eeb16b890bf93/scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812", size = 36287211, upload-time = "2026-01-10T21:28:43.122Z" }, - { url = "https://files.pythonhosted.org/packages/55/fb/7db19e0b3e52f882b420417644ec81dd57eeef1bd1705b6f689d8ff93541/scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2", size = 24312646, upload-time = "2026-01-10T21:28:49.893Z" }, - { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, - { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, - { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, - { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, - { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, - { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, - { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, - { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, - { url = "https://files.pythonhosted.org/packages/f9/cc/2bd59140ed3b2fa2882fb15da0a9cb1b5a6443d67cfd0d98d4cec83a57ec/scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0", size = 36328593, upload-time = "2026-01-10T21:28:28.007Z" }, - { url = "https://files.pythonhosted.org/packages/13/1b/c87cc44a0d2c7aaf0f003aef2904c3d097b422a96c7e7c07f5efd9073c1b/scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67", size = 24625083, upload-time = "2026-01-10T21:28:35.188Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, - { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, - { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, - { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, - { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, - { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, - { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, - { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, - { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, - { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, - { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, - { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, - { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, - { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, - { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, ] [[package]] @@ -2370,7 +2370,7 @@ wheels = [ [[package]] name = "typer" -version = "0.23.1" +version = "0.24.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, @@ -2378,9 +2378,9 @@ dependencies = [ { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/07/b822e1b307d40e263e8253d2384cf98c51aa2368cc7ba9a07e523a1d964b/typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134", size = 120047, upload-time = "2026-02-13T10:04:30.984Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e", size = 56813, upload-time = "2026-02-13T10:04:32.008Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, ] [[package]] From b9a3225b49d1e4eaa6d95d9f4ea89e5652c5b44a Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 4 Mar 2026 08:49:17 -0800 Subject: [PATCH 15/31] Remove `valve_max_open_time` feature --- examples/task_patch_foraging.py | 4 +- .../aind_behavior_vr_foraging.json | 8 ---- .../AindBehaviorVrForaging.Generated.cs | 22 ---------- src/aind_behavior_vr_foraging/task_logic.py | 3 -- src/main.bonsai | 43 +------------------ uv.lock | 22 +++++----- 6 files changed, 13 insertions(+), 89 deletions(-) diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 25d0c0d9..8442925b 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -34,9 +34,7 @@ def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimu retracting_distance=2000, ), audio_control=vr_task_logic.AudioControl(frequency=1000, duration=0.2), - odor_control=vr_task_logic.OdorControl( - valve_max_open_time=100000, target_odor_flow=100, target_total_flow=1000, use_channel_3_as_carrier=True - ), + odor_control=vr_task_logic.OdorControl(target_odor_flow=100, target_total_flow=1000, use_channel_3_as_carrier=True), position_control=vr_task_logic.PositionControl( gain=vr_task_logic.Vector3(x=1, y=1, z=1), initial_position=vr_task_logic.Vector3(x=0, y=2.56, z=0), diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index b74f6e93..9aa7abcb 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -2261,13 +2261,6 @@ "OdorControl": { "description": "Controls the odor delivery system parameters.\n\nThis class manages the olfactory stimulus delivery system, including flow rates,\nvalve timing, and carrier gas configuration. It ensures proper odor concentration\nand delivery timing for the behavioral task.", "properties": { - "valve_max_open_time": { - "default": 10, - "description": "Maximum time (s) the valve can be open continuously", - "minimum": 0, - "title": "Valve Max Open Time", - "type": "number" - }, "target_total_flow": { "default": 1000, "description": "Target total flow (ml/s) of the odor mixture", @@ -2595,7 +2588,6 @@ "odor_control": { "$ref": "#/$defs/OdorControl", "default": { - "valve_max_open_time": 10.0, "target_total_flow": 1000.0, "use_channel_3_as_carrier": true, "target_odor_flow": 100.0 diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 1c0001dc..3d0ef2bb 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -6366,8 +6366,6 @@ public override string ToString() public partial class OdorControl { - private double _valveMaxOpenTime; - private double _targetTotalFlow; private bool _useChannel3AsCarrier; @@ -6376,7 +6374,6 @@ public partial class OdorControl public OdorControl() { - _valveMaxOpenTime = 10D; _targetTotalFlow = 1000D; _useChannel3AsCarrier = true; _targetOdorFlow = 100D; @@ -6384,29 +6381,11 @@ public OdorControl() protected OdorControl(OdorControl other) { - _valveMaxOpenTime = other._valveMaxOpenTime; _targetTotalFlow = other._targetTotalFlow; _useChannel3AsCarrier = other._useChannel3AsCarrier; _targetOdorFlow = other._targetOdorFlow; } - /// - /// Maximum time (s) the valve can be open continuously - /// - [Newtonsoft.Json.JsonPropertyAttribute("valve_max_open_time")] - [System.ComponentModel.DescriptionAttribute("Maximum time (s) the valve can be open continuously")] - public double ValveMaxOpenTime - { - get - { - return _valveMaxOpenTime; - } - set - { - _valveMaxOpenTime = value; - } - } - /// /// Target total flow (ml/s) of the odor mixture /// @@ -6470,7 +6449,6 @@ public System.IObservable Generate(System.IObservable - - WaitForMaxOpenTime - - - - OdorEndValveState - - - TaskLogicParameters - - - OperationControl.OdorControl.ValveMaxOpenTime - - - ToSeconds - TimeSpan.FromSeconds(it) - - - - - - - - PT5S - - - OdorEndValveState - - - - - - - - - - - - - - SetOdorMix @@ -2867,8 +2826,8 @@ Item3 as Right) + - diff --git a/uv.lock b/uv.lock index bdfd2726..789de16f 100644 --- a/uv.lock +++ b/uv.lock @@ -159,8 +159,8 @@ aind-services = [ [[package]] name = "aind-data-schema" -version = "2.5.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#219b5511807279cc8e82db4674b3081a72102d84" } +version = "2.5.1" +source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#26c8420e5e79ca35d3a8d9b598d81b0536cbe334" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, @@ -844,11 +844,11 @@ wheels = [ [[package]] name = "imagesize" -version = "1.4.1" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } +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/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, + { 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]] @@ -1843,20 +1843,20 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.2.1" +version = "1.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] [[package]] name = "pytz" -version = "2025.2" +version = "2026.1.post1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, ] [[package]] From 1a45ac0ed85ac5ecb525c969eacfeccb7308520f Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 11 Mar 2026 02:43:51 -0700 Subject: [PATCH 16/31] Refactor lenses models for Front and Face cameras Fixes Fix lenses models in Instrument mapper Fixes #494 --- src/aind_behavior_vr_foraging/data_mappers/_rig.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/aind_behavior_vr_foraging/data_mappers/_rig.py b/src/aind_behavior_vr_foraging/data_mappers/_rig.py index 3d5872a6..1444bb47 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_rig.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_rig.py @@ -628,8 +628,8 @@ class _PartialCameraAssembly: ], lens=devices.Lens( name="face_camera_lens", - manufacturer=devices.Organization.TAMRON, - model="M112FM16", + manufacturer=devices.Organization.FUJINON, + model="CF50ZA-1S", ), ), "SideCamera": _PartialCameraAssembly( @@ -637,7 +637,9 @@ class _PartialCameraAssembly: target=devices.CameraTarget.BODY, relative_position=[aind_schema_model_coordinates.AnatomicalRelative.LATERAL], lens=devices.Lens( - name="side_camera_lens", manufacturer=devices.Organization.OTHER, model="LM5JCM", notes="manufacturer=Kowa" + name="side_camera_lens", + manufacturer=devices.Organization.KOWA, + model="LM5JCM", ), ), "FrontCamera": _PartialCameraAssembly( @@ -648,7 +650,9 @@ class _PartialCameraAssembly: aind_schema_model_coordinates.AnatomicalRelative.SUPERIOR, ], lens=devices.Lens( - name="front_camera_lens", manufacturer=devices.Organization.OTHER, model="LM5JCM", notes="manufacturer=Kowa" + name="front_camera_lens", + manufacturer=devices.Organization.KOWA, + model="LM25HC", ), ), } From 5c8724f546c2c35063b37fe97840ce856353f5f5 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 11 Mar 2026 02:49:48 -0700 Subject: [PATCH 17/31] Avoid using in-place mutation of read-only dataframe --- src/aind_behavior_vr_foraging/data_qc/data_qc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aind_behavior_vr_foraging/data_qc/data_qc.py b/src/aind_behavior_vr_foraging/data_qc/data_qc.py index f21f9d3f..7edeb456 100644 --- a/src/aind_behavior_vr_foraging/data_qc/data_qc.py +++ b/src/aind_behavior_vr_foraging/data_qc/data_qc.py @@ -111,8 +111,8 @@ def test_render_latency(self, max_latency: t.Optional[float] = None): ts_photodiode = ts_photodiode[1:] ts_gpu = ts_gpu[1:] # Zero both arrays to make it easier to manipulate - ts_gpu -= ts_gpu[0] - ts_photodiode -= ts_photodiode[0] + ts_gpu = ts_gpu - ts_gpu[0] + ts_photodiode = ts_photodiode - ts_photodiode[0] aligned_gpu_photodiode = np.empty((len(ts_gpu), 2)) aligned_gpu_photodiode[:] = np.nan From d153b6d79e52e7f84b128b8be99d296470f93949 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 25 Mar 2026 03:22:05 -0700 Subject: [PATCH 18/31] Refactor to use external sgen references --- .config/dotnet-tools.json | 2 +- bonsai/Bonsai.config | 31 +- pyproject.toml | 6 +- .../aind_behavior_vr_foraging.json | 121 +- src/Extensions.csproj | 4 +- src/Extensions/AddGapSite.bonsai | 13 +- src/Extensions/AddInterPatchSite.bonsai | 12 +- src/Extensions/AddPostPatchSite.bonsai | 13 +- src/Extensions/AddRewardSite.bonsai | 11 +- .../AindBehaviorVrForaging.Generated.cs | 15133 ++++++---------- src/Extensions/AindBehaviorVrForaging.cs | 305 +- src/Extensions/InstantiateSite.bonsai | 6 +- src/Extensions/NullDistribution.cs | 6 +- src/Extensions/OperationControl.bonsai | 2376 +++ src/Extensions/PatchState.cs | 2 +- src/Extensions/SolveBlockTransitions.bonsai | 15 +- src/Extensions/UpdateVariable.bonsai | 137 +- src/Extensions/VariableUpdaters.bonsai | 128 + src/main.bonsai | 2999 +-- uv.lock | 706 +- 20 files changed, 8903 insertions(+), 13123 deletions(-) create mode 100644 src/Extensions/OperationControl.bonsai create mode 100644 src/Extensions/VariableUpdaters.bonsai diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 44b1c27d..134d7ab4 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "bonsai.sgen": { - "version": "0.6.1", + "version": "0.9.0", "commands": [ "bonsai.sgen" ] diff --git a/bonsai/Bonsai.config b/bonsai/Bonsai.config index ca095052..86498157 100644 --- a/bonsai/Bonsai.config +++ b/bonsai/Bonsai.config @@ -4,10 +4,11 @@ - - - - + + + + + @@ -30,8 +31,8 @@ - - + + @@ -74,7 +75,7 @@ - + @@ -84,6 +85,7 @@ + @@ -132,10 +134,11 @@ - - - - + + + + + @@ -157,8 +160,8 @@ - - + + @@ -197,7 +200,7 @@ - + diff --git a/pyproject.toml b/pyproject.toml index 7cedfeff..92d8d9cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.7.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.13.2", + "aind_behavior_services>=0.13.5", "pydantic-settings" ] @@ -41,8 +41,8 @@ launcher = [ dev = [ "aind_behavior_vr_foraging[launcher]", "aind_behavior_vr_foraging[data]", - "aind-data-schema@git+https://github.com/AllenNeuralDynamics/aind-data-schema@dev", - "aind-data-schema-models@git+https://github.com/AllenNeuralDynamics/aind-data-schema-models@main", + "aind-data-schema", + "aind-data-schema-models", "ruff", "codespell", ] diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index 9aa7abcb..53367c5a 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -92,7 +92,8 @@ } }, "title": "AindManipulatorCalibration", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration" }, "AindManipulatorDevice": { "description": "Appends a task specific configuration to the base manipulator model.", @@ -209,7 +210,7 @@ "AindVrForagingRig": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.13.2", + "default": "0.13.5", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -473,7 +474,7 @@ "title": "Rng Seed" }, "aind_behavior_services_pkg_version": { - "default": "0.13.2", + "default": "0.13.5", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -544,7 +545,8 @@ "Y1", "Y2", "Z" - ] + ], + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.Axis" }, "AxisConfiguration": { "description": "Axis configuration", @@ -601,7 +603,8 @@ "axis" ], "title": "AxisConfiguration", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.AxisConfiguration" }, "BaseModel": { "properties": {}, @@ -652,7 +655,8 @@ } }, "title": "BetaDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BetaDistribution" }, "BetaDistributionParameters": { "description": "Parameters for a beta distribution.\n\nDefined by alpha and beta shape parameters.", @@ -679,7 +683,8 @@ } }, "title": "BetaDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BetaDistributionParameters" }, "BinomialDistribution": { "description": "A binomial probability distribution.\n\nModels the number of successes in a fixed number of independent\nBernoulli trials with constant success probability.", @@ -725,7 +730,8 @@ } }, "title": "BinomialDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BinomialDistribution" }, "BinomialDistributionParameters": { "description": "Parameters for a binomial distribution.\n\nDefined by number of trials (n) and success probability (p).", @@ -753,7 +759,8 @@ } }, "title": "BinomialDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BinomialDistributionParameters" }, "Block": { "description": "Configuration for a single experimental block.\n\nA block represents a period of the experiment with specific environment\nstatistics and ending conditions. Each block defines the environmental\nparameters and termination criteria for that experimental phase.", @@ -1362,7 +1369,8 @@ "$ref": "#/$defs/PdfDistribution" } ], - "title": "Distribution" + "title": "Distribution", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution" }, "EnvironmentStatistics": { "description": "Defines the statistical properties of the foraging environment.\n\nThis class specifies the patches available in the environment, their transition\nprobabilities, and initial state occupancy. It forms the core specification\nfor the foraging environment structure.", @@ -1457,7 +1465,8 @@ } }, "title": "ExponentialDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ExponentialDistribution" }, "ExponentialDistributionParameters": { "description": "Parameters for an exponential distribution.\n\nDefined by the rate parameter (inverse of mean).", @@ -1477,7 +1486,8 @@ } }, "title": "ExponentialDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ExponentialDistributionParameters" }, "GammaDistribution": { "description": "A gamma probability distribution.\n\nGeneralizes the exponential distribution. Used for modeling\npositive continuous variables with right-skewed distributions.", @@ -1523,7 +1533,8 @@ } }, "title": "GammaDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.GammaDistribution" }, "GammaDistributionParameters": { "description": "Parameters for a gamma distribution.\n\nDefined by shape (k) and rate (\u03b8\u207b\u00b9) parameters.", @@ -1550,7 +1561,8 @@ } }, "title": "GammaDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.GammaDistributionParameters" }, "HarpAnalogInput": { "properties": { @@ -1911,7 +1923,8 @@ } }, "title": "LogNormalDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.LogNormalDistribution" }, "LogNormalDistributionParameters": { "description": "Parameters for a log-normal distribution.\n\nDefined by the mean and standard deviation of the underlying normal distribution.", @@ -1936,7 +1949,8 @@ } }, "title": "LogNormalDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.LogNormalDistributionParameters" }, "LookupTableFunction": { "description": "A patch update function that uses lookup table interpolation.\n\nUpdate in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)].\nThis function maps input values to output values using a lookup table with\nlinear interpolation between defined points. Useful for complex, non-linear\nreward schedules or parameter updates.", @@ -2000,7 +2014,8 @@ "z" ], "title": "ManipulatorPosition", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.ManipulatorPosition" }, "Measurement": { "description": "Input for water valve calibration class", @@ -2058,7 +2073,8 @@ "Microstep16", "Microstep32", "Microstep64" - ] + ], + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.MicrostepResolution" }, "MotorOperationMode": { "description": "Motor operation mode", @@ -2071,7 +2087,8 @@ "x-enumNames": [ "Quiet", "Dynamic" - ] + ], + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.MotorOperationMode" }, "MovableSpoutControl": { "description": "Controls the movable water spout behavior for reward delivery.\n\nThis class configures how the movable spout operates, including when it's\nenabled, timing for reward collection, and retraction distance for operant\nconditioning protocols.", @@ -2144,7 +2161,8 @@ } }, "title": "NormalDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.NormalDistribution" }, "NormalDistributionParameters": { "description": "Parameters for a normal (Gaussian) distribution.\n\nDefined by mean (center) and standard deviation (spread).", @@ -2169,7 +2187,8 @@ } }, "title": "NormalDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.NormalDistributionParameters" }, "NumericalUpdater": { "description": "A numerical updater that modifies task parameters during execution.\n\nThis class combines an operation type with parameters to define how values\nshould be updated dynamically during the task, enabling adaptive behavior\nbased on animal performance or other criteria.", @@ -3213,7 +3232,8 @@ } }, "title": "PdfDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PdfDistribution" }, "PdfDistributionParameters": { "description": "Parameters for a custom probability density function distribution.\n\nDefined by explicit probability values and their corresponding indices.\nProbabilities are automatically normalized to sum to 1.", @@ -3249,7 +3269,8 @@ } }, "title": "PdfDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PdfDistributionParameters" }, "PersistentRewardFunction": { "description": "A RewardFunction that is always active.", @@ -3361,7 +3382,8 @@ } }, "title": "PoissonDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PoissonDistribution" }, "PoissonDistributionParameters": { "description": "Parameters for a Poisson distribution.\n\nDefined by the rate parameter (average number of events).", @@ -3381,7 +3403,8 @@ } }, "title": "PoissonDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PoissonDistributionParameters" }, "PositionControl": { "description": "Controls the position tracking and movement detection parameters.\n\nThis class manages the position control system including coordinate transformations,\ninitial positioning, signal filtering, and movement detection thresholds for the\nvirtual reality foraging task.", @@ -3617,20 +3640,33 @@ "description": "Parameters of the distribution" }, "truncation_parameters": { - "const": null, "default": null, - "title": "Truncation Parameters", - "type": "null" + "description": "Truncation parameters of the distribution", + "oneOf": [ + { + "$ref": "#/$defs/TruncationParameters" + }, + { + "type": "null" + } + ] }, "scaling_parameters": { - "const": null, "default": null, - "title": "Scaling Parameters", - "type": "null" + "description": "Scaling parameters of the distribution", + "oneOf": [ + { + "$ref": "#/$defs/ScalingParameters" + }, + { + "type": "null" + } + ] } }, "title": "Scalar", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.Scalar" }, "ScalarDistributionParameter": { "description": "Parameters for a scalar (constant) distribution.\n\nRepresents a deterministic value that always returns the same number.", @@ -3649,7 +3685,8 @@ } }, "title": "ScalarDistributionParameter", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ScalarDistributionParameter" }, "ScalingParameters": { "description": "Parameters for scaling and offsetting sampled distribution values.\nScaling is applied as (value * scale + offset).\n\nApplies linear transformation: result = (value * scale) + offset.", @@ -3668,7 +3705,8 @@ } }, "title": "ScalingParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ScalingParameters" }, "ScreenAssembly": { "description": "Represents a screen assembly (left, center and right screens) and respective configuration.", @@ -3871,14 +3909,14 @@ "Session": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.13.2", + "default": "0.13.5", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" }, "version": { - "const": "0.13.2", - "default": "0.13.2", + "const": "0.13.5", + "default": "0.13.5", "title": "Version", "type": "string" }, @@ -4640,7 +4678,8 @@ } }, "title": "TruncationParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.TruncationParameters" }, "UniformDistribution": { "description": "A uniform probability distribution.\n\nAll values between min and max have equal probability of being sampled.", @@ -4686,7 +4725,8 @@ } }, "title": "UniformDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.UniformDistribution" }, "UniformDistributionParameters": { "description": "Parameters for a uniform distribution.\n\nDefined by minimum and maximum bounds of the distribution.", @@ -4711,7 +4751,8 @@ } }, "title": "UniformDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.UniformDistributionParameters" }, "UpdaterTarget": { "description": "Enumeration of parameters that can be targeted by numerical updaters.\n\nThese targets define which task parameters can be dynamically modified\nduring task execution to adapt to animal performance or experimental needs.", diff --git a/src/Extensions.csproj b/src/Extensions.csproj index fb3b6fb9..1e4e1f78 100644 --- a/src/Extensions.csproj +++ b/src/Extensions.csproj @@ -20,6 +20,8 @@ - + + + \ No newline at end of file diff --git a/src/Extensions/AddGapSite.bonsai b/src/Extensions/AddGapSite.bonsai index 0d1b6ef9..7afa4531 100644 --- a/src/Extensions/AddGapSite.bonsai +++ b/src/Extensions/AddGapSite.bonsai @@ -1,8 +1,9 @@  - @@ -57,8 +58,9 @@ - + LengthDistribution + RngSeed @@ -69,7 +71,7 @@ - + @@ -97,7 +99,9 @@ - + + + @@ -112,6 +116,7 @@ 388 + 20.7234077 0 diff --git a/src/Extensions/AddInterPatchSite.bonsai b/src/Extensions/AddInterPatchSite.bonsai index d2267349..23bd868e 100644 --- a/src/Extensions/AddInterPatchSite.bonsai +++ b/src/Extensions/AddInterPatchSite.bonsai @@ -1,8 +1,9 @@  - @@ -46,7 +47,7 @@ - + LengthDistribution @@ -58,7 +59,7 @@ - + @@ -84,7 +85,9 @@ - + + + @@ -97,6 +100,7 @@ 0 + 120 0 diff --git a/src/Extensions/AddPostPatchSite.bonsai b/src/Extensions/AddPostPatchSite.bonsai index 1fb98db8..5ef5e83a 100644 --- a/src/Extensions/AddPostPatchSite.bonsai +++ b/src/Extensions/AddPostPatchSite.bonsai @@ -1,8 +1,9 @@  - @@ -55,8 +56,9 @@ - + LengthDistribution + RngSeed @@ -67,7 +69,7 @@ - + @@ -93,7 +95,9 @@ - + + + @@ -106,6 +110,7 @@ 0 + 120 0 diff --git a/src/Extensions/AddRewardSite.bonsai b/src/Extensions/AddRewardSite.bonsai index b9e9687d..ac50c6eb 100644 --- a/src/Extensions/AddRewardSite.bonsai +++ b/src/Extensions/AddRewardSite.bonsai @@ -3,6 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" + xmlns:p2="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -55,8 +56,9 @@ - + LengthDistribution + RngSeed @@ -67,7 +69,7 @@ - + @@ -106,7 +108,9 @@ - + + + @@ -136,6 +140,7 @@ 353 + 35.1602135 0 diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 3d0ef2bb..bb66e2f4 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -9,152 +9,10 @@ namespace AindVrForagingDataSchema { #pragma warning disable // Disable all warnings - /// - /// AindManipulator calibration class - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("AindManipulator calibration class")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorCalibration - { - - private string _description; - - private ManipulatorPosition _fullStepToMm; - - private System.Collections.Generic.List _axisConfiguration; - - private System.Collections.Generic.List _homingOrder; - - private ManipulatorPosition _initialPosition; - - public AindManipulatorCalibration() - { - _description = "AindManipulator calibration and settings"; - _fullStepToMm = new ManipulatorPosition(); - _axisConfiguration = new System.Collections.Generic.List(); - _homingOrder = new System.Collections.Generic.List(); - _initialPosition = new ManipulatorPosition(); - } - - protected AindManipulatorCalibration(AindManipulatorCalibration other) - { - _description = other._description; - _fullStepToMm = other._fullStepToMm; - _axisConfiguration = other._axisConfiguration; - _homingOrder = other._homingOrder; - _initialPosition = other._initialPosition; - } - - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description - { - get - { - return _description; - } - set - { - _description = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("full_step_to_mm")] - public ManipulatorPosition FullStepToMm - { - get - { - return _fullStepToMm; - } - set - { - _fullStepToMm = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("axis_configuration")] - public System.Collections.Generic.List AxisConfiguration - { - get - { - return _axisConfiguration; - } - set - { - _axisConfiguration = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("homing_order")] - public System.Collections.Generic.List HomingOrder - { - get - { - return _homingOrder; - } - set - { - _homingOrder = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] - public ManipulatorPosition InitialPosition - { - get - { - return _initialPosition; - } - set - { - _initialPosition = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("FullStepToMm = " + _fullStepToMm + ", "); - stringBuilder.Append("AxisConfiguration = " + _axisConfiguration + ", "); - stringBuilder.Append("HomingOrder = " + _homingOrder + ", "); - stringBuilder.Append("InitialPosition = " + _initialPosition); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - /// /// Appends a task specific configuration to the base manipulator model. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Appends a task specific configuration to the base manipulator model.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] @@ -163,7 +21,7 @@ public partial class AindManipulatorDevice private string _deviceType; - private AindManipulatorCalibration _calibration; + private AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration _calibration; private int _whoAmI; @@ -171,14 +29,14 @@ public partial class AindManipulatorDevice private string _portName; - private Axis _spoutAxis; + private AllenNeuralDynamics.AindManipulator.Axis _spoutAxis; public AindManipulatorDevice() { _deviceType = "StepperDriver"; - _calibration = new AindManipulatorCalibration(); + _calibration = new AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration(); _whoAmI = 1130; - _spoutAxis = AindVrForagingDataSchema.Axis.Y1; + _spoutAxis = AllenNeuralDynamics.AindManipulator.Axis.Y1; } protected AindManipulatorDevice(AindManipulatorDevice other) @@ -210,7 +68,7 @@ public string DeviceType [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public AindManipulatorCalibration Calibration + public AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration Calibration { get { @@ -272,10 +130,9 @@ public string PortName /// /// Spout axis /// - [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("spout_axis")] [System.ComponentModel.DescriptionAttribute("Spout axis")] - public Axis SpoutAxis + public AllenNeuralDynamics.AindManipulator.Axis SpoutAxis { get { @@ -323,7 +180,7 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class AindVrForagingRig @@ -367,7 +224,7 @@ public partial class AindVrForagingRig public AindVrForagingRig() { - _aindBehaviorServicesPkgVersion = "0.13.2"; + _aindBehaviorServicesPkgVersion = "0.13.5"; _version = "0.7.0-rc0"; _triggeredCameraController = new CameraControllerSpinnakerCamera(); _harpBehavior = new HarpBehavior(); @@ -768,7 +625,7 @@ public override string ToString() ///specification for the virtual reality foraging behavioral experiment. ///It includes all task parameters, environment specifications, and control settings. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute(@"Main task logic model for the AIND VR Foraging task. This is the top-level class that encapsulates the complete task logic @@ -930,7 +787,7 @@ public override string ToString() ///including environment structure, task mode settings, operation control, ///and numerical updaters for dynamic parameter modification. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute(@"Complete parameter specification for the AIND VR Foraging task. This class contains all configurable parameters for the VR foraging task, @@ -945,7 +802,7 @@ public partial class AindVrForagingTaskParameters private string _aindBehaviorServicesPkgVersion; - private System.Collections.Generic.Dictionary _updaters; + private System.Collections.Generic.Dictionary _updaters; private BlockStructure _environment; @@ -953,7 +810,7 @@ public partial class AindVrForagingTaskParameters public AindVrForagingTaskParameters() { - _aindBehaviorServicesPkgVersion = "0.13.2"; + _aindBehaviorServicesPkgVersion = "0.13.5"; _environment = new BlockStructure(); _operationControl = new OperationControl(); } @@ -970,7 +827,6 @@ protected AindVrForagingTaskParameters(AindVrForagingTaskParameters other) /// /// Seed of the random number generator /// - [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("rng_seed")] [System.ComponentModel.DescriptionAttribute("Seed of the random number generator")] public double? RngSeed @@ -1004,7 +860,7 @@ public string AindBehaviorServicesPkgVersion [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("updaters")] [System.ComponentModel.DescriptionAttribute("Look-up table for numeric updaters")] - public System.Collections.Generic.Dictionary Updaters + public System.Collections.Generic.Dictionary Updaters { get { @@ -1093,7 +949,7 @@ public override string ToString() ///This class manages audio cue generation including tone duration and frequency ///for auditory feedback during the behavioral task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Controls audio feedback parameters for the task.\n\nThis class manages audio cue ge" + "neration including tone duration and frequency\nfor auditory feedback during the " + "behavioral task.")] @@ -1184,214 +1040,133 @@ public override string ToString() } - /// - /// Motor axis available - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum Axis - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - None = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - X = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Y1 = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Y2 = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] - Z = 4, - } - - - /// - /// Axis configuration - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Axis configuration")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AxisConfiguration + public partial class BaseModel { - private Axis _axis; - - private int _stepAccelerationInterval; - - private int _stepInterval; - - private MicrostepResolution _microstepResolution; - - private int _maximumStepInterval; - - private MotorOperationMode _motorOperationMode; - - private double _maxLimit; - - private double _minLimit; - - public AxisConfiguration() + public BaseModel() { - _stepAccelerationInterval = 100; - _stepInterval = 100; - _microstepResolution = AindVrForagingDataSchema.MicrostepResolution.Microstep8; - _maximumStepInterval = 2000; - _motorOperationMode = AindVrForagingDataSchema.MotorOperationMode.Quiet; - _maxLimit = 25D; - _minLimit = -0.01D; } - protected AxisConfiguration(AxisConfiguration other) + protected BaseModel(BaseModel other) { - _axis = other._axis; - _stepAccelerationInterval = other._stepAccelerationInterval; - _stepInterval = other._stepInterval; - _microstepResolution = other._microstepResolution; - _maximumStepInterval = other._maximumStepInterval; - _motorOperationMode = other._motorOperationMode; - _maxLimit = other._maxLimit; - _minLimit = other._minLimit; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("axis", Required=Newtonsoft.Json.Required.Always)] - public Axis Axis + public System.IObservable Generate() { - get - { - return _axis; - } - set - { - _axis = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BaseModel(this))); } - /// - /// Acceleration of the step interval in microseconds - /// - [Newtonsoft.Json.JsonPropertyAttribute("step_acceleration_interval")] - [System.ComponentModel.DescriptionAttribute("Acceleration of the step interval in microseconds")] - public int StepAccelerationInterval + public System.IObservable Generate(System.IObservable source) { - get - { - return _stepAccelerationInterval; - } - set - { - _stepAccelerationInterval = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new BaseModel(this)); } - /// - /// Step interval in microseconds. - /// - [Newtonsoft.Json.JsonPropertyAttribute("step_interval")] - [System.ComponentModel.DescriptionAttribute("Step interval in microseconds.")] - public int StepInterval + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _stepInterval; - } - set - { - _stepInterval = value; - } + return false; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("microstep_resolution")] - public MicrostepResolution MicrostepResolution + public override string ToString() { - get - { - return _microstepResolution; - } - set + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _microstepResolution = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + /// + /// Configuration for a single experimental block. + /// + ///A block represents a period of the experiment with specific environment + ///statistics and ending conditions. Each block defines the environmental + ///parameters and termination criteria for that experimental phase. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Configuration for a single experimental block.\n\nA block represents a period of th" + + "e experiment with specific environment\nstatistics and ending conditions. Each bl" + + "ock defines the environmental\nparameters and termination criteria for that exper" + + "imental phase.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Block + { + + private EnvironmentStatistics _environmentStatistics; + + private System.Collections.Generic.List _endConditions; - [Newtonsoft.Json.JsonPropertyAttribute("maximum_step_interval")] - public int MaximumStepInterval + public Block() { - get - { - return _maximumStepInterval; - } - set - { - _maximumStepInterval = value; - } + _environmentStatistics = new EnvironmentStatistics(); + _endConditions = new System.Collections.Generic.List(); } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("motor_operation_mode")] - public MotorOperationMode MotorOperationMode + protected Block(Block other) { - get - { - return _motorOperationMode; - } - set - { - _motorOperationMode = value; - } + _environmentStatistics = other._environmentStatistics; + _endConditions = other._endConditions; } - [Newtonsoft.Json.JsonPropertyAttribute("max_limit")] - public double MaxLimit + /// + /// Statistics of the environment + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("environment_statistics", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] + public EnvironmentStatistics EnvironmentStatistics { get { - return _maxLimit; + return _environmentStatistics; } set { - _maxLimit = value; + _environmentStatistics = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("min_limit")] - public double MinLimit + /// + /// List of end conditions that must be true for the block to end. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("end_conditions")] + [System.ComponentModel.DescriptionAttribute("List of end conditions that must be true for the block to end.")] + public System.Collections.Generic.List EndConditions { get { - return _minLimit; + return _endConditions; } set { - _minLimit = value; + _endConditions = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AxisConfiguration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Block(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AxisConfiguration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Block(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Axis = " + _axis + ", "); - stringBuilder.Append("StepAccelerationInterval = " + _stepAccelerationInterval + ", "); - stringBuilder.Append("StepInterval = " + _stepInterval + ", "); - stringBuilder.Append("MicrostepResolution = " + _microstepResolution + ", "); - stringBuilder.Append("MaximumStepInterval = " + _maximumStepInterval + ", "); - stringBuilder.Append("MotorOperationMode = " + _motorOperationMode + ", "); - stringBuilder.Append("MaxLimit = " + _maxLimit + ", "); - stringBuilder.Append("MinLimit = " + _minLimit); + stringBuilder.Append("EnvironmentStatistics = " + _environmentStatistics + ", "); + stringBuilder.Append("EndConditions = " + _endConditions); return true; } @@ -1410,28 +1185,41 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Block end condition based on time duration. + /// + ///This condition ends a block after a specified amount of time has elapsed. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "condition_type")] + [JsonInheritanceAttribute("Duration", typeof(BlockEndConditionDuration))] + [JsonInheritanceAttribute("Distance", typeof(BlockEndConditionDistance))] + [JsonInheritanceAttribute("Choice", typeof(BlockEndConditionChoice))] + [JsonInheritanceAttribute("Reward", typeof(BlockEndConditionReward))] + [JsonInheritanceAttribute("PatchCount", typeof(BlockEndConditionPatchCount))] + [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + + "specified amount of time has elapsed.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BaseModel + public partial class BlockEndCondition { - public BaseModel() + public BlockEndCondition() { } - protected BaseModel(BaseModel other) + protected BlockEndCondition(BlockEndCondition other) { } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BaseModel(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndCondition(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BaseModel(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndCondition(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -1455,100 +1243,123 @@ public override string ToString() /// - /// A beta probability distribution. + /// Block end condition based on number of choices made. /// - ///Continuous distribution bounded between 0 and 1. Commonly used - ///for modeling probabilities and proportions. + ///This condition ends a block after the animal has made a specified number + ///of choices (e.g., patch visits or reward attempts). /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A beta probability distribution.\n\nContinuous distribution bounded between 0 and 1" + - ". Commonly used\nfor modeling probabilities and proportions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on number of choices made.\n\nThis condition ends a block" + + " after the animal has made a specified number\nof choices (e.g., patch visits or " + + "reward attempts).")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BetaDistribution : Distribution + public partial class BlockEndConditionChoice : BlockEndCondition { - private BetaDistributionParameters _distributionParameters; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; - private TruncationParameters _truncationParameters; - - private ScalingParameters _scalingParameters; - - public BetaDistribution() + public BlockEndConditionChoice() { - _distributionParameters = new BetaDistributionParameters(); } - protected BetaDistribution(BetaDistribution other) : + protected BlockEndConditionChoice(BlockEndConditionChoice other) : base(other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _value = other._value; } /// - /// Parameters of the distribution + /// Number of choices after which the block ends. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public BetaDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of choices after which the block ends.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _distributionParameters; + return _value; } set { - _distributionParameters = value; + _value = value; } } - /// - /// Truncation parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + public System.IObservable Generate() { - get - { - return _truncationParameters; - } - set + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionChoice(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionChoice(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - _truncationParameters = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Value = " + _value); + return true; + } + } + + + /// + /// Block end condition based on distance traveled. + /// + ///This condition ends a block after the animal has traveled a specified distance. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on distance traveled.\n\nThis condition ends a block afte" + + "r the animal has traveled a specified distance.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class BlockEndConditionDistance : BlockEndCondition + { + + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; + + public BlockEndConditionDistance() + { + } + + protected BlockEndConditionDistance(BlockEndConditionDistance other) : + base(other) + { + _value = other._value; } /// - /// Scaling parameters of the distribution + /// Distance after which the block ends. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Distance after which the block ends.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _scalingParameters; + return _value; } set { - _scalingParameters = value; + _value = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BetaDistribution(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDistance(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BetaDistribution(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDistance(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -1557,221 +1368,195 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); + stringBuilder.Append("Value = " + _value); return true; } } /// - /// Parameters for a beta distribution. + /// Block end condition based on time duration. /// - ///Defined by alpha and beta shape parameters. + ///This condition ends a block after a specified amount of time has elapsed. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a beta distribution.\n\nDefined by alpha and beta shape parameters.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + + "specified amount of time has elapsed.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BetaDistributionParameters + public partial class BlockEndConditionDuration : BlockEndCondition { - private string _family; - - private double _alpha; - - private double _beta; - - public BetaDistributionParameters() - { - _family = "Beta"; - _alpha = 5D; - _beta = 5D; - } - - protected BetaDistributionParameters(BetaDistributionParameters other) - { - _family = other._family; - _alpha = other._alpha; - _beta = other._beta; - } + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + public BlockEndConditionDuration() { - get - { - return _family; - } - set - { - _family = value; - } } - /// - /// Alpha parameter of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("alpha")] - [System.ComponentModel.DescriptionAttribute("Alpha parameter of the distribution")] - public double Alpha + protected BlockEndConditionDuration(BlockEndConditionDuration other) : + base(other) { - get - { - return _alpha; - } - set - { - _alpha = value; - } + _value = other._value; } /// - /// Beta parameter of the distribution + /// Time after which the block ends. /// - [Newtonsoft.Json.JsonPropertyAttribute("beta")] - [System.ComponentModel.DescriptionAttribute("Beta parameter of the distribution")] - public double Beta + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Time after which the block ends.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _beta; + return _value; } set { - _beta = value; + _value = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BetaDistributionParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new BetaDistributionParameters(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDuration(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Alpha = " + _alpha + ", "); - stringBuilder.Append("Beta = " + _beta); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDuration(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Value = " + _value); + return true; } } /// - /// A binomial probability distribution. + /// Block end condition based on number of patches visited. /// - ///Models the number of successes in a fixed number of independent - ///Bernoulli trials with constant success probability. + ///This condition ends a block after the animal has visited a specified + ///number of unique patches. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A binomial probability distribution.\n\nModels the number of successes in a fixed n" + - "umber of independent\nBernoulli trials with constant success probability.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on number of patches visited.\n\nThis condition ends a bl" + + "ock after the animal has visited a specified\nnumber of unique patches.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BinomialDistribution : Distribution + public partial class BlockEndConditionPatchCount : BlockEndCondition { - private BinomialDistributionParameters _distributionParameters; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; - private TruncationParameters _truncationParameters; - - private ScalingParameters _scalingParameters; - - public BinomialDistribution() + public BlockEndConditionPatchCount() { - _distributionParameters = new BinomialDistributionParameters(); } - protected BinomialDistribution(BinomialDistribution other) : + protected BlockEndConditionPatchCount(BlockEndConditionPatchCount other) : base(other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _value = other._value; } /// - /// Parameters of the distribution + /// Number of patches after which the block will end. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public BinomialDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of patches after which the block will end.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _distributionParameters; + return _value; } set { - _distributionParameters = value; + _value = value; } } - /// - /// Truncation parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + public System.IObservable Generate() { - get - { - return _truncationParameters; - } - set + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionPatchCount(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionPatchCount(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - _truncationParameters = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Value = " + _value); + return true; + } + } + + + /// + /// Block end condition based on number of rewards obtained. + /// + ///This condition ends a block after the animal has obtained a specified + ///number of rewards. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on number of rewards obtained.\n\nThis condition ends a b" + + "lock after the animal has obtained a specified\nnumber of rewards.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class BlockEndConditionReward : BlockEndCondition + { + + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; + + public BlockEndConditionReward() + { + } + + protected BlockEndConditionReward(BlockEndConditionReward other) : + base(other) + { + _value = other._value; } /// - /// Scaling parameters of the distribution + /// Number of rewards after which the block ends. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of rewards after which the block ends.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _scalingParameters; + return _value; } set { - _scalingParameters = value; + _value = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BinomialDistribution(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionReward(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BinomialDistribution(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionReward(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -1780,109 +1565,92 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); + stringBuilder.Append("Value = " + _value); return true; } } /// - /// Parameters for a binomial distribution. + /// Structure defining the sequence and sampling of experimental blocks. /// - ///Defined by number of trials (n) and success probability (p). + ///This class manages multiple experimental blocks and determines how they + ///are presented during the experiment (sequentially or randomly). /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a binomial distribution.\n\nDefined by number of trials (n) and succ" + - "ess probability (p).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Structure defining the sequence and sampling of experimental blocks.\n\nThis class " + + "manages multiple experimental blocks and determines how they\nare presented durin" + + "g the experiment (sequentially or randomly).")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BinomialDistributionParameters + public partial class BlockStructure { - private string _family; - - private int _n; + private System.Collections.Generic.List _blocks; - private double _p; + private BlockStructureSamplingMode _samplingMode; - public BinomialDistributionParameters() + public BlockStructure() { - _family = "Binomial"; - _n = 1; - _p = 0.5D; + _blocks = new System.Collections.Generic.List(); + _samplingMode = BlockStructureSamplingMode.Sequential; } - protected BinomialDistributionParameters(BinomialDistributionParameters other) + protected BlockStructure(BlockStructure other) { - _family = other._family; - _n = other._n; - _p = other._p; + _blocks = other._blocks; + _samplingMode = other._samplingMode; } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// Statistics of the environment + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("blocks", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] + public System.Collections.Generic.List Blocks { get { - return _family; + return _blocks; } set { - _family = value; + _blocks = value; } } /// - /// Number of trials + /// Sampling mode of the blocks. /// - [Newtonsoft.Json.JsonPropertyAttribute("n")] - [System.ComponentModel.DescriptionAttribute("Number of trials")] - public int N + [Newtonsoft.Json.JsonPropertyAttribute("sampling_mode")] + [System.ComponentModel.DescriptionAttribute("Sampling mode of the blocks.")] + public BlockStructureSamplingMode SamplingMode { get { - return _n; + return _samplingMode; } set { - _n = value; + _samplingMode = value; } } - /// - /// Probability of success - /// - [Newtonsoft.Json.JsonPropertyAttribute("p")] - [System.ComponentModel.DescriptionAttribute("Probability of success")] - public double P + public System.IObservable Generate() { - get - { - return _p; - } - set - { - _p = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BinomialDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockStructure(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BinomialDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new BlockStructure(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("N = " + _n + ", "); - stringBuilder.Append("P = " + _p); + stringBuilder.Append("Blocks = " + _blocks + ", "); + stringBuilder.Append("SamplingMode = " + _samplingMode); return true; } @@ -1901,89 +1669,117 @@ public override string ToString() } - /// - /// Configuration for a single experimental block. - /// - ///A block represents a period of the experiment with specific environment - ///statistics and ending conditions. Each block defines the environmental - ///parameters and termination criteria for that experimental phase. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Configuration for a single experimental block.\n\nA block represents a period of th" + - "e experiment with specific environment\nstatistics and ending conditions. Each bl" + - "ock defines the environmental\nparameters and termination criteria for that exper" + - "imental phase.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Block + public partial class CameraControllerSpinnakerCamera { - private EnvironmentStatistics _environmentStatistics; + private string _deviceType; - private System.Collections.Generic.List _endConditions; + private BaseModel _calibration; - public Block() + private System.Collections.Generic.Dictionary _cameras; + + private int? _frameRate; + + public CameraControllerSpinnakerCamera() { - _environmentStatistics = new EnvironmentStatistics(); - _endConditions = new System.Collections.Generic.List(); + _deviceType = "CameraController"; + _cameras = new System.Collections.Generic.Dictionary(); + _frameRate = 30; } - protected Block(Block other) + protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) { - _environmentStatistics = other._environmentStatistics; - _endConditions = other._endConditions; + _deviceType = other._deviceType; + _calibration = other._calibration; + _cameras = other._cameras; + _frameRate = other._frameRate; + } + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } /// - /// Statistics of the environment + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("environment_statistics", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] - public EnvironmentStatistics EnvironmentStatistics + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _environmentStatistics; + return _calibration; } set { - _environmentStatistics = value; + _calibration = value; } } /// - /// List of end conditions that must be true for the block to end. + /// Cameras to be instantiated /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("end_conditions")] - [System.ComponentModel.DescriptionAttribute("List of end conditions that must be true for the block to end.")] - public System.Collections.Generic.List EndConditions + [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] + public System.Collections.Generic.Dictionary Cameras { get { - return _endConditions; + return _cameras; } set { - _endConditions = value; + _cameras = value; } } - public System.IObservable Generate() + /// + /// Frame rate of the trigger to all cameras + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] + public int? FrameRate { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Block(this))); + get + { + return _frameRate; + } + set + { + _frameRate = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new Block(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("EnvironmentStatistics = " + _environmentStatistics + ", "); - stringBuilder.Append("EndConditions = " + _endConditions); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Cameras = " + _cameras + ", "); + stringBuilder.Append("FrameRate = " + _frameRate); return true; } @@ -2002,46 +1798,118 @@ public override string ToString() } - /// - /// Block end condition based on time duration. - /// - ///This condition ends a block after a specified amount of time has elapsed. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "condition_type")] - [JsonInheritanceAttribute("Duration", typeof(BlockEndConditionDuration))] - [JsonInheritanceAttribute("Distance", typeof(BlockEndConditionDistance))] - [JsonInheritanceAttribute("Choice", typeof(BlockEndConditionChoice))] - [JsonInheritanceAttribute("Reward", typeof(BlockEndConditionReward))] - [JsonInheritanceAttribute("PatchCount", typeof(BlockEndConditionPatchCount))] - [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + - "specified amount of time has elapsed.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndCondition + public partial class CameraControllerWebCamera { - public BlockEndCondition() + private string _deviceType; + + private BaseModel _calibration; + + private System.Collections.Generic.Dictionary _cameras; + + private int? _frameRate; + + public CameraControllerWebCamera() { + _deviceType = "CameraController"; + _cameras = new System.Collections.Generic.Dictionary(); + _frameRate = 30; } - protected BlockEndCondition(BlockEndCondition other) + protected CameraControllerWebCamera(CameraControllerWebCamera other) { + _deviceType = other._deviceType; + _calibration = other._calibration; + _cameras = other._cameras; + _frameRate = other._frameRate; } - public System.IObservable Generate() + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndCondition(this))); + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Calibration for the device. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndCondition(this)); + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + /// + /// Cameras to be instantiated + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] + public System.Collections.Generic.Dictionary Cameras + { + get + { + return _cameras; + } + set + { + _cameras = value; + } + } + + /// + /// Frame rate of the trigger to all cameras + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] + public int? FrameRate + { + get + { + return _frameRate; + } + set + { + _frameRate = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerWebCamera(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerWebCamera(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Cameras = " + _cameras + ", "); + stringBuilder.Append("FrameRate = " + _frameRate); + return true; } public override string ToString() @@ -2060,123 +1928,104 @@ public override string ToString() /// - /// Block end condition based on number of choices made. + /// A patch update function that applies multiplicative rate updates with bounds. /// - ///This condition ends a block after the animal has made a specified number - ///of choices (e.g., patch visits or reward attempts). + ///Update in the form of x = clamp(x * rate ** tick_value). + ///This function multiplies the current value by the rate parameter, maintaining + ///the result within specified minimum and maximum bounds. Useful for percentage- + ///based changes and exponential decay/growth patterns. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on number of choices made.\n\nThis condition ends a block" + - " after the animal has made a specified number\nof choices (e.g., patch visits or " + - "reward attempts).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies multiplicative rate updates with bounds. + + Update in the form of x = clamp(x * rate ** tick_value). + This function multiplies the current value by the rate parameter, maintaining + the result within specified minimum and maximum bounds. Useful for percentage- + based changes and exponential decay/growth patterns.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionChoice : BlockEndCondition + public partial class ClampedMultiplicativeRateFunction : PatchUpdateFunction { - private Distribution _value; + private double? _minimum; - public BlockEndConditionChoice() + private double? _maximum; + + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _rate; + + public ClampedMultiplicativeRateFunction() { + _minimum = 0; } - protected BlockEndConditionChoice(BlockEndConditionChoice other) : + protected ClampedMultiplicativeRateFunction(ClampedMultiplicativeRateFunction other) : base(other) { - _value = other._value; + _minimum = other._minimum; + _maximum = other._maximum; + _rate = other._rate; } /// - /// Number of choices after which the block ends. + /// Minimum value of the rate /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of choices after which the block ends.")] - public Distribution Value + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] + public double? Minimum { get { - return _value; + return _minimum; } set { - _value = value; + _minimum = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionChoice(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionChoice(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Maximum value of the rate + /// + [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] + public double? Maximum { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _maximum; + } + set + { + _maximum = value; } - stringBuilder.Append("Value = " + _value); - return true; - } - } - - - /// - /// Block end condition based on distance traveled. - /// - ///This condition ends a block after the animal has traveled a specified distance. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on distance traveled.\n\nThis condition ends a block afte" + - "r the animal has traveled a specified distance.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionDistance : BlockEndCondition - { - - private Distribution _value; - - public BlockEndConditionDistance() - { - } - - protected BlockEndConditionDistance(BlockEndConditionDistance other) : - base(other) - { - _value = other._value; } /// - /// Distance after which the block ends. + /// Rate of the replenishment, in value per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Distance after which the block ends.")] - public Distribution Value + [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Rate { get { - return _value; + return _rate; } set { - _value = value; + _rate = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDistance(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ClampedMultiplicativeRateFunction(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDistance(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ClampedMultiplicativeRateFunction(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -2185,129 +2034,113 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("Value = " + _value); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum + ", "); + stringBuilder.Append("Rate = " + _rate); return true; } } /// - /// Block end condition based on time duration. + /// A patch update function that applies a clamped rate-based update. /// - ///This condition ends a block after a specified amount of time has elapsed. + ///Update in the form of x = clamp(x + rate * tick_value). + ///This function updates values at a specified rate while keeping results within + ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + ///time, distance, choices). /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + - "specified amount of time has elapsed.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. + + Update in the form of x = clamp(x + rate * tick_value). + This function updates values at a specified rate while keeping results within + defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + time, distance, choices).")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionDuration : BlockEndCondition + public partial class ClampedRateFunction : PatchUpdateFunction { - private Distribution _value; + private double? _minimum; + + private double? _maximum; + + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _rate; - public BlockEndConditionDuration() + public ClampedRateFunction() { + _minimum = 0; } - protected BlockEndConditionDuration(BlockEndConditionDuration other) : + protected ClampedRateFunction(ClampedRateFunction other) : base(other) { - _value = other._value; + _minimum = other._minimum; + _maximum = other._maximum; + _rate = other._rate; } /// - /// Time after which the block ends. + /// Minimum value of the rate /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Time after which the block ends.")] - public Distribution Value + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] + public double? Minimum { get { - return _value; + return _minimum; } set { - _value = value; + _minimum = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDuration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDuration(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Maximum value of the rate + /// + [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] + public double? Maximum { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _maximum; + } + set + { + _maximum = value; } - stringBuilder.Append("Value = " + _value); - return true; - } - } - - - /// - /// Block end condition based on number of patches visited. - /// - ///This condition ends a block after the animal has visited a specified - ///number of unique patches. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on number of patches visited.\n\nThis condition ends a bl" + - "ock after the animal has visited a specified\nnumber of unique patches.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionPatchCount : BlockEndCondition - { - - private Distribution _value; - - public BlockEndConditionPatchCount() - { - } - - protected BlockEndConditionPatchCount(BlockEndConditionPatchCount other) : - base(other) - { - _value = other._value; } /// - /// Number of patches after which the block will end. + /// Rate of the replenishment, in value per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of patches after which the block will end.")] - public Distribution Value + [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Rate { get { - return _value; + return _rate; } set { - _value = value; + _rate = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionPatchCount(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ClampedRateFunction(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionPatchCount(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ClampedRateFunction(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -2316,417 +2149,358 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("Value = " + _value); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum + ", "); + stringBuilder.Append("Rate = " + _rate); return true; } } - /// - /// Block end condition based on number of rewards obtained. - /// - ///This condition ends a block after the animal has obtained a specified - ///number of rewards. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on number of rewards obtained.\n\nThis condition ends a b" + - "lock after the animal has obtained a specified\nnumber of rewards.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionReward : BlockEndCondition + public partial class ConnectedClockOutput { - private Distribution _value; + private string _targetDevice; - public BlockEndConditionReward() + private int _outputChannel; + + public ConnectedClockOutput() { } - protected BlockEndConditionReward(BlockEndConditionReward other) : - base(other) + protected ConnectedClockOutput(ConnectedClockOutput other) { - _value = other._value; + _targetDevice = other._targetDevice; + _outputChannel = other._outputChannel; } /// - /// Number of rewards after which the block ends. + /// Optional device name to provide user additional information /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of rewards after which the block ends.")] - public Distribution Value + [Newtonsoft.Json.JsonPropertyAttribute("target_device")] + [System.ComponentModel.DescriptionAttribute("Optional device name to provide user additional information")] + public string TargetDevice { get { - return _value; + return _targetDevice; } set { - _value = value; + _targetDevice = value; } } - public System.IObservable Generate() + /// + /// Output channel + /// + [Newtonsoft.Json.JsonPropertyAttribute("output_channel", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Output channel")] + public int OutputChannel { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionReward(this))); + get + { + return _outputChannel; + } + set + { + _outputChannel = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionReward(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ConnectedClockOutput(this))); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - if (base.PrintMembers(stringBuilder)) + return System.Reactive.Linq.Observable.Select(source, _ => new ConnectedClockOutput(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("TargetDevice = " + _targetDevice + ", "); + stringBuilder.Append("OutputChannel = " + _outputChannel); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("Value = " + _value); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Structure defining the sequence and sampling of experimental blocks. + /// A patch update function that uses a continuous-time Markov chain (CTMC) + ///to determine patch updates based on a transition probability matrix. /// - ///This class manages multiple experimental blocks and determines how they - ///are presented during the experiment (sequentially or randomly). + ///It expects a transition matrix that takes the current value of the variable + ///of interest (e.g. Probability), and outputs a new value based on the defined + ///stochastic process in the transition matrix. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Structure defining the sequence and sampling of experimental blocks.\n\nThis class " + - "manages multiple experimental blocks and determines how they\nare presented durin" + - "g the experiment (sequentially or randomly).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses a continuous-time Markov chain (CTMC) + to determine patch updates based on a transition probability matrix. + + It expects a transition matrix that takes the current value of the variable + of interest (e.g. Probability), and outputs a new value based on the defined + stochastic process in the transition matrix.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockStructure + public partial class CtcmFunction : PatchUpdateFunction { - private System.Collections.Generic.List _blocks; + private System.Collections.Generic.List> _transitionMatrix; - private BlockStructureSamplingMode _samplingMode; + private double _rho; - public BlockStructure() + private double _dt; + + private double? _rate; + + private double _minimum; + + private double _maximum; + + public CtcmFunction() { - _blocks = new System.Collections.Generic.List(); - _samplingMode = AindVrForagingDataSchema.BlockStructureSamplingMode.Sequential; + _transitionMatrix = new System.Collections.Generic.List>(); + _dt = 0.1D; + _minimum = 1D; + _maximum = 0D; } - protected BlockStructure(BlockStructure other) + protected CtcmFunction(CtcmFunction other) : + base(other) { - _blocks = other._blocks; - _samplingMode = other._samplingMode; + _transitionMatrix = other._transitionMatrix; + _rho = other._rho; + _dt = other._dt; + _rate = other._rate; + _minimum = other._minimum; + _maximum = other._maximum; } /// - /// Statistics of the environment + /// Transition matrix between states /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("blocks", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] - public System.Collections.Generic.List Blocks + [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Transition matrix between states")] + public System.Collections.Generic.List> TransitionMatrix { get { - return _blocks; + return _transitionMatrix; } set { - _blocks = value; + _transitionMatrix = value; } } /// - /// Sampling mode of the blocks. + /// The underlying value governing the stochastic process /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("sampling_mode")] - [System.ComponentModel.DescriptionAttribute("Sampling mode of the blocks.")] - public BlockStructureSamplingMode SamplingMode + [Newtonsoft.Json.JsonPropertyAttribute("rho", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The underlying value governing the stochastic process")] + public double Rho { get { - return _samplingMode; + return _rho; } set { - _samplingMode = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockStructure(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockStructure(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Blocks = " + _blocks + ", "); - stringBuilder.Append("SamplingMode = " + _samplingMode); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); + _rho = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class CameraControllerSpinnakerCamera - { - - private string _deviceType; - - private BaseModel _calibration; - - private System.Collections.Generic.Dictionary _cameras; - - private int? _frameRate; - - public CameraControllerSpinnakerCamera() - { - _deviceType = "CameraController"; - _cameras = new System.Collections.Generic.Dictionary(); - } - - protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) - { - _deviceType = other._deviceType; - _calibration = other._calibration; - _cameras = other._cameras; - _frameRate = other._frameRate; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Sampling time step (s) + /// + [Newtonsoft.Json.JsonPropertyAttribute("dt")] + [System.ComponentModel.DescriptionAttribute("Sampling time step (s)")] + public double Dt { get { - return _deviceType; + return _dt; } set { - _deviceType = value; + _dt = value; } } /// - /// Calibration for the device. + /// Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("rate")] + [System.ComponentModel.DescriptionAttribute("Rate of the replenishment used to generate the matrix. This value is used for met" + + "adata keep sake only")] + public double? Rate { get { - return _calibration; + return _rate; } set { - _calibration = value; + _rate = value; } } /// - /// Cameras to be instantiated + /// Maximum value after update /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] - public System.Collections.Generic.Dictionary Cameras + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Maximum value after update")] + public double Minimum { get { - return _cameras; + return _minimum; } set { - _cameras = value; + _minimum = value; } } /// - /// Frame rate of the trigger to all cameras + /// Minimum value after update /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] - public int? FrameRate + [Newtonsoft.Json.JsonPropertyAttribute("maximum")] + [System.ComponentModel.DescriptionAttribute("Minimum value after update")] + public double Maximum { get { - return _frameRate; + return _maximum; } set { - _frameRate = value; + _maximum = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CtcmFunction(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("Cameras = " + _cameras + ", "); - stringBuilder.Append("FrameRate = " + _frameRate); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new CtcmFunction(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); + stringBuilder.Append("Rho = " + _rho + ", "); + stringBuilder.Append("Dt = " + _dt + ", "); + stringBuilder.Append("Rate = " + _rate + ", "); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum); + return true; } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Represents the calibration parameters of a display. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class CameraControllerWebCamera + public partial class DisplayCalibration { - private string _deviceType; + private DisplayIntrinsics _intrinsics; - private BaseModel _calibration; - - private System.Collections.Generic.Dictionary _cameras; - - private int? _frameRate; - - public CameraControllerWebCamera() - { - _deviceType = "CameraController"; - _cameras = new System.Collections.Generic.Dictionary(); - } - - protected CameraControllerWebCamera(CameraControllerWebCamera other) - { - _deviceType = other._deviceType; - _calibration = other._calibration; - _cameras = other._cameras; - _frameRate = other._frameRate; - } + private DisplayExtrinsics _extrinsics; - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + public DisplayCalibration() { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _intrinsics = new DisplayIntrinsics(); + _extrinsics = new DisplayExtrinsics(); } - /// - /// Calibration for the device. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + protected DisplayCalibration(DisplayCalibration other) { - get - { - return _calibration; - } - set - { - _calibration = value; - } + _intrinsics = other._intrinsics; + _extrinsics = other._extrinsics; } /// - /// Cameras to be instantiated + /// Intrinsics /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] - public System.Collections.Generic.Dictionary Cameras + [Newtonsoft.Json.JsonPropertyAttribute("intrinsics")] + [System.ComponentModel.DescriptionAttribute("Intrinsics")] + public DisplayIntrinsics Intrinsics { get { - return _cameras; + return _intrinsics; } set { - _cameras = value; + _intrinsics = value; } } /// - /// Frame rate of the trigger to all cameras + /// Extrinsics /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] - public int? FrameRate + [Newtonsoft.Json.JsonPropertyAttribute("extrinsics")] + [System.ComponentModel.DescriptionAttribute("Extrinsics")] + public DisplayExtrinsics Extrinsics { get { - return _frameRate; + return _extrinsics; } set { - _frameRate = value; + _extrinsics = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerWebCamera(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerWebCamera(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("Cameras = " + _cameras + ", "); - stringBuilder.Append("FrameRate = " + _frameRate); + stringBuilder.Append("Intrinsics = " + _intrinsics + ", "); + stringBuilder.Append("Extrinsics = " + _extrinsics); return true; } @@ -2746,305 +2520,342 @@ public override string ToString() /// - /// A patch update function that applies multiplicative rate updates with bounds. - /// - ///Update in the form of x = clamp(x * rate ** tick_value). - ///This function multiplies the current value by the rate parameter, maintaining - ///the result within specified minimum and maximum bounds. Useful for percentage- - ///based changes and exponential decay/growth patterns. + /// Represents the extrinsic parameters of a display. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies multiplicative rate updates with bounds. - - Update in the form of x = clamp(x * rate ** tick_value). - This function multiplies the current value by the rate parameter, maintaining - the result within specified minimum and maximum bounds. Useful for percentage- - based changes and exponential decay/growth patterns.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the extrinsic parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ClampedMultiplicativeRateFunction : PatchUpdateFunction + public partial class DisplayExtrinsics { - private double? _minimum; - - private double? _maximum; + private AindBehaviorServicesCommonVector3 _rotation; - private Distribution _rate; + private AindBehaviorServicesCommonVector3 _translation; - public ClampedMultiplicativeRateFunction() + public DisplayExtrinsics() { + _rotation = new AindBehaviorServicesCommonVector3(); + _translation = new AindBehaviorServicesCommonVector3(); } - protected ClampedMultiplicativeRateFunction(ClampedMultiplicativeRateFunction other) : - base(other) + protected DisplayExtrinsics(DisplayExtrinsics other) { - _minimum = other._minimum; - _maximum = other._maximum; - _rate = other._rate; + _rotation = other._rotation; + _translation = other._translation; } /// - /// Minimum value of the rate + /// Rotation vector (radians) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] - public double? Minimum + [Newtonsoft.Json.JsonPropertyAttribute("rotation")] + [System.ComponentModel.DescriptionAttribute("Rotation vector (radians)")] + public AindBehaviorServicesCommonVector3 Rotation { get { - return _minimum; + return _rotation; } set { - _minimum = value; + _rotation = value; } } /// - /// Maximum value of the rate + /// Translation (in cm) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] - public double? Maximum + [Newtonsoft.Json.JsonPropertyAttribute("translation")] + [System.ComponentModel.DescriptionAttribute("Translation (in cm)")] + public AindBehaviorServicesCommonVector3 Translation { get { - return _maximum; + return _translation; } set { - _maximum = value; + _translation = value; } } - /// - /// Rate of the replenishment, in value per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] - public Distribution Rate + public System.IObservable Generate() { - get - { - return _rate; - } - set - { - _rate = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayExtrinsics(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ClampedMultiplicativeRateFunction(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayExtrinsics(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new ClampedMultiplicativeRateFunction(this)); + stringBuilder.Append("Rotation = " + _rotation + ", "); + stringBuilder.Append("Translation = " + _translation); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum + ", "); - stringBuilder.Append("Rate = " + _rate); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// A patch update function that applies a clamped rate-based update. - /// - ///Update in the form of x = clamp(x + rate * tick_value). - ///This function updates values at a specified rate while keeping results within - ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - ///time, distance, choices). + /// Represents the intrinsic parameters of a display. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. - - Update in the form of x = clamp(x + rate * tick_value). - This function updates values at a specified rate while keeping results within - defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - time, distance, choices).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the intrinsic parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ClampedRateFunction : PatchUpdateFunction + public partial class DisplayIntrinsics { - private double? _minimum; + private int _frameWidth; - private double? _maximum; + private int _frameHeight; + + private double _displayWidth; - private Distribution _rate; + private double _displayHeight; - public ClampedRateFunction() + public DisplayIntrinsics() { + _frameWidth = 1920; + _frameHeight = 1080; + _displayWidth = 20D; + _displayHeight = 15D; } - protected ClampedRateFunction(ClampedRateFunction other) : - base(other) + protected DisplayIntrinsics(DisplayIntrinsics other) { - _minimum = other._minimum; - _maximum = other._maximum; - _rate = other._rate; + _frameWidth = other._frameWidth; + _frameHeight = other._frameHeight; + _displayWidth = other._displayWidth; + _displayHeight = other._displayHeight; } /// - /// Minimum value of the rate + /// Frame width (px) /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] - public double? Minimum + [Newtonsoft.Json.JsonPropertyAttribute("frame_width")] + [System.ComponentModel.DescriptionAttribute("Frame width (px)")] + public int FrameWidth { get { - return _minimum; + return _frameWidth; } set { - _minimum = value; + _frameWidth = value; } } /// - /// Maximum value of the rate + /// Frame height (px) /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] - public double? Maximum + [Newtonsoft.Json.JsonPropertyAttribute("frame_height")] + [System.ComponentModel.DescriptionAttribute("Frame height (px)")] + public int FrameHeight { get { - return _maximum; + return _frameHeight; } set { - _maximum = value; + _frameHeight = value; } } /// - /// Rate of the replenishment, in value per rule unit. + /// Display width (cm) /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] - public Distribution Rate + [Newtonsoft.Json.JsonPropertyAttribute("display_width")] + [System.ComponentModel.DescriptionAttribute("Display width (cm)")] + public double DisplayWidth { get { - return _rate; + return _displayWidth; } set { - _rate = value; + _displayWidth = value; } } - public System.IObservable Generate() + /// + /// Display width (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("display_height")] + [System.ComponentModel.DescriptionAttribute("Display width (cm)")] + public double DisplayHeight { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ClampedRateFunction(this))); + get + { + return _displayHeight; + } + set + { + _displayHeight = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new ClampedRateFunction(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayIntrinsics(this))); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - if (base.PrintMembers(stringBuilder)) + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayIntrinsics(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("FrameWidth = " + _frameWidth + ", "); + stringBuilder.Append("FrameHeight = " + _frameHeight + ", "); + stringBuilder.Append("DisplayWidth = " + _displayWidth + ", "); + stringBuilder.Append("DisplayHeight = " + _displayHeight); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum + ", "); - stringBuilder.Append("Rate = " + _rate); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Defines the statistical properties of the foraging environment. + /// + ///This class specifies the patches available in the environment, their transition + ///probabilities, and initial state occupancy. It forms the core specification + ///for the foraging environment structure. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines the statistical properties of the foraging environment. + + This class specifies the patches available in the environment, their transition + probabilities, and initial state occupancy. It forms the core specification + for the foraging environment structure.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ConnectedClockOutput + public partial class EnvironmentStatistics { - private string _targetDevice; + private System.Collections.Generic.List _patches; - private int _outputChannel; + private System.Collections.Generic.List> _transitionMatrix; - public ConnectedClockOutput() + private System.Collections.Generic.List _firstStateOccupancy; + + public EnvironmentStatistics() { + _patches = new System.Collections.Generic.List(); + _transitionMatrix = new System.Collections.Generic.List>(); } - protected ConnectedClockOutput(ConnectedClockOutput other) + protected EnvironmentStatistics(EnvironmentStatistics other) { - _targetDevice = other._targetDevice; - _outputChannel = other._outputChannel; + _patches = other._patches; + _transitionMatrix = other._transitionMatrix; + _firstStateOccupancy = other._firstStateOccupancy; } /// - /// Optional device name to provide user additional information + /// List of patches /// - [Newtonsoft.Json.JsonPropertyAttribute("target_device")] - [System.ComponentModel.DescriptionAttribute("Optional device name to provide user additional information")] - public string TargetDevice + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("patches")] + [System.ComponentModel.DescriptionAttribute("List of patches")] + public System.Collections.Generic.List Patches { get { - return _targetDevice; + return _patches; } set { - _targetDevice = value; + _patches = value; } } /// - /// Output channel + /// Determines the transition probabilities between patches /// - [Newtonsoft.Json.JsonPropertyAttribute("output_channel", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Output channel")] - public int OutputChannel + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix")] + [System.ComponentModel.DescriptionAttribute("Determines the transition probabilities between patches")] + public System.Collections.Generic.List> TransitionMatrix { get { - return _outputChannel; + return _transitionMatrix; } set { - _outputChannel = value; + _transitionMatrix = value; } } - public System.IObservable Generate() + /// + /// Determines the first state the animal will be in. If null, it will be randomly drawn. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("first_state_occupancy")] + [System.ComponentModel.DescriptionAttribute("Determines the first state the animal will be in. If null, it will be randomly dr" + + "awn.")] + public System.Collections.Generic.List FirstStateOccupancy { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ConnectedClockOutput(this))); + get + { + return _firstStateOccupancy; + } + set + { + _firstStateOccupancy = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new ConnectedClockOutput(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new EnvironmentStatistics(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new EnvironmentStatistics(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("TargetDevice = " + _targetDevice + ", "); - stringBuilder.Append("OutputChannel = " + _outputChannel); + stringBuilder.Append("Patches = " + _patches + ", "); + stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); + stringBuilder.Append("FirstStateOccupancy = " + _firstStateOccupancy); return true; } @@ -3063,359 +2874,276 @@ public override string ToString() } - /// - /// A patch update function that uses a continuous-time Markov chain (CTMC) - ///to determine patch updates based on a transition probability matrix. - /// - ///It expects a transition matrix that takes the current value of the variable - ///of interest (e.g. Probability), and outputs a new value based on the defined - ///stochastic process in the transition matrix. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses a continuous-time Markov chain (CTMC) - to determine patch updates based on a transition probability matrix. - - It expects a transition matrix that takes the current value of the variable - of interest (e.g. Probability), and outputs a new value based on the defined - stochastic process in the transition matrix.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class CtcmFunction : PatchUpdateFunction + public partial class HarpAnalogInput { - private System.Collections.Generic.List> _transitionMatrix; - - private double _rho; + private string _deviceType; - private double _dt; + private BaseModel _calibration; - private double? _rate; + private int _whoAmI; - private double _minimum; + private string _serialNumber; - private double _maximum; + private string _portName; - public CtcmFunction() + public HarpAnalogInput() { - _transitionMatrix = new System.Collections.Generic.List>(); - _dt = 0.1D; - _minimum = 1D; - _maximum = 0D; + _deviceType = "AnalogInput"; + _whoAmI = 1236; } - protected CtcmFunction(CtcmFunction other) : - base(other) + protected HarpAnalogInput(HarpAnalogInput other) { - _transitionMatrix = other._transitionMatrix; - _rho = other._rho; - _dt = other._dt; - _rate = other._rate; - _minimum = other._minimum; - _maximum = other._maximum; + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Transition matrix between states - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Transition matrix between states")] - public System.Collections.Generic.List> TransitionMatrix + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _transitionMatrix; + return _deviceType; } set { - _transitionMatrix = value; + _deviceType = value; } } /// - /// The underlying value governing the stochastic process + /// Calibration for the device. /// - [Newtonsoft.Json.JsonPropertyAttribute("rho", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The underlying value governing the stochastic process")] - public double Rho + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _rho; + return _calibration; } set { - _rho = value; + _calibration = value; } } - /// - /// Sampling time step (s) - /// - [Newtonsoft.Json.JsonPropertyAttribute("dt")] - [System.ComponentModel.DescriptionAttribute("Sampling time step (s)")] - public double Dt + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _dt; + return _whoAmI; } set { - _dt = value; + _whoAmI = value; } } /// - /// Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rate")] - [System.ComponentModel.DescriptionAttribute("Rate of the replenishment used to generate the matrix. This value is used for met" + - "adata keep sake only")] - public double? Rate + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _rate; + return _serialNumber; } set { - _rate = value; + _serialNumber = value; } } /// - /// Maximum value after update + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Maximum value after update")] - public double Minimum + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _minimum; + return _portName; } set { - _minimum = value; + _portName = value; } } - /// - /// Minimum value after update - /// - [Newtonsoft.Json.JsonPropertyAttribute("maximum")] - [System.ComponentModel.DescriptionAttribute("Minimum value after update")] - public double Maximum + public System.IObservable Generate() { - get - { - return _maximum; - } - set - { - _maximum = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpAnalogInput(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CtcmFunction(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpAnalogInput(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new CtcmFunction(this)); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); - stringBuilder.Append("Rho = " + _rho + ", "); - stringBuilder.Append("Dt = " + _dt + ", "); - stringBuilder.Append("Rate = " + _rate + ", "); - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } - /// - /// Represents the calibration parameters of a display. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters of a display.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplayCalibration + public partial class HarpBehavior { - private DisplayIntrinsics _intrinsics; + private string _deviceType; - private DisplayExtrinsics _extrinsics; + private BaseModel _calibration; - public DisplayCalibration() + private int _whoAmI; + + private string _serialNumber; + + private string _portName; + + public HarpBehavior() { - _intrinsics = new DisplayIntrinsics(); - _extrinsics = new DisplayExtrinsics(); + _deviceType = "Behavior"; + _whoAmI = 1216; } - protected DisplayCalibration(DisplayCalibration other) + protected HarpBehavior(HarpBehavior other) { - _intrinsics = other._intrinsics; - _extrinsics = other._extrinsics; + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Intrinsics - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("intrinsics")] - [System.ComponentModel.DescriptionAttribute("Intrinsics")] - public DisplayIntrinsics Intrinsics + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _intrinsics; + return _deviceType; } set { - _intrinsics = value; + _deviceType = value; } } /// - /// Extrinsics + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("extrinsics")] - [System.ComponentModel.DescriptionAttribute("Extrinsics")] - public DisplayExtrinsics Extrinsics + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _extrinsics; + return _calibration; } set { - _extrinsics = value; + _calibration = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new DisplayCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Intrinsics = " + _intrinsics + ", "); - stringBuilder.Append("Extrinsics = " + _extrinsics); - return true; - } - - public override string ToString() + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _whoAmI; + } + set + { + _whoAmI = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Represents the extrinsic parameters of a display. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents the extrinsic parameters of a display.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplayExtrinsics - { - - private AindBehaviorServicesCommonVector3 _rotation; - - private AindBehaviorServicesCommonVector3 _translation; - - public DisplayExtrinsics() - { - _rotation = new AindBehaviorServicesCommonVector3(); - _translation = new AindBehaviorServicesCommonVector3(); - } - - protected DisplayExtrinsics(DisplayExtrinsics other) - { - _rotation = other._rotation; - _translation = other._translation; } /// - /// Rotation vector (radians) + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rotation")] - [System.ComponentModel.DescriptionAttribute("Rotation vector (radians)")] - public AindBehaviorServicesCommonVector3 Rotation + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _rotation; + return _serialNumber; } set { - _rotation = value; + _serialNumber = value; } } /// - /// Translation (in cm) + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("translation")] - [System.ComponentModel.DescriptionAttribute("Translation (in cm)")] - public AindBehaviorServicesCommonVector3 Translation + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _translation; + return _portName; } set { - _translation = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayExtrinsics(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpBehavior(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new DisplayExtrinsics(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Rotation = " + _rotation + ", "); - stringBuilder.Append("Translation = " + _translation); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -3434,124 +3162,132 @@ public override string ToString() } - /// - /// Represents the intrinsic parameters of a display. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents the intrinsic parameters of a display.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplayIntrinsics + public partial class HarpEnvironmentSensor { - private int _frameWidth; + private string _deviceType; - private int _frameHeight; + private BaseModel _calibration; - private double _displayWidth; + private int _whoAmI; - private double _displayHeight; + private string _serialNumber; - public DisplayIntrinsics() + private string _portName; + + public HarpEnvironmentSensor() { - _frameWidth = 1920; - _frameHeight = 1080; - _displayWidth = 20D; - _displayHeight = 15D; + _deviceType = "EnvironmentSensor"; + _whoAmI = 1405; } - protected DisplayIntrinsics(DisplayIntrinsics other) + protected HarpEnvironmentSensor(HarpEnvironmentSensor other) { - _frameWidth = other._frameWidth; - _frameHeight = other._frameHeight; - _displayWidth = other._displayWidth; - _displayHeight = other._displayHeight; + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Frame width (px) - /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_width")] - [System.ComponentModel.DescriptionAttribute("Frame width (px)")] - public int FrameWidth + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _frameWidth; + return _deviceType; } set { - _frameWidth = value; + _deviceType = value; } } /// - /// Frame height (px) + /// Calibration for the device. /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_height")] - [System.ComponentModel.DescriptionAttribute("Frame height (px)")] - public int FrameHeight + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _frameHeight; + return _calibration; } set { - _frameHeight = value; + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI + { + get + { + return _whoAmI; + } + set + { + _whoAmI = value; } } /// - /// Display width (cm) + /// Device serial number /// - [Newtonsoft.Json.JsonPropertyAttribute("display_width")] - [System.ComponentModel.DescriptionAttribute("Display width (cm)")] - public double DisplayWidth + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _displayWidth; + return _serialNumber; } set { - _displayWidth = value; + _serialNumber = value; } } /// - /// Display width (cm) + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("display_height")] - [System.ComponentModel.DescriptionAttribute("Display width (cm)")] - public double DisplayHeight + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _displayHeight; + return _portName; } set { - _displayHeight = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayIntrinsics(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpEnvironmentSensor(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new DisplayIntrinsics(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpEnvironmentSensor(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("FrameWidth = " + _frameWidth + ", "); - stringBuilder.Append("FrameHeight = " + _frameHeight + ", "); - stringBuilder.Append("DisplayWidth = " + _displayWidth + ", "); - stringBuilder.Append("DisplayHeight = " + _displayHeight); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -3570,168 +3306,132 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [JsonInheritanceAttribute("Scalar", typeof(Scalar))] - [JsonInheritanceAttribute("Beta", typeof(BetaDistribution))] - [JsonInheritanceAttribute("Binomial", typeof(BinomialDistribution))] - [JsonInheritanceAttribute("Exponential", typeof(ExponentialDistribution))] - [JsonInheritanceAttribute("Gamma", typeof(GammaDistribution))] - [JsonInheritanceAttribute("LogNormal", typeof(LogNormalDistribution))] - [JsonInheritanceAttribute("Normal", typeof(NormalDistribution))] - [JsonInheritanceAttribute("Pdf", typeof(PdfDistribution))] - [JsonInheritanceAttribute("Poisson", typeof(PoissonDistribution))] - [JsonInheritanceAttribute("Uniform", typeof(UniformDistribution))] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Distribution + public partial class HarpLicketySplit { - public Distribution() - { - } + private string _deviceType; - protected Distribution(Distribution other) - { - } + private BaseModel _calibration; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Distribution(this))); - } + private int _whoAmI; - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Distribution(this)); - } + private string _serialNumber; - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + private string _portName; - public override string ToString() + public HarpLicketySplit() { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + _deviceType = "LicketySplit"; + _whoAmI = 1400; } - } - - - /// - /// Defines the statistical properties of the foraging environment. - /// - ///This class specifies the patches available in the environment, their transition - ///probabilities, and initial state occupancy. It forms the core specification - ///for the foraging environment structure. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines the statistical properties of the foraging environment. - - This class specifies the patches available in the environment, their transition - probabilities, and initial state occupancy. It forms the core specification - for the foraging environment structure.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class EnvironmentStatistics - { - - private System.Collections.Generic.List _patches; - - private System.Collections.Generic.List> _transitionMatrix; - private System.Collections.Generic.List _firstStateOccupancy; - - public EnvironmentStatistics() + protected HarpLicketySplit(HarpLicketySplit other) { - _patches = new System.Collections.Generic.List(); - _transitionMatrix = new System.Collections.Generic.List>(); + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - protected EnvironmentStatistics(EnvironmentStatistics other) + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { - _patches = other._patches; - _transitionMatrix = other._transitionMatrix; - _firstStateOccupancy = other._firstStateOccupancy; + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } /// - /// List of patches + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("patches")] - [System.ComponentModel.DescriptionAttribute("List of patches")] - public System.Collections.Generic.List Patches + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _patches; + return _calibration; } set { - _patches = value; + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI + { + get + { + return _whoAmI; + } + set + { + _whoAmI = value; } } /// - /// Determines the transition probabilities between patches + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix")] - [System.ComponentModel.DescriptionAttribute("Determines the transition probabilities between patches")] - public System.Collections.Generic.List> TransitionMatrix + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _transitionMatrix; + return _serialNumber; } set { - _transitionMatrix = value; + _serialNumber = value; } } /// - /// Determines the first state the animal will be in. If null, it will be randomly drawn. + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("first_state_occupancy")] - [System.ComponentModel.DescriptionAttribute("Determines the first state the animal will be in. If null, it will be randomly dr" + - "awn.")] - public System.Collections.Generic.List FirstStateOccupancy + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _firstStateOccupancy; + return _portName; } set { - _firstStateOccupancy = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new EnvironmentStatistics(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpLicketySplit(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new EnvironmentStatistics(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpLicketySplit(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Patches = " + _patches + ", "); - stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); - stringBuilder.Append("FirstStateOccupancy = " + _firstStateOccupancy); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -3750,190 +3450,132 @@ public override string ToString() } - /// - /// An exponential probability distribution. - /// - ///Models time between events in a Poisson process. Commonly used - ///for wait times and inter-event intervals. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("An exponential probability distribution.\n\nModels time between events in a Poisson" + - " process. Commonly used\nfor wait times and inter-event intervals.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ExponentialDistribution : Distribution + public partial class HarpSniffDetector { - private ExponentialDistributionParameters _distributionParameters; + private string _deviceType; + + private BaseModel _calibration; + + private int _whoAmI; - private TruncationParameters _truncationParameters; + private string _serialNumber; - private ScalingParameters _scalingParameters; + private string _portName; - public ExponentialDistribution() + public HarpSniffDetector() { - _distributionParameters = new ExponentialDistributionParameters(); + _deviceType = "SniffDetector"; + _whoAmI = 1401; } - protected ExponentialDistribution(ExponentialDistribution other) : - base(other) + protected HarpSniffDetector(HarpSniffDetector other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public ExponentialDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _distributionParameters; + return _deviceType; } set { - _distributionParameters = value; + _deviceType = value; } } /// - /// Truncation parameters of the distribution + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _truncationParameters; + return _calibration; } set { - _truncationParameters = value; + _calibration = value; } } - /// - /// Scaling parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _scalingParameters; + return _whoAmI; } set { - _scalingParameters = value; + _whoAmI = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ExponentialDistribution(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ExponentialDistribution(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for an exponential distribution. - /// - ///Defined by the rate parameter (inverse of mean). - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for an exponential distribution.\n\nDefined by the rate parameter (inver" + - "se of mean).")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ExponentialDistributionParameters - { - - private string _family; - - private double _rate; - - public ExponentialDistributionParameters() - { - _family = "Exponential"; - _rate = 0D; - } - - protected ExponentialDistributionParameters(ExponentialDistributionParameters other) - { - _family = other._family; - _rate = other._rate; - } - - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// Device serial number + /// + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _family; + return _serialNumber; } set { - _family = value; + _serialNumber = value; } } /// - /// Rate parameter of the distribution + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("rate")] - [System.ComponentModel.DescriptionAttribute("Rate parameter of the distribution")] - public double Rate + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _rate; + return _portName; } set { - _rate = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ExponentialDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpSniffDetector(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ExponentialDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpSniffDetector(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Rate = " + _rate); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -3952,212 +3594,155 @@ public override string ToString() } - /// - /// A gamma probability distribution. - /// - ///Generalizes the exponential distribution. Used for modeling - ///positive continuous variables with right-skewed distributions. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A gamma probability distribution.\n\nGeneralizes the exponential distribution. Used" + - " for modeling\npositive continuous variables with right-skewed distributions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class GammaDistribution : Distribution + public partial class HarpWhiteRabbit { - private GammaDistributionParameters _distributionParameters; + private string _deviceType; + + private BaseModel _calibration; + + private int _whoAmI; + + private string _serialNumber; - private TruncationParameters _truncationParameters; + private string _portName; - private ScalingParameters _scalingParameters; + private System.Collections.Generic.List _connectedClockOutputs; - public GammaDistribution() + public HarpWhiteRabbit() { - _distributionParameters = new GammaDistributionParameters(); + _deviceType = "WhiteRabbit"; + _whoAmI = 1404; + _connectedClockOutputs = new System.Collections.Generic.List(); } - protected GammaDistribution(GammaDistribution other) : - base(other) + protected HarpWhiteRabbit(HarpWhiteRabbit other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + _connectedClockOutputs = other._connectedClockOutputs; } - /// - /// Parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public GammaDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _distributionParameters; + return _deviceType; } set { - _distributionParameters = value; + _deviceType = value; } } /// - /// Truncation parameters of the distribution + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _truncationParameters; + return _calibration; } set { - _truncationParameters = value; + _calibration = value; } } - /// - /// Scaling parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _scalingParameters; + return _whoAmI; } set { - _scalingParameters = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new GammaDistribution(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new GammaDistribution(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); + _whoAmI = value; } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a gamma distribution. - /// - ///Defined by shape (k) and rate (θ⁻¹) parameters. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a gamma distribution.\n\nDefined by shape (k) and rate (θ⁻¹) paramet" + - "ers.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class GammaDistributionParameters - { - - private string _family; - - private double _shape; - - private double _rate; - - public GammaDistributionParameters() - { - _family = "Gamma"; - _shape = 1D; - _rate = 1D; - } - - protected GammaDistributionParameters(GammaDistributionParameters other) - { - _family = other._family; - _shape = other._shape; - _rate = other._rate; } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// Device serial number + /// + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _family; + return _serialNumber; } set { - _family = value; + _serialNumber = value; } } /// - /// Shape parameter of the distribution + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("shape")] - [System.ComponentModel.DescriptionAttribute("Shape parameter of the distribution")] - public double Shape + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _shape; + return _portName; } set { - _shape = value; + _portName = value; } } /// - /// Rate parameter of the distribution + /// Connected clock outputs /// - [Newtonsoft.Json.JsonPropertyAttribute("rate")] - [System.ComponentModel.DescriptionAttribute("Rate parameter of the distribution")] - public double Rate + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("connected_clock_outputs")] + [System.ComponentModel.DescriptionAttribute("Connected clock outputs")] + public System.Collections.Generic.List ConnectedClockOutputs { get { - return _rate; + return _connectedClockOutputs; } set { - _rate = value; + _connectedClockOutputs = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new GammaDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpWhiteRabbit(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new GammaDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpWhiteRabbit(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Shape = " + _shape + ", "); - stringBuilder.Append("Rate = " + _rate); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName + ", "); + stringBuilder.Append("ConnectedClockOutputs = " + _connectedClockOutputs); return true; } @@ -4176,276 +3761,218 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// A patch update function that uses lookup table interpolation. + /// + ///Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. + ///This function maps input values to output values using a lookup table with + ///linear interpolation between defined points. Useful for complex, non-linear + ///reward schedules or parameter updates. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses lookup table interpolation. + + Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. + This function maps input values to output values using a lookup table with + linear interpolation between defined points. Useful for complex, non-linear + reward schedules or parameter updates.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpAnalogInput + public partial class LookupTableFunction : PatchUpdateFunction { - private string _deviceType; - - private BaseModel _calibration; - - private int _whoAmI; - - private string _serialNumber; + private System.Collections.Generic.List _lutKeys; - private string _portName; + private System.Collections.Generic.List _lutValues; - public HarpAnalogInput() + public LookupTableFunction() { - _deviceType = "AnalogInput"; - _whoAmI = 1236; + _lutKeys = new System.Collections.Generic.List(); + _lutValues = new System.Collections.Generic.List(); } - protected HarpAnalogInput(HarpAnalogInput other) + protected LookupTableFunction(LookupTableFunction other) : + base(other) { - _deviceType = other._deviceType; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _lutKeys = other._lutKeys; + _lutValues = other._lutValues; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// List of keys of the lookup table + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("lut_keys", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("List of keys of the lookup table")] + public System.Collections.Generic.List LutKeys { get { - return _deviceType; + return _lutKeys; } set { - _deviceType = value; + _lutKeys = value; } } /// - /// Calibration for the device. + /// List of values of the lookup table /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("lut_values", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("List of values of the lookup table")] + public System.Collections.Generic.List LutValues { get { - return _calibration; + return _lutValues; } set { - _calibration = value; + _lutValues = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + public System.IObservable Generate() { - get - { - return _whoAmI; - } - set - { - _whoAmI = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LookupTableFunction(this))); } - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + public System.IObservable Generate(System.IObservable source) { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new LookupTableFunction(this)); } - /// - /// Device port name - /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _portName; - } - set + if (base.PrintMembers(stringBuilder)) { - _portName = value; + stringBuilder.Append(", "); } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpAnalogInput(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpAnalogInput(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("LutKeys = " + _lutKeys + ", "); + stringBuilder.Append("LutValues = " + _lutValues); return true; } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Input for water valve calibration class + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Input for water valve calibration class")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpBehavior + public partial class Measurement { - private string _deviceType; - - private BaseModel _calibration; - - private int _whoAmI; + private double _valveOpenInterval; - private string _serialNumber; + private double _valveOpenTime; - private string _portName; + private System.Collections.Generic.List _waterWeight; - public HarpBehavior() - { - _deviceType = "Behavior"; - _whoAmI = 1216; - } + private int _repeatCount; - protected HarpBehavior(HarpBehavior other) + public Measurement() { - _deviceType = other._deviceType; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _waterWeight = new System.Collections.Generic.List(); } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + protected Measurement(Measurement other) { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _valveOpenInterval = other._valveOpenInterval; + _valveOpenTime = other._valveOpenTime; + _waterWeight = other._waterWeight; + _repeatCount = other._repeatCount; } /// - /// Calibration for the device. + /// Time between two consecutive valve openings (s) /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("valve_open_interval", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Time between two consecutive valve openings (s)")] + public double ValveOpenInterval { get { - return _calibration; + return _valveOpenInterval; } set { - _calibration = value; + _valveOpenInterval = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + /// + /// Valve open interval (s) + /// + [Newtonsoft.Json.JsonPropertyAttribute("valve_open_time", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Valve open interval (s)")] + public double ValveOpenTime { get { - return _whoAmI; + return _valveOpenTime; } set { - _whoAmI = value; + _valveOpenTime = value; } } /// - /// Device serial number + /// Weight of water delivered (g) /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("water_weight", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Weight of water delivered (g)")] + public System.Collections.Generic.List WaterWeight { get { - return _serialNumber; + return _waterWeight; } set { - _serialNumber = value; + _waterWeight = value; } } /// - /// Device port name + /// Number of times the valve opened. /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("repeat_count", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of times the valve opened.")] + public int RepeatCount { get { - return _portName; + return _repeatCount; } set { - _portName = value; + _repeatCount = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpBehavior(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Measurement(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Measurement(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("ValveOpenInterval = " + _valveOpenInterval + ", "); + stringBuilder.Append("ValveOpenTime = " + _valveOpenTime + ", "); + stringBuilder.Append("WaterWeight = " + _waterWeight + ", "); + stringBuilder.Append("RepeatCount = " + _repeatCount); return true; } @@ -4464,132 +3991,209 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Controls the movable water spout behavior for reward delivery. + /// + ///This class configures how the movable spout operates, including when it's + ///enabled, timing for reward collection, and retraction distance for operant + ///conditioning protocols. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Controls the movable water spout behavior for reward delivery.\n\nThis class config" + + "ures how the movable spout operates, including when it\'s\nenabled, timing for rew" + + "ard collection, and retraction distance for operant\nconditioning protocols.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpEnvironmentSensor + public partial class MovableSpoutControl { - private string _deviceType; - - private BaseModel _calibration; - - private int _whoAmI; + private bool _enabled; - private string _serialNumber; + private double _timeToCollectAfterReward; - private string _portName; + private double _retractingDistance; - public HarpEnvironmentSensor() + public MovableSpoutControl() { - _deviceType = "EnvironmentSensor"; - _whoAmI = 1405; + _enabled = false; + _timeToCollectAfterReward = 1D; + _retractingDistance = 0D; } - protected HarpEnvironmentSensor(HarpEnvironmentSensor other) + protected MovableSpoutControl(MovableSpoutControl other) { - _deviceType = other._deviceType; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _enabled = other._enabled; + _timeToCollectAfterReward = other._timeToCollectAfterReward; + _retractingDistance = other._retractingDistance; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Whether the movable spout is enabled + /// + [Newtonsoft.Json.JsonPropertyAttribute("enabled")] + [System.ComponentModel.DescriptionAttribute("Whether the movable spout is enabled")] + public bool Enabled { get { - return _deviceType; + return _enabled; } set { - _deviceType = value; + _enabled = value; } } /// - /// Calibration for the device. + /// Time (s) to collect after reward /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_after_reward")] + [System.ComponentModel.DescriptionAttribute("Time (s) to collect after reward")] + public double TimeToCollectAfterReward { get { - return _calibration; + return _timeToCollectAfterReward; } set { - _calibration = value; + _timeToCollectAfterReward = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + /// + /// The distance, relative to the default position, the spout will be retracted by + /// + [Newtonsoft.Json.JsonPropertyAttribute("retracting_distance")] + [System.ComponentModel.DescriptionAttribute("The distance, relative to the default position, the spout will be retracted by")] + public double RetractingDistance { get { - return _whoAmI; + return _retractingDistance; } set { - _whoAmI = value; + _retractingDistance = value; } } - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + public System.IObservable Generate() { - get + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new MovableSpoutControl(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new MovableSpoutControl(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Enabled = " + _enabled + ", "); + stringBuilder.Append("TimeToCollectAfterReward = " + _timeToCollectAfterReward + ", "); + stringBuilder.Append("RetractingDistance = " + _retractingDistance); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - return _serialNumber; + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// A numerical updater that modifies task parameters during execution. + /// + ///This class combines an operation type with parameters to define how values + ///should be updated dynamically during the task, enabling adaptive behavior + ///based on animal performance or other criteria. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A numerical updater that modifies task parameters during execution. + + This class combines an operation type with parameters to define how values + should be updated dynamically during the task, enabling adaptive behavior + based on animal performance or other criteria.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class NumericalUpdater + { + + private NumericalUpdaterOperation _operation; + + private NumericalUpdaterParameters _parameters; + + public NumericalUpdater() + { + _operation = NumericalUpdaterOperation.None; + _parameters = new NumericalUpdaterParameters(); + } + + protected NumericalUpdater(NumericalUpdater other) + { + _operation = other._operation; + _parameters = other._parameters; + } + + /// + /// Operation to perform on the parameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("operation")] + [System.ComponentModel.DescriptionAttribute("Operation to perform on the parameter")] + public NumericalUpdaterOperation Operation + { + get + { + return _operation; } set { - _serialNumber = value; + _operation = value; } } /// - /// Device port name + /// Parameters of the updater /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("parameters")] + [System.ComponentModel.DescriptionAttribute("Parameters of the updater")] + public NumericalUpdaterParameters Parameters { get { - return _portName; + return _parameters; } set { - _portName = value; + _parameters = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpEnvironmentSensor(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdater(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpEnvironmentSensor(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdater(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("Operation = " + _operation + ", "); + stringBuilder.Append("Parameters = " + _parameters); return true; } @@ -4608,132 +4212,220 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Enumeration of operations that can be performed by numerical updaters. + /// + ///These operations define how parameter values are modified during task execution, + ///allowing for dynamic adjustment of task parameters based on performance or other criteria. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum NumericalUpdaterOperation + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="None")] + None = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Offset")] + Offset = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Gain")] + Gain = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Set")] + Set = 3, + } + + + /// + /// Parameters that control how numerical updates are applied to task values. + /// + ///These parameters define the bounds and increments for updating numerical values + ///during task execution, ensuring values stay within acceptable ranges. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Parameters that control how numerical updates are applied to task values.\n\nThese " + + "parameters define the bounds and increments for updating numerical values\nduring" + + " task execution, ensuring values stay within acceptable ranges.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpLicketySplit + public partial class NumericalUpdaterParameters { - private string _deviceType; + private double _initialValue; - private BaseModel _calibration; + private double _onSuccess; - private int _whoAmI; + private double _onFailure; - private string _serialNumber; + private double _increment; - private string _portName; + private double _decrement; - public HarpLicketySplit() + private double _minimum; + + private double _maximum; + + public NumericalUpdaterParameters() { - _deviceType = "LicketySplit"; - _whoAmI = 1400; + _initialValue = 0D; + _onSuccess = 0D; + _onFailure = 0D; + _increment = 0D; + _decrement = 0D; + _minimum = 0D; + _maximum = 0D; } - protected HarpLicketySplit(HarpLicketySplit other) + protected NumericalUpdaterParameters(NumericalUpdaterParameters other) { - _deviceType = other._deviceType; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _initialValue = other._initialValue; + _onSuccess = other._onSuccess; + _onFailure = other._onFailure; + _increment = other._increment; + _decrement = other._decrement; + _minimum = other._minimum; + _maximum = other._maximum; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Initial value of the parameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("initial_value")] + [System.ComponentModel.DescriptionAttribute("Initial value of the parameter")] + public double InitialValue { get { - return _deviceType; + return _initialValue; } set { - _deviceType = value; + _initialValue = value; } } /// - /// Calibration for the device. + /// Value used to update the parameter by on success /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("on_success")] + [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on success")] + public double OnSuccess { get { - return _calibration; + return _onSuccess; } set { - _calibration = value; + _onSuccess = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + /// + /// Value used to update the parameter by on failure + /// + [Newtonsoft.Json.JsonPropertyAttribute("on_failure")] + [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on failure")] + public double OnFailure { get { - return _whoAmI; + return _onFailure; } set { - _whoAmI = value; + _onFailure = value; } } /// - /// Device serial number + /// Value to increment the parameter by /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [Newtonsoft.Json.JsonPropertyAttribute("increment")] + [System.ComponentModel.DescriptionAttribute("Value to increment the parameter by")] + public double Increment { get { - return _serialNumber; + return _increment; } set { - _serialNumber = value; + _increment = value; } } /// - /// Device port name + /// Value to decrement the parameter by /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("decrement")] + [System.ComponentModel.DescriptionAttribute("Value to decrement the parameter by")] + public double Decrement { get { - return _portName; + return _decrement; } set { - _portName = value; + _decrement = value; } } - public System.IObservable Generate() + /// + /// Minimum value of the parameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] + public double Minimum { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpLicketySplit(this))); + get + { + return _minimum; + } + set + { + _minimum = value; + } } - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpLicketySplit(this)); + /// + /// Minimum value of the parameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("maximum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] + public double Maximum + { + get + { + return _maximum; + } + set + { + _maximum = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdaterParameters(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdaterParameters(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("InitialValue = " + _initialValue + ", "); + stringBuilder.Append("OnSuccess = " + _onSuccess + ", "); + stringBuilder.Append("OnFailure = " + _onFailure + ", "); + stringBuilder.Append("Increment = " + _increment + ", "); + stringBuilder.Append("Decrement = " + _decrement + ", "); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum); return true; } @@ -4752,132 +4444,205 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Controls the odor delivery system parameters. + /// + ///This class manages the olfactory stimulus delivery system, including flow rates, + ///valve timing, and carrier gas configuration. It ensures proper odor concentration + ///and delivery timing for the behavioral task. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Controls the odor delivery system parameters.\n\nThis class manages the olfactory s" + + "timulus delivery system, including flow rates,\nvalve timing, and carrier gas con" + + "figuration. It ensures proper odor concentration\nand delivery timing for the beh" + + "avioral task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpSniffDetector + public partial class OdorControl { - private string _deviceType; - - private BaseModel _calibration; - - private int _whoAmI; + private double _targetTotalFlow; - private string _serialNumber; + private bool _useChannel3AsCarrier; - private string _portName; + private double _targetOdorFlow; - public HarpSniffDetector() + public OdorControl() { - _deviceType = "SniffDetector"; - _whoAmI = 1401; + _targetTotalFlow = 1000D; + _useChannel3AsCarrier = true; + _targetOdorFlow = 100D; } - protected HarpSniffDetector(HarpSniffDetector other) + protected OdorControl(OdorControl other) { - _deviceType = other._deviceType; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _targetTotalFlow = other._targetTotalFlow; + _useChannel3AsCarrier = other._useChannel3AsCarrier; + _targetOdorFlow = other._targetOdorFlow; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Target total flow (ml/s) of the odor mixture + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_total_flow")] + [System.ComponentModel.DescriptionAttribute("Target total flow (ml/s) of the odor mixture")] + public double TargetTotalFlow { get { - return _deviceType; + return _targetTotalFlow; } set { - _deviceType = value; + _targetTotalFlow = value; } } /// - /// Calibration for the device. + /// Whether to use channel 3 as carrier /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("use_channel_3_as_carrier")] + [System.ComponentModel.DescriptionAttribute("Whether to use channel 3 as carrier")] + public bool UseChannel3AsCarrier { get { - return _calibration; + return _useChannel3AsCarrier; } set { - _calibration = value; + _useChannel3AsCarrier = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + /// + /// Target odor flow (ml/s) in the odor mixture + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_odor_flow")] + [System.ComponentModel.DescriptionAttribute("Target odor flow (ml/s) in the odor mixture")] + public double TargetOdorFlow { get { - return _whoAmI; + return _targetOdorFlow; } set { - _whoAmI = value; + _targetOdorFlow = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorControl(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new OdorControl(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("TargetTotalFlow = " + _targetTotalFlow + ", "); + stringBuilder.Append("UseChannel3AsCarrier = " + _useChannel3AsCarrier + ", "); + stringBuilder.Append("TargetOdorFlow = " + _targetOdorFlow); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Specifies odor delivery parameters for olfactory cues in the VR environment. + /// + ///Odors can be delivered at specific locations to provide additional sensory + ///information for navigation and foraging decisions. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Specifies odor delivery parameters for olfactory cues in the VR environment.\n\nOdo" + + "rs can be delivered at specific locations to provide additional sensory\ninformat" + + "ion for navigation and foraging decisions.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class OdorSpecification + { + + private int _index; + + private double _concentration; + + public OdorSpecification() + { + _concentration = 1D; + } + + protected OdorSpecification(OdorSpecification other) + { + _index = other._index; + _concentration = other._concentration; } /// - /// Device serial number + /// Index of the odor to be used /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [Newtonsoft.Json.JsonPropertyAttribute("index", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Index of the odor to be used")] + public int Index { get { - return _serialNumber; + return _index; } set { - _serialNumber = value; + _index = value; } } /// - /// Device port name + /// Concentration of the odor /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("concentration")] + [System.ComponentModel.DescriptionAttribute("Concentration of the odor")] + public double Concentration { get { - return _portName; + return _concentration; } set { - _portName = value; + _concentration = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpSniffDetector(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpSniffDetector(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OdorSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("Index = " + _index + ", "); + stringBuilder.Append("Concentration = " + _concentration); return true; } @@ -4896,15 +4661,19 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// A calibrated olfactometer device + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A calibrated olfactometer device")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpWhiteRabbit + public partial class Olfactometer { private string _deviceType; - private BaseModel _calibration; + private OlfactometerCalibration _calibration; private int _whoAmI; @@ -4912,23 +4681,20 @@ public partial class HarpWhiteRabbit private string _portName; - private System.Collections.Generic.List _connectedClockOutputs; - - public HarpWhiteRabbit() + public Olfactometer() { - _deviceType = "WhiteRabbit"; - _whoAmI = 1404; - _connectedClockOutputs = new System.Collections.Generic.List(); + _deviceType = "Olfactometer"; + _calibration = new OlfactometerCalibration(); + _whoAmI = 1140; } - protected HarpWhiteRabbit(HarpWhiteRabbit other) + protected Olfactometer(Olfactometer other) { _deviceType = other._deviceType; _calibration = other._calibration; _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; _portName = other._portName; - _connectedClockOutputs = other._connectedClockOutputs; } [Newtonsoft.Json.JsonPropertyAttribute("device_type")] @@ -4944,13 +4710,9 @@ public string DeviceType } } - /// - /// Calibration for the device. - /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + public OlfactometerCalibration Calibration { get { @@ -5009,32 +4771,14 @@ public string PortName } } - /// - /// Connected clock outputs - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("connected_clock_outputs")] - [System.ComponentModel.DescriptionAttribute("Connected clock outputs")] - public System.Collections.Generic.List ConnectedClockOutputs + public System.IObservable Generate() { - get - { - return _connectedClockOutputs; - } - set - { - _connectedClockOutputs = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpWhiteRabbit(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Olfactometer(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpWhiteRabbit(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Olfactometer(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -5043,8 +4787,7 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("Calibration = " + _calibration + ", "); stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName + ", "); - stringBuilder.Append("ConnectedClockOutputs = " + _connectedClockOutputs); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -5064,212 +4807,254 @@ public override string ToString() /// - /// A log-normal probability distribution. - /// - ///Distribution where the logarithm of the variable is normally distributed. - ///Always produces positive values and is right-skewed. + /// Olfactometer device configuration model /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A log-normal probability distribution.\n\nDistribution where the logarithm of the v" + - "ariable is normally distributed.\nAlways produces positive values and is right-sk" + - "ewed.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Olfactometer device configuration model")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LogNormalDistribution : Distribution + public partial class OlfactometerCalibration { - private LogNormalDistributionParameters _distributionParameters; - - private TruncationParameters _truncationParameters; + private System.DateTimeOffset? _date; - private ScalingParameters _scalingParameters; + private System.Collections.Generic.Dictionary _channelConfig; - public LogNormalDistribution() + public OlfactometerCalibration() { - _distributionParameters = new LogNormalDistributionParameters(); + _channelConfig = new System.Collections.Generic.Dictionary(); } - protected LogNormalDistribution(LogNormalDistribution other) : - base(other) + protected OlfactometerCalibration(OlfactometerCalibration other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _date = other._date; + _channelConfig = other._channelConfig; } /// - /// Parameters of the distribution + /// Date of the calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public LogNormalDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset? Date { get { - return _distributionParameters; + return _date; } set { - _distributionParameters = value; + _date = value; } } /// - /// Truncation parameters of the distribution + /// Configuration of olfactometer channels /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("channel_config")] + [System.ComponentModel.DescriptionAttribute("Configuration of olfactometer channels")] + public System.Collections.Generic.Dictionary ChannelConfig { get { - return _truncationParameters; + return _channelConfig; } set { - _truncationParameters = value; + _channelConfig = value; } } - /// - /// Scaling parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + public System.IObservable Generate() { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibration(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LogNormalDistribution(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new LogNormalDistribution(this)); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("ChannelConfig = " + _channelConfig); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Parameters for a log-normal distribution. - /// - ///Defined by the mean and standard deviation of the underlying normal distribution. + /// Harp Olfactometer available channel + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum OlfactometerChannel + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Channel0 = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Channel1 = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Channel2 = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Channel3 = 3, + } + + + /// + /// Configuration for a single olfactometer channel /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a log-normal distribution.\n\nDefined by the mean and standard devia" + - "tion of the underlying normal distribution.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Configuration for a single olfactometer channel")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LogNormalDistributionParameters + public partial class OlfactometerChannelConfig { - private string _family; + private int _channelIndex; + + private OlfactometerChannelType _channelType; + + private OlfactometerChannelConfigFlowRateCapacity _flowRateCapacity; + + private double _flowRate; - private double _mean; + private string _odorant; - private double _std; + private double? _odorantDilution; - public LogNormalDistributionParameters() + public OlfactometerChannelConfig() { - _family = "LogNormal"; - _mean = 0D; - _std = 0D; + _channelType = OlfactometerChannelType.Odor; + _flowRateCapacity = OlfactometerChannelConfigFlowRateCapacity._100; + _flowRate = 100D; } - protected LogNormalDistributionParameters(LogNormalDistributionParameters other) + protected OlfactometerChannelConfig(OlfactometerChannelConfig other) { - _family = other._family; - _mean = other._mean; - _std = other._std; + _channelIndex = other._channelIndex; + _channelType = other._channelType; + _flowRateCapacity = other._flowRateCapacity; + _flowRate = other._flowRate; + _odorant = other._odorant; + _odorantDilution = other._odorantDilution; } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + [Newtonsoft.Json.JsonPropertyAttribute("channel_index", Required=Newtonsoft.Json.Required.Always)] + public int ChannelIndex { get { - return _family; + return _channelIndex; } set { - _family = value; + _channelIndex = value; } } - /// - /// Mean of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("mean")] - [System.ComponentModel.DescriptionAttribute("Mean of the distribution")] - public double Mean + [Newtonsoft.Json.JsonPropertyAttribute("channel_type")] + public OlfactometerChannelType ChannelType { get { - return _mean; + return _channelType; } set { - _mean = value; + _channelType = value; } } - /// - /// Standard deviation of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("std")] - [System.ComponentModel.DescriptionAttribute("Standard deviation of the distribution")] - public double Std + [Newtonsoft.Json.JsonPropertyAttribute("flow_rate_capacity")] + public OlfactometerChannelConfigFlowRateCapacity FlowRateCapacity + { + get + { + return _flowRateCapacity; + } + set + { + _flowRateCapacity = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("flow_rate")] + public double FlowRate + { + get + { + return _flowRate; + } + set + { + _flowRate = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("odorant")] + public string Odorant + { + get + { + return _odorant; + } + set + { + _odorant = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("odorant_dilution")] + public double? OdorantDilution { get { - return _std; + return _odorantDilution; } set { - _std = value; + _odorantDilution = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LogNormalDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerChannelConfig(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new LogNormalDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerChannelConfig(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Mean = " + _mean + ", "); - stringBuilder.Append("Std = " + _std); + stringBuilder.Append("ChannelIndex = " + _channelIndex + ", "); + stringBuilder.Append("ChannelType = " + _channelType + ", "); + stringBuilder.Append("FlowRateCapacity = " + _flowRateCapacity + ", "); + stringBuilder.Append("FlowRate = " + _flowRate + ", "); + stringBuilder.Append("Odorant = " + _odorant + ", "); + stringBuilder.Append("OdorantDilution = " + _odorantDilution); return true; } @@ -5289,86 +5074,132 @@ public override string ToString() /// - /// A patch update function that uses lookup table interpolation. - /// - ///Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. - ///This function maps input values to output values using a lookup table with - ///linear interpolation between defined points. Useful for complex, non-linear - ///reward schedules or parameter updates. + /// Olfactometer channel type /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses lookup table interpolation. + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum OlfactometerChannelType + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Odor")] + Odor = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Carrier")] + Carrier = 1, + } - Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. - This function maps input values to output values using a lookup table with - linear interpolation between defined points. Useful for complex, non-linear - reward schedules or parameter updates.")] + + /// + /// A RewardFunction that is applied when the animal enters the patch. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal enters the patch.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LookupTableFunction : PatchUpdateFunction + public partial class OnThisPatchEntryRewardFunction : RewardFunction { - private System.Collections.Generic.List _lutKeys; + private PatchUpdateFunction _amount; - private System.Collections.Generic.List _lutValues; + private PatchUpdateFunction _probability; - public LookupTableFunction() + private PatchUpdateFunction _available; + + private string _rule; + + public OnThisPatchEntryRewardFunction() { - _lutKeys = new System.Collections.Generic.List(); - _lutValues = new System.Collections.Generic.List(); + _rule = "OnThisPatchEntry"; } - protected LookupTableFunction(LookupTableFunction other) : + protected OnThisPatchEntryRewardFunction(OnThisPatchEntryRewardFunction other) : base(other) { - _lutKeys = other._lutKeys; - _lutValues = other._lutValues; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; } /// - /// List of keys of the lookup table + /// Defines the amount of reward replenished per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("lut_keys", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("List of keys of the lookup table")] - public System.Collections.Generic.List LutKeys + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { get { - return _lutKeys; + return _amount; } set { - _lutKeys = value; + _amount = value; } } /// - /// List of values of the lookup table + /// Defines the probability of reward replenished per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("lut_values", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("List of values of the lookup table")] - public System.Collections.Generic.List LutValues + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _lutValues; + return _probability; } set { - _lutValues = value; + _probability = value; } } - public System.IObservable Generate() + /// + /// Defines the amount of reward available replenished in the patch per rule unit. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LookupTableFunction(this))); + get + { + return _available; + } + set + { + _available = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Rule to trigger reward function + /// + [Newtonsoft.Json.JsonPropertyAttribute("rule")] + [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] + public string Rule { - return System.Reactive.Linq.Observable.Select(source, _ => new LookupTableFunction(this)); + get + { + return _rule; + } + set + { + _rule = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OnThisPatchEntryRewardFunction(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new OnThisPatchEntryRewardFunction(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -5377,111 +5208,140 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("LutKeys = " + _lutKeys + ", "); - stringBuilder.Append("LutValues = " + _lutValues); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule); return true; } } /// - /// Represents a position in the manipulator coordinate system + /// Defines operant conditioning logic for reward delivery in the VR foraging task. + /// + ///This class controls when and how rewards are delivered based on animal behavior, + ///implementing stopping requirements, collection timeouts, and spatial constraints. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a position in the manipulator coordinate system")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines operant conditioning logic for reward delivery in the VR foraging task.\n\n" + + "This class controls when and how rewards are delivered based on animal behavior," + + "\nimplementing stopping requirements, collection timeouts, and spatial constraint" + + "s.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ManipulatorPosition + public partial class OperantLogic { - private double _x; + private bool _isOperant; - private double _y1; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _stopDuration; - private double _y2; + private double _timeToCollectReward; - private double _z; + private double _graceDistanceThreshold; - public ManipulatorPosition() + public OperantLogic() { + _isOperant = true; + _stopDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _timeToCollectReward = 100000D; + _graceDistanceThreshold = 10D; } - protected ManipulatorPosition(ManipulatorPosition other) + protected OperantLogic(OperantLogic other) { - _x = other._x; - _y1 = other._y1; - _y2 = other._y2; - _z = other._z; + _isOperant = other._isOperant; + _stopDuration = other._stopDuration; + _timeToCollectReward = other._timeToCollectReward; + _graceDistanceThreshold = other._graceDistanceThreshold; } - [Newtonsoft.Json.JsonPropertyAttribute("x", Required=Newtonsoft.Json.Required.Always)] - public double X + /// + /// Will the trial implement operant logic + /// + [Newtonsoft.Json.JsonPropertyAttribute("is_operant")] + [System.ComponentModel.DescriptionAttribute("Will the trial implement operant logic")] + public bool IsOperant { get { - return _x; + return _isOperant; } set { - _x = value; + _isOperant = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("y1", Required=Newtonsoft.Json.Required.Always)] - public double Y1 + /// + /// Duration (s) the animal must stop for to lock its choice + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("stop_duration")] + [System.ComponentModel.DescriptionAttribute("Duration (s) the animal must stop for to lock its choice")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution StopDuration { get { - return _y1; + return _stopDuration; } set { - _y1 = value; + _stopDuration = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("y2", Required=Newtonsoft.Json.Required.Always)] - public double Y2 + /// + /// Time(s) the animal has to collect the reward + /// + [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_reward")] + [System.ComponentModel.DescriptionAttribute("Time(s) the animal has to collect the reward")] + public double TimeToCollectReward { get { - return _y2; + return _timeToCollectReward; } set { - _y2 = value; + _timeToCollectReward = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("z", Required=Newtonsoft.Json.Required.Always)] - public double Z + /// + /// Virtual distance (cm) the animal must be within to not abort the current choice + /// + [Newtonsoft.Json.JsonPropertyAttribute("grace_distance_threshold")] + [System.ComponentModel.DescriptionAttribute("Virtual distance (cm) the animal must be within to not abort the current choice")] + public double GraceDistanceThreshold { get { - return _z; + return _graceDistanceThreshold; } set { - _z = value; + _graceDistanceThreshold = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ManipulatorPosition(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperantLogic(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ManipulatorPosition(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OperantLogic(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y1 = " + _y1 + ", "); - stringBuilder.Append("Y2 = " + _y2 + ", "); - stringBuilder.Append("Z = " + _z); + stringBuilder.Append("IsOperant = " + _isOperant + ", "); + stringBuilder.Append("StopDuration = " + _stopDuration + ", "); + stringBuilder.Append("TimeToCollectReward = " + _timeToCollectReward + ", "); + stringBuilder.Append("GraceDistanceThreshold = " + _graceDistanceThreshold); return true; } @@ -5501,121 +5361,135 @@ public override string ToString() /// - /// Input for water valve calibration class + /// Master control class for all operational hardware systems. + /// + ///This class aggregates all the hardware control specifications including + ///movable spout, odor delivery, position tracking, and audio systems. + ///It provides a centralized configuration point for all task hardware. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Input for water valve calibration class")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Master control class for all operational hardware systems. + + This class aggregates all the hardware control specifications including + movable spout, odor delivery, position tracking, and audio systems. + It provides a centralized configuration point for all task hardware.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Measurement + public partial class OperationControl { - private double _valveOpenInterval; + private MovableSpoutControl _movableSpoutControl; - private double _valveOpenTime; + private OdorControl _odorControl; - private System.Collections.Generic.List _waterWeight; + private PositionControl _positionControl; - private int _repeatCount; + private AudioControl _audioControl; - public Measurement() + public OperationControl() { - _waterWeight = new System.Collections.Generic.List(); + _movableSpoutControl = new MovableSpoutControl(); + _odorControl = new OdorControl(); + _positionControl = new PositionControl(); + _audioControl = new AudioControl(); } - protected Measurement(Measurement other) + protected OperationControl(OperationControl other) { - _valveOpenInterval = other._valveOpenInterval; - _valveOpenTime = other._valveOpenTime; - _waterWeight = other._waterWeight; - _repeatCount = other._repeatCount; + _movableSpoutControl = other._movableSpoutControl; + _odorControl = other._odorControl; + _positionControl = other._positionControl; + _audioControl = other._audioControl; } /// - /// Time between two consecutive valve openings (s) + /// Control of the movable spout /// - [Newtonsoft.Json.JsonPropertyAttribute("valve_open_interval", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Time between two consecutive valve openings (s)")] - public double ValveOpenInterval + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("movable_spout_control")] + [System.ComponentModel.DescriptionAttribute("Control of the movable spout")] + public MovableSpoutControl MovableSpoutControl { get { - return _valveOpenInterval; + return _movableSpoutControl; } set { - _valveOpenInterval = value; + _movableSpoutControl = value; } } /// - /// Valve open interval (s) + /// Control of the odor /// - [Newtonsoft.Json.JsonPropertyAttribute("valve_open_time", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Valve open interval (s)")] - public double ValveOpenTime + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("odor_control")] + [System.ComponentModel.DescriptionAttribute("Control of the odor")] + public OdorControl OdorControl { get { - return _valveOpenTime; + return _odorControl; } set { - _valveOpenTime = value; + _odorControl = value; } } /// - /// Weight of water delivered (g) + /// Control of the position /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("water_weight", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Weight of water delivered (g)")] - public System.Collections.Generic.List WaterWeight + [Newtonsoft.Json.JsonPropertyAttribute("position_control")] + [System.ComponentModel.DescriptionAttribute("Control of the position")] + public PositionControl PositionControl { get { - return _waterWeight; + return _positionControl; } set { - _waterWeight = value; + _positionControl = value; } } /// - /// Number of times the valve opened. + /// Control of the audio /// - [Newtonsoft.Json.JsonPropertyAttribute("repeat_count", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of times the valve opened.")] - public int RepeatCount + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("audio_control")] + [System.ComponentModel.DescriptionAttribute("Control of the audio")] + public AudioControl AudioControl { get { - return _repeatCount; + return _audioControl; } set { - _repeatCount = value; + _audioControl = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Measurement(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperationControl(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Measurement(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OperationControl(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("ValveOpenInterval = " + _valveOpenInterval + ", "); - stringBuilder.Append("ValveOpenTime = " + _valveOpenTime + ", "); - stringBuilder.Append("WaterWeight = " + _waterWeight + ", "); - stringBuilder.Append("RepeatCount = " + _repeatCount); + stringBuilder.Append("MovableSpoutControl = " + _movableSpoutControl + ", "); + stringBuilder.Append("OdorControl = " + _odorControl + ", "); + stringBuilder.Append("PositionControl = " + _positionControl + ", "); + stringBuilder.Append("AudioControl = " + _audioControl); return true; } @@ -5635,368 +5509,320 @@ public override string ToString() /// - /// Microstep resolution available + /// A RewardFunction that is applied when the animal is outside of the patch. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum MicrostepResolution + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is outside of the patch.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class OutsideRewardFunction : RewardFunction { - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Microstep8 = 0, + private PatchUpdateFunction _amount; - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Microstep16 = 1, + private PatchUpdateFunction _probability; - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Microstep32 = 2, + private PatchUpdateFunction _available; - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Microstep64 = 3, - } - - - /// - /// Motor operation mode - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum MotorOperationMode - { + private OutsideRewardFunctionRule _rule; - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Quiet = 0, + private double _delay; - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Dynamic = 1, - } - - - /// - /// Controls the movable water spout behavior for reward delivery. - /// - ///This class configures how the movable spout operates, including when it's - ///enabled, timing for reward collection, and retraction distance for operant - ///conditioning protocols. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Controls the movable water spout behavior for reward delivery.\n\nThis class config" + - "ures how the movable spout operates, including when it\'s\nenabled, timing for rew" + - "ard collection, and retraction distance for operant\nconditioning protocols.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class MovableSpoutControl - { - - private bool _enabled; - - private double _timeToCollectAfterReward; - - private double _retractingDistance; + public OutsideRewardFunction() + { + _rule = OutsideRewardFunctionRule.OnTime; + _delay = 0D; + } - public MovableSpoutControl() + protected OutsideRewardFunction(OutsideRewardFunction other) : + base(other) { - _enabled = false; - _timeToCollectAfterReward = 1D; - _retractingDistance = 0D; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; + _delay = other._delay; } - protected MovableSpoutControl(MovableSpoutControl other) + /// + /// Defines the amount of reward replenished per rule unit. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { - _enabled = other._enabled; - _timeToCollectAfterReward = other._timeToCollectAfterReward; - _retractingDistance = other._retractingDistance; + get + { + return _amount; + } + set + { + _amount = value; + } } /// - /// Whether the movable spout is enabled + /// Defines the probability of reward replenished per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("enabled")] - [System.ComponentModel.DescriptionAttribute("Whether the movable spout is enabled")] - public bool Enabled + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _enabled; + return _probability; } set { - _enabled = value; + _probability = value; } } /// - /// Time (s) to collect after reward + /// Defines the amount of reward available replenished in the patch per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_after_reward")] - [System.ComponentModel.DescriptionAttribute("Time (s) to collect after reward")] - public double TimeToCollectAfterReward + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { get { - return _timeToCollectAfterReward; + return _available; } set { - _timeToCollectAfterReward = value; + _available = value; } } /// - /// The distance, relative to the default position, the spout will be retracted by + /// Rule to trigger reward function /// - [Newtonsoft.Json.JsonPropertyAttribute("retracting_distance")] - [System.ComponentModel.DescriptionAttribute("The distance, relative to the default position, the spout will be retracted by")] - public double RetractingDistance + [Newtonsoft.Json.JsonPropertyAttribute("rule")] + [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] + public OutsideRewardFunctionRule Rule { get { - return _retractingDistance; + return _rule; } set { - _retractingDistance = value; + _rule = value; } } - public System.IObservable Generate() + /// + /// Delay (s) before the replenishment starts after the rule is triggered. + /// + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("Delay (s) before the replenishment starts after the rule is triggered.")] + public double Delay { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new MovableSpoutControl(this))); + get + { + return _delay; + } + set + { + _delay = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new MovableSpoutControl(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OutsideRewardFunction(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Enabled = " + _enabled + ", "); - stringBuilder.Append("TimeToCollectAfterReward = " + _timeToCollectAfterReward + ", "); - stringBuilder.Append("RetractingDistance = " + _retractingDistance); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new OutsideRewardFunction(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule + ", "); + stringBuilder.Append("Delay = " + _delay); + return true; } } /// - /// A normal (Gaussian) probability distribution. - /// - ///Bell-shaped distribution symmetric around the mean, commonly used - ///for modeling naturally occurring random variables. + /// Represents statistics for a patch in the VR foraging task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A normal (Gaussian) probability distribution.\n\nBell-shaped distribution symmetric" + - " around the mean, commonly used\nfor modeling naturally occurring random variable" + - "s.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents statistics for a patch in the VR foraging task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NormalDistribution : Distribution + public partial class Patch { - private NormalDistributionParameters _distributionParameters; + private string _label; + + private int _stateIndex; + + private OdorSpecification _odorSpecification; + + private RewardSpecification _rewardSpecification; - private TruncationParameters _truncationParameters; + private PatchVirtualSitesGenerator _patchVirtualSitesGenerator; - private ScalingParameters _scalingParameters; + private System.Collections.Generic.List _patchTerminators; - public NormalDistribution() + public Patch() { - _distributionParameters = new NormalDistributionParameters(); + _label = ""; + _stateIndex = 0; + _rewardSpecification = new RewardSpecification(); + _patchVirtualSitesGenerator = new PatchVirtualSitesGenerator(); + _patchTerminators = new System.Collections.Generic.List(); } - protected NormalDistribution(NormalDistribution other) : - base(other) + protected Patch(Patch other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _label = other._label; + _stateIndex = other._stateIndex; + _odorSpecification = other._odorSpecification; + _rewardSpecification = other._rewardSpecification; + _patchVirtualSitesGenerator = other._patchVirtualSitesGenerator; + _patchTerminators = other._patchTerminators; } /// - /// Parameters of the distribution + /// Label of the patch /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public NormalDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("label")] + [System.ComponentModel.DescriptionAttribute("Label of the patch")] + public string Label { get { - return _distributionParameters; + return _label; } set { - _distributionParameters = value; + _label = value; } } /// - /// Truncation parameters of the distribution + /// Index of the state /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("state_index")] + [System.ComponentModel.DescriptionAttribute("Index of the state")] + public int StateIndex { get { - return _truncationParameters; + return _stateIndex; } set { - _truncationParameters = value; + _stateIndex = value; } } /// - /// Scaling parameters of the distribution + /// The optional odor specification of the patch /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] + [System.ComponentModel.DescriptionAttribute("The optional odor specification of the patch")] + public OdorSpecification OdorSpecification { get { - return _scalingParameters; + return _odorSpecification; } set { - _scalingParameters = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NormalDistribution(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new NormalDistribution(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); + _odorSpecification = value; } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a normal (Gaussian) distribution. - /// - ///Defined by mean (center) and standard deviation (spread). - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a normal (Gaussian) distribution.\n\nDefined by mean (center) and st" + - "andard deviation (spread).")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NormalDistributionParameters - { - - private string _family; - - private double _mean; - - private double _std; - - public NormalDistributionParameters() - { - _family = "Normal"; - _mean = 0D; - _std = 0D; - } - - protected NormalDistributionParameters(NormalDistributionParameters other) - { - _family = other._family; - _mean = other._mean; - _std = other._std; } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// The optional reward specification of the patch + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] + [System.ComponentModel.DescriptionAttribute("The optional reward specification of the patch")] + public RewardSpecification RewardSpecification { get { - return _family; + return _rewardSpecification; } set { - _family = value; + _rewardSpecification = value; } } /// - /// Mean of the distribution + /// Virtual site generation specification /// - [Newtonsoft.Json.JsonPropertyAttribute("mean")] - [System.ComponentModel.DescriptionAttribute("Mean of the distribution")] - public double Mean + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("patch_virtual_sites_generator")] + [System.ComponentModel.DescriptionAttribute("Virtual site generation specification")] + public PatchVirtualSitesGenerator PatchVirtualSitesGenerator { get { - return _mean; + return _patchVirtualSitesGenerator; } set { - _mean = value; + _patchVirtualSitesGenerator = value; } } /// - /// Standard deviation of the distribution + /// The optional termination specification of the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("std")] - [System.ComponentModel.DescriptionAttribute("Standard deviation of the distribution")] - public double Std + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("patch_terminators")] + [System.ComponentModel.DescriptionAttribute("The optional termination specification of the patch")] + public System.Collections.Generic.List PatchTerminators { get { - return _std; + return _patchTerminators; } set { - _std = value; + _patchTerminators = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NormalDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Patch(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new NormalDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Patch(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Mean = " + _mean + ", "); - stringBuilder.Append("Std = " + _std); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("StateIndex = " + _stateIndex + ", "); + stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); + stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); + stringBuilder.Append("PatchVirtualSitesGenerator = " + _patchVirtualSitesGenerator + ", "); + stringBuilder.Append("PatchTerminators = " + _patchTerminators); return true; } @@ -6016,539 +5842,551 @@ public override string ToString() /// - /// A numerical updater that modifies task parameters during execution. - /// - ///This class combines an operation type with parameters to define how values - ///should be updated dynamically during the task, enabling adaptive behavior - ///based on animal performance or other criteria. + /// A RewardFunction that is applied when the animal is inside the patch. + ///For the purposes of this function post-patch and inter-patch are excluded. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A numerical updater that modifies task parameters during execution. - - This class combines an operation type with parameters to define how values - should be updated dynamically during the task, enabling adaptive behavior - based on animal performance or other criteria.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is inside the patch.\nFor the pur" + + "poses of this function post-patch and inter-patch are excluded.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NumericalUpdater + public partial class PatchRewardFunction : RewardFunction { - private NumericalUpdaterOperation _operation; + private PatchUpdateFunction _amount; - private NumericalUpdaterParameters _parameters; + private PatchUpdateFunction _probability; - public NumericalUpdater() + private PatchUpdateFunction _available; + + private PatchRewardFunctionRule _rule; + + public PatchRewardFunction() { - _operation = AindVrForagingDataSchema.NumericalUpdaterOperation.None; - _parameters = new NumericalUpdaterParameters(); + _rule = PatchRewardFunctionRule.OnReward; } - protected NumericalUpdater(NumericalUpdater other) + protected PatchRewardFunction(PatchRewardFunction other) : + base(other) { - _operation = other._operation; - _parameters = other._parameters; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; } /// - /// Operation to perform on the parameter + /// Defines the amount of reward replenished per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operation")] - [System.ComponentModel.DescriptionAttribute("Operation to perform on the parameter")] - public NumericalUpdaterOperation Operation + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { get { - return _operation; + return _amount; } set { - _operation = value; + _amount = value; } } /// - /// Parameters of the updater + /// Defines the probability of reward replenished per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the updater")] - public NumericalUpdaterParameters Parameters + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _parameters; + return _probability; } set { - _parameters = value; + _probability = value; } } - public System.IObservable Generate() + /// + /// Defines the amount of reward available replenished in the patch per rule unit. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdater(this))); + get + { + return _available; + } + set + { + _available = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Rule to trigger reward function + /// + [Newtonsoft.Json.JsonPropertyAttribute("rule")] + [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] + public PatchRewardFunctionRule Rule { - return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdater(this)); + get + { + return _rule; + } + set + { + _rule = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate() { - stringBuilder.Append("Operation = " + _operation + ", "); - stringBuilder.Append("Parameters = " + _parameters); - return true; + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchRewardFunction(this))); } - public override string ToString() + public System.IObservable Generate(System.IObservable source) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + return System.Reactive.Linq.Observable.Select(source, _ => new PatchRewardFunction(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule); + return true; } } /// - /// Enumeration of operations that can be performed by numerical updaters. - /// - ///These operations define how parameter values are modified during task execution, - ///allowing for dynamic adjustment of task parameters based on performance or other criteria. + /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum NumericalUpdaterOperation + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "terminator_type")] + [JsonInheritanceAttribute("OnRejection", typeof(PatchTerminatorOnRejection))] + [JsonInheritanceAttribute("OnChoice", typeof(PatchTerminatorOnChoice))] + [JsonInheritanceAttribute("OnReward", typeof(PatchTerminatorOnReward))] + [JsonInheritanceAttribute("OnTime", typeof(PatchTerminatorOnTime))] + [JsonInheritanceAttribute("OnDistance", typeof(PatchTerminatorOnDistance))] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + + "\" reward sites.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class PatchTerminator { - [System.Runtime.Serialization.EnumMemberAttribute(Value="None")] - None = 0, + public PatchTerminator() + { + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="Offset")] - Offset = 1, + protected PatchTerminator(PatchTerminator other) + { + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="Gain")] - Gain = 2, + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminator(this))); + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="Set")] - Set = 3, + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminator(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } } /// - /// Parameters that control how numerical updates are applied to task values. - /// - ///These parameters define the bounds and increments for updating numerical values - ///during task execution, ensuring values stay within acceptable ranges. + /// Terminates the patch after "count" choices. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters that control how numerical updates are applied to task values.\n\nThese " + - "parameters define the bounds and increments for updating numerical values\nduring" + - " task execution, ensuring values stay within acceptable ranges.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" choices.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NumericalUpdaterParameters + public partial class PatchTerminatorOnChoice : PatchTerminator { - private double _initialValue; - - private double _onSuccess; - - private double _onFailure; - - private double _increment; - - private double _decrement; - - private double _minimum; - - private double _maximum; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; - public NumericalUpdaterParameters() + public PatchTerminatorOnChoice() { - _initialValue = 0D; - _onSuccess = 0D; - _onFailure = 0D; - _increment = 0D; - _decrement = 0D; - _minimum = 0D; - _maximum = 0D; + _count = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - protected NumericalUpdaterParameters(NumericalUpdaterParameters other) + protected PatchTerminatorOnChoice(PatchTerminatorOnChoice other) : + base(other) { - _initialValue = other._initialValue; - _onSuccess = other._onSuccess; - _onFailure = other._onFailure; - _increment = other._increment; - _decrement = other._decrement; - _minimum = other._minimum; - _maximum = other._maximum; + _count = other._count; } /// - /// Initial value of the parameter + /// Number of choices the animal must make to terminate the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("initial_value")] - [System.ComponentModel.DescriptionAttribute("Initial value of the parameter")] - public double InitialValue + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("count")] + [System.ComponentModel.DescriptionAttribute("Number of choices the animal must make to terminate the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _initialValue; + return _count; } set { - _initialValue = value; + _count = value; } } - /// - /// Value used to update the parameter by on success - /// - [Newtonsoft.Json.JsonPropertyAttribute("on_success")] - [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on success")] - public double OnSuccess + public System.IObservable Generate() { - get - { - return _onSuccess; - } - set - { - _onSuccess = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnChoice(this))); } - /// - /// Value used to update the parameter by on failure - /// - [Newtonsoft.Json.JsonPropertyAttribute("on_failure")] - [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on failure")] - public double OnFailure + public System.IObservable Generate(System.IObservable source) { - get - { - return _onFailure; - } - set - { - _onFailure = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnChoice(this)); } - /// - /// Value to increment the parameter by - /// - [Newtonsoft.Json.JsonPropertyAttribute("increment")] - [System.ComponentModel.DescriptionAttribute("Value to increment the parameter by")] - public double Increment + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _increment; - } - set + if (base.PrintMembers(stringBuilder)) { - _increment = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Count = " + _count); + return true; } + } + + + /// + /// Terminates the patch after a "count" distance. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" distance.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class PatchTerminatorOnDistance : PatchTerminator + { - /// - /// Value to decrement the parameter by - /// - [Newtonsoft.Json.JsonPropertyAttribute("decrement")] - [System.ComponentModel.DescriptionAttribute("Value to decrement the parameter by")] - public double Decrement + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; + + public PatchTerminatorOnDistance() { - get - { - return _decrement; - } - set - { - _decrement = value; - } } - /// - /// Minimum value of the parameter - /// - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] - public double Minimum + protected PatchTerminatorOnDistance(PatchTerminatorOnDistance other) : + base(other) { - get - { - return _minimum; - } - set - { - _minimum = value; - } + _count = other._count; } /// - /// Minimum value of the parameter + /// Number of distance units to wait before terminating the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("maximum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] - public double Maximum + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of distance units to wait before terminating the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _maximum; + return _count; } set { - _maximum = value; + _count = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdaterParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdaterParameters(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnDistance(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("InitialValue = " + _initialValue + ", "); - stringBuilder.Append("OnSuccess = " + _onSuccess + ", "); - stringBuilder.Append("OnFailure = " + _onFailure + ", "); - stringBuilder.Append("Increment = " + _increment + ", "); - stringBuilder.Append("Decrement = " + _decrement + ", "); - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnDistance(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Count = " + _count); + return true; } } /// - /// Controls the odor delivery system parameters. - /// - ///This class manages the olfactory stimulus delivery system, including flow rates, - ///valve timing, and carrier gas configuration. It ensures proper odor concentration - ///and delivery timing for the behavioral task. + /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Controls the odor delivery system parameters.\n\nThis class manages the olfactory s" + - "timulus delivery system, including flow rates,\nvalve timing, and carrier gas con" + - "figuration. It ensures proper odor concentration\nand delivery timing for the beh" + - "avioral task.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + + "\" reward sites.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OdorControl + public partial class PatchTerminatorOnRejection : PatchTerminator { - private double _targetTotalFlow; - - private bool _useChannel3AsCarrier; - - private double _targetOdorFlow; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; - public OdorControl() + public PatchTerminatorOnRejection() { - _targetTotalFlow = 1000D; - _useChannel3AsCarrier = true; - _targetOdorFlow = 100D; + _count = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - protected OdorControl(OdorControl other) + protected PatchTerminatorOnRejection(PatchTerminatorOnRejection other) : + base(other) { - _targetTotalFlow = other._targetTotalFlow; - _useChannel3AsCarrier = other._useChannel3AsCarrier; - _targetOdorFlow = other._targetOdorFlow; + _count = other._count; } /// - /// Target total flow (ml/s) of the odor mixture + /// Number of reward sites the animal must not stop in to terminate the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("target_total_flow")] - [System.ComponentModel.DescriptionAttribute("Target total flow (ml/s) of the odor mixture")] - public double TargetTotalFlow + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("count")] + [System.ComponentModel.DescriptionAttribute("Number of reward sites the animal must not stop in to terminate the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _targetTotalFlow; + return _count; } set { - _targetTotalFlow = value; + _count = value; } } - /// - /// Whether to use channel 3 as carrier - /// - [Newtonsoft.Json.JsonPropertyAttribute("use_channel_3_as_carrier")] - [System.ComponentModel.DescriptionAttribute("Whether to use channel 3 as carrier")] - public bool UseChannel3AsCarrier + public System.IObservable Generate() { - get - { - return _useChannel3AsCarrier; - } - set + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnRejection(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnRejection(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - _useChannel3AsCarrier = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Count = " + _count); + return true; + } + } + + + /// + /// Terminates the patch after "count" rewards. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" rewards.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class PatchTerminatorOnReward : PatchTerminator + { + + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; + + public PatchTerminatorOnReward() + { + _count = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + } + + protected PatchTerminatorOnReward(PatchTerminatorOnReward other) : + base(other) + { + _count = other._count; } /// - /// Target odor flow (ml/s) in the odor mixture + /// Number of rewards the animal must collect to terminate the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("target_odor_flow")] - [System.ComponentModel.DescriptionAttribute("Target odor flow (ml/s) in the odor mixture")] - public double TargetOdorFlow + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("count")] + [System.ComponentModel.DescriptionAttribute("Number of rewards the animal must collect to terminate the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _targetOdorFlow; + return _count; } set { - _targetOdorFlow = value; + _count = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorControl(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new OdorControl(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnReward(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("TargetTotalFlow = " + _targetTotalFlow + ", "); - stringBuilder.Append("UseChannel3AsCarrier = " + _useChannel3AsCarrier + ", "); - stringBuilder.Append("TargetOdorFlow = " + _targetOdorFlow); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnReward(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Count = " + _count); + return true; } } /// - /// Specifies odor delivery parameters for olfactory cues in the VR environment. - /// - ///Odors can be delivered at specific locations to provide additional sensory - ///information for navigation and foraging decisions. + /// Terminates the patch after a "count" seconds. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Specifies odor delivery parameters for olfactory cues in the VR environment.\n\nOdo" + - "rs can be delivered at specific locations to provide additional sensory\ninformat" + - "ion for navigation and foraging decisions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" seconds.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OdorSpecification + public partial class PatchTerminatorOnTime : PatchTerminator { - private int _index; - - private double _concentration; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; - public OdorSpecification() + public PatchTerminatorOnTime() { - _concentration = 1D; } - protected OdorSpecification(OdorSpecification other) + protected PatchTerminatorOnTime(PatchTerminatorOnTime other) : + base(other) { - _index = other._index; - _concentration = other._concentration; + _count = other._count; } /// - /// Index of the odor to be used + /// Number of seconds to wait before terminating the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("index", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Index of the odor to be used")] - public int Index + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of seconds to wait before terminating the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _index; + return _count; } set { - _index = value; + _count = value; } } - /// - /// Concentration of the odor - /// - [Newtonsoft.Json.JsonPropertyAttribute("concentration")] - [System.ComponentModel.DescriptionAttribute("Concentration of the odor")] - public double Concentration + public System.IObservable Generate() { - get - { - return _concentration; - } - set + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnTime(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnTime(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - _concentration = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Count = " + _count); + return true; + } + } + + + /// + /// A patch update function that applies a clamped rate-based update. + /// + ///Update in the form of x = clamp(x + rate * tick_value). + ///This function updates values at a specified rate while keeping results within + ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + ///time, distance, choices). + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] + [JsonInheritanceAttribute("ClampedRateFunction", typeof(ClampedRateFunction))] + [JsonInheritanceAttribute("ClampedMultiplicativeRateFunction", typeof(ClampedMultiplicativeRateFunction))] + [JsonInheritanceAttribute("SetValueFunction", typeof(SetValueFunction))] + [JsonInheritanceAttribute("LookupTableFunction", typeof(LookupTableFunction))] + [JsonInheritanceAttribute("CtcmFunction", typeof(CtcmFunction))] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. + + Update in the form of x = clamp(x + rate * tick_value). + This function updates values at a specified rate while keeping results within + defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + time, distance, choices).")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class PatchUpdateFunction + { + + public PatchUpdateFunction() + { } - public System.IObservable Generate() + protected PatchUpdateFunction(PatchUpdateFunction other) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new OdorSpecification(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchUpdateFunction(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new PatchUpdateFunction(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Index = " + _index + ", "); - stringBuilder.Append("Concentration = " + _concentration); - return true; + return false; } public override string ToString() @@ -6567,132 +6405,134 @@ public override string ToString() /// - /// A calibrated olfactometer device + /// Defines the generation specifications for all virtual site types within a patch. + /// + ///This class contains generators for all the different types of virtual sites + ///that can appear within a patch environment. Each generator defines how sites + ///of that type should be created with their properties and distributions. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A calibrated olfactometer device")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines the generation specifications for all virtual site types within a patch. + + This class contains generators for all the different types of virtual sites + that can appear within a patch environment. Each generator defines how sites + of that type should be created with their properties and distributions.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Olfactometer + public partial class PatchVirtualSitesGenerator { - private string _deviceType; - - private OlfactometerCalibration _calibration; - - private int _whoAmI; + private VirtualSiteGenerator _interSite; - private string _serialNumber; + private VirtualSiteGenerator _interPatch; - private string _portName; + private VirtualSiteGenerator _postPatch; - public Olfactometer() - { - _deviceType = "Olfactometer"; - _calibration = new OlfactometerCalibration(); - _whoAmI = 1140; - } + private VirtualSiteGenerator _rewardSite; - protected Olfactometer(Olfactometer other) + public PatchVirtualSitesGenerator() { - _deviceType = other._deviceType; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _interSite = new VirtualSiteGenerator(); + _interPatch = new VirtualSiteGenerator(); + _rewardSite = new VirtualSiteGenerator(); } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + protected PatchVirtualSitesGenerator(PatchVirtualSitesGenerator other) { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _interSite = other._interSite; + _interPatch = other._interPatch; + _postPatch = other._postPatch; + _rewardSite = other._rewardSite; } + /// + /// Generator of the inter-site virtual sites + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - public OlfactometerCalibration Calibration + [Newtonsoft.Json.JsonPropertyAttribute("inter_site")] + [System.ComponentModel.DescriptionAttribute("Generator of the inter-site virtual sites")] + public VirtualSiteGenerator InterSite { get { - return _calibration; + return _interSite; } set { - _calibration = value; + _interSite = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + /// + /// Generator of the inter-patch virtual sites + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("inter_patch")] + [System.ComponentModel.DescriptionAttribute("Generator of the inter-patch virtual sites")] + public VirtualSiteGenerator InterPatch { get { - return _whoAmI; + return _interPatch; } set { - _whoAmI = value; + _interPatch = value; } } /// - /// Device serial number + /// Generator of the post-patch virtual sites /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("post_patch")] + [System.ComponentModel.DescriptionAttribute("Generator of the post-patch virtual sites")] + public VirtualSiteGenerator PostPatch { get { - return _serialNumber; + return _postPatch; } set { - _serialNumber = value; + _postPatch = value; } } /// - /// Device port name + /// Generator of the reward-site virtual sites /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_site")] + [System.ComponentModel.DescriptionAttribute("Generator of the reward-site virtual sites")] + public VirtualSiteGenerator RewardSite { get { - return _portName; + return _rewardSite; } set { - _portName = value; + _rewardSite = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Olfactometer(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchVirtualSitesGenerator(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Olfactometer(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new PatchVirtualSitesGenerator(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("InterSite = " + _interSite + ", "); + stringBuilder.Append("InterPatch = " + _interPatch + ", "); + stringBuilder.Append("PostPatch = " + _postPatch + ", "); + stringBuilder.Append("RewardSite = " + _rewardSite); return true; } @@ -6712,257 +6552,257 @@ public override string ToString() /// - /// Olfactometer device configuration model + /// A RewardFunction that is always active. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Olfactometer device configuration model")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is always active.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerCalibration + public partial class PersistentRewardFunction : RewardFunction { - private System.DateTimeOffset? _date; + private PatchUpdateFunction _amount; - private System.Collections.Generic.Dictionary _channelConfig; + private PatchUpdateFunction _probability; - public OlfactometerCalibration() + private PatchUpdateFunction _available; + + private PersistentRewardFunctionRule _rule; + + public PersistentRewardFunction() { - _channelConfig = new System.Collections.Generic.Dictionary(); } - protected OlfactometerCalibration(OlfactometerCalibration other) + protected PersistentRewardFunction(PersistentRewardFunction other) : + base(other) { - _date = other._date; - _channelConfig = other._channelConfig; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; } /// - /// Date of the calibration + /// Defines the amount of reward replenished per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the calibration")] - public System.DateTimeOffset? Date + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { get { - return _date; + return _amount; } set { - _date = value; + _amount = value; } } /// - /// Configuration of olfactometer channels + /// Defines the probability of reward replenished per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("channel_config")] - [System.ComponentModel.DescriptionAttribute("Configuration of olfactometer channels")] - public System.Collections.Generic.Dictionary ChannelConfig + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _channelConfig; + return _probability; } set { - _channelConfig = value; + _probability = value; } } - public System.IObservable Generate() + /// + /// Defines the amount of reward available replenished in the patch per rule unit. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibration(this))); + get + { + return _available; + } + set + { + _available = value; + } } - public System.IObservable Generate(System.IObservable source) + [Newtonsoft.Json.JsonPropertyAttribute("rule", Required=Newtonsoft.Json.Required.Always)] + public PersistentRewardFunctionRule Rule { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); + get + { + return _rule; + } + set + { + _rule = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate() { - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("ChannelConfig = " + _channelConfig); - return true; + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PersistentRewardFunction(this))); } - public override string ToString() + public System.IObservable Generate(System.IObservable source) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + return System.Reactive.Linq.Observable.Select(source, _ => new PersistentRewardFunction(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule); + return true; } } /// - /// Harp Olfactometer available channel + /// Controls the position tracking and movement detection parameters. + /// + ///This class manages the position control system including coordinate transformations, + ///initial positioning, signal filtering, and movement detection thresholds for the + ///virtual reality foraging task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum OlfactometerChannel - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Channel0 = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Channel1 = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Channel2 = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Channel3 = 3, - } - + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Controls the position tracking and movement detection parameters. - /// - /// Configuration for a single olfactometer channel - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Configuration for a single olfactometer channel")] + This class manages the position control system including coordinate transformations, + initial positioning, signal filtering, and movement detection thresholds for the + virtual reality foraging task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerChannelConfig + public partial class PositionControl { - private int _channelIndex; - - private OlfactometerChannelType _channelType; - - private OlfactometerChannelConfigFlowRateCapacity _flowRateCapacity; - - private double _flowRate; + private AindBehaviorVrForagingTaskLogicVector3 _gain; - private string _odorant; + private AindBehaviorVrForagingTaskLogicVector3 _initialPosition; - private double? _odorantDilution; + private double _frequencyFilterCutoff; - public OlfactometerChannelConfig() - { - _channelType = AindVrForagingDataSchema.OlfactometerChannelType.Odor; - _flowRateCapacity = AindVrForagingDataSchema.OlfactometerChannelConfigFlowRateCapacity._100; - _flowRate = 100D; - } + private double _velocityThreshold; - protected OlfactometerChannelConfig(OlfactometerChannelConfig other) + public PositionControl() { - _channelIndex = other._channelIndex; - _channelType = other._channelType; - _flowRateCapacity = other._flowRateCapacity; - _flowRate = other._flowRate; - _odorant = other._odorant; - _odorantDilution = other._odorantDilution; + _gain = new AindBehaviorVrForagingTaskLogicVector3(); + _initialPosition = new AindBehaviorVrForagingTaskLogicVector3(); + _frequencyFilterCutoff = 0.5D; + _velocityThreshold = 1D; } - [Newtonsoft.Json.JsonPropertyAttribute("channel_index", Required=Newtonsoft.Json.Required.Always)] - public int ChannelIndex + protected PositionControl(PositionControl other) { - get - { - return _channelIndex; - } - set - { - _channelIndex = value; - } + _gain = other._gain; + _initialPosition = other._initialPosition; + _frequencyFilterCutoff = other._frequencyFilterCutoff; + _velocityThreshold = other._velocityThreshold; } + /// + /// Gain of the position control. + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("channel_type")] - public OlfactometerChannelType ChannelType + [Newtonsoft.Json.JsonPropertyAttribute("gain")] + [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] + public AindBehaviorVrForagingTaskLogicVector3 Gain { get { - return _channelType; + return _gain; } set { - _channelType = value; + _gain = value; } } + /// + /// Gain of the position control. + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("flow_rate_capacity")] - public OlfactometerChannelConfigFlowRateCapacity FlowRateCapacity - { - get - { - return _flowRateCapacity; - } - set - { - _flowRateCapacity = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("flow_rate")] - public double FlowRate + [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] + [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] + public AindBehaviorVrForagingTaskLogicVector3 InitialPosition { get { - return _flowRate; + return _initialPosition; } set { - _flowRate = value; + _initialPosition = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("odorant")] - public string Odorant + /// + /// Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal. + /// + [Newtonsoft.Json.JsonPropertyAttribute("frequency_filter_cutoff")] + [System.ComponentModel.DescriptionAttribute("Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal.")] + public double FrequencyFilterCutoff { get { - return _odorant; + return _frequencyFilterCutoff; } set { - _odorant = value; + _frequencyFilterCutoff = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odorant_dilution")] - public double? OdorantDilution + /// + /// Threshold (cm/s) of the velocity signal used to detect when the animal is moving. + /// + [Newtonsoft.Json.JsonPropertyAttribute("velocity_threshold")] + [System.ComponentModel.DescriptionAttribute("Threshold (cm/s) of the velocity signal used to detect when the animal is moving." + + "")] + public double VelocityThreshold { get { - return _odorantDilution; + return _velocityThreshold; } set { - _odorantDilution = value; + _velocityThreshold = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerChannelConfig(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PositionControl(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerChannelConfig(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new PositionControl(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("ChannelIndex = " + _channelIndex + ", "); - stringBuilder.Append("ChannelType = " + _channelType + ", "); - stringBuilder.Append("FlowRateCapacity = " + _flowRateCapacity + ", "); - stringBuilder.Append("FlowRate = " + _flowRate + ", "); - stringBuilder.Append("Odorant = " + _odorant + ", "); - stringBuilder.Append("OdorantDilution = " + _odorantDilution); + stringBuilder.Append("Gain = " + _gain + ", "); + stringBuilder.Append("InitialPosition = " + _initialPosition + ", "); + stringBuilder.Append("FrequencyFilterCutoff = " + _frequencyFilterCutoff + ", "); + stringBuilder.Append("VelocityThreshold = " + _velocityThreshold); return true; } @@ -6982,275 +6822,248 @@ public override string ToString() /// - /// Olfactometer channel type - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum OlfactometerChannelType - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="Odor")] - Odor = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="Carrier")] - Carrier = 1, - } - - - /// - /// A RewardFunction that is applied when the animal enters the patch. + /// Represents a rectangle defined by its top-left corner, width, and height. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal enters the patch.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a rectangle defined by its top-left corner, width, and height.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OnThisPatchEntryRewardFunction : RewardFunction + public partial class Rect { - private PatchUpdateFunction _amount; + private int _x; - private PatchUpdateFunction _probability; + private int _y; - private PatchUpdateFunction _available; + private int _width; - private string _rule; + private int _height; - public OnThisPatchEntryRewardFunction() + public Rect() { - _rule = "OnThisPatchEntry"; + _x = 0; + _y = 0; + _width = 0; + _height = 0; } - protected OnThisPatchEntryRewardFunction(OnThisPatchEntryRewardFunction other) : - base(other) + protected Rect(Rect other) { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; + _x = other._x; + _y = other._y; + _width = other._width; + _height = other._height; } /// - /// Defines the amount of reward replenished per rule unit. + /// X coordinate of the top-left corner /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] + public int X { get { - return _amount; + return _x; } set { - _amount = value; + _x = value; } } /// - /// Defines the probability of reward replenished per rule unit. + /// Y coordinate of the top-left corner /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the top-left corner")] + public int Y { get { - return _probability; + return _y; } set { - _probability = value; + _y = value; } } /// - /// Defines the amount of reward available replenished in the patch per rule unit. + /// Width of the rectangle /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available + [Newtonsoft.Json.JsonPropertyAttribute("width")] + [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] + public int Width { get { - return _available; + return _width; } set { - _available = value; + _width = value; } } /// - /// Rule to trigger reward function + /// Height of the rectangle /// - [Newtonsoft.Json.JsonPropertyAttribute("rule")] - [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] - public string Rule + [Newtonsoft.Json.JsonPropertyAttribute("height")] + [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] + public int Height { get { - return _rule; + return _height; } set { - _rule = value; + _height = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OnThisPatchEntryRewardFunction(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OnThisPatchEntryRewardFunction(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - if (base.PrintMembers(stringBuilder)) + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Width = " + _width + ", "); + stringBuilder.Append("Height = " + _height); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Defines operant conditioning logic for reward delivery in the VR foraging task. + /// Defines visual rendering properties for virtual environment elements. /// - ///This class controls when and how rewards are delivered based on animal behavior, - ///implementing stopping requirements, collection timeouts, and spatial constraints. + ///This class controls the visual appearance of virtual sites, including + ///contrast and other visual parameters that affect how elements are rendered + ///in the VR environment. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines operant conditioning logic for reward delivery in the VR foraging task.\n\n" + - "This class controls when and how rewards are delivered based on animal behavior," + - "\nimplementing stopping requirements, collection timeouts, and spatial constraint" + - "s.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines visual rendering properties for virtual environment elements.\n\nThis class" + + " controls the visual appearance of virtual sites, including\ncontrast and other v" + + "isual parameters that affect how elements are rendered\nin the VR environment.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OperantLogic + public partial class RenderSpecification { - private bool _isOperant; - - private Distribution _stopDuration; - - private double _timeToCollectReward; - - private double _graceDistanceThreshold; + private double? _contrast; - public OperantLogic() + public RenderSpecification() { - _isOperant = true; - _stopDuration = new Distribution(); - _timeToCollectReward = 100000D; - _graceDistanceThreshold = 10D; } - protected OperantLogic(OperantLogic other) + protected RenderSpecification(RenderSpecification other) { - _isOperant = other._isOperant; - _stopDuration = other._stopDuration; - _timeToCollectReward = other._timeToCollectReward; - _graceDistanceThreshold = other._graceDistanceThreshold; + _contrast = other._contrast; } /// - /// Will the trial implement operant logic + /// Contrast of the texture /// - [Newtonsoft.Json.JsonPropertyAttribute("is_operant")] - [System.ComponentModel.DescriptionAttribute("Will the trial implement operant logic")] - public bool IsOperant + [Newtonsoft.Json.JsonPropertyAttribute("contrast")] + [System.ComponentModel.DescriptionAttribute("Contrast of the texture")] + public double? Contrast { get { - return _isOperant; + return _contrast; } set { - _isOperant = value; + _contrast = value; } } - /// - /// Duration (s) the animal must stop for to lock its choice - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("stop_duration")] - [System.ComponentModel.DescriptionAttribute("Duration (s) the animal must stop for to lock its choice")] - public Distribution StopDuration + public System.IObservable Generate() { - get - { - return _stopDuration; - } - set - { - _stopDuration = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RenderSpecification(this))); } - /// - /// Time(s) the animal has to collect the reward - /// - [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_reward")] - [System.ComponentModel.DescriptionAttribute("Time(s) the animal has to collect the reward")] - public double TimeToCollectReward + public System.IObservable Generate(System.IObservable source) { - get - { - return _timeToCollectReward; - } - set - { - _timeToCollectReward = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new RenderSpecification(this)); } - /// - /// Virtual distance (cm) the animal must be within to not abort the current choice - /// - [Newtonsoft.Json.JsonPropertyAttribute("grace_distance_threshold")] - [System.ComponentModel.DescriptionAttribute("Virtual distance (cm) the animal must be within to not abort the current choice")] - public double GraceDistanceThreshold + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _graceDistanceThreshold; - } - set + stringBuilder.Append("Contrast = " + _contrast); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _graceDistanceThreshold = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] + [JsonInheritanceAttribute("PatchRewardFunction", typeof(PatchRewardFunction))] + [JsonInheritanceAttribute("OnThisPatchEntryRewardFunction", typeof(OnThisPatchEntryRewardFunction))] + [JsonInheritanceAttribute("OutsideRewardFunction", typeof(OutsideRewardFunction))] + [JsonInheritanceAttribute("PersistentRewardFunction", typeof(PersistentRewardFunction))] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class RewardFunction + { - public System.IObservable Generate() + public RewardFunction() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperantLogic(this))); } - public System.IObservable Generate(System.IObservable source) + protected RewardFunction(RewardFunction other) { - return System.Reactive.Linq.Observable.Select(source, _ => new OperantLogic(this)); + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardFunction(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RewardFunction(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("IsOperant = " + _isOperant + ", "); - stringBuilder.Append("StopDuration = " + _stopDuration + ", "); - stringBuilder.Append("TimeToCollectReward = " + _timeToCollectReward + ", "); - stringBuilder.Append("GraceDistanceThreshold = " + _graceDistanceThreshold); - return true; + return false; } public override string ToString() @@ -7269,135 +7082,180 @@ public override string ToString() /// - /// Master control class for all operational hardware systems. + /// Specifies reward parameters and behavior for a patch. /// - ///This class aggregates all the hardware control specifications including - ///movable spout, odor delivery, position tracking, and audio systems. - ///It provides a centralized configuration point for all task hardware. + ///This class defines all aspects of reward delivery including amounts, probabilities, + ///delays, operant logic, and dynamic update functions. It serves as the complete + ///specification for how rewards are managed in a given Patch. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Master control class for all operational hardware systems. + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Specifies reward parameters and behavior for a patch. - This class aggregates all the hardware control specifications including - movable spout, odor delivery, position tracking, and audio systems. - It provides a centralized configuration point for all task hardware.")] + This class defines all aspects of reward delivery including amounts, probabilities, + delays, operant logic, and dynamic update functions. It serves as the complete + specification for how rewards are managed in a given Patch.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OperationControl + public partial class RewardSpecification { - private MovableSpoutControl _movableSpoutControl; + private OperantLogic _operantLogic; - private OdorControl _odorControl; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _delay; - private PositionControl _positionControl; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _amount; - private AudioControl _audioControl; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _probability; - public OperationControl() + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _available; + + private System.Collections.Generic.List _rewardFunction; + + public RewardSpecification() { - _movableSpoutControl = new MovableSpoutControl(); - _odorControl = new OdorControl(); - _positionControl = new PositionControl(); - _audioControl = new AudioControl(); + _delay = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _amount = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _probability = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _available = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _rewardFunction = new System.Collections.Generic.List(); } - protected OperationControl(OperationControl other) + protected RewardSpecification(RewardSpecification other) { - _movableSpoutControl = other._movableSpoutControl; - _odorControl = other._odorControl; - _positionControl = other._positionControl; - _audioControl = other._audioControl; + _operantLogic = other._operantLogic; + _delay = other._delay; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rewardFunction = other._rewardFunction; } /// - /// Control of the movable spout + /// The optional operant logic of the reward /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("movable_spout_control")] - [System.ComponentModel.DescriptionAttribute("Control of the movable spout")] - public MovableSpoutControl MovableSpoutControl + [Newtonsoft.Json.JsonPropertyAttribute("operant_logic")] + [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] + public OperantLogic OperantLogic { get { - return _movableSpoutControl; + return _operantLogic; } set { - _movableSpoutControl = value; + _operantLogic = value; } } /// - /// Control of the odor + /// The optional distribution where the delay to reward will be drawn from /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_control")] - [System.ComponentModel.DescriptionAttribute("Control of the odor")] - public OdorControl OdorControl + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Delay { get { - return _odorControl; + return _delay; } set { - _odorControl = value; + _delay = value; } } /// - /// Control of the position + /// Initial amount of reward in microliters /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("position_control")] - [System.ComponentModel.DescriptionAttribute("Control of the position")] - public PositionControl PositionControl + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Initial amount of reward in microliters")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Amount { get { - return _positionControl; + return _amount; } set { - _positionControl = value; + _amount = value; } } /// - /// Control of the audio + /// Initial probability of reward delivery /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("audio_control")] - [System.ComponentModel.DescriptionAttribute("Control of the audio")] - public AudioControl AudioControl + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Initial probability of reward delivery")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Probability { get { - return _audioControl; + return _probability; } set { - _audioControl = value; + _probability = value; } } - public System.IObservable Generate() + /// + /// Initial amount of reward available in the patch in microliters + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Initial amount of reward available in the patch in microliters")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Available { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperationControl(this))); + get + { + return _available; + } + set + { + _available = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Reward function of the patch + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_function")] + [System.ComponentModel.DescriptionAttribute("Reward function of the patch")] + public System.Collections.Generic.List RewardFunction { - return System.Reactive.Linq.Observable.Select(source, _ => new OperationControl(this)); + get + { + return _rewardFunction; + } + set + { + _rewardFunction = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardSpecification(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RewardSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("MovableSpoutControl = " + _movableSpoutControl + ", "); - stringBuilder.Append("OdorControl = " + _odorControl + ", "); - stringBuilder.Append("PositionControl = " + _positionControl + ", "); - stringBuilder.Append("AudioControl = " + _audioControl); + stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); + stringBuilder.Append("Delay = " + _delay + ", "); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("RewardFunction = " + _rewardFunction); return true; } @@ -7417,321 +7275,280 @@ public override string ToString() /// - /// A RewardFunction that is applied when the animal is outside of the patch. + /// Container class for calibration models. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is outside of the patch.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Container class for calibration models.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OutsideRewardFunction : RewardFunction + public partial class RigCalibration { - private PatchUpdateFunction _amount; - - private PatchUpdateFunction _probability; - - private PatchUpdateFunction _available; - - private OutsideRewardFunctionRule _rule; - - private double _delay; - - public OutsideRewardFunction() - { - _rule = AindVrForagingDataSchema.OutsideRewardFunctionRule.OnTime; - _delay = 0D; - } - - protected OutsideRewardFunction(OutsideRewardFunction other) : - base(other) - { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; - _delay = other._delay; - } - - /// - /// Defines the amount of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount - { - get - { - return _amount; - } - set - { - _amount = value; - } - } + private WaterValveCalibration _waterValve; - /// - /// Defines the probability of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability + public RigCalibration() { - get - { - return _probability; - } - set - { - _probability = value; - } + _waterValve = new WaterValveCalibration(); } - /// - /// Defines the amount of reward available replenished in the patch per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available + protected RigCalibration(RigCalibration other) { - get - { - return _available; - } - set - { - _available = value; - } + _waterValve = other._waterValve; } /// - /// Rule to trigger reward function + /// Water valve calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rule")] - [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] - public OutsideRewardFunctionRule Rule + [Newtonsoft.Json.JsonPropertyAttribute("water_valve", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Water valve calibration")] + public WaterValveCalibration WaterValve { get { - return _rule; + return _waterValve; } set { - _rule = value; + _waterValve = value; } } - /// - /// Delay (s) before the replenishment starts after the rule is triggered. - /// - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("Delay (s) before the replenishment starts after the rule is triggered.")] - public double Delay + public System.IObservable Generate() { - get - { - return _delay; - } - set - { - _delay = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OutsideRewardFunction(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new OutsideRewardFunction(this)); + stringBuilder.Append("WaterValve = " + _waterValve); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule + ", "); - stringBuilder.Append("Delay = " + _delay); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Represents statistics for a patch in the VR foraging task. + /// Represents a screen assembly (left, center and right screens) and respective configuration. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents statistics for a patch in the VR foraging task.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a screen assembly (left, center and right screens) and respective conf" + + "iguration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Patch + public partial class ScreenAssembly { - private string _label; + private string _deviceType; - private int _stateIndex; + private ScreenAssemblyCalibration _calibration; - private OdorSpecification _odorSpecification; + private int _displayIndex; - private RewardSpecification _rewardSpecification; + private double _targetRenderFrequency; - private PatchVirtualSitesGenerator _patchVirtualSitesGenerator; + private double _targetUpdateFrequency; - private System.Collections.Generic.List _patchTerminators; + private string _textureAssetsDirectory; - public Patch() + private double _brightness; + + private double _contrast; + + public ScreenAssembly() { - _label = ""; - _stateIndex = 0; - _rewardSpecification = new RewardSpecification(); - _patchVirtualSitesGenerator = new PatchVirtualSitesGenerator(); - _patchTerminators = new System.Collections.Generic.List(); + _deviceType = "ScreenAssembly"; + _calibration = new ScreenAssemblyCalibration(); + _displayIndex = 1; + _targetRenderFrequency = 60D; + _targetUpdateFrequency = 120D; + _textureAssetsDirectory = "Textures"; + _brightness = 0D; + _contrast = 1D; } - protected Patch(Patch other) + protected ScreenAssembly(ScreenAssembly other) { - _label = other._label; - _stateIndex = other._stateIndex; - _odorSpecification = other._odorSpecification; - _rewardSpecification = other._rewardSpecification; - _patchVirtualSitesGenerator = other._patchVirtualSitesGenerator; - _patchTerminators = other._patchTerminators; + _deviceType = other._deviceType; + _calibration = other._calibration; + _displayIndex = other._displayIndex; + _targetRenderFrequency = other._targetRenderFrequency; + _targetUpdateFrequency = other._targetUpdateFrequency; + _textureAssetsDirectory = other._textureAssetsDirectory; + _brightness = other._brightness; + _contrast = other._contrast; + } + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } /// - /// Label of the patch + /// Screen assembly calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("label")] - [System.ComponentModel.DescriptionAttribute("Label of the patch")] - public string Label + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Screen assembly calibration")] + public ScreenAssemblyCalibration Calibration { get { - return _label; + return _calibration; } set { - _label = value; + _calibration = value; } } /// - /// Index of the state + /// Display index /// - [Newtonsoft.Json.JsonPropertyAttribute("state_index")] - [System.ComponentModel.DescriptionAttribute("Index of the state")] - public int StateIndex + [Newtonsoft.Json.JsonPropertyAttribute("display_index")] + [System.ComponentModel.DescriptionAttribute("Display index")] + public int DisplayIndex { get { - return _stateIndex; + return _displayIndex; } set { - _stateIndex = value; + _displayIndex = value; } } /// - /// The optional odor specification of the patch + /// Target render frequency /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] - [System.ComponentModel.DescriptionAttribute("The optional odor specification of the patch")] - public OdorSpecification OdorSpecification + [Newtonsoft.Json.JsonPropertyAttribute("target_render_frequency")] + [System.ComponentModel.DescriptionAttribute("Target render frequency")] + public double TargetRenderFrequency { get { - return _odorSpecification; + return _targetRenderFrequency; } set { - _odorSpecification = value; + _targetRenderFrequency = value; } } /// - /// The optional reward specification of the patch + /// Target update frequency /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] - [System.ComponentModel.DescriptionAttribute("The optional reward specification of the patch")] - public RewardSpecification RewardSpecification + [Newtonsoft.Json.JsonPropertyAttribute("target_update_frequency")] + [System.ComponentModel.DescriptionAttribute("Target update frequency")] + public double TargetUpdateFrequency { get { - return _rewardSpecification; + return _targetUpdateFrequency; } set { - _rewardSpecification = value; + _targetUpdateFrequency = value; } } /// - /// Virtual site generation specification + /// Calibration directory /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("patch_virtual_sites_generator")] - [System.ComponentModel.DescriptionAttribute("Virtual site generation specification")] - public PatchVirtualSitesGenerator PatchVirtualSitesGenerator + [Newtonsoft.Json.JsonPropertyAttribute("texture_assets_directory")] + [System.ComponentModel.DescriptionAttribute("Calibration directory")] + public string TextureAssetsDirectory { get { - return _patchVirtualSitesGenerator; + return _textureAssetsDirectory; } set { - _patchVirtualSitesGenerator = value; + _textureAssetsDirectory = value; } } /// - /// The optional termination specification of the patch + /// Brightness /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("patch_terminators")] - [System.ComponentModel.DescriptionAttribute("The optional termination specification of the patch")] - public System.Collections.Generic.List PatchTerminators + [Newtonsoft.Json.JsonPropertyAttribute("brightness")] + [System.ComponentModel.DescriptionAttribute("Brightness")] + public double Brightness { get { - return _patchTerminators; + return _brightness; } set { - _patchTerminators = value; + _brightness = value; } } - public System.IObservable Generate() + /// + /// Contrast + /// + [Newtonsoft.Json.JsonPropertyAttribute("contrast")] + [System.ComponentModel.DescriptionAttribute("Contrast")] + public double Contrast { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Patch(this))); + get + { + return _contrast; + } + set + { + _contrast = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new Patch(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScreenAssembly(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssembly(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("StateIndex = " + _stateIndex + ", "); - stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); - stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); - stringBuilder.Append("PatchVirtualSitesGenerator = " + _patchVirtualSitesGenerator + ", "); - stringBuilder.Append("PatchTerminators = " + _patchTerminators); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("DisplayIndex = " + _displayIndex + ", "); + stringBuilder.Append("TargetRenderFrequency = " + _targetRenderFrequency + ", "); + stringBuilder.Append("TargetUpdateFrequency = " + _targetUpdateFrequency + ", "); + stringBuilder.Append("TextureAssetsDirectory = " + _textureAssetsDirectory + ", "); + stringBuilder.Append("Brightness = " + _brightness + ", "); + stringBuilder.Append("Contrast = " + _contrast); return true; } @@ -7751,174 +7568,105 @@ public override string ToString() /// - /// A RewardFunction that is applied when the animal is inside the patch. - ///For the purposes of this function post-patch and inter-patch are excluded. + /// Represents the calibration parameters for a screen assembly with three displays. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is inside the patch.\nFor the pur" + - "poses of this function post-patch and inter-patch are excluded.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters for a screen assembly with three displays.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchRewardFunction : RewardFunction + public partial class ScreenAssemblyCalibration { - private PatchUpdateFunction _amount; - - private PatchUpdateFunction _probability; + private DisplayCalibration _left; - private PatchUpdateFunction _available; + private DisplayCalibration _center; - private PatchRewardFunctionRule _rule; + private DisplayCalibration _right; - public PatchRewardFunction() + public ScreenAssemblyCalibration() { - _rule = AindVrForagingDataSchema.PatchRewardFunctionRule.OnReward; + _left = new DisplayCalibration(); + _center = new DisplayCalibration(); + _right = new DisplayCalibration(); } - protected PatchRewardFunction(PatchRewardFunction other) : - base(other) + protected ScreenAssemblyCalibration(ScreenAssemblyCalibration other) { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; + _left = other._left; + _center = other._center; + _right = other._right; } /// - /// Defines the amount of reward replenished per rule unit. + /// Left display calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount + [Newtonsoft.Json.JsonPropertyAttribute("left")] + [System.ComponentModel.DescriptionAttribute("Left display calibration")] + public DisplayCalibration Left { get { - return _amount; + return _left; } set { - _amount = value; + _left = value; } } /// - /// Defines the probability of reward replenished per rule unit. + /// Center display calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability + [Newtonsoft.Json.JsonPropertyAttribute("center")] + [System.ComponentModel.DescriptionAttribute("Center display calibration")] + public DisplayCalibration Center { get { - return _probability; + return _center; } set { - _probability = value; + _center = value; } } /// - /// Defines the amount of reward available replenished in the patch per rule unit. + /// Right display calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available + [Newtonsoft.Json.JsonPropertyAttribute("right")] + [System.ComponentModel.DescriptionAttribute("Right display calibration")] + public DisplayCalibration Right { get { - return _available; + return _right; } set { - _available = value; + _right = value; } } - /// - /// Rule to trigger reward function - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rule")] - [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] - public PatchRewardFunctionRule Rule + public System.IObservable Generate() { - get - { - return _rule; - } - set - { - _rule = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchRewardFunction(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchRewardFunction(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule); - return true; - } - } - - - /// - /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "terminator_type")] - [JsonInheritanceAttribute("OnRejection", typeof(PatchTerminatorOnRejection))] - [JsonInheritanceAttribute("OnChoice", typeof(PatchTerminatorOnChoice))] - [JsonInheritanceAttribute("OnReward", typeof(PatchTerminatorOnReward))] - [JsonInheritanceAttribute("OnTime", typeof(PatchTerminatorOnTime))] - [JsonInheritanceAttribute("OnDistance", typeof(PatchTerminatorOnDistance))] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + - "\" reward sites.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminator - { - - public PatchTerminator() - { - } - - protected PatchTerminator(PatchTerminator other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminator(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScreenAssemblyCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminator(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssemblyCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("Left = " + _left + ", "); + stringBuilder.Append("Center = " + _center + ", "); + stringBuilder.Append("Right = " + _right); + return true; } public override string ToString() @@ -7936,306 +7684,355 @@ public override string ToString() } - /// - /// Terminates the patch after "count" choices. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" choices.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnChoice : PatchTerminator + public partial class Session { - private Distribution _count; + private string _aindBehaviorServicesPkgVersion; + + private string _version; - public PatchTerminatorOnChoice() + private string _experiment; + + private System.Collections.Generic.List _experimenter; + + private System.DateTimeOffset _date; + + private string _sessionName; + + private string _subject; + + private string _notes; + + private string _commitHash; + + private bool _allowDirtyRepo; + + private bool _skipHardwareValidation; + + public Session() { - _count = new Distribution(); + _aindBehaviorServicesPkgVersion = "0.13.5"; + _version = "0.13.5"; + _experimenter = new System.Collections.Generic.List(); + _allowDirtyRepo = false; + _skipHardwareValidation = false; } - protected PatchTerminatorOnChoice(PatchTerminatorOnChoice other) : - base(other) + protected Session(Session other) { - _count = other._count; + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _experiment = other._experiment; + _experimenter = other._experimenter; + _date = other._date; + _sessionName = other._sessionName; + _subject = other._subject; + _notes = other._notes; + _commitHash = other._commitHash; + _allowDirtyRepo = other._allowDirtyRepo; + _skipHardwareValidation = other._skipHardwareValidation; } - /// - /// Number of choices the animal must make to terminate the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count")] - [System.ComponentModel.DescriptionAttribute("Number of choices the animal must make to terminate the patch")] - public Distribution Count + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion { get { - return _count; + return _aindBehaviorServicesPkgVersion; } set { - _count = value; + _aindBehaviorServicesPkgVersion = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnChoice(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnChoice(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _version; + } + set + { + _version = value; } - stringBuilder.Append("Count = " + _count); - return true; - } - } - - - /// - /// Terminates the patch after a "count" distance. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" distance.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnDistance : PatchTerminator - { - - private Distribution _count; - - public PatchTerminatorOnDistance() - { - } - - protected PatchTerminatorOnDistance(PatchTerminatorOnDistance other) : - base(other) - { - _count = other._count; } /// - /// Number of distance units to wait before terminating the patch + /// Name of the experiment /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of distance units to wait before terminating the patch")] - public Distribution Count + [Newtonsoft.Json.JsonPropertyAttribute("experiment")] + [System.ComponentModel.DescriptionAttribute("Name of the experiment")] + public string Experiment { get { - return _count; + return _experiment; } set { - _count = value; + _experiment = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnDistance(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnDistance(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Name of the experimenter + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] + [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] + public System.Collections.Generic.List Experimenter { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _experimenter; + } + set + { + _experimenter = value; } - stringBuilder.Append("Count = " + _count); - return true; - } - } - - - /// - /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + - "\" reward sites.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnRejection : PatchTerminator - { - - private Distribution _count; - - public PatchTerminatorOnRejection() - { - _count = new Distribution(); - } - - protected PatchTerminatorOnRejection(PatchTerminatorOnRejection other) : - base(other) - { - _count = other._count; } /// - /// Number of reward sites the animal must not stop in to terminate the patch + /// Date of the experiment /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count")] - [System.ComponentModel.DescriptionAttribute("Number of reward sites the animal must not stop in to terminate the patch")] - public Distribution Count + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the experiment")] + public System.DateTimeOffset Date { get { - return _count; + return _date; } set { - _count = value; + _date = value; } } - public System.IObservable Generate() + [Newtonsoft.Json.JsonIgnoreAttribute()] + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Xml.Serialization.XmlElementAttribute("Date")] + public string DateXml { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnRejection(this))); + get + { + return _date.ToString("o"); + } + set + { + _date = System.DateTimeOffset.Parse(value); + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. + /// + [Newtonsoft.Json.JsonPropertyAttribute("session_name")] + [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + + "t provided, it will be generated using subject and date.")] + public string SessionName { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnRejection(this)); + get + { + return _sessionName; + } + set + { + _sessionName = value; + } } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Name of the subject + /// + [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Name of the subject")] + public string Subject { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _subject; + } + set + { + _subject = value; } - stringBuilder.Append("Count = " + _count); - return true; } - } - - - /// - /// Terminates the patch after "count" rewards. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" rewards.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnReward : PatchTerminator - { - private Distribution _count; + /// + /// Notes about the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("notes")] + [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] + public string Notes + { + get + { + return _notes; + } + set + { + _notes = value; + } + } - public PatchTerminatorOnReward() + /// + /// Commit hash of the repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] + [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] + public string CommitHash { - _count = new Distribution(); + get + { + return _commitHash; + } + set + { + _commitHash = value; + } } - protected PatchTerminatorOnReward(PatchTerminatorOnReward other) : - base(other) + /// + /// Allow running from a dirty repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] + [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] + public bool AllowDirtyRepo { - _count = other._count; + get + { + return _allowDirtyRepo; + } + set + { + _allowDirtyRepo = value; + } } /// - /// Number of rewards the animal must collect to terminate the patch + /// Skip hardware validation /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count")] - [System.ComponentModel.DescriptionAttribute("Number of rewards the animal must collect to terminate the patch")] - public Distribution Count + [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] + [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] + public bool SkipHardwareValidation { get { - return _count; + return _skipHardwareValidation; } set { - _count = value; + _skipHardwareValidation = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnReward(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Session(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnReward(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Session(this)); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - if (base.PrintMembers(stringBuilder)) + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("Experiment = " + _experiment + ", "); + stringBuilder.Append("Experimenter = " + _experimenter + ", "); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("SessionName = " + _sessionName + ", "); + stringBuilder.Append("Subject = " + _subject + ", "); + stringBuilder.Append("Notes = " + _notes + ", "); + stringBuilder.Append("CommitHash = " + _commitHash + ", "); + stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); + stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("Count = " + _count); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Terminates the patch after a "count" seconds. + /// A patch update function that sets the target to a specific value. + /// + ///Update in the form of x = value. + ///This function directly sets the target parameter to a value drawn from the + ///specified distribution, ignoring the current value. Useful for resetting + ///parameters or applying discrete changes. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" seconds.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that sets the target to a specific value. + + Update in the form of x = value. + This function directly sets the target parameter to a value drawn from the + specified distribution, ignoring the current value. Useful for resetting + parameters or applying discrete changes.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnTime : PatchTerminator + public partial class SetValueFunction : PatchUpdateFunction { - private Distribution _count; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; - public PatchTerminatorOnTime() + public SetValueFunction() { } - protected PatchTerminatorOnTime(PatchTerminatorOnTime other) : + protected SetValueFunction(SetValueFunction other) : base(other) { - _count = other._count; + _value = other._value; } /// - /// Number of seconds to wait before terminating the patch + /// Sets the value of the target to this value. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of seconds to wait before terminating the patch")] - public Distribution Count + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Sets the value of the target to this value.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _count; + return _value; } set { - _count = value; + _value = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnTime(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SetValueFunction(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnTime(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new SetValueFunction(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -8244,62 +8041,94 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("Count = " + _count); + stringBuilder.Append("Value = " + _value); return true; } } /// - /// A patch update function that applies a clamped rate-based update. + /// Represents 2D dimensions with width and height. /// - ///Update in the form of x = clamp(x + rate * tick_value). - ///This function updates values at a specified rate while keeping results within - ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - ///time, distance, choices). + ///Used for defining texture sizes, corridor dimensions, and other 2D measurements + ///in the VR foraging environment. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] - [JsonInheritanceAttribute("ClampedRateFunction", typeof(ClampedRateFunction))] - [JsonInheritanceAttribute("ClampedMultiplicativeRateFunction", typeof(ClampedMultiplicativeRateFunction))] - [JsonInheritanceAttribute("SetValueFunction", typeof(SetValueFunction))] - [JsonInheritanceAttribute("LookupTableFunction", typeof(LookupTableFunction))] - [JsonInheritanceAttribute("CtcmFunction", typeof(CtcmFunction))] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. - - Update in the form of x = clamp(x + rate * tick_value). - This function updates values at a specified rate while keeping results within - defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - time, distance, choices).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents 2D dimensions with width and height.\n\nUsed for defining texture sizes," + + " corridor dimensions, and other 2D measurements\nin the VR foraging environment.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchUpdateFunction + public partial class Size { - public PatchUpdateFunction() + private double _width; + + private double _height; + + public Size() { + _width = 0D; + _height = 0D; } - protected PatchUpdateFunction(PatchUpdateFunction other) + protected Size(Size other) { + _width = other._width; + _height = other._height; } - public System.IObservable Generate() + /// + /// Width of the texture + /// + [Newtonsoft.Json.JsonPropertyAttribute("width")] + [System.ComponentModel.DescriptionAttribute("Width of the texture")] + public double Width { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchUpdateFunction(this))); + get + { + return _width; + } + set + { + _width = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Height of the texture + /// + [Newtonsoft.Json.JsonPropertyAttribute("height")] + [System.ComponentModel.DescriptionAttribute("Height of the texture")] + public double Height { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchUpdateFunction(this)); + get + { + return _height; + } + set + { + _height = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate() { - return false; + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Size(this))); } - public override string ToString() + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Size(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Width = " + _width + ", "); + stringBuilder.Append("Height = " + _height); + return true; + } + + public override string ToString() { System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); stringBuilder.Append(GetType().Name); @@ -8315,363 +8144,294 @@ public override string ToString() /// - /// Defines the generation specifications for all virtual site types within a patch. - /// - ///This class contains generators for all the different types of virtual sites - ///that can appear within a patch environment. Each generator defines how sites - ///of that type should be created with their properties and distributions. + /// Spinnaker camera device configuration. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines the generation specifications for all virtual site types within a patch. - - This class contains generators for all the different types of virtual sites - that can appear within a patch environment. Each generator defines how sites - of that type should be created with their properties and distributions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Spinnaker camera device configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchVirtualSitesGenerator + public partial class SpinnakerCamera { - private VirtualSiteGenerator _interSite; + private string _deviceType; - private VirtualSiteGenerator _interPatch; + private BaseModel _calibration; - private VirtualSiteGenerator _postPatch; + private string _serialNumber; - private VirtualSiteGenerator _rewardSite; + private int _binning; - public PatchVirtualSitesGenerator() + private SpinnakerCameraColorProcessing _colorProcessing; + + private int _exposure; + + private double _gain; + + private double? _gamma; + + private SpinnakerCameraAdcBitDepth? _adcBitDepth; + + private SpinnakerCameraPixelFormat? _pixelFormat; + + private Rect _regionOfInterest; + + private VideoWriter _videoWriter; + + public SpinnakerCamera() { - _interSite = new VirtualSiteGenerator(); - _interPatch = new VirtualSiteGenerator(); - _rewardSite = new VirtualSiteGenerator(); + _deviceType = "SpinnakerCamera"; + _binning = 1; + _colorProcessing = SpinnakerCameraColorProcessing.Default; + _exposure = 1000; + _gain = 0D; + _adcBitDepth = SpinnakerCameraAdcBitDepth.Adc8bit; + _pixelFormat = SpinnakerCameraPixelFormat.Mono8; + _regionOfInterest = new Rect(); } - protected PatchVirtualSitesGenerator(PatchVirtualSitesGenerator other) + protected SpinnakerCamera(SpinnakerCamera other) { - _interSite = other._interSite; - _interPatch = other._interPatch; - _postPatch = other._postPatch; - _rewardSite = other._rewardSite; + _deviceType = other._deviceType; + _calibration = other._calibration; + _serialNumber = other._serialNumber; + _binning = other._binning; + _colorProcessing = other._colorProcessing; + _exposure = other._exposure; + _gain = other._gain; + _gamma = other._gamma; + _adcBitDepth = other._adcBitDepth; + _pixelFormat = other._pixelFormat; + _regionOfInterest = other._regionOfInterest; + _videoWriter = other._videoWriter; } - /// - /// Generator of the inter-site virtual sites - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("inter_site")] - [System.ComponentModel.DescriptionAttribute("Generator of the inter-site virtual sites")] - public VirtualSiteGenerator InterSite + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _interSite; + return _deviceType; } set { - _interSite = value; + _deviceType = value; } } /// - /// Generator of the inter-patch virtual sites + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("inter_patch")] - [System.ComponentModel.DescriptionAttribute("Generator of the inter-patch virtual sites")] - public VirtualSiteGenerator InterPatch + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _interPatch; + return _calibration; } set { - _interPatch = value; + _calibration = value; } } /// - /// Generator of the post-patch virtual sites + /// Camera serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("post_patch")] - [System.ComponentModel.DescriptionAttribute("Generator of the post-patch virtual sites")] - public VirtualSiteGenerator PostPatch + [Newtonsoft.Json.JsonPropertyAttribute("serial_number", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Camera serial number")] + public string SerialNumber { get { - return _postPatch; + return _serialNumber; } set { - _postPatch = value; + _serialNumber = value; } } /// - /// Generator of the reward-site virtual sites + /// Binning /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_site")] - [System.ComponentModel.DescriptionAttribute("Generator of the reward-site virtual sites")] - public VirtualSiteGenerator RewardSite + [Newtonsoft.Json.JsonPropertyAttribute("binning")] + [System.ComponentModel.DescriptionAttribute("Binning")] + public int Binning { get { - return _rewardSite; + return _binning; } set { - _rewardSite = value; + _binning = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchVirtualSitesGenerator(this))); - } - - public System.IObservable Generate(System.IObservable source) + /// + /// Color processing + /// + [Newtonsoft.Json.JsonPropertyAttribute("color_processing")] + [System.ComponentModel.DescriptionAttribute("Color processing")] + public SpinnakerCameraColorProcessing ColorProcessing { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchVirtualSitesGenerator(this)); + get + { + return _colorProcessing; + } + set + { + _colorProcessing = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Exposure time + /// + [Newtonsoft.Json.JsonPropertyAttribute("exposure")] + [System.ComponentModel.DescriptionAttribute("Exposure time")] + public int Exposure { - stringBuilder.Append("InterSite = " + _interSite + ", "); - stringBuilder.Append("InterPatch = " + _interPatch + ", "); - stringBuilder.Append("PostPatch = " + _postPatch + ", "); - stringBuilder.Append("RewardSite = " + _rewardSite); - return true; + get + { + return _exposure; + } + set + { + _exposure = value; + } } - public override string ToString() + /// + /// Gain + /// + [Newtonsoft.Json.JsonPropertyAttribute("gain")] + [System.ComponentModel.DescriptionAttribute("Gain")] + public double Gain { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _gain; + } + set + { + _gain = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - /// - /// A custom probability density function distribution. - /// - ///Allows defining arbitrary discrete distributions by specifying - ///probability values and their corresponding indices. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A custom probability density function distribution.\n\nAllows defining arbitrary di" + - "screte distributions by specifying\nprobability values and their corresponding in" + - "dices.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PdfDistribution : Distribution - { - private PdfDistributionParameters _distributionParameters; - - private TruncationParameters _truncationParameters; - - private ScalingParameters _scalingParameters; - - public PdfDistribution() + /// + /// Gamma. If None, will disable gamma correction. + /// + [Newtonsoft.Json.JsonPropertyAttribute("gamma")] + [System.ComponentModel.DescriptionAttribute("Gamma. If None, will disable gamma correction.")] + public double? Gamma { - _distributionParameters = new PdfDistributionParameters(); + get + { + return _gamma; + } + set + { + _gamma = value; + } } - protected PdfDistribution(PdfDistribution other) : - base(other) + /// + /// ADC bit depth. If None will be left as default. + /// + [Newtonsoft.Json.JsonPropertyAttribute("adc_bit_depth")] + [System.ComponentModel.DescriptionAttribute("ADC bit depth. If None will be left as default.")] + public SpinnakerCameraAdcBitDepth? AdcBitDepth { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + get + { + return _adcBitDepth; + } + set + { + _adcBitDepth = value; + } } /// - /// Parameters of the distribution + /// Pixel format. If None will be left as default. /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public PdfDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("pixel_format")] + [System.ComponentModel.DescriptionAttribute("Pixel format. If None will be left as default.")] + public SpinnakerCameraPixelFormat? PixelFormat { get { - return _distributionParameters; + return _pixelFormat; } set { - _distributionParameters = value; + _pixelFormat = value; } } /// - /// Truncation parameters of the distribution + /// Region of interest /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("region_of_interest")] + [System.ComponentModel.DescriptionAttribute("Region of interest")] + public Rect RegionOfInterest { get { - return _truncationParameters; + return _regionOfInterest; } set { - _truncationParameters = value; + _regionOfInterest = value; } } /// - /// Scaling parameters of the distribution + /// Video writer. If not provided, no video will be saved. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] + [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] + public VideoWriter VideoWriter { get { - return _scalingParameters; + return _videoWriter; } set { - _scalingParameters = value; + _videoWriter = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PdfDistribution(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new PdfDistribution(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a custom probability density function distribution. - /// - ///Defined by explicit probability values and their corresponding indices. - ///Probabilities are automatically normalized to sum to 1. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a custom probability density function distribution.\n\nDefined by ex" + - "plicit probability values and their corresponding indices.\nProbabilities are aut" + - "omatically normalized to sum to 1.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PdfDistributionParameters - { - - private string _family; - - private System.Collections.Generic.List _pdf; - - private System.Collections.Generic.List _index; - - public PdfDistributionParameters() - { - _family = "Pdf"; - _pdf = new System.Collections.Generic.List(); - _index = new System.Collections.Generic.List(); - } - - protected PdfDistributionParameters(PdfDistributionParameters other) - { - _family = other._family; - _pdf = other._pdf; - _index = other._index; - } - - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } - - /// - /// The probability density function - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("pdf")] - [System.ComponentModel.DescriptionAttribute("The probability density function")] - public System.Collections.Generic.List Pdf - { - get - { - return _pdf; - } - set - { - _pdf = value; - } - } - - /// - /// The index of the probability density function - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("index")] - [System.ComponentModel.DescriptionAttribute("The index of the probability density function")] - public System.Collections.Generic.List Index - { - get - { - return _index; - } - set - { - _index = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PdfDistributionParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PdfDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Pdf = " + _pdf + ", "); - stringBuilder.Append("Index = " + _index); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("Binning = " + _binning + ", "); + stringBuilder.Append("ColorProcessing = " + _colorProcessing + ", "); + stringBuilder.Append("Exposure = " + _exposure + ", "); + stringBuilder.Append("Gain = " + _gain + ", "); + stringBuilder.Append("Gamma = " + _gamma + ", "); + stringBuilder.Append("AdcBitDepth = " + _adcBitDepth + ", "); + stringBuilder.Append("PixelFormat = " + _pixelFormat + ", "); + stringBuilder.Append("RegionOfInterest = " + _regionOfInterest + ", "); + stringBuilder.Append("VideoWriter = " + _videoWriter); return true; } @@ -8691,4216 +8451,694 @@ public override string ToString() /// - /// A RewardFunction that is always active. + /// ADC bit depth options for Spinnaker cameras. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is always active.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PersistentRewardFunction : RewardFunction + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraAdcBitDepth { - private PatchUpdateFunction _amount; + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Adc8bit = 0, - private PatchUpdateFunction _probability; + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Adc10bit = 1, - private PatchUpdateFunction _available; + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Adc12bit = 2, + } + + + /// + /// Pixel format options for Spinnaker cameras. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraPixelFormat + { - private PersistentRewardFunctionRule _rule; + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Mono8 = 0, - public PersistentRewardFunction() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Mono16 = 1, - protected PersistentRewardFunction(PersistentRewardFunction other) : - base(other) - { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Rgb8packed = 2, - /// - /// Defines the amount of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount - { - get - { - return _amount; - } - set - { - _amount = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Bayergr8 = 3, - /// - /// Defines the probability of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability - { - get - { - return _probability; - } - set - { - _probability = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] + Bayerrg8 = 4, - /// - /// Defines the amount of reward available replenished in the patch per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available - { - get - { - return _available; - } - set - { - _available = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="5")] + Bayergb8 = 5, - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rule", Required=Newtonsoft.Json.Required.Always)] - public PersistentRewardFunctionRule Rule - { - get - { - return _rule; - } - set - { - _rule = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="6")] + Bayerbg8 = 6, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PersistentRewardFunction(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="7")] + Bayergr16 = 7, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PersistentRewardFunction(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="8")] + Bayerrg16 = 8, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule); - return true; - } - } - - - /// - /// A Poisson probability distribution. - /// - ///Models the number of events occurring in a fixed interval of time or space - ///when events occur independently at a constant rate. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A Poisson probability distribution.\n\nModels the number of events occurring in a f" + - "ixed interval of time or space\nwhen events occur independently at a constant rat" + - "e.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PoissonDistribution : Distribution - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="9")] + Bayergb16 = 9, - private PoissonDistributionParameters _distributionParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] + Bayerbg16 = 10, - private TruncationParameters _truncationParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="11")] + Mono12packed = 11, - private ScalingParameters _scalingParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="12")] + Bayergr12packed = 12, - public PoissonDistribution() - { - _distributionParameters = new PoissonDistributionParameters(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="13")] + Bayerrg12packed = 13, - protected PoissonDistribution(PoissonDistribution other) : - base(other) - { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="14")] + Bayergb12packed = 14, - /// - /// Parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public PoissonDistributionParameters DistributionParameters - { - get - { - return _distributionParameters; - } - set - { - _distributionParameters = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="15")] + Bayerbg12packed = 15, - /// - /// Truncation parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters - { - get - { - return _truncationParameters; - } - set - { - _truncationParameters = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="16")] + Yuv411packed = 16, - /// - /// Scaling parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters - { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="17")] + Yuv422packed = 17, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PoissonDistribution(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="18")] + Yuv444packed = 18, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PoissonDistribution(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="19")] + Mono12p = 19, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a Poisson distribution. - /// - ///Defined by the rate parameter (average number of events). - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a Poisson distribution.\n\nDefined by the rate parameter (average nu" + - "mber of events).")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PoissonDistributionParameters - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] + Bayergr12p = 20, - private string _family; + [System.Runtime.Serialization.EnumMemberAttribute(Value="21")] + Bayerrg12p = 21, - private double _rate; + [System.Runtime.Serialization.EnumMemberAttribute(Value="22")] + Bayergb12p = 22, - public PoissonDistributionParameters() - { - _family = "Poisson"; - _rate = 1D; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="23")] + Bayerbg12p = 23, - protected PoissonDistributionParameters(PoissonDistributionParameters other) - { - _family = other._family; - _rate = other._rate; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="24")] + Ycbcr8 = 24, - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="25")] + Ycbcr4228 = 25, - /// - /// Rate parameter of the Poisson process that generates the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("rate")] - [System.ComponentModel.DescriptionAttribute("Rate parameter of the Poisson process that generates the distribution")] - public double Rate - { - get - { - return _rate; - } - set - { - _rate = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="26")] + Ycbcr4118 = 26, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PoissonDistributionParameters(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="27")] + Bgr8 = 27, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PoissonDistributionParameters(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="28")] + Bgra8 = 28, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Rate = " + _rate); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="29")] + Mono10packed = 29, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Controls the position tracking and movement detection parameters. - /// - ///This class manages the position control system including coordinate transformations, - ///initial positioning, signal filtering, and movement detection thresholds for the - ///virtual reality foraging task. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Controls the position tracking and movement detection parameters. - - This class manages the position control system including coordinate transformations, - initial positioning, signal filtering, and movement detection thresholds for the - virtual reality foraging task.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PositionControl - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] + Bayergr10packed = 30, - private AindBehaviorVrForagingTaskLogicVector3 _gain; + [System.Runtime.Serialization.EnumMemberAttribute(Value="31")] + Bayerrg10packed = 31, - private AindBehaviorVrForagingTaskLogicVector3 _initialPosition; + [System.Runtime.Serialization.EnumMemberAttribute(Value="32")] + Bayergb10packed = 32, - private double _frequencyFilterCutoff; + [System.Runtime.Serialization.EnumMemberAttribute(Value="33")] + Bayerbg10packed = 33, - private double _velocityThreshold; + [System.Runtime.Serialization.EnumMemberAttribute(Value="34")] + Mono10p = 34, - public PositionControl() - { - _gain = new AindBehaviorVrForagingTaskLogicVector3(); - _initialPosition = new AindBehaviorVrForagingTaskLogicVector3(); - _frequencyFilterCutoff = 0.5D; - _velocityThreshold = 1D; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="35")] + Bayergr10p = 35, - protected PositionControl(PositionControl other) - { - _gain = other._gain; - _initialPosition = other._initialPosition; - _frequencyFilterCutoff = other._frequencyFilterCutoff; - _velocityThreshold = other._velocityThreshold; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="36")] + Bayerrg10p = 36, - /// - /// Gain of the position control. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("gain")] - [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] - public AindBehaviorVrForagingTaskLogicVector3 Gain - { - get - { - return _gain; - } - set - { - _gain = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="37")] + Bayergb10p = 37, - /// - /// Gain of the position control. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] - [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] - public AindBehaviorVrForagingTaskLogicVector3 InitialPosition - { - get - { - return _initialPosition; - } - set - { - _initialPosition = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="38")] + Bayerbg10p = 38, - /// - /// Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal. - /// - [Newtonsoft.Json.JsonPropertyAttribute("frequency_filter_cutoff")] - [System.ComponentModel.DescriptionAttribute("Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal.")] - public double FrequencyFilterCutoff - { - get - { - return _frequencyFilterCutoff; - } - set - { - _frequencyFilterCutoff = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="39")] + Mono1p = 39, - /// - /// Threshold (cm/s) of the velocity signal used to detect when the animal is moving. - /// - [Newtonsoft.Json.JsonPropertyAttribute("velocity_threshold")] - [System.ComponentModel.DescriptionAttribute("Threshold (cm/s) of the velocity signal used to detect when the animal is moving." + - "")] - public double VelocityThreshold - { - get - { - return _velocityThreshold; - } - set - { - _velocityThreshold = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] + Mono2p = 40, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PositionControl(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="41")] + Mono4p = 41, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PositionControl(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="42")] + Mono8s = 42, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Gain = " + _gain + ", "); - stringBuilder.Append("InitialPosition = " + _initialPosition + ", "); - stringBuilder.Append("FrequencyFilterCutoff = " + _frequencyFilterCutoff + ", "); - stringBuilder.Append("VelocityThreshold = " + _velocityThreshold); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="43")] + Mono10 = 43, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Represents a rectangle defined by its top-left corner, width, and height. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a rectangle defined by its top-left corner, width, and height.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Rect - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="44")] + Mono12 = 44, - private int _x; + [System.Runtime.Serialization.EnumMemberAttribute(Value="45")] + Mono14 = 45, - private int _y; + [System.Runtime.Serialization.EnumMemberAttribute(Value="46")] + Mono16s = 46, - private int _width; + [System.Runtime.Serialization.EnumMemberAttribute(Value="47")] + Mono32f = 47, - private int _height; + [System.Runtime.Serialization.EnumMemberAttribute(Value="48")] + Bayerbg10 = 48, - public Rect() - { - _x = 0; - _y = 0; - _width = 0; - _height = 0; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="49")] + Bayerbg12 = 49, - protected Rect(Rect other) - { - _x = other._x; - _y = other._y; - _width = other._width; - _height = other._height; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] + Bayergb10 = 50, - /// - /// X coordinate of the top-left corner - /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] - public int X - { - get - { - return _x; - } - set - { - _x = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="51")] + Bayergb12 = 51, - /// - /// Y coordinate of the top-left corner - /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the top-left corner")] - public int Y - { - get - { - return _y; - } - set - { - _y = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="52")] + Bayergr10 = 52, - /// - /// Width of the rectangle - /// - [Newtonsoft.Json.JsonPropertyAttribute("width")] - [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] - public int Width - { - get - { - return _width; - } - set - { - _width = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="53")] + Bayergr12 = 53, - /// - /// Height of the rectangle - /// - [Newtonsoft.Json.JsonPropertyAttribute("height")] - [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] - public int Height - { - get - { - return _height; - } - set - { - _height = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="54")] + Bayerrg10 = 54, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="55")] + Bayerrg12 = 55, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="56")] + Rgba8 = 56, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Width = " + _width + ", "); - stringBuilder.Append("Height = " + _height); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="57")] + Rgba10 = 57, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Defines visual rendering properties for virtual environment elements. - /// - ///This class controls the visual appearance of virtual sites, including - ///contrast and other visual parameters that affect how elements are rendered - ///in the VR environment. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines visual rendering properties for virtual environment elements.\n\nThis class" + - " controls the visual appearance of virtual sites, including\ncontrast and other v" + - "isual parameters that affect how elements are rendered\nin the VR environment.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RenderSpecification - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="58")] + Rgba10p = 58, - private double? _contrast; + [System.Runtime.Serialization.EnumMemberAttribute(Value="59")] + Rgba12 = 59, - public RenderSpecification() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="60")] + Rgba12p = 60, - protected RenderSpecification(RenderSpecification other) - { - _contrast = other._contrast; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="61")] + Rgba14 = 61, - /// - /// Contrast of the texture - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("contrast")] - [System.ComponentModel.DescriptionAttribute("Contrast of the texture")] - public double? Contrast - { - get - { - return _contrast; - } - set - { - _contrast = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="62")] + Rgba16 = 62, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RenderSpecification(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="63")] + Rgb8 = 63, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RenderSpecification(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="64")] + Rgb8Planar = 64, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Contrast = " + _contrast); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="65")] + Rgb10 = 65, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] - [JsonInheritanceAttribute("PatchRewardFunction", typeof(PatchRewardFunction))] - [JsonInheritanceAttribute("OnThisPatchEntryRewardFunction", typeof(OnThisPatchEntryRewardFunction))] - [JsonInheritanceAttribute("OutsideRewardFunction", typeof(OutsideRewardFunction))] - [JsonInheritanceAttribute("PersistentRewardFunction", typeof(PersistentRewardFunction))] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RewardFunction - { - - public RewardFunction() - { - } - - protected RewardFunction(RewardFunction other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardFunction(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RewardFunction(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Specifies reward parameters and behavior for a patch. - /// - ///This class defines all aspects of reward delivery including amounts, probabilities, - ///delays, operant logic, and dynamic update functions. It serves as the complete - ///specification for how rewards are managed in a given Patch. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Specifies reward parameters and behavior for a patch. - - This class defines all aspects of reward delivery including amounts, probabilities, - delays, operant logic, and dynamic update functions. It serves as the complete - specification for how rewards are managed in a given Patch.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RewardSpecification - { - - private OperantLogic _operantLogic; - - private Distribution _delay; - - private Distribution _amount; - - private Distribution _probability; - - private Distribution _available; - - private System.Collections.Generic.List _rewardFunction; - - public RewardSpecification() - { - _delay = new Distribution(); - _amount = new Distribution(); - _probability = new Distribution(); - _available = new Distribution(); - _rewardFunction = new System.Collections.Generic.List(); - } - - protected RewardSpecification(RewardSpecification other) - { - _operantLogic = other._operantLogic; - _delay = other._delay; - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rewardFunction = other._rewardFunction; - } - - /// - /// The optional operant logic of the reward - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operant_logic")] - [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] - public OperantLogic OperantLogic - { - get - { - return _operantLogic; - } - set - { - _operantLogic = value; - } - } - - /// - /// The optional distribution where the delay to reward will be drawn from - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] - public Distribution Delay - { - get - { - return _delay; - } - set - { - _delay = value; - } - } - - /// - /// Initial amount of reward in microliters - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Initial amount of reward in microliters")] - public Distribution Amount - { - get - { - return _amount; - } - set - { - _amount = value; - } - } - - /// - /// Initial probability of reward delivery - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Initial probability of reward delivery")] - public Distribution Probability - { - get - { - return _probability; - } - set - { - _probability = value; - } - } - - /// - /// Initial amount of reward available in the patch in microliters - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Initial amount of reward available in the patch in microliters")] - public Distribution Available - { - get - { - return _available; - } - set - { - _available = value; - } - } - - /// - /// Reward function of the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_function")] - [System.ComponentModel.DescriptionAttribute("Reward function of the patch")] - public System.Collections.Generic.List RewardFunction - { - get - { - return _rewardFunction; - } - set - { - _rewardFunction = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardSpecification(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RewardSpecification(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); - stringBuilder.Append("Delay = " + _delay + ", "); - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("RewardFunction = " + _rewardFunction); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Container class for calibration models. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Container class for calibration models.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RigCalibration - { - - private WaterValveCalibration _waterValve; - - public RigCalibration() - { - _waterValve = new WaterValveCalibration(); - } - - protected RigCalibration(RigCalibration other) - { - _waterValve = other._waterValve; - } - - /// - /// Water valve calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("water_valve", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Water valve calibration")] - public WaterValveCalibration WaterValve - { - get - { - return _waterValve; - } - set - { - _waterValve = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("WaterValve = " + _waterValve); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// A scalar distribution that returns a constant value. - /// - ///Useful for fixed parameters that don't vary across trials or samples. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A scalar distribution that returns a constant value.\n\nUseful for fixed parameters" + - " that don\'t vary across trials or samples.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Scalar : Distribution - { - - private ScalarDistributionParameter _distributionParameters; - - private TruncationParameters2 _truncationParameters; - - private ScalingParameters2 _scalingParameters; - - public Scalar() - { - _distributionParameters = new ScalarDistributionParameter(); - } - - protected Scalar(Scalar other) : - base(other) - { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; - } - - /// - /// Parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public ScalarDistributionParameter DistributionParameters - { - get - { - return _distributionParameters; - } - set - { - _distributionParameters = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - public TruncationParameters2 TruncationParameters - { - get - { - return _truncationParameters; - } - set - { - _truncationParameters = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - public ScalingParameters2 ScalingParameters - { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Scalar(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Scalar(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a scalar (constant) distribution. - /// - ///Represents a deterministic value that always returns the same number. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a scalar (constant) distribution.\n\nRepresents a deterministic valu" + - "e that always returns the same number.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalarDistributionParameter - { - - private string _family; - - private double _value; - - public ScalarDistributionParameter() - { - _family = "Scalar"; - _value = 0D; - } - - protected ScalarDistributionParameter(ScalarDistributionParameter other) - { - _family = other._family; - _value = other._value; - } - - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } - - /// - /// The static value of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("value")] - [System.ComponentModel.DescriptionAttribute("The static value of the distribution")] - public double Value - { - get - { - return _value; - } - set - { - _value = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalarDistributionParameter(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalarDistributionParameter(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Value = " + _value); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Parameters for scaling and offsetting sampled distribution values. - ///Scaling is applied as (value * scale + offset). - /// - ///Applies linear transformation: result = (value * scale) + offset. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for scaling and offsetting sampled distribution values.\nScaling is app" + - "lied as (value * scale + offset).\n\nApplies linear transformation: result = (valu" + - "e * scale) + offset.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalingParameters - { - - private double _scale; - - private double _offset; - - public ScalingParameters() - { - _scale = 1D; - _offset = 0D; - } - - protected ScalingParameters(ScalingParameters other) - { - _scale = other._scale; - _offset = other._offset; - } - - /// - /// Scaling factor to apply on the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("scale")] - [System.ComponentModel.DescriptionAttribute("Scaling factor to apply on the sampled distribution")] - public double Scale - { - get - { - return _scale; - } - set - { - _scale = value; - } - } - - /// - /// Offset factor to apply on the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("offset")] - [System.ComponentModel.DescriptionAttribute("Offset factor to apply on the sampled distribution")] - public double Offset - { - get - { - return _offset; - } - set - { - _offset = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalingParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalingParameters(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Scale = " + _scale + ", "); - stringBuilder.Append("Offset = " + _offset); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Represents a screen assembly (left, center and right screens) and respective configuration. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a screen assembly (left, center and right screens) and respective conf" + - "iguration.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScreenAssembly - { - - private string _deviceType; - - private ScreenAssemblyCalibration _calibration; - - private int _displayIndex; - - private double _targetRenderFrequency; - - private double _targetUpdateFrequency; - - private string _textureAssetsDirectory; - - private double _brightness; - - private double _contrast; - - public ScreenAssembly() - { - _deviceType = "ScreenAssembly"; - _calibration = new ScreenAssemblyCalibration(); - _displayIndex = 1; - _targetRenderFrequency = 60D; - _targetUpdateFrequency = 120D; - _textureAssetsDirectory = "Textures"; - _brightness = 0D; - _contrast = 1D; - } - - protected ScreenAssembly(ScreenAssembly other) - { - _deviceType = other._deviceType; - _calibration = other._calibration; - _displayIndex = other._displayIndex; - _targetRenderFrequency = other._targetRenderFrequency; - _targetUpdateFrequency = other._targetUpdateFrequency; - _textureAssetsDirectory = other._textureAssetsDirectory; - _brightness = other._brightness; - _contrast = other._contrast; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - /// - /// Screen assembly calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Screen assembly calibration")] - public ScreenAssemblyCalibration Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - /// - /// Display index - /// - [Newtonsoft.Json.JsonPropertyAttribute("display_index")] - [System.ComponentModel.DescriptionAttribute("Display index")] - public int DisplayIndex - { - get - { - return _displayIndex; - } - set - { - _displayIndex = value; - } - } - - /// - /// Target render frequency - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_render_frequency")] - [System.ComponentModel.DescriptionAttribute("Target render frequency")] - public double TargetRenderFrequency - { - get - { - return _targetRenderFrequency; - } - set - { - _targetRenderFrequency = value; - } - } - - /// - /// Target update frequency - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_update_frequency")] - [System.ComponentModel.DescriptionAttribute("Target update frequency")] - public double TargetUpdateFrequency - { - get - { - return _targetUpdateFrequency; - } - set - { - _targetUpdateFrequency = value; - } - } - - /// - /// Calibration directory - /// - [Newtonsoft.Json.JsonPropertyAttribute("texture_assets_directory")] - [System.ComponentModel.DescriptionAttribute("Calibration directory")] - public string TextureAssetsDirectory - { - get - { - return _textureAssetsDirectory; - } - set - { - _textureAssetsDirectory = value; - } - } - - /// - /// Brightness - /// - [Newtonsoft.Json.JsonPropertyAttribute("brightness")] - [System.ComponentModel.DescriptionAttribute("Brightness")] - public double Brightness - { - get - { - return _brightness; - } - set - { - _brightness = value; - } - } - - /// - /// Contrast - /// - [Newtonsoft.Json.JsonPropertyAttribute("contrast")] - [System.ComponentModel.DescriptionAttribute("Contrast")] - public double Contrast - { - get - { - return _contrast; - } - set - { - _contrast = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScreenAssembly(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssembly(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("DisplayIndex = " + _displayIndex + ", "); - stringBuilder.Append("TargetRenderFrequency = " + _targetRenderFrequency + ", "); - stringBuilder.Append("TargetUpdateFrequency = " + _targetUpdateFrequency + ", "); - stringBuilder.Append("TextureAssetsDirectory = " + _textureAssetsDirectory + ", "); - stringBuilder.Append("Brightness = " + _brightness + ", "); - stringBuilder.Append("Contrast = " + _contrast); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Represents the calibration parameters for a screen assembly with three displays. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters for a screen assembly with three displays.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScreenAssemblyCalibration - { - - private DisplayCalibration _left; - - private DisplayCalibration _center; - - private DisplayCalibration _right; - - public ScreenAssemblyCalibration() - { - _left = new DisplayCalibration(); - _center = new DisplayCalibration(); - _right = new DisplayCalibration(); - } - - protected ScreenAssemblyCalibration(ScreenAssemblyCalibration other) - { - _left = other._left; - _center = other._center; - _right = other._right; - } - - /// - /// Left display calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("left")] - [System.ComponentModel.DescriptionAttribute("Left display calibration")] - public DisplayCalibration Left - { - get - { - return _left; - } - set - { - _left = value; - } - } - - /// - /// Center display calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("center")] - [System.ComponentModel.DescriptionAttribute("Center display calibration")] - public DisplayCalibration Center - { - get - { - return _center; - } - set - { - _center = value; - } - } - - /// - /// Right display calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("right")] - [System.ComponentModel.DescriptionAttribute("Right display calibration")] - public DisplayCalibration Right - { - get - { - return _right; - } - set - { - _right = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScreenAssemblyCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssemblyCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Left = " + _left + ", "); - stringBuilder.Append("Center = " + _center + ", "); - stringBuilder.Append("Right = " + _right); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Session - { - - private string _aindBehaviorServicesPkgVersion; - - private string _version; - - private string _experiment; - - private System.Collections.Generic.List _experimenter; - - private System.DateTimeOffset _date; - - private string _sessionName; - - private string _subject; - - private string _notes; - - private string _commitHash; - - private bool _allowDirtyRepo; - - private bool _skipHardwareValidation; - - public Session() - { - _aindBehaviorServicesPkgVersion = "0.13.2"; - _version = "0.13.2"; - _experimenter = new System.Collections.Generic.List(); - _allowDirtyRepo = false; - _skipHardwareValidation = false; - } - - protected Session(Session other) - { - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _experiment = other._experiment; - _experimenter = other._experimenter; - _date = other._date; - _sessionName = other._sessionName; - _subject = other._subject; - _notes = other._notes; - _commitHash = other._commitHash; - _allowDirtyRepo = other._allowDirtyRepo; - _skipHardwareValidation = other._skipHardwareValidation; - } - - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion - { - get - { - return _aindBehaviorServicesPkgVersion; - } - set - { - _aindBehaviorServicesPkgVersion = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version - { - get - { - return _version; - } - set - { - _version = value; - } - } - - /// - /// Name of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment")] - [System.ComponentModel.DescriptionAttribute("Name of the experiment")] - public string Experiment - { - get - { - return _experiment; - } - set - { - _experiment = value; - } - } - - /// - /// Name of the experimenter - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] - [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] - public System.Collections.Generic.List Experimenter - { - get - { - return _experimenter; - } - set - { - _experimenter = value; - } - } - - /// - /// Date of the experiment - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the experiment")] - public System.DateTimeOffset Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - /// - /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. - /// - [Newtonsoft.Json.JsonPropertyAttribute("session_name")] - [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + - "t provided, it will be generated using subject and date.")] - public string SessionName - { - get - { - return _sessionName; - } - set - { - _sessionName = value; - } - } - - /// - /// Name of the subject - /// - [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Name of the subject")] - public string Subject - { - get - { - return _subject; - } - set - { - _subject = value; - } - } - - /// - /// Notes about the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] - public string Notes - { - get - { - return _notes; - } - set - { - _notes = value; - } - } - - /// - /// Commit hash of the repository - /// - [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] - [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] - public string CommitHash - { - get - { - return _commitHash; - } - set - { - _commitHash = value; - } - } - - /// - /// Allow running from a dirty repository - /// - [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] - [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] - public bool AllowDirtyRepo - { - get - { - return _allowDirtyRepo; - } - set - { - _allowDirtyRepo = value; - } - } - - /// - /// Skip hardware validation - /// - [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] - [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] - public bool SkipHardwareValidation - { - get - { - return _skipHardwareValidation; - } - set - { - _skipHardwareValidation = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Session(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Session(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("Version = " + _version + ", "); - stringBuilder.Append("Experiment = " + _experiment + ", "); - stringBuilder.Append("Experimenter = " + _experimenter + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("SessionName = " + _sessionName + ", "); - stringBuilder.Append("Subject = " + _subject + ", "); - stringBuilder.Append("Notes = " + _notes + ", "); - stringBuilder.Append("CommitHash = " + _commitHash + ", "); - stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); - stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// A patch update function that sets the target to a specific value. - /// - ///Update in the form of x = value. - ///This function directly sets the target parameter to a value drawn from the - ///specified distribution, ignoring the current value. Useful for resetting - ///parameters or applying discrete changes. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that sets the target to a specific value. - - Update in the form of x = value. - This function directly sets the target parameter to a value drawn from the - specified distribution, ignoring the current value. Useful for resetting - parameters or applying discrete changes.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SetValueFunction : PatchUpdateFunction - { - - private Distribution _value; - - public SetValueFunction() - { - } - - protected SetValueFunction(SetValueFunction other) : - base(other) - { - _value = other._value; - } - - /// - /// Sets the value of the target to this value. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Sets the value of the target to this value.")] - public Distribution Value - { - get - { - return _value; - } - set - { - _value = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SetValueFunction(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SetValueFunction(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Value = " + _value); - return true; - } - } - - - /// - /// Represents 2D dimensions with width and height. - /// - ///Used for defining texture sizes, corridor dimensions, and other 2D measurements - ///in the VR foraging environment. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents 2D dimensions with width and height.\n\nUsed for defining texture sizes," + - " corridor dimensions, and other 2D measurements\nin the VR foraging environment.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Size - { - - private double _width; - - private double _height; - - public Size() - { - _width = 0D; - _height = 0D; - } - - protected Size(Size other) - { - _width = other._width; - _height = other._height; - } - - /// - /// Width of the texture - /// - [Newtonsoft.Json.JsonPropertyAttribute("width")] - [System.ComponentModel.DescriptionAttribute("Width of the texture")] - public double Width - { - get - { - return _width; - } - set - { - _width = value; - } - } - - /// - /// Height of the texture - /// - [Newtonsoft.Json.JsonPropertyAttribute("height")] - [System.ComponentModel.DescriptionAttribute("Height of the texture")] - public double Height - { - get - { - return _height; - } - set - { - _height = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Size(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Size(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Width = " + _width + ", "); - stringBuilder.Append("Height = " + _height); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Spinnaker camera device configuration. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Spinnaker camera device configuration.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SpinnakerCamera - { - - private string _deviceType; - - private BaseModel _calibration; - - private string _serialNumber; - - private int _binning; - - private SpinnakerCameraColorProcessing _colorProcessing; - - private int _exposure; - - private double _gain; - - private double? _gamma; - - private SpinnakerCameraAdcBitDepth? _adcBitDepth; - - private SpinnakerCameraPixelFormat? _pixelFormat; - - private Rect _regionOfInterest; - - private VideoWriter _videoWriter; - - public SpinnakerCamera() - { - _deviceType = "SpinnakerCamera"; - _binning = 1; - _colorProcessing = AindVrForagingDataSchema.SpinnakerCameraColorProcessing.Default; - _exposure = 1000; - _gain = 0D; - _adcBitDepth = AindVrForagingDataSchema.SpinnakerCameraAdcBitDepth.Adc8bit; - _pixelFormat = AindVrForagingDataSchema.SpinnakerCameraPixelFormat.Mono8; - _regionOfInterest = new Rect(); - } - - protected SpinnakerCamera(SpinnakerCamera other) - { - _deviceType = other._deviceType; - _calibration = other._calibration; - _serialNumber = other._serialNumber; - _binning = other._binning; - _colorProcessing = other._colorProcessing; - _exposure = other._exposure; - _gain = other._gain; - _gamma = other._gamma; - _adcBitDepth = other._adcBitDepth; - _pixelFormat = other._pixelFormat; - _regionOfInterest = other._regionOfInterest; - _videoWriter = other._videoWriter; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - /// - /// Calibration for the device. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - /// - /// Camera serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Camera serial number")] - public string SerialNumber - { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } - } - - /// - /// Binning - /// - [Newtonsoft.Json.JsonPropertyAttribute("binning")] - [System.ComponentModel.DescriptionAttribute("Binning")] - public int Binning - { - get - { - return _binning; - } - set - { - _binning = value; - } - } - - /// - /// Color processing - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("color_processing")] - [System.ComponentModel.DescriptionAttribute("Color processing")] - public SpinnakerCameraColorProcessing ColorProcessing - { - get - { - return _colorProcessing; - } - set - { - _colorProcessing = value; - } - } - - /// - /// Exposure time - /// - [Newtonsoft.Json.JsonPropertyAttribute("exposure")] - [System.ComponentModel.DescriptionAttribute("Exposure time")] - public int Exposure - { - get - { - return _exposure; - } - set - { - _exposure = value; - } - } - - /// - /// Gain - /// - [Newtonsoft.Json.JsonPropertyAttribute("gain")] - [System.ComponentModel.DescriptionAttribute("Gain")] - public double Gain - { - get - { - return _gain; - } - set - { - _gain = value; - } - } - - /// - /// Gamma. If None, will disable gamma correction. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("gamma")] - [System.ComponentModel.DescriptionAttribute("Gamma. If None, will disable gamma correction.")] - public double? Gamma - { - get - { - return _gamma; - } - set - { - _gamma = value; - } - } - - /// - /// ADC bit depth. If None will be left as default. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("adc_bit_depth")] - [System.ComponentModel.DescriptionAttribute("ADC bit depth. If None will be left as default.")] - public SpinnakerCameraAdcBitDepth? AdcBitDepth - { - get - { - return _adcBitDepth; - } - set - { - _adcBitDepth = value; - } - } - - /// - /// Pixel format. If None will be left as default. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("pixel_format")] - [System.ComponentModel.DescriptionAttribute("Pixel format. If None will be left as default.")] - public SpinnakerCameraPixelFormat? PixelFormat - { - get - { - return _pixelFormat; - } - set - { - _pixelFormat = value; - } - } - - /// - /// Region of interest - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("region_of_interest")] - [System.ComponentModel.DescriptionAttribute("Region of interest")] - public Rect RegionOfInterest - { - get - { - return _regionOfInterest; - } - set - { - _regionOfInterest = value; - } - } - - /// - /// Video writer. If not provided, no video will be saved. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] - [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] - public VideoWriter VideoWriter - { - get - { - return _videoWriter; - } - set - { - _videoWriter = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("Binning = " + _binning + ", "); - stringBuilder.Append("ColorProcessing = " + _colorProcessing + ", "); - stringBuilder.Append("Exposure = " + _exposure + ", "); - stringBuilder.Append("Gain = " + _gain + ", "); - stringBuilder.Append("Gamma = " + _gamma + ", "); - stringBuilder.Append("AdcBitDepth = " + _adcBitDepth + ", "); - stringBuilder.Append("PixelFormat = " + _pixelFormat + ", "); - stringBuilder.Append("RegionOfInterest = " + _regionOfInterest + ", "); - stringBuilder.Append("VideoWriter = " + _videoWriter); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// ADC bit depth options for Spinnaker cameras. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum SpinnakerCameraAdcBitDepth - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Adc8bit = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Adc10bit = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Adc12bit = 2, - } - - - /// - /// Pixel format options for Spinnaker cameras. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum SpinnakerCameraPixelFormat - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Mono8 = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Mono16 = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Rgb8packed = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Bayergr8 = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] - Bayerrg8 = 4, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="5")] - Bayergb8 = 5, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="6")] - Bayerbg8 = 6, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="7")] - Bayergr16 = 7, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="8")] - Bayerrg16 = 8, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="9")] - Bayergb16 = 9, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] - Bayerbg16 = 10, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="11")] - Mono12packed = 11, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="12")] - Bayergr12packed = 12, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="13")] - Bayerrg12packed = 13, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="14")] - Bayergb12packed = 14, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="15")] - Bayerbg12packed = 15, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="16")] - Yuv411packed = 16, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="17")] - Yuv422packed = 17, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="18")] - Yuv444packed = 18, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="19")] - Mono12p = 19, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] - Bayergr12p = 20, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="21")] - Bayerrg12p = 21, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="22")] - Bayergb12p = 22, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="23")] - Bayerbg12p = 23, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="24")] - Ycbcr8 = 24, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="25")] - Ycbcr4228 = 25, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="26")] - Ycbcr4118 = 26, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="27")] - Bgr8 = 27, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="28")] - Bgra8 = 28, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="29")] - Mono10packed = 29, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] - Bayergr10packed = 30, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="31")] - Bayerrg10packed = 31, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="32")] - Bayergb10packed = 32, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="33")] - Bayerbg10packed = 33, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="34")] - Mono10p = 34, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="35")] - Bayergr10p = 35, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="36")] - Bayerrg10p = 36, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="37")] - Bayergb10p = 37, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="38")] - Bayerbg10p = 38, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="39")] - Mono1p = 39, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] - Mono2p = 40, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="41")] - Mono4p = 41, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="42")] - Mono8s = 42, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="43")] - Mono10 = 43, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="44")] - Mono12 = 44, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="45")] - Mono14 = 45, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="46")] - Mono16s = 46, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="47")] - Mono32f = 47, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="48")] - Bayerbg10 = 48, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="49")] - Bayerbg12 = 49, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] - Bayergb10 = 50, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="51")] - Bayergb12 = 51, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="52")] - Bayergr10 = 52, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="53")] - Bayergr12 = 53, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="54")] - Bayerrg10 = 54, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="55")] - Bayerrg12 = 55, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="56")] - Rgba8 = 56, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="57")] - Rgba10 = 57, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="58")] - Rgba10p = 58, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="59")] - Rgba12 = 59, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="60")] - Rgba12p = 60, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="61")] - Rgba14 = 61, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="62")] - Rgba16 = 62, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="63")] - Rgb8 = 63, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="64")] - Rgb8Planar = 64, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="65")] - Rgb10 = 65, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="66")] - Rgb10Planar = 66, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="67")] - Rgb10p = 67, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="68")] - Rgb10p32 = 68, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="69")] - Rgb12 = 69, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="70")] - Rgb12Planar = 70, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="71")] - Rgb12p = 71, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="72")] - Rgb14 = 72, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="73")] - Rgb16 = 73, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="74")] - Rgb16s = 74, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="75")] - Rgb32f = 75, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="76")] - Rgb16Planar = 76, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="77")] - Rgb565p = 77, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="78")] - Bgra10 = 78, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="79")] - Bgra10p = 79, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="80")] - Bgra12 = 80, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="81")] - Bgra12p = 81, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="82")] - Bgra14 = 82, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="83")] - Bgra16 = 83, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="84")] - Rgba32f = 84, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="85")] - Bgr10 = 85, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="86")] - Bgr10p = 86, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="87")] - Bgr12 = 87, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="88")] - Bgr12p = 88, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="89")] - Bgr14 = 89, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="90")] - Bgr16 = 90, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="91")] - Bgr565p = 91, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="92")] - R8 = 92, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="93")] - R10 = 93, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="94")] - R12 = 94, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="95")] - R16 = 95, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="96")] - G8 = 96, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="97")] - G10 = 97, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="98")] - G12 = 98, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="99")] - G16 = 99, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] - B8 = 100, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="101")] - B10 = 101, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="102")] - B12 = 102, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="103")] - B16 = 103, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="104")] - Coord3dAbc8 = 104, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="105")] - Coord3dAbc8Planar = 105, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="106")] - Coord3dAbc10p = 106, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="107")] - Coord3dAbc10pPlanar = 107, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="108")] - Coord3dAbc12p = 108, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="109")] - Coord3dAbc12pPlanar = 109, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="110")] - Coord3dAbc16 = 110, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="111")] - Coord3dAbc16Planar = 111, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="112")] - Coord3dAbc32f = 112, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="113")] - Coord3dAbc32fPlanar = 113, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="114")] - Coord3dAc8 = 114, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="115")] - Coord3dAc8Planar = 115, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="116")] - Coord3dAc10p = 116, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="117")] - Coord3dAc10pPlanar = 117, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="118")] - Coord3dAc12p = 118, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="119")] - Coord3dAc12pPlanar = 119, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="120")] - Coord3dAc16 = 120, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="121")] - Coord3dAc16Planar = 121, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="122")] - Coord3dAc32f = 122, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="123")] - Coord3dAc32fPlanar = 123, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="124")] - Coord3dA8 = 124, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="125")] - Coord3dA10p = 125, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="126")] - Coord3dA12p = 126, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="127")] - Coord3dA16 = 127, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="128")] - Coord3dA32f = 128, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="129")] - Coord3dB8 = 129, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="130")] - Coord3dB10p = 130, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="131")] - Coord3dB12p = 131, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="132")] - Coord3dB16 = 132, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="133")] - Coord3dB32f = 133, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="134")] - Coord3dC8 = 134, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="135")] - Coord3dC10p = 135, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="136")] - Coord3dC12p = 136, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="137")] - Coord3dC16 = 137, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="138")] - Coord3dC32f = 138, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="139")] - Confidence1 = 139, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="140")] - Confidence1p = 140, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="141")] - Confidence8 = 141, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="142")] - Confidence16 = 142, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="143")] - Confidence32f = 143, - } - - - /// - /// Defines visual texture properties for VR environment surfaces. - /// - ///Textures are applied to walls, floors, and other surfaces in the virtual - ///environment to provide visual cues and context for the foraging task. - /// - ///Texture name must correspond to a valid texture asset loaded in the workflow. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines visual texture properties for VR environment surfaces. - - Textures are applied to walls, floors, and other surfaces in the virtual - environment to provide visual cues and context for the foraging task. - - Texture name must correspond to a valid texture asset loaded in the workflow.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Texture - { - - private string _name; - - private Size _size; - - public Texture() - { - _name = "default"; - _size = new Size(); - } - - protected Texture(Texture other) - { - _name = other._name; - _size = other._size; - } - - /// - /// Name of the texture - /// - [Newtonsoft.Json.JsonPropertyAttribute("name")] - [System.ComponentModel.DescriptionAttribute("Name of the texture")] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - /// - /// Size of the texture - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("size")] - [System.ComponentModel.DescriptionAttribute("Size of the texture")] - public Size Size - { - get - { - return _size; - } - set - { - _size = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Texture(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Texture(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Name = " + _name + ", "); - stringBuilder.Append("Size = " + _size); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// A calibrated treadmill device - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A calibrated treadmill device")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Treadmill - { - - private string _deviceType; - - private TreadmillCalibration _calibration; - - private int _whoAmI; - - private string _serialNumber; - - private string _portName; - - public Treadmill() - { - _deviceType = "Treadmill"; - _calibration = new TreadmillCalibration(); - _whoAmI = 1402; - } - - protected Treadmill(Treadmill other) - { - _deviceType = other._deviceType; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType - { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - public TreadmillCalibration Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI - { - get - { - return _whoAmI; - } - set - { - _whoAmI = value; - } - } - - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber - { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } - } - - /// - /// Device port name - /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName - { - get - { - return _portName; - } - set - { - _portName = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Treadmill calibration class - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Treadmill calibration class")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillCalibration - { - - private System.DateTimeOffset? _date; - - private double _wheelDiameter; - - private int _pulsesPerRevolution; - - private bool _invertDirection; - - private System.Collections.Generic.List> _brakeLookupCalibration; - - public TreadmillCalibration() - { - _wheelDiameter = 15D; - _pulsesPerRevolution = 28800; - _invertDirection = false; - _brakeLookupCalibration = new System.Collections.Generic.List>(); - } - - protected TreadmillCalibration(TreadmillCalibration other) - { - _date = other._date; - _wheelDiameter = other._wheelDiameter; - _pulsesPerRevolution = other._pulsesPerRevolution; - _invertDirection = other._invertDirection; - _brakeLookupCalibration = other._brakeLookupCalibration; - } - - /// - /// Date of the calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the calibration")] - public System.DateTimeOffset? Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - /// - /// Wheel diameter - /// - [Newtonsoft.Json.JsonPropertyAttribute("wheel_diameter")] - [System.ComponentModel.DescriptionAttribute("Wheel diameter")] - public double WheelDiameter - { - get - { - return _wheelDiameter; - } - set - { - _wheelDiameter = value; - } - } - - /// - /// Pulses per revolution - /// - [Newtonsoft.Json.JsonPropertyAttribute("pulses_per_revolution")] - [System.ComponentModel.DescriptionAttribute("Pulses per revolution")] - public int PulsesPerRevolution - { - get - { - return _pulsesPerRevolution; - } - set - { - _pulsesPerRevolution = value; - } - } - - /// - /// Invert direction - /// - [Newtonsoft.Json.JsonPropertyAttribute("invert_direction")] - [System.ComponentModel.DescriptionAttribute("Invert direction")] - public bool InvertDirection - { - get - { - return _invertDirection; - } - set - { - _invertDirection = value; - } - } - - /// - /// Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16]) - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("brake_lookup_calibration")] - [System.ComponentModel.DescriptionAttribute("Brake lookup calibration. Each pair of values define (input [torque], output [bra" + - "ke set-point U16])")] - public System.Collections.Generic.List> BrakeLookupCalibration - { - get - { - return _brakeLookupCalibration; - } - set - { - _brakeLookupCalibration = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("WheelDiameter = " + _wheelDiameter + ", "); - stringBuilder.Append("PulsesPerRevolution = " + _pulsesPerRevolution + ", "); - stringBuilder.Append("InvertDirection = " + _invertDirection + ", "); - stringBuilder.Append("BrakeLookupCalibration = " + _brakeLookupCalibration); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="66")] + Rgb10Planar = 66, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Defines treadmill friction properties for virtual sites. - /// - ///This class controls the friction experienced by the animal when moving - ///through different virtual sites, allowing for varied locomotion dynamics - ///across different regions of the environment. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines treadmill friction properties for virtual sites.\n\nThis class controls the" + - " friction experienced by the animal when moving\nthrough different virtual sites," + - " allowing for varied locomotion dynamics\nacross different regions of the environ" + - "ment.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillSpecification - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="67")] + Rgb10p = 67, - private Distribution _friction; + [System.Runtime.Serialization.EnumMemberAttribute(Value="68")] + Rgb10p32 = 68, - public TreadmillSpecification() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="69")] + Rgb12 = 69, - protected TreadmillSpecification(TreadmillSpecification other) - { - _friction = other._friction; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="70")] + Rgb12Planar = 70, - /// - /// Friction of the treadmill (0-1). The drawn value must be between 0 and 1 - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("friction")] - [System.ComponentModel.DescriptionAttribute("Friction of the treadmill (0-1). The drawn value must be between 0 and 1")] - public Distribution Friction - { - get - { - return _friction; - } - set - { - _friction = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="71")] + Rgb12p = 71, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillSpecification(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="72")] + Rgb14 = 72, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillSpecification(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="73")] + Rgb16 = 73, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Friction = " + _friction); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="74")] + Rgb16s = 74, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Parameters for truncating a distribution to a specified range. Truncation should - ///be applied after sampling and scaling. - /// - ///The truncation_mode determines how out-of-bounds values are handled: - ///- "exclude": Resample until a value within [min, max] is obtained. - ///If after a certain number of attempts no valid value is found, it - ///will use the average of sampled values and pick the closest bound. - ///- "clamp": Clamp values to the nearest bound within [min, max]. - ///Used to constrain sampled values within minimum and maximum bounds. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Parameters for truncating a distribution to a specified range. Truncation should - be applied after sampling and scaling. - - The truncation_mode determines how out-of-bounds values are handled: - - ""exclude"": Resample until a value within [min, max] is obtained. - If after a certain number of attempts no valid value is found, it - will use the average of sampled values and pick the closest bound. - - ""clamp"": Clamp values to the nearest bound within [min, max]. - Used to constrain sampled values within minimum and maximum bounds.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TruncationParameters - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="75")] + Rgb32f = 75, - private TruncationParametersTruncationMode _truncationMode; + [System.Runtime.Serialization.EnumMemberAttribute(Value="76")] + Rgb16Planar = 76, - private double _min; + [System.Runtime.Serialization.EnumMemberAttribute(Value="77")] + Rgb565p = 77, - private double _max; + [System.Runtime.Serialization.EnumMemberAttribute(Value="78")] + Bgra10 = 78, - public TruncationParameters() - { - _truncationMode = AindVrForagingDataSchema.TruncationParametersTruncationMode.Exclude; - _min = 0D; - _max = 0D; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="79")] + Bgra10p = 79, - protected TruncationParameters(TruncationParameters other) - { - _truncationMode = other._truncationMode; - _min = other._min; - _max = other._max; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="80")] + Bgra12 = 80, - /// - /// Mode of truncation to apply - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_mode")] - [System.ComponentModel.DescriptionAttribute("Mode of truncation to apply")] - public TruncationParametersTruncationMode TruncationMode - { - get - { - return _truncationMode; - } - set - { - _truncationMode = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="81")] + Bgra12p = 81, - /// - /// Minimum value of the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("min")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the sampled distribution")] - public double Min - { - get - { - return _min; - } - set - { - _min = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="82")] + Bgra14 = 82, - /// - /// Maximum value of the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("max")] - [System.ComponentModel.DescriptionAttribute("Maximum value of the sampled distribution")] - public double Max - { - get - { - return _max; - } - set - { - _max = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="83")] + Bgra16 = 83, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TruncationParameters(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="84")] + Rgba32f = 84, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TruncationParameters(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="85")] + Bgr10 = 85, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("TruncationMode = " + _truncationMode + ", "); - stringBuilder.Append("Min = " + _min + ", "); - stringBuilder.Append("Max = " + _max); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="86")] + Bgr10p = 86, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// A uniform probability distribution. - /// - ///All values between min and max have equal probability of being sampled. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A uniform probability distribution.\n\nAll values between min and max have equal pr" + - "obability of being sampled.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class UniformDistribution : Distribution - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="87")] + Bgr12 = 87, - private UniformDistributionParameters _distributionParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="88")] + Bgr12p = 88, - private TruncationParameters _truncationParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="89")] + Bgr14 = 89, - private ScalingParameters _scalingParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="90")] + Bgr16 = 90, - public UniformDistribution() - { - _distributionParameters = new UniformDistributionParameters(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="91")] + Bgr565p = 91, - protected UniformDistribution(UniformDistribution other) : - base(other) - { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="92")] + R8 = 92, - /// - /// Parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public UniformDistributionParameters DistributionParameters - { - get - { - return _distributionParameters; - } - set - { - _distributionParameters = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="93")] + R10 = 93, - /// - /// Truncation parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters - { - get - { - return _truncationParameters; - } - set - { - _truncationParameters = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="94")] + R12 = 94, - /// - /// Scaling parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters - { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="95")] + R16 = 95, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new UniformDistribution(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="96")] + G8 = 96, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new UniformDistribution(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="97")] + G10 = 97, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a uniform distribution. - /// - ///Defined by minimum and maximum bounds of the distribution. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a uniform distribution.\n\nDefined by minimum and maximum bounds of " + - "the distribution.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class UniformDistributionParameters - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="98")] + G12 = 98, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="99")] + G16 = 99, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] + B8 = 100, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="101")] + B10 = 101, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="102")] + B12 = 102, - private string _family; + [System.Runtime.Serialization.EnumMemberAttribute(Value="103")] + B16 = 103, - private double _min; + [System.Runtime.Serialization.EnumMemberAttribute(Value="104")] + Coord3dAbc8 = 104, - private double _max; + [System.Runtime.Serialization.EnumMemberAttribute(Value="105")] + Coord3dAbc8Planar = 105, - public UniformDistributionParameters() - { - _family = "Uniform"; - _min = 0D; - _max = 0D; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="106")] + Coord3dAbc10p = 106, - protected UniformDistributionParameters(UniformDistributionParameters other) - { - _family = other._family; - _min = other._min; - _max = other._max; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="107")] + Coord3dAbc10pPlanar = 107, - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="108")] + Coord3dAbc12p = 108, - /// - /// Minimum value of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("min")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the distribution")] - public double Min - { - get - { - return _min; - } - set - { - _min = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="109")] + Coord3dAbc12pPlanar = 109, - /// - /// Maximum value of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("max")] - [System.ComponentModel.DescriptionAttribute("Maximum value of the distribution")] - public double Max - { - get - { - return _max; - } - set - { - _max = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="110")] + Coord3dAbc16 = 110, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new UniformDistributionParameters(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="111")] + Coord3dAbc16Planar = 111, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new UniformDistributionParameters(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="112")] + Coord3dAbc32f = 112, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Min = " + _min + ", "); - stringBuilder.Append("Max = " + _max); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="113")] + Coord3dAbc32fPlanar = 113, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Enumeration of parameters that can be targeted by numerical updaters. - /// - ///These targets define which task parameters can be dynamically modified - ///during task execution to adapt to animal performance or experimental needs. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum UpdaterTarget - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="114")] + Coord3dAc8 = 114, - [System.Runtime.Serialization.EnumMemberAttribute(Value="StopDurationOffset")] - StopDurationOffset = 0, + [System.Runtime.Serialization.EnumMemberAttribute(Value="115")] + Coord3dAc8Planar = 115, - [System.Runtime.Serialization.EnumMemberAttribute(Value="StopVelocityThreshold")] - StopVelocityThreshold = 1, + [System.Runtime.Serialization.EnumMemberAttribute(Value="116")] + Coord3dAc10p = 116, - [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardDelayOffset")] - RewardDelayOffset = 2, - } - - - /// - /// FFMPEG video writer configuration. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] - [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] - [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] - [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriter - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="117")] + Coord3dAc10pPlanar = 117, - public VideoWriter() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="118")] + Coord3dAc12p = 118, - protected VideoWriter(VideoWriter other) - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="119")] + Coord3dAc12pPlanar = 119, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriter(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="120")] + Coord3dAc16 = 120, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriter(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="121")] + Coord3dAc16Planar = 121, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="122")] + Coord3dAc32f = 122, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// FFMPEG video writer configuration. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriterFfmpeg : VideoWriter - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="123")] + Coord3dAc32fPlanar = 123, - private int _frameRate; + [System.Runtime.Serialization.EnumMemberAttribute(Value="124")] + Coord3dA8 = 124, - private string _containerExtension; + [System.Runtime.Serialization.EnumMemberAttribute(Value="125")] + Coord3dA10p = 125, - private string _outputArguments; + [System.Runtime.Serialization.EnumMemberAttribute(Value="126")] + Coord3dA12p = 126, - private string _inputArguments; + [System.Runtime.Serialization.EnumMemberAttribute(Value="127")] + Coord3dA16 = 127, - public VideoWriterFfmpeg() - { - _frameRate = 30; - _containerExtension = "mkv"; - _outputArguments = "-vf \"scale=out_range=full,setparams=range=full:colorspace=bt709:color_primaries=bt709:color_trc=linear\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p3 -rc vbr -cq 18 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M -f matroska -write_crc32 0"; - _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="128")] + Coord3dA32f = 128, - protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : - base(other) - { - _frameRate = other._frameRate; - _containerExtension = other._containerExtension; - _outputArguments = other._outputArguments; - _inputArguments = other._inputArguments; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="129")] + Coord3dB8 = 129, - /// - /// Encoding frame rate - /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] - public int FrameRate - { - get - { - return _frameRate; - } - set - { - _frameRate = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="130")] + Coord3dB10p = 130, - /// - /// Container extension - /// - [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] - [System.ComponentModel.DescriptionAttribute("Container extension")] - public string ContainerExtension - { - get - { - return _containerExtension; - } - set - { - _containerExtension = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="131")] + Coord3dB12p = 131, - /// - /// Output arguments - /// - [Newtonsoft.Json.JsonPropertyAttribute("output_arguments")] - [System.ComponentModel.DescriptionAttribute("Output arguments")] - public string OutputArguments - { - get - { - return _outputArguments; - } - set - { - _outputArguments = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="132")] + Coord3dB16 = 132, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="133")] + Coord3dB32f = 133, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="134")] + Coord3dC8 = 134, - /// - /// Input arguments - /// - [Newtonsoft.Json.JsonPropertyAttribute("input_arguments")] - [System.ComponentModel.DescriptionAttribute("Input arguments")] - public string InputArguments - { - get - { - return _inputArguments; - } - set - { - _inputArguments = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="135")] + Coord3dC10p = 135, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="136")] + Coord3dC12p = 136, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterFfmpeg(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="137")] + Coord3dC16 = 137, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("FrameRate = " + _frameRate + ", "); - stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); - stringBuilder.Append("OutputArguments = " + _outputArguments + ", "); - stringBuilder.Append("InputArguments = " + _inputArguments); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="138")] + Coord3dC32f = 138, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="139")] + Confidence1 = 139, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="140")] + Confidence1p = 140, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="141")] + Confidence8 = 141, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="142")] + Confidence16 = 142, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="143")] + Confidence32f = 143, } /// - /// OpenCV video writer configuration. + /// Defines visual texture properties for VR environment surfaces. + /// + ///Textures are applied to walls, floors, and other surfaces in the virtual + ///environment to provide visual cues and context for the foraging task. + /// + ///Texture name must correspond to a valid texture asset loaded in the workflow. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("OpenCV video writer configuration.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines visual texture properties for VR environment surfaces. + + Textures are applied to walls, floors, and other surfaces in the virtual + environment to provide visual cues and context for the foraging task. + + Texture name must correspond to a valid texture asset loaded in the workflow.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriterOpenCv : VideoWriter + public partial class Texture { - private int _frameRate; - - private string _containerExtension; + private string _name; - private string _fourCc; + private Size _size; - public VideoWriterOpenCv() + public Texture() { - _frameRate = 30; - _containerExtension = "avi"; - _fourCc = "FMP4"; + _name = "default"; + _size = new Size(); } - protected VideoWriterOpenCv(VideoWriterOpenCv other) : - base(other) + protected Texture(Texture other) { - _frameRate = other._frameRate; - _containerExtension = other._containerExtension; - _fourCc = other._fourCc; + _name = other._name; + _size = other._size; } /// - /// Encoding frame rate + /// Name of the texture /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] - public int FrameRate + [Newtonsoft.Json.JsonPropertyAttribute("name")] + [System.ComponentModel.DescriptionAttribute("Name of the texture")] + public string Name { get { - return _frameRate; + return _name; } set { - _frameRate = value; + _name = value; } } /// - /// Container extension + /// Size of the texture /// - [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] - [System.ComponentModel.DescriptionAttribute("Container extension")] - public string ContainerExtension + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("size")] + [System.ComponentModel.DescriptionAttribute("Size of the texture")] + public Size Size { get { - return _containerExtension; + return _size; } set { - _containerExtension = value; + _size = value; } } - /// - /// Four character code - /// - [Newtonsoft.Json.JsonPropertyAttribute("four_cc")] - [System.ComponentModel.DescriptionAttribute("Four character code")] - public string FourCc + public System.IObservable Generate() { - get - { - return _fourCc; - } - set - { - _fourCc = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Texture(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterOpenCv(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new Texture(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterOpenCv(this)); + stringBuilder.Append("Name = " + _name + ", "); + stringBuilder.Append("Size = " + _size); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("FrameRate = " + _frameRate + ", "); - stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); - stringBuilder.Append("FourCc = " + _fourCc); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - ///Represents a specific virtual site instance in the VR environment. - /// - ///This class defines a concrete virtual site with specific properties like position, - ///length, and associated specifications. It is typically generated from VirtualSiteGenerator - ///templates rather than being directly instantiated in the DSL. - /// - ///Note: This class is primarily used internally for runtime site generation - ///and is not meant to be directly instantiated in task configuration DSL. + /// A calibrated treadmill device /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - Represents a specific virtual site instance in the VR environment. - - This class defines a concrete virtual site with specific properties like position, - length, and associated specifications. It is typically generated from VirtualSiteGenerator - templates rather than being directly instantiated in the DSL. - - Note: This class is primarily used internally for runtime site generation - and is not meant to be directly instantiated in task configuration DSL.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A calibrated treadmill device")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSite + public partial class Treadmill { - private int _id; - - private VirtualSiteLabels _label; - - private double _length; - - private double _startPosition; - - private OdorSpecification _odorSpecification; - - private VirtualSiteRewardSpecification _rewardSpecification; - - private RenderSpecification _renderSpecification; + private string _deviceType; - private TreadmillSpecification _treadmillSpecification; + private TreadmillCalibration _calibration; - public VirtualSite() - { - _id = 0; - _label = AindVrForagingDataSchema.VirtualSiteLabels.Unspecified; - _length = 20D; - _startPosition = 0D; - _renderSpecification = new RenderSpecification(); - } + private int _whoAmI; - protected VirtualSite(VirtualSite other) - { - _id = other._id; - _label = other._label; - _length = other._length; - _startPosition = other._startPosition; - _odorSpecification = other._odorSpecification; - _rewardSpecification = other._rewardSpecification; - _renderSpecification = other._renderSpecification; - _treadmillSpecification = other._treadmillSpecification; - } + private string _serialNumber; - /// - /// Id of the virtual site - /// - [Newtonsoft.Json.JsonPropertyAttribute("id")] - [System.ComponentModel.DescriptionAttribute("Id of the virtual site")] - public int Id - { - get - { - return _id; - } - set - { - _id = value; - } - } + private string _portName; - /// - /// Label of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("label")] - [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] - public VirtualSiteLabels Label + public Treadmill() { - get - { - return _label; - } - set - { - _label = value; - } + _deviceType = "Treadmill"; + _calibration = new TreadmillCalibration(); + _whoAmI = 1402; } - /// - /// Length of the virtual site (cm) - /// - [Newtonsoft.Json.JsonPropertyAttribute("length")] - [System.ComponentModel.DescriptionAttribute("Length of the virtual site (cm)")] - public double Length + protected Treadmill(Treadmill other) { - get - { - return _length; - } - set - { - _length = value; - } + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Start position of the virtual site (cm) - /// - [Newtonsoft.Json.JsonPropertyAttribute("start_position")] - [System.ComponentModel.DescriptionAttribute("Start position of the virtual site (cm)")] - public double StartPosition + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _startPosition; + return _deviceType; } set { - _startPosition = value; + _deviceType = value; } } - /// - /// The optional odor specification of the virtual site - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] - [System.ComponentModel.DescriptionAttribute("The optional odor specification of the virtual site")] - public OdorSpecification OdorSpecification + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + public TreadmillCalibration Calibration { get { - return _odorSpecification; + return _calibration; } set { - _odorSpecification = value; + _calibration = value; } } - /// - /// The optional reward specification of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] - [System.ComponentModel.DescriptionAttribute("The optional reward specification of the virtual site")] - public VirtualSiteRewardSpecification RewardSpecification + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _rewardSpecification; + return _whoAmI; } set { - _rewardSpecification = value; + _whoAmI = value; } } /// - /// The optional render specification of the virtual site + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] - [System.ComponentModel.DescriptionAttribute("The optional render specification of the virtual site")] - public RenderSpecification RenderSpecification + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _renderSpecification; + return _serialNumber; } set { - _renderSpecification = value; + _serialNumber = value; } } /// - /// Treadmill specification + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] - [System.ComponentModel.DescriptionAttribute("Treadmill specification")] - public TreadmillSpecification TreadmillSpecification + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _treadmillSpecification; + return _portName; } set { - _treadmillSpecification = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSite(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSite(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Id = " + _id + ", "); - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("Length = " + _length + ", "); - stringBuilder.Append("StartPosition = " + _startPosition + ", "); - stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); - stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); - stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); - stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -12920,134 +9158,224 @@ public override string ToString() /// - /// Generates virtual site specifications with randomized properties. - /// - ///This class defines templates for creating virtual sites with variable properties - ///like length and rendering specifications. It's used to generate diverse virtual - ///environments for the foraging task. + /// Treadmill calibration class /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Generates virtual site specifications with randomized properties. - - This class defines templates for creating virtual sites with variable properties - like length and rendering specifications. It's used to generate diverse virtual - environments for the foraging task.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Treadmill calibration class")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSiteGenerator + public partial class TreadmillCalibration { - private RenderSpecification _renderSpecification; + private System.DateTimeOffset? _date; - private VirtualSiteLabels _label; + private double _wheelDiameter; - private Distribution _lengthDistribution; + private int _pulsesPerRevolution; - private TreadmillSpecification _treadmillSpecification; + private bool _invertDirection; - public VirtualSiteGenerator() + private System.Collections.Generic.List> _brakeLookupCalibration; + + public TreadmillCalibration() { - _renderSpecification = new RenderSpecification(); - _label = AindVrForagingDataSchema.VirtualSiteLabels.Unspecified; - _lengthDistribution = new Distribution(); + _wheelDiameter = 15D; + _pulsesPerRevolution = 28800; + _invertDirection = false; + _brakeLookupCalibration = new System.Collections.Generic.List>(); } - protected VirtualSiteGenerator(VirtualSiteGenerator other) + protected TreadmillCalibration(TreadmillCalibration other) { - _renderSpecification = other._renderSpecification; - _label = other._label; - _lengthDistribution = other._lengthDistribution; - _treadmillSpecification = other._treadmillSpecification; + _date = other._date; + _wheelDiameter = other._wheelDiameter; + _pulsesPerRevolution = other._pulsesPerRevolution; + _invertDirection = other._invertDirection; + _brakeLookupCalibration = other._brakeLookupCalibration; } /// - /// Contrast of the environment + /// Date of the calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] - [System.ComponentModel.DescriptionAttribute("Contrast of the environment")] - public RenderSpecification RenderSpecification + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset? Date + { + get + { + return _date; + } + set + { + _date = value; + } + } + + /// + /// Wheel diameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("wheel_diameter")] + [System.ComponentModel.DescriptionAttribute("Wheel diameter")] + public double WheelDiameter + { + get + { + return _wheelDiameter; + } + set + { + _wheelDiameter = value; + } + } + + /// + /// Pulses per revolution + /// + [Newtonsoft.Json.JsonPropertyAttribute("pulses_per_revolution")] + [System.ComponentModel.DescriptionAttribute("Pulses per revolution")] + public int PulsesPerRevolution + { + get + { + return _pulsesPerRevolution; + } + set + { + _pulsesPerRevolution = value; + } + } + + /// + /// Invert direction + /// + [Newtonsoft.Json.JsonPropertyAttribute("invert_direction")] + [System.ComponentModel.DescriptionAttribute("Invert direction")] + public bool InvertDirection + { + get + { + return _invertDirection; + } + set + { + _invertDirection = value; + } + } + + /// + /// Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16]) + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("brake_lookup_calibration")] + [System.ComponentModel.DescriptionAttribute("Brake lookup calibration. Each pair of values define (input [torque], output [bra" + + "ke set-point U16])")] + public System.Collections.Generic.List> BrakeLookupCalibration + { + get + { + return _brakeLookupCalibration; + } + set + { + _brakeLookupCalibration = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibration(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibration(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("WheelDiameter = " + _wheelDiameter + ", "); + stringBuilder.Append("PulsesPerRevolution = " + _pulsesPerRevolution + ", "); + stringBuilder.Append("InvertDirection = " + _invertDirection + ", "); + stringBuilder.Append("BrakeLookupCalibration = " + _brakeLookupCalibration); + return true; + } + + public override string ToString() { - get - { - return _renderSpecification; - } - set + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _renderSpecification = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + /// + /// Defines treadmill friction properties for virtual sites. + /// + ///This class controls the friction experienced by the animal when moving + ///through different virtual sites, allowing for varied locomotion dynamics + ///across different regions of the environment. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines treadmill friction properties for virtual sites.\n\nThis class controls the" + + " friction experienced by the animal when moving\nthrough different virtual sites," + + " allowing for varied locomotion dynamics\nacross different regions of the environ" + + "ment.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class TreadmillSpecification + { - /// - /// Label of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("label")] - [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] - public VirtualSiteLabels Label + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _friction; + + public TreadmillSpecification() { - get - { - return _label; - } - set - { - _label = value; - } } - /// - /// Distribution of the length of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("length_distribution")] - [System.ComponentModel.DescriptionAttribute("Distribution of the length of the virtual site")] - public Distribution LengthDistribution + protected TreadmillSpecification(TreadmillSpecification other) { - get - { - return _lengthDistribution; - } - set - { - _lengthDistribution = value; - } + _friction = other._friction; } /// - /// Treadmill specification + /// Friction of the treadmill (0-1). The drawn value must be between 0 and 1 /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] - [System.ComponentModel.DescriptionAttribute("Treadmill specification")] - public TreadmillSpecification TreadmillSpecification + [Newtonsoft.Json.JsonPropertyAttribute("friction")] + [System.ComponentModel.DescriptionAttribute("Friction of the treadmill (0-1). The drawn value must be between 0 and 1")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Friction { get { - return _treadmillSpecification; + return _friction; } set { - _treadmillSpecification = value; + _friction = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteGenerator(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteGenerator(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("LengthDistribution = " + _lengthDistribution + ", "); - stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); + stringBuilder.Append("Friction = " + _friction); return true; } @@ -13067,430 +9395,535 @@ public override string ToString() /// - /// Enumeration of virtual site types in the VR foraging environment. + /// Enumeration of parameters that can be targeted by numerical updaters. /// - ///These labels categorize different regions of the virtual environment, - ///each serving different functional roles in the foraging task. + ///These targets define which task parameters can be dynamically modified + ///during task execution to adapt to animal performance or experimental needs. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum VirtualSiteLabels + public enum UpdaterTarget { - [System.Runtime.Serialization.EnumMemberAttribute(Value="Unspecified")] - Unspecified = 0, + [System.Runtime.Serialization.EnumMemberAttribute(Value="StopDurationOffset")] + StopDurationOffset = 0, - [System.Runtime.Serialization.EnumMemberAttribute(Value="InterPatch")] - InterPatch = 1, + [System.Runtime.Serialization.EnumMemberAttribute(Value="StopVelocityThreshold")] + StopVelocityThreshold = 1, - [System.Runtime.Serialization.EnumMemberAttribute(Value="PostPatch")] - PostPatch = 2, + [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardDelayOffset")] + RewardDelayOffset = 2, + } + + + /// + /// FFMPEG video writer configuration. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] + [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] + [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class VideoWriter + { - [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardSite")] - RewardSite = 3, + public VideoWriter() + { + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="InterSite")] - InterSite = 4, + protected VideoWriter(VideoWriter other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriter(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriter(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } } /// - /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - ///Specifies reward parameters and behavior for a virtual site. - /// - ///Note: This class is primarily used internally for runtime site generation - ///and is not meant to be directly instantiated in task configuration DSL. + /// FFMPEG video writer configuration. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - Specifies reward parameters and behavior for a virtual site. - - Note: This class is primarily used internally for runtime site generation - and is not meant to be directly instantiated in task configuration DSL.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSiteRewardSpecification + public partial class VideoWriterFfmpeg : VideoWriter { - private OperantLogic _operantLogic; + private int _frameRate; - private Distribution _delay; + private string _containerExtension; - public VirtualSiteRewardSpecification() + private string _outputArguments; + + private string _inputArguments; + + public VideoWriterFfmpeg() { - _operantLogic = new OperantLogic(); - _delay = new Distribution(); + _frameRate = 30; + _containerExtension = "mkv"; + _outputArguments = "-vf \"scale=out_range=full,setparams=range=full:colorspace=bt709:color_primaries=bt709:color_trc=linear\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p3 -rc vbr -cq 18 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M -f matroska -write_crc32 0"; + _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; } - protected VirtualSiteRewardSpecification(VirtualSiteRewardSpecification other) + protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : + base(other) { - _operantLogic = other._operantLogic; - _delay = other._delay; + _frameRate = other._frameRate; + _containerExtension = other._containerExtension; + _outputArguments = other._outputArguments; + _inputArguments = other._inputArguments; } /// - /// The optional operant logic of the reward + /// Encoding frame rate /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operant_logic", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] - public OperantLogic OperantLogic + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] + public int FrameRate { get { - return _operantLogic; + return _frameRate; } set { - _operantLogic = value; + _frameRate = value; } } /// - /// The optional distribution where the delay to reward will be drawn from + /// Container extension /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] - public Distribution Delay + [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] + [System.ComponentModel.DescriptionAttribute("Container extension")] + public string ContainerExtension { get { - return _delay; + return _containerExtension; } set { - _delay = value; + _containerExtension = value; + } + } + + /// + /// Output arguments + /// + [Newtonsoft.Json.JsonPropertyAttribute("output_arguments")] + [System.ComponentModel.DescriptionAttribute("Output arguments")] + public string OutputArguments + { + get + { + return _outputArguments; + } + set + { + _outputArguments = value; + } + } + + /// + /// Input arguments + /// + [Newtonsoft.Json.JsonPropertyAttribute("input_arguments")] + [System.ComponentModel.DescriptionAttribute("Input arguments")] + public string InputArguments + { + get + { + return _inputArguments; + } + set + { + _inputArguments = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteRewardSpecification(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteRewardSpecification(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); - stringBuilder.Append("Delay = " + _delay); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterFfmpeg(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("OutputArguments = " + _outputArguments + ", "); + stringBuilder.Append("InputArguments = " + _inputArguments); + return true; } } /// - /// Defines a visual corridor segment in the VR environment. - /// - ///Visual corridors are the basic building blocks of the VR environment, - ///defining spatial regions with specific textures, dimensions, and positions. + /// OpenCV video writer configuration. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines a visual corridor segment in the VR environment.\n\nVisual corridors are th" + - "e basic building blocks of the VR environment,\ndefining spatial regions with spe" + - "cific textures, dimensions, and positions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("OpenCV video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VisualCorridor + public partial class VideoWriterOpenCv : VideoWriter { - private int _id; - - private Size _size; - - private double _startPosition; - - private double _length; - - private WallTextures _textures; + private int _frameRate; - public VisualCorridor() - { - _id = 0; - _size = new Size(); - _startPosition = 0D; - _length = 120D; - _textures = new WallTextures(); - } + private string _containerExtension; - protected VisualCorridor(VisualCorridor other) - { - _id = other._id; - _size = other._size; - _startPosition = other._startPosition; - _length = other._length; - _textures = other._textures; - } + private string _fourCc; - /// - /// Id of the visual corridor object - /// - [Newtonsoft.Json.JsonPropertyAttribute("id")] - [System.ComponentModel.DescriptionAttribute("Id of the visual corridor object")] - public int Id + public VideoWriterOpenCv() { - get - { - return _id; - } - set - { - _id = value; - } + _frameRate = 30; + _containerExtension = "avi"; + _fourCc = "FMP4"; } - /// - /// Size of the corridor (cm) - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("size")] - [System.ComponentModel.DescriptionAttribute("Size of the corridor (cm)")] - public Size Size + protected VideoWriterOpenCv(VideoWriterOpenCv other) : + base(other) { - get - { - return _size; - } - set - { - _size = value; - } + _frameRate = other._frameRate; + _containerExtension = other._containerExtension; + _fourCc = other._fourCc; } /// - /// Start position of the corridor (cm) + /// Encoding frame rate /// - [Newtonsoft.Json.JsonPropertyAttribute("start_position")] - [System.ComponentModel.DescriptionAttribute("Start position of the corridor (cm)")] - public double StartPosition + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] + public int FrameRate { get { - return _startPosition; + return _frameRate; } set { - _startPosition = value; + _frameRate = value; } } /// - /// Length of the corridor site (cm) + /// Container extension /// - [Newtonsoft.Json.JsonPropertyAttribute("length")] - [System.ComponentModel.DescriptionAttribute("Length of the corridor site (cm)")] - public double Length + [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] + [System.ComponentModel.DescriptionAttribute("Container extension")] + public string ContainerExtension { get { - return _length; + return _containerExtension; } set { - _length = value; + _containerExtension = value; } } /// - /// The textures of the corridor + /// Four character code /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("textures", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The textures of the corridor")] - public WallTextures Textures + [Newtonsoft.Json.JsonPropertyAttribute("four_cc")] + [System.ComponentModel.DescriptionAttribute("Four character code")] + public string FourCc { get { - return _textures; + return _fourCc; } set { - _textures = value; + _fourCc = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VisualCorridor(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new VisualCorridor(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterOpenCv(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Id = " + _id + ", "); - stringBuilder.Append("Size = " + _size + ", "); - stringBuilder.Append("StartPosition = " + _startPosition + ", "); - stringBuilder.Append("Length = " + _length + ", "); - stringBuilder.Append("Textures = " + _textures); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterOpenCv(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("FourCc = " + _fourCc); + return true; } } /// - /// Defines textures for all walls of a visual corridor in the VR environment. + /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + ///Represents a specific virtual site instance in the VR environment. /// - ///This class specifies the visual appearance of corridor surfaces including - ///floor, ceiling, and side walls, allowing for complex visual environments - ///with different textures on each surface. + ///This class defines a concrete virtual site with specific properties like position, + ///length, and associated specifications. It is typically generated from VirtualSiteGenerator + ///templates rather than being directly instantiated in the DSL. + /// + ///Note: This class is primarily used internally for runtime site generation + ///and is not meant to be directly instantiated in task configuration DSL. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines textures for all walls of a visual corridor in the VR environment. + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + Represents a specific virtual site instance in the VR environment. - This class specifies the visual appearance of corridor surfaces including - floor, ceiling, and side walls, allowing for complex visual environments - with different textures on each surface.")] + This class defines a concrete virtual site with specific properties like position, + length, and associated specifications. It is typically generated from VirtualSiteGenerator + templates rather than being directly instantiated in the DSL. + + Note: This class is primarily used internally for runtime site generation + and is not meant to be directly instantiated in task configuration DSL.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WallTextures + public partial class VirtualSite { - private Texture _floor; + private int _id; - private Texture _ceiling; + private VirtualSiteLabels _label; - private Texture _left; + private double _length; + + private double _startPosition; + + private OdorSpecification _odorSpecification; + + private VirtualSiteRewardSpecification _rewardSpecification; + + private RenderSpecification _renderSpecification; + + private TreadmillSpecification _treadmillSpecification; + + public VirtualSite() + { + _id = 0; + _label = VirtualSiteLabels.Unspecified; + _length = 20D; + _startPosition = 0D; + _renderSpecification = new RenderSpecification(); + } + + protected VirtualSite(VirtualSite other) + { + _id = other._id; + _label = other._label; + _length = other._length; + _startPosition = other._startPosition; + _odorSpecification = other._odorSpecification; + _rewardSpecification = other._rewardSpecification; + _renderSpecification = other._renderSpecification; + _treadmillSpecification = other._treadmillSpecification; + } + + /// + /// Id of the virtual site + /// + [Newtonsoft.Json.JsonPropertyAttribute("id")] + [System.ComponentModel.DescriptionAttribute("Id of the virtual site")] + public int Id + { + get + { + return _id; + } + set + { + _id = value; + } + } - private Texture _right; + /// + /// Label of the virtual site + /// + [Newtonsoft.Json.JsonPropertyAttribute("label")] + [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] + public VirtualSiteLabels Label + { + get + { + return _label; + } + set + { + _label = value; + } + } - public WallTextures() + /// + /// Length of the virtual site (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("length")] + [System.ComponentModel.DescriptionAttribute("Length of the virtual site (cm)")] + public double Length { - _floor = new Texture(); - _ceiling = new Texture(); - _left = new Texture(); - _right = new Texture(); + get + { + return _length; + } + set + { + _length = value; + } } - protected WallTextures(WallTextures other) + /// + /// Start position of the virtual site (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("start_position")] + [System.ComponentModel.DescriptionAttribute("Start position of the virtual site (cm)")] + public double StartPosition { - _floor = other._floor; - _ceiling = other._ceiling; - _left = other._left; - _right = other._right; + get + { + return _startPosition; + } + set + { + _startPosition = value; + } } /// - /// The texture of the floor + /// The optional odor specification of the virtual site /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("floor", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the floor")] - public Texture Floor + [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] + [System.ComponentModel.DescriptionAttribute("The optional odor specification of the virtual site")] + public OdorSpecification OdorSpecification { get { - return _floor; + return _odorSpecification; } set { - _floor = value; + _odorSpecification = value; } } /// - /// The texture of the ceiling + /// The optional reward specification of the virtual site /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("ceiling", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the ceiling")] - public Texture Ceiling + [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] + [System.ComponentModel.DescriptionAttribute("The optional reward specification of the virtual site")] + public VirtualSiteRewardSpecification RewardSpecification { get { - return _ceiling; + return _rewardSpecification; } set { - _ceiling = value; + _rewardSpecification = value; } } /// - /// The texture of the left + /// The optional render specification of the virtual site /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("left", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the left")] - public Texture Left + [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] + [System.ComponentModel.DescriptionAttribute("The optional render specification of the virtual site")] + public RenderSpecification RenderSpecification { get { - return _left; + return _renderSpecification; } set { - _left = value; + _renderSpecification = value; } } /// - /// The texture of the right + /// Treadmill specification /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("right", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the right")] - public Texture Right + [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] + [System.ComponentModel.DescriptionAttribute("Treadmill specification")] + public TreadmillSpecification TreadmillSpecification { get { - return _right; + return _treadmillSpecification; } set { - _right = value; + _treadmillSpecification = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WallTextures(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSite(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WallTextures(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSite(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Floor = " + _floor + ", "); - stringBuilder.Append("Ceiling = " + _ceiling + ", "); - stringBuilder.Append("Left = " + _left + ", "); - stringBuilder.Append("Right = " + _right); + stringBuilder.Append("Id = " + _id + ", "); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("Length = " + _length + ", "); + stringBuilder.Append("StartPosition = " + _startPosition + ", "); + stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); + stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); + stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); + stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); return true; } @@ -13510,189 +9943,133 @@ public override string ToString() /// - /// Represents a water valve calibration. + /// Generates virtual site specifications with randomized properties. + /// + ///This class defines templates for creating virtual sites with variable properties + ///like length and rendering specifications. It's used to generate diverse virtual + ///environments for the foraging task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a water valve calibration.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Generates virtual site specifications with randomized properties. + + This class defines templates for creating virtual sites with variable properties + like length and rendering specifications. It's used to generate diverse virtual + environments for the foraging task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WaterValveCalibration + public partial class VirtualSiteGenerator { - private System.DateTimeOffset? _date; - - private System.Collections.Generic.List _measurements; - - private System.Collections.Generic.Dictionary _intervalAverage; - - private double _slope; - - private double _offset; - - private double? _r2; + private RenderSpecification _renderSpecification; - private System.Collections.Generic.List _validDomain; + private VirtualSiteLabels _label; - public WaterValveCalibration() - { - _measurements = new System.Collections.Generic.List(); - } + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _lengthDistribution; - protected WaterValveCalibration(WaterValveCalibration other) - { - _date = other._date; - _measurements = other._measurements; - _intervalAverage = other._intervalAverage; - _slope = other._slope; - _offset = other._offset; - _r2 = other._r2; - _validDomain = other._validDomain; - } + private TreadmillSpecification _treadmillSpecification; - /// - /// Date of the calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the calibration")] - public System.DateTimeOffset? Date + public VirtualSiteGenerator() { - get - { - return _date; - } - set - { - _date = value; - } + _renderSpecification = new RenderSpecification(); + _label = VirtualSiteLabels.Unspecified; + _lengthDistribution = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - /// - /// List of measurements - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("measurements")] - [System.ComponentModel.DescriptionAttribute("List of measurements")] - public System.Collections.Generic.List Measurements + protected VirtualSiteGenerator(VirtualSiteGenerator other) { - get - { - return _measurements; - } - set - { - _measurements = value; - } + _renderSpecification = other._renderSpecification; + _label = other._label; + _lengthDistribution = other._lengthDistribution; + _treadmillSpecification = other._treadmillSpecification; } /// - /// Dictionary keyed by measured valve interval and corresponding average single event volume. + /// Contrast of the environment /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("interval_average")] - [System.ComponentModel.DescriptionAttribute("Dictionary keyed by measured valve interval and corresponding average single even" + - "t volume.")] - public System.Collections.Generic.Dictionary IntervalAverage - { - get - { - return _intervalAverage; - } - set - { - _intervalAverage = value; - } - } - - /// - /// Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) - /// - [Newtonsoft.Json.JsonPropertyAttribute("slope", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] - public double Slope + [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] + [System.ComponentModel.DescriptionAttribute("Contrast of the environment")] + public RenderSpecification RenderSpecification { get { - return _slope; + return _renderSpecification; } set { - _slope = value; + _renderSpecification = value; } } /// - /// Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) + /// Label of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("offset", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] - public double Offset + [Newtonsoft.Json.JsonPropertyAttribute("label")] + [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] + public VirtualSiteLabels Label { get { - return _offset; + return _label; } set { - _offset = value; + _label = value; } } /// - /// R2 metric from the linear model. + /// Distribution of the length of the virtual site /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("r2")] - [System.ComponentModel.DescriptionAttribute("R2 metric from the linear model.")] - public double? R2 + [Newtonsoft.Json.JsonPropertyAttribute("length_distribution")] + [System.ComponentModel.DescriptionAttribute("Distribution of the length of the virtual site")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution LengthDistribution { get { - return _r2; + return _lengthDistribution; } set { - _r2 = value; + _lengthDistribution = value; } } /// - /// The optional time-intervals the calibration curve was calculated on. + /// Treadmill specification /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("valid_domain")] - [System.ComponentModel.DescriptionAttribute("The optional time-intervals the calibration curve was calculated on.")] - public System.Collections.Generic.List ValidDomain + [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] + [System.ComponentModel.DescriptionAttribute("Treadmill specification")] + public TreadmillSpecification TreadmillSpecification { get { - return _validDomain; + return _treadmillSpecification; } set { - _validDomain = value; + _treadmillSpecification = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteGenerator(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteGenerator(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Measurements = " + _measurements + ", "); - stringBuilder.Append("IntervalAverage = " + _intervalAverage + ", "); - stringBuilder.Append("Slope = " + _slope + ", "); - stringBuilder.Append("Offset = " + _offset + ", "); - stringBuilder.Append("R2 = " + _r2 + ", "); - stringBuilder.Append("ValidDomain = " + _validDomain); + stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("LengthDistribution = " + _lengthDistribution + ", "); + stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); return true; } @@ -13712,119 +10089,117 @@ public override string ToString() /// - /// Web camera device configuration. + /// Enumeration of virtual site types in the VR foraging environment. + /// + ///These labels categorize different regions of the virtual environment, + ///each serving different functional roles in the foraging task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Web camera device configuration.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WebCamera + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum VirtualSiteLabels { - private string _deviceType; + [System.Runtime.Serialization.EnumMemberAttribute(Value="Unspecified")] + Unspecified = 0, - private BaseModel _calibration; + [System.Runtime.Serialization.EnumMemberAttribute(Value="InterPatch")] + InterPatch = 1, - private int _index; + [System.Runtime.Serialization.EnumMemberAttribute(Value="PostPatch")] + PostPatch = 2, - private VideoWriter _videoWriter; + [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardSite")] + RewardSite = 3, - public WebCamera() - { - _deviceType = "WebCamera"; - _index = 0; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="InterSite")] + InterSite = 4, + } + + + /// + /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + ///Specifies reward parameters and behavior for a virtual site. + /// + ///Note: This class is primarily used internally for runtime site generation + ///and is not meant to be directly instantiated in task configuration DSL. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + Specifies reward parameters and behavior for a virtual site. + + Note: This class is primarily used internally for runtime site generation + and is not meant to be directly instantiated in task configuration DSL.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class VirtualSiteRewardSpecification + { - protected WebCamera(WebCamera other) - { - _deviceType = other._deviceType; - _calibration = other._calibration; - _index = other._index; - _videoWriter = other._videoWriter; - } + private OperantLogic _operantLogic; - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _delay; + + public VirtualSiteRewardSpecification() { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _operantLogic = new OperantLogic(); + _delay = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - /// - /// Calibration for the device. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] - public BaseModel Calibration + protected VirtualSiteRewardSpecification(VirtualSiteRewardSpecification other) { - get - { - return _calibration; - } - set - { - _calibration = value; - } + _operantLogic = other._operantLogic; + _delay = other._delay; } /// - /// Camera index + /// The optional operant logic of the reward /// - [Newtonsoft.Json.JsonPropertyAttribute("index")] - [System.ComponentModel.DescriptionAttribute("Camera index")] - public int Index + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("operant_logic", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] + public OperantLogic OperantLogic { get { - return _index; + return _operantLogic; } set { - _index = value; + _operantLogic = value; } } /// - /// Video writer. If not provided, no video will be saved. + /// The optional distribution where the delay to reward will be drawn from /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] - [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] - public VideoWriter VideoWriter + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Delay { get { - return _videoWriter; + return _delay; } set { - _videoWriter = value; + _delay = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WebCamera(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteRewardSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WebCamera(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteRewardSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("Index = " + _index + ", "); - stringBuilder.Append("VideoWriter = " + _videoWriter); + stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); + stringBuilder.Append("Delay = " + _delay); return true; } @@ -13844,101 +10219,152 @@ public override string ToString() /// - /// Represents a 3D vector with float coordinates. + /// Defines a visual corridor segment in the VR environment. + /// + ///Visual corridors are the basic building blocks of the VR environment, + ///defining spatial regions with specific textures, dimensions, and positions. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a 3D vector with float coordinates.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines a visual corridor segment in the VR environment.\n\nVisual corridors are th" + + "e basic building blocks of the VR environment,\ndefining spatial regions with spe" + + "cific textures, dimensions, and positions.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorServicesCommonVector3 + public partial class VisualCorridor { - private double _x; + private int _id; - private double _y; + private Size _size; - private double _z; + private double _startPosition; - public AindBehaviorServicesCommonVector3() + private double _length; + + private WallTextures _textures; + + public VisualCorridor() { - _x = 0D; - _y = 0D; - _z = 0D; + _id = 0; + _size = new Size(); + _startPosition = 0D; + _length = 120D; + _textures = new WallTextures(); } - protected AindBehaviorServicesCommonVector3(AindBehaviorServicesCommonVector3 other) + protected VisualCorridor(VisualCorridor other) { - _x = other._x; - _y = other._y; - _z = other._z; + _id = other._id; + _size = other._size; + _startPosition = other._startPosition; + _length = other._length; + _textures = other._textures; } /// - /// X coordinate of the vector + /// Id of the visual corridor object /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the vector")] - public double X + [Newtonsoft.Json.JsonPropertyAttribute("id")] + [System.ComponentModel.DescriptionAttribute("Id of the visual corridor object")] + public int Id { get { - return _x; + return _id; } set { - _x = value; + _id = value; } } /// - /// Y coordinate of the vector + /// Size of the corridor (cm) /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the vector")] - public double Y + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("size")] + [System.ComponentModel.DescriptionAttribute("Size of the corridor (cm)")] + public Size Size { get { - return _y; + return _size; + } + set + { + _size = value; + } + } + + /// + /// Start position of the corridor (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("start_position")] + [System.ComponentModel.DescriptionAttribute("Start position of the corridor (cm)")] + public double StartPosition + { + get + { + return _startPosition; + } + set + { + _startPosition = value; + } + } + + /// + /// Length of the corridor site (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("length")] + [System.ComponentModel.DescriptionAttribute("Length of the corridor site (cm)")] + public double Length + { + get + { + return _length; } set { - _y = value; + _length = value; } } /// - /// Z coordinate of the vector + /// The textures of the corridor /// - [Newtonsoft.Json.JsonPropertyAttribute("z")] - [System.ComponentModel.DescriptionAttribute("Z coordinate of the vector")] - public double Z + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("textures", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The textures of the corridor")] + public WallTextures Textures { get { - return _z; + return _textures; } set { - _z = value; + _textures = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorServicesCommonVector3(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VisualCorridor(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorServicesCommonVector3(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VisualCorridor(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Z = " + _z); + stringBuilder.Append("Id = " + _id + ", "); + stringBuilder.Append("Size = " + _size + ", "); + stringBuilder.Append("StartPosition = " + _startPosition + ", "); + stringBuilder.Append("Length = " + _length + ", "); + stringBuilder.Append("Textures = " + _textures); return true; } @@ -13958,197 +10384,136 @@ public override string ToString() /// - /// Represents a 3D point or vector with x, y, and z coordinates. + /// Defines textures for all walls of a visual corridor in the VR environment. /// - ///Used for 3D positioning and movement in the virtual reality environment, - ///including camera positions, object locations, and 3D transformations. + ///This class specifies the visual appearance of corridor surfaces including + ///floor, ceiling, and side walls, allowing for complex visual environments + ///with different textures on each surface. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a 3D point or vector with x, y, and z coordinates.\n\nUsed for 3D positi" + - "oning and movement in the virtual reality environment,\nincluding camera position" + - "s, object locations, and 3D transformations.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines textures for all walls of a visual corridor in the VR environment. + + This class specifies the visual appearance of corridor surfaces including + floor, ceiling, and side walls, allowing for complex visual environments + with different textures on each surface.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorVrForagingTaskLogicVector3 + public partial class WallTextures { - private double _x; + private Texture _floor; - private double _y; + private Texture _ceiling; - private double _z; + private Texture _left; - public AindBehaviorVrForagingTaskLogicVector3() + private Texture _right; + + public WallTextures() { - _x = 0D; - _y = 0D; - _z = 0D; + _floor = new Texture(); + _ceiling = new Texture(); + _left = new Texture(); + _right = new Texture(); } - protected AindBehaviorVrForagingTaskLogicVector3(AindBehaviorVrForagingTaskLogicVector3 other) + protected WallTextures(WallTextures other) { - _x = other._x; - _y = other._y; - _z = other._z; + _floor = other._floor; + _ceiling = other._ceiling; + _left = other._left; + _right = other._right; } /// - /// X coordinate of the point + /// The texture of the floor /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the point")] - public double X + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("floor", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the floor")] + public Texture Floor { get { - return _x; + return _floor; } set { - _x = value; + _floor = value; } } /// - /// Y coordinate of the point + /// The texture of the ceiling /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the point")] - public double Y + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("ceiling", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the ceiling")] + public Texture Ceiling { get { - return _y; + return _ceiling; } set { - _y = value; + _ceiling = value; } } /// - /// Z coordinate of the point + /// The texture of the left /// - [Newtonsoft.Json.JsonPropertyAttribute("z")] - [System.ComponentModel.DescriptionAttribute("Z coordinate of the point")] - public double Z + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("left", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the left")] + public Texture Left { get { - return _z; + return _left; } set { - _z = value; + _left = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorVrForagingTaskLogicVector3(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorVrForagingTaskLogicVector3(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Z = " + _z); - return true; - } - - public override string ToString() + /// + /// The texture of the right + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("right", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the right")] + public Texture Right { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _right; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Delay - { - - public Delay() - { - } - - protected Delay(Delay other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Delay(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Delay(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + set { - stringBuilder.Append(" "); + _right = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Amount - { - - public Amount() - { - } - - protected Amount(Amount other) - { } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Amount(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WallTextures(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Amount(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new WallTextures(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("Floor = " + _floor + ", "); + stringBuilder.Append("Ceiling = " + _ceiling + ", "); + stringBuilder.Append("Left = " + _left + ", "); + stringBuilder.Append("Right = " + _right); + return true; } public override string ToString() @@ -14166,169 +10531,190 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] + /// + /// Represents a water valve calibration. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a water valve calibration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Probability + public partial class WaterValveCalibration { - public Probability() - { - } - - protected Probability(Probability other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Probability(this))); - } + private System.DateTimeOffset? _date; - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Probability(this)); - } + private System.Collections.Generic.List _measurements; - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + private System.Collections.Generic.Dictionary _intervalAverage; - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Available - { + private double _slope; - public Available() - { - } + private double _offset; - protected Available(Available other) - { - } + private double? _r2; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Available(this))); - } + private System.Collections.Generic.List _validDomain; - public System.IObservable Generate(System.IObservable source) + public WaterValveCalibration() { - return System.Reactive.Linq.Observable.Select(source, _ => new Available(this)); + _measurements = new System.Collections.Generic.List(); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected WaterValveCalibration(WaterValveCalibration other) { - return false; + _date = other._date; + _measurements = other._measurements; + _intervalAverage = other._intervalAverage; + _slope = other._slope; + _offset = other._offset; + _r2 = other._r2; + _validDomain = other._validDomain; } - public override string ToString() + /// + /// Date of the calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset? Date { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _date; + } + set + { + _date = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Rate - { - - public Rate() - { - } - - protected Rate(Rate other) - { } - public System.IObservable Generate() + /// + /// List of measurements + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("measurements")] + [System.ComponentModel.DescriptionAttribute("List of measurements")] + public System.Collections.Generic.List Measurements { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rate(this))); + get + { + return _measurements; + } + set + { + _measurements = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Dictionary keyed by measured valve interval and corresponding average single event volume. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("interval_average")] + [System.ComponentModel.DescriptionAttribute("Dictionary keyed by measured valve interval and corresponding average single even" + + "t volume.")] + public System.Collections.Generic.Dictionary IntervalAverage { - return System.Reactive.Linq.Observable.Select(source, _ => new Rate(this)); + get + { + return _intervalAverage; + } + set + { + _intervalAverage = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) + /// + [Newtonsoft.Json.JsonPropertyAttribute("slope", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] + public double Slope { - return false; + get + { + return _slope; + } + set + { + _slope = value; + } } - public override string ToString() + /// + /// Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) + /// + [Newtonsoft.Json.JsonPropertyAttribute("offset", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] + public double Offset { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _offset; + } + set + { + _offset = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Value - { - public Value() + /// + /// R2 metric from the linear model. + /// + [Newtonsoft.Json.JsonPropertyAttribute("r2")] + [System.ComponentModel.DescriptionAttribute("R2 metric from the linear model.")] + public double? R2 { + get + { + return _r2; + } + set + { + _r2 = value; + } } - protected Value(Value other) + /// + /// The optional time-intervals the calibration curve was calculated on. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("valid_domain")] + [System.ComponentModel.DescriptionAttribute("The optional time-intervals the calibration curve was calculated on.")] + public System.Collections.Generic.List ValidDomain { + get + { + return _validDomain; + } + set + { + _validDomain = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Value(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Value(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("Measurements = " + _measurements + ", "); + stringBuilder.Append("IntervalAverage = " + _intervalAverage + ", "); + stringBuilder.Append("Slope = " + _slope + ", "); + stringBuilder.Append("Offset = " + _offset + ", "); + stringBuilder.Append("R2 = " + _r2 + ", "); + stringBuilder.Append("ValidDomain = " + _validDomain); + return true; } public override string ToString() @@ -14346,79 +10732,121 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] + /// + /// Web camera device configuration. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Web camera device configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LengthDistribution + public partial class WebCamera { - public LengthDistribution() - { - } + private string _deviceType; - protected LengthDistribution(LengthDistribution other) - { - } + private BaseModel _calibration; + + private int _index; + + private VideoWriter _videoWriter; - public System.IObservable Generate() + public WebCamera() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LengthDistribution(this))); + _deviceType = "WebCamera"; + _index = 0; } - public System.IObservable Generate(System.IObservable source) + protected WebCamera(WebCamera other) { - return System.Reactive.Linq.Observable.Select(source, _ => new LengthDistribution(this)); + _deviceType = other._deviceType; + _calibration = other._calibration; + _index = other._index; + _videoWriter = other._videoWriter; } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { - return false; + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } - public override string ToString() + /// + /// Calibration for the device. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _calibration; + } + set + { + _calibration = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Count - { - public Count() + /// + /// Camera index + /// + [Newtonsoft.Json.JsonPropertyAttribute("index")] + [System.ComponentModel.DescriptionAttribute("Camera index")] + public int Index { + get + { + return _index; + } + set + { + _index = value; + } } - protected Count(Count other) + /// + /// Video writer. If not provided, no video will be saved. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] + [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] + public VideoWriter VideoWriter { + get + { + return _videoWriter; + } + set + { + _videoWriter = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Count(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WebCamera(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Count(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new WebCamera(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Index = " + _index + ", "); + stringBuilder.Append("VideoWriter = " + _videoWriter); + return true; } public override string ToString() @@ -14436,142 +10864,103 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum BlockStructureSamplingMode - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="Random")] - Random = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="Sequential")] - Sequential = 1, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum OlfactometerChannelConfigFlowRateCapacity - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] - _100 = 100, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1000")] - _1000 = 1000, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum OutsideRewardFunctionRule - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] - OnTime = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] - OnDistance = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] - OnTimeAccumulated = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] - OnDistanceAccumulated = 3, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum PatchRewardFunctionRule - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] - OnReward = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] - OnChoice = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] - OnTime = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] - OnDistance = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] - OnChoiceAccumulated = 4, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] - OnRewardAccumulated = 5, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] - OnTimeAccumulated = 6, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] - OnDistanceAccumulated = 7, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum PersistentRewardFunctionRule + /// + /// Represents a 3D vector with float coordinates. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a 3D vector with float coordinates.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class AindBehaviorServicesCommonVector3 { - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] - OnReward = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] - OnChoice = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] - OnTime = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] - OnDistance = 3, + private double _x; - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] - OnChoiceAccumulated = 4, + private double _y; - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] - OnRewardAccumulated = 5, + private double _z; - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] - OnTimeAccumulated = 6, + public AindBehaviorServicesCommonVector3() + { + _x = 0D; + _y = 0D; + _z = 0D; + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] - OnDistanceAccumulated = 7, + protected AindBehaviorServicesCommonVector3(AindBehaviorServicesCommonVector3 other) + { + _x = other._x; + _y = other._y; + _z = other._z; + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnPatchEntry")] - OnPatchEntry = 8, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TruncationParameters2 - { + /// + /// X coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the vector")] + public double X + { + get + { + return _x; + } + set + { + _x = value; + } + } - public TruncationParameters2() + /// + /// Y coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the vector")] + public double Y { + get + { + return _y; + } + set + { + _y = value; + } } - protected TruncationParameters2(TruncationParameters2 other) + /// + /// Z coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("z")] + [System.ComponentModel.DescriptionAttribute("Z coordinate of the vector")] + public double Z { + get + { + return _z; + } + set + { + _z = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TruncationParameters2(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorServicesCommonVector3(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new TruncationParameters2(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorServicesCommonVector3(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Z = " + _z); + return true; } public override string ToString() @@ -14589,33 +10978,108 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Represents a 3D point or vector with x, y, and z coordinates. + /// + ///Used for 3D positioning and movement in the virtual reality environment, + ///including camera positions, object locations, and 3D transformations. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a 3D point or vector with x, y, and z coordinates.\n\nUsed for 3D positi" + + "oning and movement in the virtual reality environment,\nincluding camera position" + + "s, object locations, and 3D transformations.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalingParameters2 + public partial class AindBehaviorVrForagingTaskLogicVector3 { - public ScalingParameters2() + private double _x; + + private double _y; + + private double _z; + + public AindBehaviorVrForagingTaskLogicVector3() + { + _x = 0D; + _y = 0D; + _z = 0D; + } + + protected AindBehaviorVrForagingTaskLogicVector3(AindBehaviorVrForagingTaskLogicVector3 other) + { + _x = other._x; + _y = other._y; + _z = other._z; + } + + /// + /// X coordinate of the point + /// + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the point")] + public double X + { + get + { + return _x; + } + set + { + _x = value; + } + } + + /// + /// Y coordinate of the point + /// + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the point")] + public double Y { + get + { + return _y; + } + set + { + _y = value; + } } - protected ScalingParameters2(ScalingParameters2 other) + /// + /// Z coordinate of the point + /// + [Newtonsoft.Json.JsonPropertyAttribute("z")] + [System.ComponentModel.DescriptionAttribute("Z coordinate of the point")] + public double Z { + get + { + return _z; + } + set + { + _z = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalingParameters2(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorVrForagingTaskLogicVector3(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalingParameters2(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorVrForagingTaskLogicVector3(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Z = " + _z); + return true; } public override string ToString() @@ -14633,555 +11097,274 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum SpinnakerCameraColorProcessing + public enum BlockStructureSamplingMode { - [System.Runtime.Serialization.EnumMemberAttribute(Value="Default")] - Default = 0, + [System.Runtime.Serialization.EnumMemberAttribute(Value="Random")] + Random = 0, - [System.Runtime.Serialization.EnumMemberAttribute(Value="NoColorProcessing")] - NoColorProcessing = 1, + [System.Runtime.Serialization.EnumMemberAttribute(Value="Sequential")] + Sequential = 1, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum TruncationParametersTruncationMode + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum OlfactometerChannelConfigFlowRateCapacity { - [System.Runtime.Serialization.EnumMemberAttribute(Value="exclude")] - Exclude = 0, + [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] + _100 = 100, - [System.Runtime.Serialization.EnumMemberAttribute(Value="clamp")] - Clamp = 1, - } - - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] - internal class JsonInheritanceAttribute : System.Attribute - { - public JsonInheritanceAttribute(string key, System.Type type) - { - Key = key; - Type = type; - } - - public string Key { get; private set; } - - public System.Type Type { get; private set; } + [System.Runtime.Serialization.EnumMemberAttribute(Value="1000")] + _1000 = 1000, } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - public class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter - { - internal static readonly string DefaultDiscriminatorName = "discriminator"; - - private readonly string _discriminatorName; - - [System.ThreadStatic] - private static bool _isReading; - - [System.ThreadStatic] - private static bool _isWriting; - - public JsonInheritanceConverter() - { - _discriminatorName = DefaultDiscriminatorName; - } - - public JsonInheritanceConverter(string discriminatorName) - { - _discriminatorName = discriminatorName; - } - - public string DiscriminatorName { get { return _discriminatorName; } } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) - { - try - { - _isWriting = true; - - var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); - jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminatorName, GetSubtypeDiscriminator(value.GetType()))); - writer.WriteToken(jObject.CreateReader()); - } - finally - { - _isWriting = false; - } - } - - public override bool CanWrite - { - get - { - if (_isWriting) - { - _isWriting = false; - return false; - } - return true; - } - } - - public override bool CanRead - { - get - { - if (_isReading) - { - _isReading = false; - return false; - } - return true; - } - } - - public override bool CanConvert(System.Type objectType) - { - return true; - } - - public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) - { - var jObject = serializer.Deserialize(reader); - if (jObject == null) - return null; - - var discriminatorValue = jObject.GetValue(_discriminatorName); - var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; - var subtype = GetObjectSubtype(objectType, discriminator); - - var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; - if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminatorName)) - { - jObject.Remove(_discriminatorName); - } - - try - { - _isReading = true; - return serializer.Deserialize(jObject.CreateReader(), subtype); - } - finally - { - _isReading = false; - } - } - - private System.Type GetObjectSubtype(System.Type objectType, string discriminator) - { - foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) - { - if (attribute.Key == discriminator) - return attribute.Type; - } - - return objectType; - } - - private string GetSubtypeDiscriminator(System.Type objectType) - { - foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) - { - if (attribute.Type == objectType) - return attribute.Key; - } - - return objectType.Name; - } - } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class MatchBlockEndCondition : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum OutsideRewardFunctionRule { - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(BlockEndCondition); - return System.Linq.Expressions.Expression.Call( - typeof(MatchBlockEndCondition), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] + OnTime = 0, - private static System.IObservable Process(System.IObservable source) - where TResult : BlockEndCondition - { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] + OnDistance = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] + OnTimeAccumulated = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] + OnDistanceAccumulated = 3, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class MatchDistribution : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum PatchRewardFunctionRule { - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Distribution); - return System.Linq.Expressions.Expression.Call( - typeof(MatchDistribution), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] + OnReward = 0, - private static System.IObservable Process(System.IObservable source) - where TResult : Distribution - { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] + OnChoice = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] + OnTime = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] + OnDistance = 3, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] + OnChoiceAccumulated = 4, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] + OnRewardAccumulated = 5, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] + OnTimeAccumulated = 6, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] + OnDistanceAccumulated = 7, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class MatchPatchTerminator : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum PersistentRewardFunctionRule { - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(PatchTerminator); - return System.Linq.Expressions.Expression.Call( - typeof(MatchPatchTerminator), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] + OnReward = 0, - private static System.IObservable Process(System.IObservable source) - where TResult : PatchTerminator - { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] + OnChoice = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] + OnTime = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] + OnDistance = 3, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] + OnChoiceAccumulated = 4, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] + OnRewardAccumulated = 5, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] + OnTimeAccumulated = 6, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] + OnDistanceAccumulated = 7, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnPatchEntry")] + OnPatchEntry = 8, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class MatchPatchUpdateFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum SpinnakerCameraColorProcessing { - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(PatchUpdateFunction); - return System.Linq.Expressions.Expression.Call( - typeof(MatchPatchUpdateFunction), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - + [System.Runtime.Serialization.EnumMemberAttribute(Value="Default")] + Default = 0, - private static System.IObservable Process(System.IObservable source) - where TResult : PatchUpdateFunction - { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="NoColorProcessing")] + NoColorProcessing = 1, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class MatchRewardFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] + internal class JsonInheritanceAttribute : System.Attribute { - - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + public JsonInheritanceAttribute(string key, System.Type type) { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(RewardFunction); - return System.Linq.Expressions.Expression.Call( - typeof(MatchRewardFunction), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + Key = key; + Type = type; } - - private static System.IObservable Process(System.IObservable source) - where TResult : RewardFunction - { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); - } - } + public string Key { get; private set; } + public System.Type Type { get; private set; } + } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - public partial class MatchVideoWriter : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter { - - public Bonsai.Expressions.TypeMapping Type { get; set; } + internal static readonly string DefaultDiscriminatorName = "discriminator"; - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + private readonly string _discriminatorName; + + [System.ThreadStatic] + private static bool _isReading; + + [System.ThreadStatic] + private static bool _isWriting; + + public JsonInheritanceConverter() { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(VideoWriter); - return System.Linq.Expressions.Expression.Call( - typeof(MatchVideoWriter), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + _discriminatorName = DefaultDiscriminatorName; } - - private static System.IObservable Process(System.IObservable source) - where TResult : VideoWriter + public JsonInheritanceConverter(string discriminatorName) { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); + _discriminatorName = discriminatorName; } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchDelay : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } + public string DiscriminatorName { get { return _discriminatorName; } } - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Delay); - return System.Linq.Expressions.Expression.Call( - typeof(MatchDelay), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } + try + { + _isWriting = true; - - private static System.IObservable Process(System.IObservable source) - where TResult : Delay - { - return System.Reactive.Linq.Observable.Create(observer => + var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); + jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminatorName, GetSubtypeDiscriminator(value.GetType()))); + writer.WriteToken(jObject.CreateReader()); + } + finally { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); + _isWriting = false; + } } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchAmount : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } + public override bool CanWrite + { + get + { + if (_isWriting) + { + _isWriting = false; + return false; + } + return true; + } + } - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + public override bool CanRead { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Amount); - return System.Linq.Expressions.Expression.Call( - typeof(MatchAmount), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + get + { + if (_isReading) + { + _isReading = false; + return false; + } + return true; + } } - - private static System.IObservable Process(System.IObservable source) - where TResult : Amount + public override bool CanConvert(System.Type objectType) { - return System.Reactive.Linq.Observable.Create(observer => - { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); + return true; } - } + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) + { + var jObject = serializer.Deserialize(reader); + if (jObject == null) + return null; - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchProbability : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } + var discriminatorValue = jObject.GetValue(_discriminatorName); + var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; + var subtype = GetObjectSubtype(objectType, discriminator); - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; + if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminatorName)) + { + jObject.Remove(_discriminatorName); + } + + try + { + _isReading = true; + return serializer.Deserialize(jObject.CreateReader(), subtype); + } + finally + { + _isReading = false; + } + } + + private System.Type GetObjectSubtype(System.Type objectType, string discriminator) { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Probability); - return System.Linq.Expressions.Expression.Call( - typeof(MatchProbability), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) + { + if (attribute.Key == discriminator) + return attribute.Type; + } + + return objectType; } - - private static System.IObservable Process(System.IObservable source) - where TResult : Probability + private string GetSubtypeDiscriminator(System.Type objectType) { - return System.Reactive.Linq.Observable.Create(observer => + foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) { - var sourceObserver = System.Reactive.Observer.Create( - value => - { - var match = value as TResult; - if (match != null) observer.OnNext(match); - }, - observer.OnError, - observer.OnCompleted); - return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); - }); + if (attribute.Type == objectType) + return attribute.Key; + } + + return objectType.Name; } } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchAvailable : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchBlockEndCondition : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -15189,21 +11372,21 @@ public partial class MatchAvailable : Bonsai.Expressions.SingleArgumentExpressio public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Available); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(BlockEndCondition); return System.Linq.Expressions.Expression.Call( - typeof(MatchAvailable), + typeof(MatchBlockEndCondition), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Available + private static System.IObservable Process(System.IObservable source) + where TResult : BlockEndCondition { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -15217,10 +11400,15 @@ private static System.IObservable Process(System.IObservable))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchPatchTerminator : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -15228,21 +11416,21 @@ public partial class MatchRate : Bonsai.Expressions.SingleArgumentExpressionBuil public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Rate); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(PatchTerminator); return System.Linq.Expressions.Expression.Call( - typeof(MatchRate), + typeof(MatchPatchTerminator), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Rate + private static System.IObservable Process(System.IObservable source) + where TResult : PatchTerminator { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -15256,10 +11444,15 @@ private static System.IObservable Process(System.IObservable))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchPatchUpdateFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -15267,21 +11460,21 @@ public partial class MatchValue : Bonsai.Expressions.SingleArgumentExpressionBui public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Value); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(PatchUpdateFunction); return System.Linq.Expressions.Expression.Call( - typeof(MatchValue), + typeof(MatchPatchUpdateFunction), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Value + private static System.IObservable Process(System.IObservable source) + where TResult : PatchUpdateFunction { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -15295,10 +11488,14 @@ private static System.IObservable Process(System.IObservable))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchRewardFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -15306,21 +11503,21 @@ public partial class MatchLengthDistribution : Bonsai.Expressions.SingleArgument public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(LengthDistribution); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(RewardFunction); return System.Linq.Expressions.Expression.Call( - typeof(MatchLengthDistribution), + typeof(MatchRewardFunction), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : LengthDistribution + private static System.IObservable Process(System.IObservable source) + where TResult : RewardFunction { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -15334,10 +11531,12 @@ private static System.IObservable Process(System.IObservable))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchVideoWriter : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -15345,21 +11544,21 @@ public partial class MatchCount : Bonsai.Expressions.SingleArgumentExpressionBui public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Count); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(VideoWriter); return System.Linq.Expressions.Expression.Call( - typeof(MatchCount), + typeof(MatchVideoWriter), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Count + private static System.IObservable Process(System.IObservable source) + where TResult : VideoWriter { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -15376,7 +11575,7 @@ private static System.IObservable Process(System.IObservable /// Serializes a sequence of data model objects into JSON strings. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Serializes a sequence of data model objects into JSON strings.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] [Bonsai.CombinatorAttribute()] @@ -15391,11 +11590,6 @@ private System.IObservable Process(System.IObservable source) return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value, formatting)); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15421,36 +11615,11 @@ public System.IObservable Process(System.IObservable sourc return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15536,36 +11705,11 @@ public System.IObservable Process(System.IObservable return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15596,26 +11740,11 @@ public System.IObservable Process(System.IObservable so return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15626,16 +11755,6 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15741,31 +11860,11 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15796,21 +11895,6 @@ public System.IObservable Process(System.IObservable sou return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15861,21 +11945,6 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -15935,78 +12004,22 @@ public System.IObservable Process(System.IObservable(source); } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } } /// /// Deserializes a sequence of JSON strings into data model objects. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -16024,26 +12037,16 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -16065,20 +12068,13 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -16089,9 +12085,6 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -16104,22 +12097,12 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder { public DeserializeFromJson() { - Type = new Bonsai.Expressions.TypeMapping(); + Type = new Bonsai.Expressions.TypeMapping(); } public Bonsai.Expressions.TypeMapping Type { get; set; } diff --git a/src/Extensions/AindBehaviorVrForaging.cs b/src/Extensions/AindBehaviorVrForaging.cs index b7ad141b..e093488b 100644 --- a/src/Extensions/AindBehaviorVrForaging.cs +++ b/src/Extensions/AindBehaviorVrForaging.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using MathNet.Numerics.Interpolation; @@ -103,307 +103,4 @@ public override double Invoke(double value, double tickValue, Random random = nu return Math.Max(Math.Min(updatedValue, Maximum), Minimum); } } - - partial class Distribution - { - private const uint SampleSize = 1000; - - public virtual double SampleDistribution(Random random) - { - throw new NotImplementedException(); - } - - public virtual IDistribution GetDistribution(Random random) - { - throw new NotImplementedException(); - } - - private static double ApplyScaleAndOffset(double value, ScalingParameters scalingParameters) - { - return scalingParameters == null ? value : value * scalingParameters.Scale + scalingParameters.Offset; - } - - public double DrawSample(IDistribution distribution, ScalingParameters scalingParameters, TruncationParameters truncationParameters) - { - if (truncationParameters == null) - { - return ApplyScaleAndOffset(distribution.Sample(), scalingParameters); - } - - ValidateTruncationParameters(truncationParameters); - - switch (truncationParameters.TruncationMode) - { - case TruncationParametersTruncationMode.Clamp: - var sample = ApplyScaleAndOffset(distribution.Sample(), scalingParameters); - return Math.Min(Math.Max(sample, truncationParameters.Min), truncationParameters.Max); - case TruncationParametersTruncationMode.Exclude: - double[] samples = new double[SampleSize]; - distribution.Samples(samples); - var scaledSamples = samples.Select(x => ApplyScaleAndOffset(x, scalingParameters)).ToArray(); - return ValidateTruncationExcludeMode(scaledSamples, truncationParameters); - default: - throw new ArgumentException("Invalid truncation mode."); - } - } - - private static double ValidateTruncationExcludeMode(double[] drawnSamples, TruncationParameters truncationParameters) - { - double outValue; - var average = drawnSamples.Average(); - var truncatedSamples = drawnSamples.Where(x => x >= truncationParameters.Min && x <= truncationParameters.Max); - - if (truncatedSamples.Count() <= 0) - { - if (average <= truncationParameters.Min) - { - outValue = truncationParameters.Min; - } - else if (average >= truncationParameters.Max) - { - outValue = truncationParameters.Max; - } - else - { - throw new ArgumentException("Truncation heuristic has failed. Please check your truncation parameters."); - } - } - else - { - outValue = truncatedSamples.First(); - } - return outValue; - } - - private static void ValidateTruncationParameters(TruncationParameters truncationParameters) - { - if (truncationParameters == null) { return; } - if (truncationParameters.Min > truncationParameters.Max) - { - throw new ArgumentException("Invalid truncation parameters. Min must be lower than Max"); - } - } - } - - partial class PdfDistribution - { - public override double SampleDistribution(Random random) - { - var pdf = DistributionParameters.Pdf; - var index = DistributionParameters.Index; - if (pdf.Count != index.Count) - { - throw new ArgumentException("Pdf and Index must have the same length."); - } - var pdf_normalized = pdf.Select(x => x / pdf.Sum()).ToArray(); - var coin = random.NextDouble(); - double sum = 0; - for (int i = 0; i < pdf_normalized.Length; i++) - { - sum += pdf_normalized[i]; - if (coin < sum) - { - return index[i]; - } - } - return index.Last(); - } - } - - partial class Scalar - { - public override double SampleDistribution(Random random) - { - return DistributionParameters.Value; - } - } - - partial class NormalDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Normal(DistributionParameters.Mean, DistributionParameters.Std, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class ExponentialDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Exponential(DistributionParameters.Rate, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class LogNormalDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new LogNormal(DistributionParameters.Mean, DistributionParameters.Std, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class GammaDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Gamma(DistributionParameters.Shape, DistributionParameters.Rate, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class BetaDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Beta(DistributionParameters.Alpha, DistributionParameters.Beta, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class UniformDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new ContinuousUniform(DistributionParameters.Min, DistributionParameters.Max, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class BinomialDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new DiscreteDistributionWrapper(new Binomial(DistributionParameters.P, DistributionParameters.N, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class PoissonDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new DiscreteDistributionWrapper(new Poisson(DistributionParameters.Rate, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - [Combinator] - [Description("Samples a value for a known distribution.")] - [WorkflowElementCategory(ElementCategory.Transform)] - - public class SampleDistribution - { - - private Random randomSource; - public Random RandomSource - { - get { return randomSource; } - set { randomSource = value; } - } - - public IObservable Process(IObservable source) - { - return source.Select(value => value.SampleDistribution(RandomSource)); - } - } - - - - public interface IDistribution - { - double Sample(); - - double[] Samples(double[] arr); - } - - public class ContinuousDistributionWrapper : IDistribution - { - private readonly IContinuousDistribution _distribution; - - public ContinuousDistributionWrapper(IContinuousDistribution distribution) - { - _distribution = distribution; - } - - public double Sample() - { - return _distribution.Sample(); - } - - public double[] Samples(double[] arr) - { - _distribution.Samples(arr); - return arr; - } - } - - public class DiscreteDistributionWrapper : IDistribution - { - private readonly IDiscreteDistribution _distribution; - - public DiscreteDistributionWrapper(IDiscreteDistribution distribution) - { - _distribution = distribution; - } - - public double Sample() - { - return (double)_distribution.Sample(); - } - - public double[] Samples(double[] arr) - { - int[] intSamples = new int[arr.Length]; - _distribution.Samples(intSamples); - for (int i = 0; i < arr.Length; i++) - { - arr[i] = (double)intSamples[i]; - } - return arr; - } - } - } diff --git a/src/Extensions/InstantiateSite.bonsai b/src/Extensions/InstantiateSite.bonsai index e76d82d1..c14e9152 100644 --- a/src/Extensions/InstantiateSite.bonsai +++ b/src/Extensions/InstantiateSite.bonsai @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" + xmlns:p1="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" xmlns:p2="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" xmlns:dsp="clr-namespace:Bonsai.Dsp;assembly=Bonsai.Dsp" @@ -1198,9 +1198,7 @@ it.Item2 as EntryPosition) - - - + TreadmillFriction diff --git a/src/Extensions/NullDistribution.cs b/src/Extensions/NullDistribution.cs index d6cacc3f..2b20ec1a 100644 --- a/src/Extensions/NullDistribution.cs +++ b/src/Extensions/NullDistribution.cs @@ -1,4 +1,4 @@ -using Bonsai; +using Bonsai; using System; using System.ComponentModel; using System.Reactive.Linq; @@ -8,8 +8,8 @@ [WorkflowElementCategory(ElementCategory.Source)] public class NullDistribution { - public IObservable Process() + public IObservable Process() { - return Observable.Return(null); + return Observable.Return(null); } } diff --git a/src/Extensions/OperationControl.bonsai b/src/Extensions/OperationControl.bonsai new file mode 100644 index 00000000..b77f069f --- /dev/null +++ b/src/Extensions/OperationControl.bonsai @@ -0,0 +1,2376 @@ + + + + + + OdorControl + + + + OlfactometerInitialConfiguration + + + + HarpOlfactometerEvents + + + + 1 + + + + Channel3Setting + + + + TaskLogicParameters + + + OperationControl.OdorControl.UseChannel3AsCarrier + + + + + + Source1 + + + + + + + + + + Channel3Range + FlowRate1000 + + + + + + + Source1 + + + + + + + + + + Channel3Range + FlowRate100 + + + + + + + + + + + + + + + + + + + + + + + + + + Write + + FlowRate1000 + + + + HarpOlfactometerCommands + + + Write + + Flowmeter DI0Trigger ChannelActualFlow + + + + HarpOlfactometerCommands + + + Write + + Enabled + + + + HarpOlfactometerCommands + + + + Channel3Setting + + + + TaskLogicParameters + + + OperationControl.OdorControl.UseChannel3AsCarrier + + + + + + Source1 + + + + + + + + + + Channel3Range + FlowRate1000 + + + + + + + Source1 + + + + + + + + + + Channel3Range + FlowRate100 + + + + + + + + + + + + + + + + + + + + + + FlowRate1000 + + + + + + + Source1 + + + + + + + + + + HarpOlfactometerEvents + + + + 1 + + + + + + + + true + 0 + 0 + 0 + NaN + true + 100 + 1000 + + + + SetOdorMix + + + + + + + + + + + + + + + + + + + + + + + + + ArmOdor + + + + ArmOdor + + + ArmOdor + + + + ArmOdor + + + + SoftwareEvent + + + ArmOdor + + + Index,Concentration + + + TaskLogicParameters + + + OperationControl.OdorControl.UseChannel3AsCarrier + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetOdorFlow + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetTotalFlow + + + + + + + + + false + 0 + 0 + 0 + 0 + false + 100 + 1000 + + + + SetOdorMix + + + + + + + + + + + + + + + + + + + + + + EndValveControl + + + + HarpOlfactometerEvents + + + + 1 + + + + + false + + + + OdorEndValveState + + + OdorEndValveState + + + OdorPath + + + + Source1 + + + + + + + + + + EndValvesState + EndValve0 + + + + CarrierPath + + + + Source1 + + + + + + + + + + EndValvesState + None + + + + + + Write + + + + HarpOlfactometerCommands + + + + + + + + + + + + + + + + + + + + SetOdorMix + + + SetChannelsTargetFlow + + + + Source1 + + + Mix + + + Mix + + + ChannelsTargetFlow + + + HarpOlfactometerCommands + + + HarpOlfactometerEvents + + + + Include + Write + + + + Mix + + + ChannelsTargetFlow + + + Address + + + + + + + + Include + + + + + + + + PT0.01S + + + + + + + + + 1 + + + + Mix + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + + SetOdorValveState + + + + Source1 + + + Mix + + + Mix + + + OdorValveState + + + HarpOlfactometerCommands + + + HarpOlfactometerEvents + + + + Include + Write + + + + Mix + + + OdorValveState + + + Address + + + + + + + + Include + + + + + + + + PT0.01S + + + + + + + + + 1 + + + + Mix + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RewardControl + + + + WaterValve + + + + ValveOpenTimeMs + + + SetValue + + + + Source1 + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + + + + + + + 0 + + + + + PT0.01S + + + + + 0 + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + TriggerValve + + + TriggerValve + + + Write + + SupplyPort0 + + + + HarpBehaviorCommands + + + + + + + + + + + + + + + + 0 + true + + + + + 1 + + + + GiveReward + + + ForceGiveReward + + + GiveReward + + + HotGiveReward + + + GiveReward + + + ManualReward + + + + ForceGiveReward + + + + + + HasValue + + + + Source1 + + + HasValue + + + + + + + + + + + Value + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + RigSchema + + + Calibration.WaterValve + + + + + + RewardToTime + ((Item1 * 0.001) - Item2.Offset) / Item2.Slope + + + ToMilliseconds + + + + + 1000 + + + + + + + + + + 0 + + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + ValveOpenTimeMs + + + GiveReward + + + + GiveReward + + + + SoftwareEvent + + + ForceGiveReward + + + + ForceGiveReward + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MovableSpoutControl + + + + Start with the spout at max distance + + + + + true + + + + + 1 + + + + SpoutAvailable + + + SpoutAvailable + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled + + + + + + IsEnabled + + + + Source1 + + + Item2 + + + + + + + + + + + Item1 + + + SpoutParkingPositions + + + + + + GetPosition + it.Item1 ? it.Item2.ResetPosition : it.Item2.RetractedPosition + + + MoveTo + + + InitialState + + + + ManipulatorPosition + + + + 1 + + + + RigSchema + + + Manipulator + + + SpoutAxis + + + + + + + + CalculateRetractedPosition + + + + + + + Axis + Y1 + + + + 1 + + + + SpoutAxis + + + Source1 + + + + 1 + + + + SpoutResetPosition + + + SpoutResetPosition + + + + + 1 + + + + + 0 + 0 + 0 + 0 + + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + RetractingDistance + + + + + + SpoutAxis + + + + + + + + + None + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rename + new(Item1 as ResetPosition, Item2 as RetractedPosition) + + + SpoutParkingPositions + + + SpoutParkingPositions + + + + SpoutParkingPositions + + + + SoftwareEvent + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled + + + + SpoutAvailable + + + GiveReward + + + + false + + + + SpoutAvailable + + + Condition + + + + Source1 + + + + + + + + + + + true + + + + + + + DelayWithdraw + + + + Source1 + + + + 1 + + + + State + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + TimeToCollectAfterReward + + + FromSeconds + TimeSpan.FromSeconds(it) + + + + + + + + + PT0S + + + + State + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + IsWithdraw? + + + + Source1 + + + + + + + + + + + + SpoutAvailable + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled + + + + + + Source1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + StartExperiment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FeedbackControl + + + + ChoiceFeedback + + + ChoiceFeedback + + + HotChoiceFeedback + + + ChoiceFeedback + + + + AudioTrigger + + + + ChoiceFeedback + + + + ChoiceFeedback + + + + SoftwareEvent + + + HarpBehaviorEvents + + + + 1 + + + + + true + + + + SpoutAvailable + + + + + + + + + + + + + + + + + Lickometer + + + + HarpLickometerEvents + + + + + + Value + + + + Channel0 + + + + + 0 + + + + + + + + + + IsLickOnset + + + + Source1 + + + Item1 + + + + + + + + + + + Item2.Seconds + + + LickEvent + + + HarpLickometerEvents + + + Write + + Active + true + false + Off + Off + Enabled + + + + + 1 + + + + HarpLickometerCommands + + + + + + + + + + + + + + + + + + + + + CameraControl + + + + HarpBehaviorEvents + + + + 1 + + + + TextureBank + + + TriggeredCamerasReady + + + + + + + 1 + + + + + PT2S + + + + + true + + + + CameraState + + + CameraState + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + HarpBehaviorCommands + + + StartLogging + + + + 1 + + + + + false + + + + CameraState + + + StartExperiment + + + + 1 + + + + + true + + + + CameraState + + + EndExperiment + + + + 1 + + + + + false + + + + CameraState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Thermistor/Pressure + + + + HarpSniffDetectorEvents + + + + + + RigSchema + + + HarpSniffDetector + + + + + + + ThermistorData + + + + + + + + + + + + + + Treadmill + + + + StartLogging + + + ClearCurrentLimit + + + + + PT0S + PT0.05S + + + + + + + + 5 + + + + + + + ThrowOnRetryCount + + + + Source1 + + + + + + + Number of attempts ot clear the current limit state register has been exceeded. + + + + + + + + + + + + + Write + + 0 + + + + HarpTreadmillCommands + + + HarpTreadmillEvents + + + + Include + Write + + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 0 + + + + + 1 + + + + TreadmillFriction + + + HarpTreadmillEvents + + + + + + TreadmillSamplingRate + + + DetermineTreadmillScaling + + + + RigSchema + + + HarpTreadmill.Calibration + + + WheelDiameter + + + Perimeter + it * Math.Pi + + + PulsesPerRevolution + + + + + + CentimetersPerTick + Item1 / Item2 + + + InvertDirection + + + + + + Item2 ? -1.0 * Item1 : Item1 + + + + + + + + + + + + + + + + + + + + + TreadmillScaling + + + HarpTreadmillEvents + + + + + + + 1 + + + + + + + CalculateDisplacement + single(Item1.Value.Encoder - Item2.Value.Encoder) + + + TreadmillScaling + + + + + + + + + 0 + 1 + 0 + -0.005752427954571154 + Linear + + + + + + + CalculateInstantSpeed + new( +Item1 as Displacement, +(Item1 / single(Item2.Item1.Seconds - Item2.Item2.Seconds)) as InstantVelocity +) + + + Item1.Seconds + + + + + + + + + EncoderSample + + + TreadmillFriction + + + + 0 + 1 + 0 + 1 + Clamp + + + + + + + GetInterpolator + + + + RigSchema + + + HarpTreadmill.Calibration + + + BrakeLookupCalibration + + + + + + + 0 + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Write + + + + SendMessage + + + + Source1 + + + + 1 + + + + HarpMessage + + + HarpTreadmillEvents + + + + + + HarpMessage + + + + + + + PT0.1S + PT0.1S + + + + HarpMessage + + + + + + Item2 + + + + + + HarpTreadmillCommands + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + EncoderSample + + + Value + + + InstantVelocity + + + TaskLogicParameters + + + OperationControl + + + PositionControl.FrequencyFilterCutoff + + + + + + + + TreadmillSamplingRate + + + + + + + + + 250 + 5 + 0 + 60 + LowPass + + + + Seconds + + + + + + FilteredCurrentVelocity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AudioControl + + + + AudioDuration + + + + 1000 + + + + Write + + + + HarpBehaviorCommands + + + AudioFrequency + + + Write + + + + HarpBehaviorCommands + + + AudioTrigger + + + Write + + PwmDO2 + + + + HarpBehaviorCommands + + + InitialSettings + + + + HarpBehaviorEvents + + + Write + + 50 + + + + + 1 + + + + HarpBehaviorCommands + + + TaskLogicParameters + + + OperationControl.AudioControl + + + Duration + + + AudioDuration + + + TaskLogicParameters + + + OperationControl.AudioControl + + + Frequency + + + AudioFrequency + + + + + + + + + + + + + + + + + HarpBehaviorEvents + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/PatchState.cs b/src/Extensions/PatchState.cs index 9e6d6ac5..c13ac41d 100644 --- a/src/Extensions/PatchState.cs +++ b/src/Extensions/PatchState.cs @@ -1,4 +1,4 @@ -using System; +using System; using AindVrForagingDataSchema; public class PatchState diff --git a/src/Extensions/SolveBlockTransitions.bonsai b/src/Extensions/SolveBlockTransitions.bonsai index c069e019..bb92ab59 100644 --- a/src/Extensions/SolveBlockTransitions.bonsai +++ b/src/Extensions/SolveBlockTransitions.bonsai @@ -4,8 +4,9 @@ xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" + xmlns:p2="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p2="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:p3="clr-namespace:System.Reactive;assembly=System.Reactive.Core" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -248,7 +249,7 @@ - + @@ -361,7 +362,7 @@ - + @@ -446,7 +447,7 @@ - + @@ -524,7 +525,7 @@ - + @@ -602,7 +603,7 @@ - + @@ -731,7 +732,7 @@ - + EvaluateBlockEndConditions diff --git a/src/Extensions/UpdateVariable.bonsai b/src/Extensions/UpdateVariable.bonsai index c581bfb5..e2dccd19 100644 --- a/src/Extensions/UpdateVariable.bonsai +++ b/src/Extensions/UpdateVariable.bonsai @@ -4,7 +4,6 @@ xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p2="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -30,10 +29,6 @@ Value StopDurationOffset - - ToString - it.ToString() - 1 @@ -48,45 +43,16 @@ Key - - - - - - - HasKey? - - - - Source1 - - - - - - - - - - - - - - - - - - Key + + - - - - + + HasKey? + it.Item1.ContainsKey(it.Item2) - - - StopVelocityThreshold - + + GetValue + it.Item1[it.Item2] @@ -94,6 +60,8 @@ 0 + 0 + 0 0 0 0 @@ -106,7 +74,9 @@ - + + None + @@ -143,36 +113,44 @@ Source1 - - VariableUpdaters - - - - - - Item2 - - - Key - - - - - - - - + + ContainsKey? + + + + VariableUpdaters + + + Key + + + + + + ContainsKey? + it.Item1.ContainsKey(it.Item2) + + + + 1 + + + + + + + + + + + + - - - - - - - + + @@ -218,7 +196,9 @@ false - + + None + @@ -246,25 +226,22 @@ - - + + - - + + - - + + - + - - - diff --git a/src/Extensions/VariableUpdaters.bonsai b/src/Extensions/VariableUpdaters.bonsai new file mode 100644 index 00000000..2d328980 --- /dev/null +++ b/src/Extensions/VariableUpdaters.bonsai @@ -0,0 +1,128 @@ + + + + + + TaskLogicParameters + + + Updaters + + + + 1 + + + + VariableUpdaters + + + GiveReward + + + + true + + + + StopDurationOffset + 0 + + + StopDurationOffset + + + + UpdaterStopDurationOffset + + + + UpdaterEvents + + + GiveReward + + + + true + + + + TaskLogicParameters + + + OperationControl.PositionControl.VelocityThreshold + + + + + + + + StopVelocityThreshold + 0 + + + StopVelocityThreshold + + + + UpdaterStopVelocityThreshold + + + + UpdaterEvents + + + GiveReward + + + + true + + + + RewardDelayOffset + 0 + + + RewardDelayOffset + + + + UpdaterRewardDelayOffset + + + + UpdaterEvents + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main.bonsai b/src/main.bonsai index 737c95ba..6be5e9c6 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -8,30 +8,27 @@ xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns:p2="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" - xmlns:p3="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:cv="clr-namespace:Bonsai.Vision;assembly=Bonsai.Vision" - xmlns:p4="clr-namespace:OpenCV.Net;assembly=OpenCV.Net" - xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" + xmlns:p3="clr-namespace:OpenCV.Net;assembly=OpenCV.Net" + xmlns:p4="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:spk="clr-namespace:Bonsai.Spinnaker;assembly=Bonsai.Spinnaker" xmlns:vid="clr-namespace:Bonsai.Video;assembly=Bonsai.Video" xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" - xmlns:p6="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" - xmlns:p7="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" - xmlns:p8="clr-namespace:System.Reactive;assembly=System.Reactive.Core" - xmlns:p9="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" - xmlns:p10="clr-namespace:;assembly=Extensions" - xmlns:p11="clr-namespace:OpenTK;assembly=OpenTK" - xmlns:p12="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" + xmlns:p5="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" + xmlns:p6="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" + xmlns:p7="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:p8="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" + xmlns:p9="clr-namespace:;assembly=Extensions" + xmlns:p10="clr-namespace:OpenTK;assembly=OpenTK" + xmlns:p11="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" xmlns:dsp="clr-namespace:Bonsai.Dsp;assembly=Bonsai.Dsp" - xmlns:p13="clr-namespace:AllenNeuralDynamics.Core.Design;assembly=AllenNeuralDynamics.Core.Design" - xmlns:p14="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" + xmlns:p12="clr-namespace:AllenNeuralDynamics.Core.Design;assembly=AllenNeuralDynamics.Core.Design" + xmlns:p13="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" + xmlns:p14="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" xmlns:p15="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" - xmlns:bv="clr-namespace:BonVision;assembly=BonVision" - xmlns:p16="clr-namespace:AllenNeuralDynamics.LicketySplit;assembly=AllenNeuralDynamics.LicketySplit" - xmlns:p17="clr-namespace:AllenNeuralDynamics.SniffDetector;assembly=AllenNeuralDynamics.SniffDetector" - xmlns:p18="clr-namespace:Bonsai.Numerics.Interpolation;assembly=Bonsai.Numerics" + xmlns:p16="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -489,14 +486,6 @@ Item3 as Right) Calibration - - - None - - - - - RigSchema @@ -612,34 +601,32 @@ Item3 as Right) - + - + - - - + + + - + - - - - + + + + - + - - - - + + + + - + - - - - + + @@ -803,7 +790,7 @@ Item3 as Right) - + RegionOfInterest 0 @@ -818,21 +805,21 @@ Item3 as Right) - + Default - 19000 - 0 - 1 - - Mono8 - - 0 - 0 - 0 - 0 - - + 19000 + 0 + 1 + + Mono8 + + 0 + 0 + 0 + 0 + + @@ -1162,13 +1149,13 @@ Item3 as Right) - - 0 - 10 + + 0 + 10 - + @@ -1204,8 +1191,8 @@ Item3 as Right) RngSeed - - ../. + + ../. @@ -1344,7 +1331,7 @@ Item3 as Right) Initialization - + StartExperiment @@ -1353,30 +1340,30 @@ Item3 as Right) GlobalActiveSite - + UpdaterEvents - + SoftwareEvent - + RuntimeLogging - + EndExperiment - + StartLogging Annotations - + GlobalPatchState - - GlobalPatchState + + GlobalPatchState @@ -1386,13 +1373,13 @@ Item3 as Right) Position - + CurrentPosition IsStopped - + MaxPosition @@ -1484,8 +1471,8 @@ Item3 as Right) Repository - - false + + false @@ -1516,8 +1503,8 @@ Item3 as Right) - - Repository is not clean! Please discard all local changes. + + Repository is not clean! Please discard all local changes. @@ -1554,8 +1541,8 @@ Item3 as Right) HarpOlfactometerEvents - - + + Value @@ -1630,8 +1617,8 @@ Item3 as Right) it - - Flow on Channel3 is lower than expected. + + Flow on Channel3 is lower than expected. @@ -1742,8 +1729,8 @@ Item3 as Right) it - - Dropped frame detected during pre-session! + + Dropped frame detected during pre-session! @@ -1858,8 +1845,8 @@ Item3 as Right) it - - + + @@ -1883,8 +1870,8 @@ Item3 as Right) - - TriggeredCameraControl must specify a valid FrameRate property! + + TriggeredCameraControl must specify a valid FrameRate property! @@ -2000,10 +1987,10 @@ Item3 as Right) - - - Warning - Exclamation + + + Warning + Exclamation @@ -2076,8 +2063,8 @@ Item3 as Right) HarpTreadmillEvents - - + + @@ -2098,10 +2085,10 @@ Item3 as Right) - - The treadmill current limit has been triggered. If this is a problem, please restart the session. - Treadmill limit trigger - Exclamation + + The treadmill current limit has been triggered. If this is a problem, please restart the session. + Treadmill limit trigger + Exclamation @@ -2206,2669 +2193,192 @@ Item3 as Right) - - OperationControl + + + TaskLogic - - OdorControl + + 120 + 40 + 30 + + + + + + + + PatchStateMachine - - OlfactometerInitialConfiguration + + CurrentBlock + + + ActivePatch + + + ActivePatch + + + GlobalActivePatch + + + TaskLogicParameters + + + Environment + + + Blocks + + + Blocks + + + + Updates asynch + + + + CurrentBlock + + + + Block + + + + SoftwareEvent + + + CurrentBlock + + + EnvironmentStatistics.TransitionMatrix + + + + true + + + + TransitionMatrix + + + CurrentBlock + + + WithinBlockLogic - HarpOlfactometerEvents + CurrentBlock + + + EnvironmentStatistics.FirstStateOccupancy + + + TransitionMatrix - - 1 - + - - Channel3Setting - - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate1000 - - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate100 - - - - - - - - - - - - - - - - - - + + RngSeed - + - - Write - - FlowRate1000 - + + - - HarpOlfactometerCommands + + + 1 + - - Write - - Flowmeter DI0Trigger ChannelActualFlow - + + ActiveStateIndex - - HarpOlfactometerCommands + + + ActiveSite - - Write - - Enabled - + + ActiveSite - HarpOlfactometerCommands + GlobalActiveSite - - - Channel3Setting + + ActiveStateIndex + + + UpdatePatch - - TaskLogicParameters + + Source1 - - OperationControl.OdorControl.UseChannel3AsCarrier + + + 1 + - - - - - Source1 - - - - - - - + + idx - - Channel3Range - FlowRate1000 + + PatchStatistics - - - - - - Source1 - - - - - - - + + idx + + + + + - - Channel3Range - FlowRate100 + + + 0 + - + + 1 + - - - + - - + + - - - FlowRate1000 - - - - - - - Source1 - - - - - - - + + ActivePatch - HarpOlfactometerEvents - - - - 1 - - - - + ActivePatch - - true - 0 - 0 - 0 - NaN - true - 100 - 1000 + + ActivePatch - SetOdorMix - - - - - - - - - - - - - - - - - - - - - - - - - ArmOdor - - - - ArmOdor - - - ArmOdor - - - - ArmOdor - - - - SoftwareEvent - - - ArmOdor - - - Index,Concentration - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - - - TaskLogicParameters - - - OperationControl.OdorControl.TargetOdorFlow - - - - - - - - TaskLogicParameters - - - OperationControl.OdorControl.TargetTotalFlow - - - - - - - - - false - 0 - 0 - 0 - 0 - false - 100 - 1000 - - - - SetOdorMix - - - - - - - - - - - - - - - - - - - - - - EndValveControl - - - - HarpOlfactometerEvents - - - - 1 - - - - - false - - - - OdorEndValveState - - - OdorEndValveState - - - OdorPath - - - - Source1 - - - - - - - - - - EndValvesState - EndValve0 - - - - CarrierPath - - - - Source1 - - - - - - - - - - EndValvesState - None - - - - - - Write - - - - HarpOlfactometerCommands - - - - - - - - - - - - - - - - - - - - SetOdorMix - - - SetChannelsTargetFlow - - - - Source1 - - - Mix - - - Mix - - - ChannelsTargetFlow - - - HarpOlfactometerCommands - - - HarpOlfactometerEvents - - - - Include - Write - - - - Mix - - - ChannelsTargetFlow - - - Address - - - - - - - - Include - - - - - - - - PT0.01S - - - - - - - - - 1 - - - - Mix - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - - - - - SetOdorValveState - - - - Source1 - - - Mix - - - Mix - - - OdorValveState - - - HarpOlfactometerCommands - - - HarpOlfactometerEvents - - - - Include - Write - - - - Mix - - - OdorValveState - - - Address - - - - - - - - Include - - - - - - - - PT0.01S - - - - - - - - - 1 - - - - Mix - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RewardControl - - - - WaterValve - - - - ValveOpenTimeMs - - - SetValue - - - - Source1 - - - Write - - - - HarpBehaviorCommands - - - HarpBehaviorEvents - - - - - - - - - - 0 - - - - - PT0.01S - - - - - 0 - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - TriggerValve - - - TriggerValve - - - Write - - SupplyPort0 - - - - HarpBehaviorCommands - - - - - - - - - - - - - - - - 0 - true - - - - - 1 - - - - GiveReward - - - ForceGiveReward - - - GiveReward - - - HotGiveReward - - - GiveReward - - - ManualReward - - - - ForceGiveReward - - - - - - HasValue - - - - Source1 - - - HasValue - - - - - - - - - - - Value - - - GreaterThan0 - - - - Source1 - - - - 0 - - - - - - - - - - - - RigSchema - - - Calibration.WaterValve - - - - - - RewardToTime - ((Item1 * 0.001) - Item2.Offset) / Item2.Slope - - - ToMilliseconds - - - - - 1000 - - - - - - - - - - 0 - - - - GreaterThan0 - - - - Source1 - - - - 0 - - - - - - - - - - - - ValveOpenTimeMs - - - GiveReward - - - - GiveReward - - - - SoftwareEvent - - - ForceGiveReward - - - - ForceGiveReward - - - - SoftwareEvent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MovableSpoutControl - - - - Start with the spout at max distance - - - - - true - - - - - 1 - - - - SpoutAvailable - - - SpoutAvailable - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - - - IsEnabled - - - - Source1 - - - Item2 - - - - - - - - - - - Item1 - - - SpoutParkingPositions - - - - - - GetPosition - it.Item1 ? it.Item2.ResetPosition : it.Item2.RetractedPosition - - - MoveTo - - - InitialState - - - - ManipulatorPosition - - - - 1 - - - - RigSchema - - - Manipulator - - - SpoutAxis - - - - - - - - CalculateRetractedPosition - - - - - - - Axis - Y1 - - - - 1 - - - - SpoutAxis - - - Source1 - - - - 1 - - - - SpoutResetPosition - - - SpoutResetPosition - - - - - 1 - - - - - 0 - 0 - 0 - 0 - - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - RetractingDistance - - - - - - SpoutAxis - - - - - - - - - None - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Rename - new(Item1 as ResetPosition, Item2 as RetractedPosition) - - - SpoutParkingPositions - - - SpoutParkingPositions - - - - SpoutParkingPositions - - - - SoftwareEvent - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - SpoutAvailable - - - GiveReward - - - - false - - - - SpoutAvailable - - - Condition - - - - Source1 - - - - - - - - - - - true - - - - - - - DelayWithdraw - - - - Source1 - - - - 1 - - - - State - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - TimeToCollectAfterReward - - - FromSeconds - TimeSpan.FromSeconds(it) - - - - - - - - - PT0S - - - - State - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - IsWithdraw? - - - - Source1 - - - - - - - - - - - - SpoutAvailable - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - - - Source1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StartExperiment - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FeedbackControl - - - - ChoiceFeedback - - - ChoiceFeedback - - - HotChoiceFeedback - - - ChoiceFeedback - - - - AudioTrigger - - - - ChoiceFeedback - - - - ChoiceFeedback - - - - SoftwareEvent - - - HarpBehaviorEvents - - - - 1 - - - - - true - - - - SpoutAvailable - - - - - - - - - - - - - - - - - Lickometer - - - - HarpLickometerEvents - - - - - - Value - - - - Channel0 - - - - - 0 - - - - - - - - - - IsLickOnset - - - - Source1 - - - Item1 - - - - - - - - - - - Item2.Seconds - - - LickEvent - - - HarpLickometerEvents - - - Write - - Active - true - false - Off - Off - Enabled - - - - - 1 - - - - HarpLickometerCommands - - - - - - - - - - - - - - - - - - - - - CameraControl - - - - HarpBehaviorEvents - - - - 1 - - - - TextureBank - - - TriggeredCamerasReady - - - - - - - 1 - - - - - PT2S - - - - - true - - - - CameraState - - - CameraState - - - - - - Source1 - - - - - - - - - - Write - - CameraOutput0 - - - - - - - - Source1 - - - - - - - - - - Write - - CameraOutput0 - - - - - - - HarpBehaviorCommands - - - StartLogging - - - - 1 - - - - - false - - - - CameraState - - - StartExperiment - - - - 1 - - - - - true - - - - CameraState - - - EndExperiment - - - - 1 - - - - - false - - - - CameraState - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Thermistor/Pressure - - - - HarpSniffDetectorEvents - - - - - - RigSchema - - - HarpSniffDetector - - - - - - - ThermistorData - - - - - - - - - - - - - - Treadmill - - - - StartLogging - - - ClearCurrentLimit - - - - - PT0S - PT0.05S - - - - - - - - 5 - - - - - - - ThrowOnRetryCount - - - - Source1 - - - - - - - Number of attempts ot clear the current limit state register has been exceeded. - - - - - - - - - - - - - Write - - 0 - - - - HarpTreadmillCommands - - - HarpTreadmillEvents - - - - Include - Write - - - - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - 0 - - - - - 1 - - - - TreadmillFriction - - - HarpTreadmillEvents - - - - - - TreadmillSamplingRate - - - DetermineTreadmillScaling - - - - RigSchema - - - HarpTreadmill.Calibration - - - WheelDiameter - - - Perimeter - it * Math.Pi - - - PulsesPerRevolution - - - - - - CentimetersPerTick - Item1 / Item2 - - - InvertDirection - - - - - - Item2 ? -1.0 * Item1 : Item1 - - - - - - - - - - - - - - - - - - - - - TreadmillScaling - - - HarpTreadmillEvents - - - - - - - 1 - - - - - - - CalculateDisplacement - single(Item1.Value.Encoder - Item2.Value.Encoder) - - - TreadmillScaling - - - - - - - - - 0 - 1 - 0 - -0.005752427954571154 - Linear - - - - - - - CalculateInstantSpeed - new( -Item1 as Displacement, -(Item1 / single(Item2.Item1.Seconds - Item2.Item2.Seconds)) as InstantVelocity -) - - - Item1.Seconds - - - - - - - - - EncoderSample - - - TreadmillFriction - - - - 0 - 1 - 0 - 1 - Clamp - - - - - - - GetInterpolator - - - - RigSchema - - - HarpTreadmill.Calibration - - - BrakeLookupCalibration - - - - - - - 0 - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Write - - - - SendMessage - - - - Source1 - - - - 1 - - - - HarpMessage - - - HarpTreadmillEvents - - - - - - HarpMessage - - - - - - - PT0.1S - PT0.1S - - - - HarpMessage - - - - - - Item2 - - - - - - HarpTreadmillCommands - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - EncoderSample - - - Value - - - InstantVelocity - - - TaskLogicParameters - - - OperationControl - - - PositionControl.FrequencyFilterCutoff - - - - - - - - TreadmillSamplingRate - - - - - - - - - 250 - 5 - 0 - 60 - LowPass - - - - Seconds - - - - - - FilteredCurrentVelocity - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AudioControl - - - - AudioDuration - - - - 1000 - - - - Write - - - - HarpBehaviorCommands - - - AudioFrequency - - - Write - - - - HarpBehaviorCommands - - - AudioTrigger - - - Write - - PwmDO2 - - - - HarpBehaviorCommands - - - InitialSettings - - - - HarpBehaviorEvents - - - Write - - 50 - - - - - 1 - - - - HarpBehaviorCommands - - - TaskLogicParameters - - - OperationControl.AudioControl - - - Duration - - - AudioDuration - - - TaskLogicParameters - - - OperationControl.AudioControl - - - Frequency - - - AudioFrequency - - - - - - - - - - - - - - - - - HarpBehaviorEvents - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - TaskLogic - - - - 120 - 40 - 30 - - - - - - - VariableUpdaters - - - - TaskLogicParameters - - - Updaters - - - - 1 - - - - VariableUpdaters - - - GiveReward - - - - true - - - - StopDurationOffset - 0 - - - StopDurationOffset - - - - UpdaterStopDurationOffset - - - - UpdaterEvents - - - GiveReward - - - - true - - - - TaskLogicParameters - - - OperationControl.PositionControl.VelocityThreshold - - - - - - - - StopVelocityThreshold - 0 - - - StopVelocityThreshold - - - - UpdaterStopVelocityThreshold - - - - UpdaterEvents - - - GiveReward - - - - true - - - - RewardDelayOffset - 0 - - - RewardDelayOffset - - - - UpdaterRewardDelayOffset - - - - UpdaterEvents - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PatchStateMachine - - - - CurrentBlock - - - ActivePatch - - - ActivePatch - - - GlobalActivePatch - - - TaskLogicParameters - - - Environment - - - Blocks - - - Blocks - - - - Updates asynch - - - - CurrentBlock - - - - Block - - - - SoftwareEvent - - - CurrentBlock - - - EnvironmentStatistics.TransitionMatrix - - - - true - - - - TransitionMatrix - - - CurrentBlock - - - WithinBlockLogic - - - - CurrentBlock - - - EnvironmentStatistics.FirstStateOccupancy - - - TransitionMatrix - - - - - - RngSeed - - - - - - - - - - - - 1 - - - - ActiveStateIndex - - - - ActiveSite - - - ActiveSite - - - GlobalActiveSite - - - ActiveStateIndex - - - UpdatePatch - - - - Source1 - - - - 1 - - - - idx - - - PatchStatistics - - - idx - - - - - - - - - 0 - - - - - 1 - - - - - - - - - - - - - - - - - ActivePatch - - - ActivePatch - - - - ActivePatch - - - - SoftwareEvent + SoftwareEvent SiteSpecs @@ -4901,7 +2411,10 @@ Item1 as Displacement, - + + + + Patch @@ -4939,7 +2452,10 @@ Item1 as Displacement, - + + + + FirstPatchSite @@ -5023,7 +2539,7 @@ Item1 as Displacement, - + @@ -5115,7 +2631,7 @@ Item1 as Displacement, - + @@ -5205,7 +2721,7 @@ Item1 as Displacement, - + @@ -5293,7 +2809,7 @@ Item1 as Displacement, - + @@ -5453,7 +2969,10 @@ Item1 as Displacement, - + + + + ActivePatch @@ -5468,7 +2987,10 @@ Item1 as Displacement, - + + + + WaitForSiteOutcome @@ -5735,7 +3257,10 @@ it.Item3 as SiteHasChoice) - + + + + WaitForSiteOutcome @@ -5895,7 +3420,7 @@ it.Item3 as SiteHasChoice) - + ActiveStateIndex @@ -6000,7 +3525,7 @@ it.Item3 as SiteHasChoice) StartCondition - + StartExperimentShortcut @@ -6090,10 +3615,10 @@ it.Item3 as SiteHasChoice) OdorEndValveState - + Write - - 0 + + 0 @@ -6117,14 +3642,6 @@ it.Item3 as SiteHasChoice) Calibration - - - None - - - - - AxisConfiguration @@ -6141,12 +3658,12 @@ it.Item3 as SiteHasChoice) Axis - + Y1 - + Y2 @@ -6255,8 +3772,6 @@ it.Item3 as SiteHasChoice) - - @@ -6268,10 +3783,10 @@ it.Item3 as SiteHasChoice) 1 - + Write - - 0 + + 0 diff --git a/uv.lock b/uv.lock index 789de16f..41ffc2a9 100644 --- a/uv.lock +++ b/uv.lock @@ -27,21 +27,21 @@ wheels = [ [[package]] name = "aind-behavior-curriculum" -version = "0.0.37" +version = "0.0.38" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/ac/cb5073f94c6b41b88c6e91d8bf41f7c140d659a0eb1191bc0a91cace60db/aind_behavior_curriculum-0.0.37.tar.gz", hash = "sha256:a6d8fd58b4d172655bc445eefefe8ba6a7966f2b4303afe138dce3c07ec45a13", size = 139105, upload-time = "2025-12-05T22:51:07.253Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/ad/812f8cd33857366d7b1da81443ed60777992e591438c7104ad9fe0d4ac9f/aind_behavior_curriculum-0.0.38.tar.gz", hash = "sha256:11cce6a455ee3a2c0464e5f0ff170c44f1f9caf50cd3f1bf9bd9df7a41248e0d", size = 139193, upload-time = "2026-03-09T10:56:32.906Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/83/c51f680b86136dca811816746568de0feadbbe03d27a3213500a744ff047/aind_behavior_curriculum-0.0.37-py3-none-any.whl", hash = "sha256:349e973d52a450523b03a4b73b8371f72c80e9d43702eb62005f250e51663ca7", size = 48014, upload-time = "2025-12-05T22:51:06.351Z" }, + { url = "https://files.pythonhosted.org/packages/74/36/53daf76d7a3a27245fdee89e7900bbb13b9db0327af22d5f3e10c3273720/aind_behavior_curriculum-0.0.38-py3-none-any.whl", hash = "sha256:ec77803fc0cad1c9f430bad3f1d2404dd324ce24ee7970b8d8337de2d6ad2d3c", size = 48048, upload-time = "2026-03-09T10:56:31.299Z" }, ] [[package]] name = "aind-behavior-services" -version = "0.13.2" +version = "0.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-curriculum" }, @@ -50,9 +50,9 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/4b/3a5153a56ba92bf4cb8503b3670c58b0ce2dc1a38152a6888a654b2faefc/aind_behavior_services-0.13.2.tar.gz", hash = "sha256:506e9551c74db57026750f085b5f0034ba9896d9d7d496bf17977d4fc55b5f0f", size = 27357, upload-time = "2026-02-27T18:28:45.264Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/89/17cad4b1c9c75de7f71dc735ed07334eab9ea01876ddffdf6f9f64b5978a/aind_behavior_services-0.13.5.tar.gz", hash = "sha256:f771f3d1ebfc60c17cff53a2c4ad8d0919411e26066e712ef4f6cb10cd857b57", size = 29399, upload-time = "2026-03-23T18:47:18.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/ad/01b1da25639b2261159975b08e40e3fde74f73c01216cd83c1751ab23829/aind_behavior_services-0.13.2-py3-none-any.whl", hash = "sha256:2003a19aea0b0669088f02c8453c630bb0f0b3eb278c71d1107b972ac9171c8a", size = 37296, upload-time = "2026-02-27T18:28:44.055Z" }, + { url = "https://files.pythonhosted.org/packages/54/3d/a92f31e7ce1886bcaac017f25ae578589dc6ef3060f4ba10792f8c5b2e14/aind_behavior_services-0.13.5-py3-none-any.whl", hash = "sha256:bbd6ff52903a4d8d97c84f908f745a7784ded0047388225d8dee6515cd77b588", size = 39453, upload-time = "2026-03-23T18:47:19.678Z" }, ] [[package]] @@ -95,7 +95,7 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", specifier = ">=0.13.2" }, + { name = "aind-behavior-services", specifier = ">=0.13.5" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.10" }, { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.4" }, @@ -108,8 +108,8 @@ provides-extras = ["data", "launcher"] dev = [ { name = "aind-behavior-vr-foraging", extras = ["data"] }, { name = "aind-behavior-vr-foraging", extras = ["launcher"] }, - { name = "aind-data-schema", git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev" }, - { name = "aind-data-schema-models", git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main" }, + { name = "aind-data-schema" }, + { name = "aind-data-schema-models" }, { name = "codespell" }, { name = "ruff" }, ] @@ -159,27 +159,35 @@ aind-services = [ [[package]] name = "aind-data-schema" -version = "2.5.1" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema?rev=dev#26c8420e5e79ca35d3a8d9b598d81b0536cbe334" } +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, { name = "pydantic-extra-types" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/3e/04/fb661b20352d9768f1a777f5a26a4948ebeb40b49c6d0ddbe2004351aa97/aind_data_schema-2.6.0.tar.gz", hash = "sha256:921bf9e45a4d9671f883a79219119841de3d907928568c0f6f610d029ab2babf", size = 901339, upload-time = "2026-03-09T18:25:36.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/71/905924fa2483bb4bcc08218cc43119a790a859e695a1c28253711b11ec0d/aind_data_schema-2.6.0-py3-none-any.whl", hash = "sha256:dfc868930c9e2ee2fe8ca40ef3dc2d0502db59e44bd76c577fdecde77d73ac48", size = 92081, upload-time = "2026-03-09T18:25:35.332Z" }, +] [[package]] name = "aind-data-schema-models" -version = "5.4.0" -source = { git = "https://github.com/AllenNeuralDynamics/aind-data-schema-models?rev=main#0ceb561b5053cdea25dd9a00706b04a646490988" } +version = "5.4.1" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, { name = "requests" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/06/83/ac795e044cc4a44da7e61e4ca1afbf12030cd723ce7f03d85f69977e3860/aind_data_schema_models-5.4.1.tar.gz", hash = "sha256:f6550a1fc945c1954ea2c074d09df880cc8b44755f000d5ebe13f8b2507aa08c", size = 340521, upload-time = "2026-03-09T18:20:52.334Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/d7/51e8abfd0919035f719ecc3d8223e6cca4de87f1a263da527fcda34df59f/aind_data_schema_models-5.4.1-py3-none-any.whl", hash = "sha256:2996e2856b04874019d336172b934bacbc7cb3c5079deed52cda09f063d3a856", size = 309923, upload-time = "2026-03-09T18:20:50.921Z" }, +] [[package]] name = "aind-data-transfer-service" -version = "2.0.2" +version = "2.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, @@ -187,9 +195,9 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/03/60306855616b701cac67c01f552a26a7ebe211fc0168f355520ce14a69da/aind_data_transfer_service-2.0.2.tar.gz", hash = "sha256:753063c1c626ff263f8299a5a7448efa74ce535559d3ad3a80fa812ecd653889", size = 36889, upload-time = "2026-01-27T00:23:56.012Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/51/e183dd1167b58fadf4f439b1147593176ba3d155da89ecfa83e609d39f1b/aind_data_transfer_service-2.0.3.tar.gz", hash = "sha256:fee976aea5dc68943b8815398190eb9f7cc3a6fb208feadd047bd933a5014b6d", size = 37198, upload-time = "2026-03-23T23:51:33.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/90/e77fff58677299129b685d0a76c7127fa08b18b19d83d057d954eb56b809/aind_data_transfer_service-2.0.2-py3-none-any.whl", hash = "sha256:6771732fc94eeec08792a48fb81a03d6970375f9553b786290b7aecb5cebb32f", size = 23061, upload-time = "2026-01-27T00:23:55.032Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bc/c180bff4ab1ac67aeec5206afe75cc0a785980d3f38ba7482daae36231c5/aind_data_transfer_service-2.0.3-py3-none-any.whl", hash = "sha256:4429048c1896dba2fb4688f6fc2ca6bbae5e4e1d645417417e9ad45fd3736bc6", size = 23147, upload-time = "2026-03-23T23:51:32.237Z" }, ] [[package]] @@ -397,75 +405,91 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, - { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, - { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, - { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, - { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, - { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, - { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, - { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, - { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, - { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, - { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, - { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, - { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, - { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, - { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, - { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, - { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, - { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, - { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, - { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, - { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, - { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, - { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, - { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, - { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, - { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, - { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, - { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, - { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, - { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, - { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, - { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, - { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, - { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, - { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, - { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, - { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, - { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, - { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, - { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, - { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, - { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, - { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, - { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, - { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, - { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, + { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, + { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, + { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, + { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, + { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, + { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, + { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, + { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, + { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, + { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, + { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, + { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, + { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, + { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, + { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, + { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, + { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, + { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, + { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, + { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, + { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, ] [[package]] @@ -482,11 +506,11 @@ wheels = [ [[package]] name = "codespell" -version = "2.4.1" +version = "2.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740, upload-time = "2025-01-28T18:52:39.411Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/9d/1d0903dff693160f893ca6abcabad545088e7a2ee0a6deae7c24e958be69/codespell-2.4.2.tar.gz", hash = "sha256:3c33be9ae34543807f088aeb4832dfad8cb2dae38da61cac0a7045dd376cfdf3", size = 352058, upload-time = "2026-03-05T18:10:42.936Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501, upload-time = "2025-01-28T18:52:37.057Z" }, + { url = "https://files.pythonhosted.org/packages/42/a1/52fa05533e95fe45bcc09bcf8a503874b1c08f221a4e35608017e0938f55/codespell-2.4.2-py3-none-any.whl", hash = "sha256:97e0c1060cf46bd1d5db89a936c98db8c2b804e1fdd4b5c645e82a1ec6b1f886", size = 353715, upload-time = "2026-03-05T18:10:41.398Z" }, ] [[package]] @@ -732,51 +756,51 @@ wheels = [ [[package]] name = "fonttools" -version = "4.61.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" }, - { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" }, - { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" }, - { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" }, - { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" }, - { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" }, - { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" }, - { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" }, - { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, - { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, - { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, - { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, - { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, - { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, - { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, - { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, - { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" }, - { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" }, - { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" }, - { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" }, - { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" }, - { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" }, - { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, - { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, - { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, - { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, - { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, - { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, - { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, - { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, - { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, - { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, - { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7", size = 2871039, upload-time = "2026-03-13T13:52:33.127Z" }, + { url = "https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14", size = 2416346, upload-time = "2026-03-13T13:52:35.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/53/5276ceba7bff95da7793a07c5284e1da901cf00341ce5e2f3273056c0cca/fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7", size = 5100897, upload-time = "2026-03-13T13:52:38.102Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b", size = 5071078, upload-time = "2026-03-13T13:52:41.305Z" }, + { url = "https://files.pythonhosted.org/packages/e3/be/d378fca4c65ea1956fee6d90ace6e861776809cbbc5af22388a090c3c092/fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1", size = 5076908, upload-time = "2026-03-13T13:52:44.122Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d9/ae6a1d0693a4185a84605679c8a1f719a55df87b9c6e8e817bfdd9ef5936/fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416", size = 5202275, upload-time = "2026-03-13T13:52:46.591Z" }, + { url = "https://files.pythonhosted.org/packages/54/6c/af95d9c4efb15cabff22642b608342f2bd67137eea6107202d91b5b03184/fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53", size = 2293075, upload-time = "2026-03-13T13:52:48.711Z" }, + { url = "https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2", size = 2344593, upload-time = "2026-03-13T13:52:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, + { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/3b/56/6f389de21c49555553d6a5aeed5ac9767631497ac836c4f076273d15bd72/fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79", size = 2865155, upload-time = "2026-03-13T13:53:16.132Z" }, + { url = "https://files.pythonhosted.org/packages/03/c5/0e3966edd5ec668d41dfe418787726752bc07e2f5fd8c8f208615e61fa89/fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe", size = 2412802, upload-time = "2026-03-13T13:53:18.878Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/e6ac4b44026de7786fe46e3bfa0c87e51d5d70a841054065d49cd62bb909/fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68", size = 5013926, upload-time = "2026-03-13T13:53:21.379Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/8b1e801939839d405f1f122e7d175cebe9aeb4e114f95bfc45e3152af9a7/fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1", size = 4964575, upload-time = "2026-03-13T13:53:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/46/76/7d051671e938b1881670528fec69cc4044315edd71a229c7fd712eaa5119/fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069", size = 4953693, upload-time = "2026-03-13T13:53:26.569Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ae/b41f8628ec0be3c1b934fc12b84f4576a5c646119db4d3bdd76a217c90b5/fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9", size = 5094920, upload-time = "2026-03-13T13:53:29.329Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/53a1e9469331a23dcc400970a27a4caa3d9f6edbf5baab0260285238b884/fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24", size = 2279928, upload-time = "2026-03-13T13:53:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/38/60/35186529de1db3c01f5ad625bde07c1f576305eab6d86bbda4c58445f721/fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056", size = 2330514, upload-time = "2026-03-13T13:53:34.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, + { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, + { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, + { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, + { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, + { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, + { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, + { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, + { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, + { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, + { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, ] [[package]] @@ -874,101 +898,117 @@ wheels = [ [[package]] name = "jsonpointer" -version = "3.0.0" +version = "3.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } +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/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, + { 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 = "kiwisolver" -version = "1.4.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, - { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, - { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, - { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, - { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, - { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, - { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, - { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, - { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, - { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, - { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, - { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, - { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, - { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, - { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, - { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, - { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, - { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, - { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, - { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, - { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, - { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, - { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, - { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, - { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, - { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, - { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, - { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, - { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, - { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, - { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, - { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, - { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, - { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, - { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, - { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, - { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, - { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, - { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, - { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, - { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, - { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, - { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, - { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, - { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, - { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, - { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, - { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, - { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, + { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, ] [[package]] @@ -1272,16 +1312,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/d0/a0/da7aaa5c87d155f2a [[package]] name = "msal" -version = "1.35.0" +version = "1.35.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyjwt", extra = ["crypto"] }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/ec/52e6c9ad90ad7eb3035f5e511123e89d1ecc7617f0c94653264848623c12/msal-1.35.0.tar.gz", hash = "sha256:76ab7513dbdac88d76abdc6a50110f082b7ed3ff1080aca938c53fc88bc75b51", size = 164057, upload-time = "2026-02-24T10:58:28.415Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/aa/5a646093ac218e4a329391d5a31e5092a89db7d2ef1637a90b82cd0b6f94/msal-1.35.1.tar.gz", hash = "sha256:70cac18ab80a053bff86219ba64cfe3da1f307c74b009e2da57ef040eb1b5656", size = 165658, upload-time = "2026-03-04T23:38:51.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/26/5463e615de18ad8b80d75d14c612ef3c866fcc07c1c52e8eac7948984214/msal-1.35.0-py3-none-any.whl", hash = "sha256:baf268172d2b736e5d409689424d2f321b4142cab231b4b96594c86762e7e01d", size = 120082, upload-time = "2026-02-24T10:58:27.219Z" }, + { url = "https://files.pythonhosted.org/packages/96/86/16815fddf056ca998853c6dc525397edf0b43559bb4073a80d2bc7fe8009/msal-1.35.1-py3-none-any.whl", hash = "sha256:8f4e82f34b10c19e326ec69f44dc6b30171f2f7098f3720ea8a9f0c11832caa3", size = 119909, upload-time = "2026-03-04T23:38:50.452Z" }, ] [[package]] @@ -1304,81 +1344,81 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, - { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, - { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, - { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, - { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, - { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, - { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, - { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, - { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, - { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, - { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, - { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, - { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, - { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, - { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, - { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, - { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, - { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, - { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, - { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, - { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, - { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, - { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, - { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, - { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, - { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, - { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, - { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, - { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, - { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, - { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, - { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, - { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, - { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, - { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, - { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, - { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, - { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, - { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, - { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, - { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, - { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, - { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, - { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, - { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, - { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, - { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, - { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, - { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, - { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, - { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, - { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, - { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, - { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, - { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb", size = 16957183, upload-time = "2026-03-09T07:55:57.774Z" }, + { url = "https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147", size = 14968734, upload-time = "2026-03-09T07:56:00.494Z" }, + { url = "https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920", size = 5475288, upload-time = "2026-03-09T07:56:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9", size = 6805253, upload-time = "2026-03-09T07:56:04.53Z" }, + { url = "https://files.pythonhosted.org/packages/21/bc/e7aa3f6817e40c3f517d407742337cbb8e6fc4b83ce0b55ab780c829243b/numpy-2.4.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a016db5c5dba78fa8fe9f5d80d6708f9c42ab087a739803c0ac83a43d686a470", size = 15969479, upload-time = "2026-03-09T07:56:06.638Z" }, + { url = "https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71", size = 16901035, upload-time = "2026-03-09T07:56:09.405Z" }, + { url = "https://files.pythonhosted.org/packages/64/6e/b221dd847d7181bc5ee4857bfb026182ef69499f9305eb1371cbb1aea626/numpy-2.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2ddb7919366ee468342b91dea2352824c25b55814a987847b6c52003a7c97f15", size = 17325657, upload-time = "2026-03-09T07:56:12.067Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b8/8f3fd2da596e1063964b758b5e3c970aed1949a05200d7e3d46a9d46d643/numpy-2.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a315e5234d88067f2d97e1f2ef670a7569df445d55400f1e33d117418d008d52", size = 18635512, upload-time = "2026-03-09T07:56:14.629Z" }, + { url = "https://files.pythonhosted.org/packages/5c/24/2993b775c37e39d2f8ab4125b44337ab0b2ba106c100980b7c274a22bee7/numpy-2.4.3-cp311-cp311-win32.whl", hash = "sha256:2b3f8d2c4589b1a2028d2a770b0fc4d1f332fb5e01521f4de3199a896d158ddd", size = 6238100, upload-time = "2026-03-09T07:56:17.243Z" }, + { url = "https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec", size = 12609816, upload-time = "2026-03-09T07:56:19.089Z" }, + { url = "https://files.pythonhosted.org/packages/92/82/190b99153480076c8dce85f4cfe7d53ea84444145ffa54cb58dcd460d66b/numpy-2.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:eb610595dd91560905c132c709412b512135a60f1851ccbd2c959e136431ff67", size = 10485757, upload-time = "2026-03-09T07:56:21.753Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ed/6388632536f9788cea23a3a1b629f25b43eaacd7d7377e5d6bc7b9deb69b/numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef", size = 16669628, upload-time = "2026-03-09T07:56:24.252Z" }, + { url = "https://files.pythonhosted.org/packages/74/1b/ee2abfc68e1ce728b2958b6ba831d65c62e1b13ce3017c13943f8f9b5b2e/numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e", size = 14696872, upload-time = "2026-03-09T07:56:26.991Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d1/780400e915ff5638166f11ca9dc2c5815189f3d7cf6f8759a1685e586413/numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4", size = 5203489, upload-time = "2026-03-09T07:56:29.414Z" }, + { url = "https://files.pythonhosted.org/packages/0b/bb/baffa907e9da4cc34a6e556d6d90e032f6d7a75ea47968ea92b4858826c4/numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18", size = 6550814, upload-time = "2026-03-09T07:56:32.225Z" }, + { url = "https://files.pythonhosted.org/packages/7b/12/8c9f0c6c95f76aeb20fc4a699c33e9f827fa0d0f857747c73bb7b17af945/numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5", size = 15666601, upload-time = "2026-03-09T07:56:34.461Z" }, + { url = "https://files.pythonhosted.org/packages/bd/79/cc665495e4d57d0aa6fbcc0aa57aa82671dfc78fbf95fe733ed86d98f52a/numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97", size = 16621358, upload-time = "2026-03-09T07:56:36.852Z" }, + { url = "https://files.pythonhosted.org/packages/a8/40/b4ecb7224af1065c3539f5ecfff879d090de09608ad1008f02c05c770cb3/numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c", size = 17016135, upload-time = "2026-03-09T07:56:39.337Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b1/6a88e888052eed951afed7a142dcdf3b149a030ca59b4c71eef085858e43/numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc", size = 18345816, upload-time = "2026-03-09T07:56:42.31Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8f/103a60c5f8c3d7fc678c19cd7b2476110da689ccb80bc18050efbaeae183/numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9", size = 5960132, upload-time = "2026-03-09T07:56:44.851Z" }, + { url = "https://files.pythonhosted.org/packages/d7/7c/f5ee1bf6ed888494978046a809df2882aad35d414b622893322df7286879/numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5", size = 12316144, upload-time = "2026-03-09T07:56:47.057Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/8d1cb3f7a00f2fb6394140e7e6623696e54c6318a9d9691bb4904672cf42/numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e", size = 10220364, upload-time = "2026-03-09T07:56:49.849Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/1fe47a98ce0df229238b77611340aff92d52691bcbc10583303181abf7fc/numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3", size = 16665297, upload-time = "2026-03-09T07:56:52.296Z" }, + { url = "https://files.pythonhosted.org/packages/27/d9/4e7c3f0e68dfa91f21c6fb6cf839bc829ec920688b1ce7ec722b1a6202fb/numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9", size = 14691853, upload-time = "2026-03-09T07:56:54.992Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/bd096b13a87549683812b53ab211e6d413497f84e794fb3c39191948da97/numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee", size = 5198435, upload-time = "2026-03-09T07:56:57.184Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/687722910b5a5601de2135c891108f51dfc873d8e43c8ed9f4ebb440b4a2/numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f", size = 6546347, upload-time = "2026-03-09T07:56:59.531Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ec/7971c4e98d86c564750393fab8d7d83d0a9432a9d78bb8a163a6dc59967a/numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f", size = 15664626, upload-time = "2026-03-09T07:57:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/7daecbea84ec935b7fc732e18f532073064a3816f0932a40a17f3349185f/numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc", size = 16608916, upload-time = "2026-03-09T07:57:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/df/58/2a2b4a817ffd7472dca4421d9f0776898b364154e30c95f42195041dc03b/numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476", size = 17015824, upload-time = "2026-03-09T07:57:06.347Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ca/627a828d44e78a418c55f82dd4caea8ea4a8ef24e5144d9e71016e52fb40/numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92", size = 18334581, upload-time = "2026-03-09T07:57:09.114Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c0/76f93962fc79955fcba30a429b62304332345f22d4daec1cb33653425643/numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687", size = 5958618, upload-time = "2026-03-09T07:57:11.432Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3c/88af0040119209b9b5cb59485fa48b76f372c73068dbf9254784b975ac53/numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd", size = 12312824, upload-time = "2026-03-09T07:57:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/58/ce/3d07743aced3d173f877c3ef6a454c2174ba42b584ab0b7e6d99374f51ed/numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d", size = 10221218, upload-time = "2026-03-09T07:57:16.183Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/d96b02a91d09e9d97862f4fc8bfebf5400f567d8eb1fe4b0cc4795679c15/numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875", size = 14819570, upload-time = "2026-03-09T07:57:18.564Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ca/0b1aba3905fdfa3373d523b2b15b19029f4f3031c87f4066bd9d20ef6c6b/numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070", size = 5326113, upload-time = "2026-03-09T07:57:21.052Z" }, + { url = "https://files.pythonhosted.org/packages/c0/63/406e0fd32fcaeb94180fd6a4c41e55736d676c54346b7efbce548b94a914/numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73", size = 6646370, upload-time = "2026-03-09T07:57:22.804Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/10f7dc157d4b37af92720a196be6f54f889e90dcd30dce9dc657ed92c257/numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368", size = 15723499, upload-time = "2026-03-09T07:57:24.693Z" }, + { url = "https://files.pythonhosted.org/packages/66/f1/d1c2bf1161396629701bc284d958dc1efa3a5a542aab83cf11ee6eb4cba5/numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22", size = 16657164, upload-time = "2026-03-09T07:57:27.676Z" }, + { url = "https://files.pythonhosted.org/packages/1a/be/cca19230b740af199ac47331a21c71e7a3d0ba59661350483c1600d28c37/numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a", size = 17081544, upload-time = "2026-03-09T07:57:30.664Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/9602b0cbb703a0936fb40f8a95407e8171935b15846de2f0776e08af04c7/numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349", size = 18380290, upload-time = "2026-03-09T07:57:33.763Z" }, + { url = "https://files.pythonhosted.org/packages/ed/81/9f24708953cd30be9ee36ec4778f4b112b45165812f2ada4cc5ea1c1f254/numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c", size = 6082814, upload-time = "2026-03-09T07:57:36.491Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9e/52f6eaa13e1a799f0ab79066c17f7016a4a8ae0c1aefa58c82b4dab690b4/numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26", size = 12452673, upload-time = "2026-03-09T07:57:38.281Z" }, + { url = "https://files.pythonhosted.org/packages/c4/04/b8cece6ead0b30c9fbd99bb835ad7ea0112ac5f39f069788c5558e3b1ab2/numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02", size = 10290907, upload-time = "2026-03-09T07:57:40.747Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/3936f79adebf8caf81bd7a599b90a561334a658be4dcc7b6329ebf4ee8de/numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4", size = 16664563, upload-time = "2026-03-09T07:57:43.817Z" }, + { url = "https://files.pythonhosted.org/packages/9b/62/760f2b55866b496bb1fa7da2a6db076bef908110e568b02fcfc1422e2a3a/numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168", size = 14702161, upload-time = "2026-03-09T07:57:46.169Z" }, + { url = "https://files.pythonhosted.org/packages/32/af/a7a39464e2c0a21526fb4fb76e346fb172ebc92f6d1c7a07c2c139cc17b1/numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b", size = 5208738, upload-time = "2026-03-09T07:57:48.506Z" }, + { url = "https://files.pythonhosted.org/packages/29/8c/2a0cf86a59558fa078d83805589c2de490f29ed4fb336c14313a161d358a/numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950", size = 6543618, upload-time = "2026-03-09T07:57:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b8/612ce010c0728b1c363fa4ea3aa4c22fe1c5da1de008486f8c2f5cb92fae/numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd", size = 15680676, upload-time = "2026-03-09T07:57:52.34Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7e/4f120ecc54ba26ddf3dc348eeb9eb063f421de65c05fc961941798feea18/numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24", size = 16613492, upload-time = "2026-03-09T07:57:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/2c/86/1b6020db73be330c4b45d5c6ee4295d59cfeef0e3ea323959d053e5a6909/numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0", size = 17031789, upload-time = "2026-03-09T07:57:57.641Z" }, + { url = "https://files.pythonhosted.org/packages/07/3a/3b90463bf41ebc21d1b7e06079f03070334374208c0f9a1f05e4ae8455e7/numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0", size = 18339941, upload-time = "2026-03-09T07:58:00.577Z" }, + { url = "https://files.pythonhosted.org/packages/a8/74/6d736c4cd962259fd8bae9be27363eb4883a2f9069763747347544c2a487/numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a", size = 6007503, upload-time = "2026-03-09T07:58:03.331Z" }, + { url = "https://files.pythonhosted.org/packages/48/39/c56ef87af669364356bb011922ef0734fc49dad51964568634c72a009488/numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc", size = 12444915, upload-time = "2026-03-09T07:58:06.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1f/ab8528e38d295fd349310807496fabb7cf9fe2e1f70b97bc20a483ea9d4a/numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7", size = 10494875, upload-time = "2026-03-09T07:58:08.734Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ef/b7c35e4d5ef141b836658ab21a66d1a573e15b335b1d111d31f26c8ef80f/numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657", size = 14822225, upload-time = "2026-03-09T07:58:11.034Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8d/7730fa9278cf6648639946cc816e7cc89f0d891602584697923375f801ed/numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7", size = 5328769, upload-time = "2026-03-09T07:58:13.67Z" }, + { url = "https://files.pythonhosted.org/packages/47/01/d2a137317c958b074d338807c1b6a383406cdf8b8e53b075d804cc3d211d/numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093", size = 6649461, upload-time = "2026-03-09T07:58:15.912Z" }, + { url = "https://files.pythonhosted.org/packages/5c/34/812ce12bc0f00272a4b0ec0d713cd237cb390666eb6206323d1cc9cedbb2/numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a", size = 15725809, upload-time = "2026-03-09T07:58:17.787Z" }, + { url = "https://files.pythonhosted.org/packages/25/c0/2aed473a4823e905e765fee3dc2cbf504bd3e68ccb1150fbdabd5c39f527/numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611", size = 16655242, upload-time = "2026-03-09T07:58:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/f2/c8/7e052b2fc87aa0e86de23f20e2c42bd261c624748aa8efd2c78f7bb8d8c6/numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720", size = 17080660, upload-time = "2026-03-09T07:58:23.067Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3d/0876746044db2adcb11549f214d104f2e1be00f07a67edbb4e2812094847/numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5", size = 18380384, upload-time = "2026-03-09T07:58:25.839Z" }, + { url = "https://files.pythonhosted.org/packages/07/12/8160bea39da3335737b10308df4f484235fd297f556745f13092aa039d3b/numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0", size = 6154547, upload-time = "2026-03-09T07:58:28.289Z" }, + { url = "https://files.pythonhosted.org/packages/42/f3/76534f61f80d74cc9cdf2e570d3d4eeb92c2280a27c39b0aaf471eda7b48/numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b", size = 12633645, upload-time = "2026-03-09T07:58:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b6/7c0d4334c15983cec7f92a69e8ce9b1e6f31857e5ee3a413ac424e6bd63d/numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e", size = 10565454, upload-time = "2026-03-09T07:58:33.031Z" }, + { url = "https://files.pythonhosted.org/packages/64/e4/4dab9fb43c83719c29241c535d9e07be73bea4bc0c6686c5816d8e1b6689/numpy-2.4.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c6b124bfcafb9e8d3ed09130dbee44848c20b3e758b6bbf006e641778927c028", size = 16834892, upload-time = "2026-03-09T07:58:35.334Z" }, + { url = "https://files.pythonhosted.org/packages/c9/29/f8b6d4af90fed3dfda84ebc0df06c9833d38880c79ce954e5b661758aa31/numpy-2.4.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76dbb9d4e43c16cf9aa711fcd8de1e2eeb27539dcefb60a1d5e9f12fae1d1ed8", size = 14893070, upload-time = "2026-03-09T07:58:37.7Z" }, + { url = "https://files.pythonhosted.org/packages/9a/04/a19b3c91dbec0a49269407f15d5753673a09832daed40c45e8150e6fa558/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:29363fbfa6f8ee855d7569c96ce524845e3d726d6c19b29eceec7dd555dab152", size = 5399609, upload-time = "2026-03-09T07:58:39.853Z" }, + { url = "https://files.pythonhosted.org/packages/79/34/4d73603f5420eab89ea8a67097b31364bf7c30f811d4dd84b1659c7476d9/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:bc71942c789ef415a37f0d4eab90341425a00d538cd0642445d30b41023d3395", size = 6714355, upload-time = "2026-03-09T07:58:42.365Z" }, + { url = "https://files.pythonhosted.org/packages/58/ad/1100d7229bb248394939a12a8074d485b655e8ed44207d328fdd7fcebc7b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e58765ad74dcebd3ef0208a5078fba32dc8ec3578fe84a604432950cd043d79", size = 15800434, upload-time = "2026-03-09T07:58:44.837Z" }, + { url = "https://files.pythonhosted.org/packages/0c/fd/16d710c085d28ba4feaf29ac60c936c9d662e390344f94a6beaa2ac9899b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e236dbda4e1d319d681afcbb136c0c4a8e0f1a5c58ceec2adebb547357fe857", size = 16729409, upload-time = "2026-03-09T07:58:47.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" }, ] [[package]] @@ -1569,11 +1609,11 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.2" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, ] [[package]] @@ -1727,15 +1767,15 @@ wheels = [ [[package]] name = "pydantic-extra-types" -version = "2.11.0" +version = "2.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/35/2fee58b1316a73e025728583d3b1447218a97e621933fc776fb8c0f2ebdd/pydantic_extra_types-2.11.0.tar.gz", hash = "sha256:4e9991959d045b75feb775683437a97991d02c138e00b59176571db9ce634f0e", size = 157226, upload-time = "2025-12-31T16:18:27.944Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/71/dba38ee2651f84f7842206adbd2233d8bbdb59fb85e9fa14232486a8c471/pydantic_extra_types-2.11.1.tar.gz", hash = "sha256:46792d2307383859e923d8fcefa82108b1a141f8a9c0198982b3832ab5ef1049", size = 172002, upload-time = "2026-03-16T08:08:03.92Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/17/fabd56da47096d240dd45ba627bead0333b0cf0ee8ada9bec579287dadf3/pydantic_extra_types-2.11.0-py3-none-any.whl", hash = "sha256:84b864d250a0fc62535b7ec591e36f2c5b4d1325fa0017eb8cda9aeb63b374a6", size = 74296, upload-time = "2025-12-31T16:18:26.38Z" }, + { url = "https://files.pythonhosted.org/packages/17/c1/3226e6d7f5a4f736f38ac11a6fbb262d701889802595cdb0f53a885ac2e0/pydantic_extra_types-2.11.1-py3-none-any.whl", hash = "sha256:1722ea2bddae5628ace25f2aa685b69978ef533123e5638cfbddb999e0100ec1", size = 79526, upload-time = "2026-03-16T08:08:02.533Z" }, ] [[package]] @@ -1783,11 +1823,11 @@ sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b0 [[package]] name = "pyjwt" -version = "2.11.0" +version = "2.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload-time = "2026-01-30T19:59:55.694Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload-time = "2026-01-30T19:59:54.539Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] [package.optional-dependencies] @@ -2025,27 +2065,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/31/d6e536cdebb6568ae75a7f00e4b4819ae0ad2640c3604c305a0428680b0c/ruff-0.15.4.tar.gz", hash = "sha256:3412195319e42d634470cc97aa9803d07e9d5c9223b99bcb1518f0c725f26ae1", size = 4569550, upload-time = "2026-02-26T20:04:14.959Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/82/c11a03cfec3a4d26a0ea1e571f0f44be5993b923f905eeddfc397c13d360/ruff-0.15.4-py3-none-linux_armv6l.whl", hash = "sha256:a1810931c41606c686bae8b5b9a8072adac2f611bb433c0ba476acba17a332e0", size = 10453333, upload-time = "2026-02-26T20:04:20.093Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5a1632c66672b8b4d3e1d1782859e98d6e0b4e70829530666644286600a33992", size = 10853356, upload-time = "2026-02-26T20:04:05.808Z" }, - { url = "https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a4386ba2cd6c0f4ff75252845906acc7c7c8e1ac567b7bc3d373686ac8c222ba", size = 10187434, upload-time = "2026-02-26T20:03:54.656Z" }, - { url = "https://files.pythonhosted.org/packages/85/cc/cc220fd9394eff5db8d94dec199eec56dd6c9f3651d8869d024867a91030/ruff-0.15.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2496488bdfd3732747558b6f95ae427ff066d1fcd054daf75f5a50674411e75", size = 10535456, upload-time = "2026-02-26T20:03:52.738Z" }, - { url = "https://files.pythonhosted.org/packages/fa/0f/bced38fa5cf24373ec767713c8e4cadc90247f3863605fb030e597878661/ruff-0.15.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f1c4893841ff2d54cbda1b2860fa3260173df5ddd7b95d370186f8a5e66a4ac", size = 10287772, upload-time = "2026-02-26T20:04:08.138Z" }, - { url = "https://files.pythonhosted.org/packages/2b/90/58a1802d84fed15f8f281925b21ab3cecd813bde52a8ca033a4de8ab0e7a/ruff-0.15.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:820b8766bd65503b6c30aaa6331e8ef3a6e564f7999c844e9a547c40179e440a", size = 11049051, upload-time = "2026-02-26T20:04:03.53Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ac/b7ad36703c35f3866584564dc15f12f91cb1a26a897dc2fd13d7cb3ae1af/ruff-0.15.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9fb74bab47139c1751f900f857fa503987253c3ef89129b24ed375e72873e85", size = 11890494, upload-time = "2026-02-26T20:04:10.497Z" }, - { url = "https://files.pythonhosted.org/packages/93/3d/3eb2f47a39a8b0da99faf9c54d3eb24720add1e886a5309d4d1be73a6380/ruff-0.15.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f80c98765949c518142b3a50a5db89343aa90f2c2bf7799de9986498ae6176db", size = 11326221, upload-time = "2026-02-26T20:04:12.84Z" }, - { url = "https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451a2e224151729b3b6c9ffb36aed9091b2996fe4bdbd11f47e27d8f2e8888ec", size = 11168459, upload-time = "2026-02-26T20:04:00.969Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e5/a64d27688789b06b5d55162aafc32059bb8c989c61a5139a36e1368285eb/ruff-0.15.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a8f157f2e583c513c4f5f896163a93198297371f34c04220daf40d133fdd4f7f", size = 11104366, upload-time = "2026-02-26T20:03:48.099Z" }, - { url = "https://files.pythonhosted.org/packages/f1/f6/32d1dcb66a2559763fc3027bdd65836cad9eb09d90f2ed6a63d8e9252b02/ruff-0.15.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:917cc68503357021f541e69b35361c99387cdbbf99bd0ea4aa6f28ca99ff5338", size = 10510887, upload-time = "2026-02-26T20:03:45.771Z" }, - { url = "https://files.pythonhosted.org/packages/ff/92/22d1ced50971c5b6433aed166fcef8c9343f567a94cf2b9d9089f6aa80fe/ruff-0.15.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e9737c8161da79fd7cfec19f1e35620375bd8b2a50c3e77fa3d2c16f574105cc", size = 10285939, upload-time = "2026-02-26T20:04:22.42Z" }, - { url = "https://files.pythonhosted.org/packages/e6/f4/7c20aec3143837641a02509a4668fb146a642fd1211846634edc17eb5563/ruff-0.15.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:291258c917539e18f6ba40482fe31d6f5ac023994ee11d7bdafd716f2aab8a68", size = 10765471, upload-time = "2026-02-26T20:03:58.924Z" }, - { url = "https://files.pythonhosted.org/packages/d0/09/6d2f7586f09a16120aebdff8f64d962d7c4348313c77ebb29c566cefc357/ruff-0.15.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3f83c45911da6f2cd5936c436cf86b9f09f09165f033a99dcf7477e34041cbc3", size = 11263382, upload-time = "2026-02-26T20:04:24.424Z" }, - { url = "https://files.pythonhosted.org/packages/1b/fa/2ef715a1cd329ef47c1a050e10dee91a9054b7ce2fcfdd6a06d139afb7ec/ruff-0.15.4-py3-none-win32.whl", hash = "sha256:65594a2d557d4ee9f02834fcdf0a28daa8b3b9f6cb2cb93846025a36db47ef22", size = 10506664, upload-time = "2026-02-26T20:03:50.56Z" }, - { url = "https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl", hash = "sha256:04196ad44f0df220c2ece5b0e959c2f37c777375ec744397d21d15b50a75264f", size = 11651048, upload-time = "2026-02-26T20:04:17.191Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0a/9e1be9035b37448ce2e68c978f0591da94389ade5a5abafa4cf99985d1b2/ruff-0.15.4-py3-none-win_arm64.whl", hash = "sha256:60d5177e8cfc70e51b9c5fad936c634872a74209f934c1e79107d11787ad5453", size = 10966776, upload-time = "2026-02-26T20:03:56.908Z" }, +version = "0.15.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" }, + { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" }, + { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" }, + { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" }, + { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" }, + { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" }, + { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" }, + { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" }, ] [[package]] @@ -2148,11 +2188,11 @@ wheels = [ [[package]] name = "smmap" -version = "5.0.2" +version = "5.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, ] [[package]] From ce9310a8bf661dacf8c735c9af4bf892cdb29737 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Wed, 25 Mar 2026 05:24:27 -0700 Subject: [PATCH 19/31] Add saturation visualizer --- ...SpinnakerCameraControllerVisualizer.bonsai | 231 ++++++++++++++++++ src/Extensions/Visualizers.bonsai | 12 +- 2 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 src/Extensions/SpinnakerCameraControllerVisualizer.bonsai diff --git a/src/Extensions/SpinnakerCameraControllerVisualizer.bonsai b/src/Extensions/SpinnakerCameraControllerVisualizer.bonsai new file mode 100644 index 00000000..92720dae --- /dev/null +++ b/src/Extensions/SpinnakerCameraControllerVisualizer.bonsai @@ -0,0 +1,231 @@ + + + + + + Source1 + + + + + + + + + + + Source1 + + + CamerasStream + + + + CamerasStream + + + Key + + + + + + true + true + + + + SelectedControllerCamera + + + + + + SelectedControllerCamera + + + + + + GetStream + + + + Source1 + + + + 1 + + + + Camera + + + + + + CamerasStream + + + Camera + + + + + + + + + + + Source1 + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Value.Image + + + + + + + + 0 + 255 + 1 + + + + + + + false + + + + + 1 + + + + CamerasStream + + + + true + + + + + + + + + + + + + ControllerVisualization + true + true + 1 + 2 + + + + Percent + 0.1 + + + Percent + 0.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/Visualizers.bonsai b/src/Extensions/Visualizers.bonsai index 629a3fae..ada97d84 100644 --- a/src/Extensions/Visualizers.bonsai +++ b/src/Extensions/Visualizers.bonsai @@ -55,14 +55,22 @@ TriggeredCamerasStream - + + 1 + 254 + 1 + TriggeredCamerasStream - + + 1 + 254 + 1 + From 78556d16ca8145375f5bdd44c068287e14348fd8 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Thu, 26 Mar 2026 15:29:26 -0700 Subject: [PATCH 20/31] Serialize `TrainerState` that was used to a standard location --- scripts/aind.py | 5 ++-- .../data_mappers/_session.py | 28 ++++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/scripts/aind.py b/scripts/aind.py index bbf508d9..1500755d 100644 --- a/scripts/aind.py +++ b/scripts/aind.py @@ -51,7 +51,8 @@ async def aind_experiment_protocol(launcher: Launcher) -> None: ] ).run() - input_trainer_state_path = launcher.save_temp_model(trainer_state) + input_trainer_state_path = launcher.session_directory / "behavior" / "trainer_state.json" + input_trainer_state_path.write_text(trainer_state.model_dump_json(indent=2), encoding="utf-8") # Post-fetching modifications manipulator_modifier = ByAnimalManipulatorModifier( @@ -243,7 +244,7 @@ async def recover_session(launcher: Launcher) -> None: rig_model = AindVrForagingRig.model_validate_json( (session_path / "behavior/Logs/rig_input.json").read_text(encoding="utf-8") ) - trainer_state_files = list((session_path / "behavior/Logs/.launcher").glob("TrainerState_*.json")) + trainer_state_files = list((session_path / "behavior").glob("trainer_state*.json")) if trainer_state_files: input_trainer_state_path = trainer_state_files[0] else: diff --git a/src/aind_behavior_vr_foraging/data_mappers/_session.py b/src/aind_behavior_vr_foraging/data_mappers/_session.py index 92cecd92..8b8f773e 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_session.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_session.py @@ -8,6 +8,7 @@ import aind_behavior_services.rig as AbsRig import git import pydantic +from aind_behavior_curriculum import TrainerState from aind_behavior_services.rig import cameras, visual_stimulation from aind_behavior_services.session import Session from aind_behavior_services.utils import get_fields_of_type, model_from_json_file, utcnow @@ -46,6 +47,14 @@ def __init__( self.rig_model = model_from_json_file(abs_schemas_path / "rig_input.json", AindVrForagingRig) self.task_model = model_from_json_file(abs_schemas_path / "tasklogic_input.json", AindVrForagingTaskLogic) + self.trainer_state: TrainerState | None = None + trainer_state_path = Path(self._data_path) / "Behavior" / "trainer_state.json" + if trainer_state_path.exists(): + self.trainer_state = model_from_json_file( + trainer_state_path, + TrainerState, + ) + if curriculum_suggestion is not None: if isinstance(curriculum_suggestion, CurriculumSuggestion): pass @@ -60,7 +69,7 @@ def __init__( except FileNotFoundError: logger.warning("Curriculum suggestion file not found. Proceeding without it.") curriculum_suggestion = None - self.curriculum = curriculum_suggestion + self.curriculum_suggestion = curriculum_suggestion self.repository = git.Repo(self._repo_path) assert self.repository.working_tree_dir is not None self.bonsai_app = BonsaiApp( @@ -240,14 +249,19 @@ def _get_stimulus_epochs(self) -> List[acquisition.StimulusEpoch]: # logger.error("Olfactometer device not found in rig model.") # raise ValueError("Olfactometer device not found in rig model.") - if self.curriculum is not None: + performance_metrics: Optional[acquisition.PerformanceMetrics] = None + curriculum_status: str = "false" + + if self.curriculum_suggestion is not None: + logger.debug("Curriculum suggestion found. Setting performance metrics based on curriculum suggestion.") performance_metrics = acquisition.PerformanceMetrics( - output_parameters=acquisition.GenericModel.model_validate(self.curriculum.metrics.model_dump()) + output_parameters=acquisition.GenericModel.model_validate( + self.curriculum_suggestion.metrics.model_dump() + ) ) - curriculum_status = str(self.curriculum.trainer_state.is_on_curriculum) - else: - curriculum_status = "false" - performance_metrics = None + if self.trainer_state is not None: + logger.debug("Trainer state found. Setting curriculum status based on trainer state.") + curriculum_status = str(self.trainer_state.is_on_curriculum) stimulus_epochs: list[acquisition.StimulusEpoch] = [ acquisition.StimulusEpoch( From d893341e686f64f046324d67ac065122c0ddb1fb Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:03:15 -0700 Subject: [PATCH 21/31] Add minimum pin to aind-data-schema --- pyproject.toml | 2 +- uv.lock | 158 ++++++++++++++++++++++++------------------------- 2 files changed, 80 insertions(+), 80 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 92d8d9cf..39e429c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ data = ["contraqctor>=0.5.3, <0.6.0"] launcher = [ "aind-clabe[aind-services]>=0.10", - "aind-data-schema>=2.4", + "aind-data-schema>=2.6", "aind_behavior_vr_foraging[data]", ] diff --git a/uv.lock b/uv.lock index 41ffc2a9..5f5be9f7 100644 --- a/uv.lock +++ b/uv.lock @@ -98,7 +98,7 @@ requires-dist = [ { name = "aind-behavior-services", specifier = ">=0.13.5" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.10" }, - { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.4" }, + { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.6" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, ] @@ -173,16 +173,16 @@ wheels = [ [[package]] name = "aind-data-schema-models" -version = "5.4.1" +version = "5.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/83/ac795e044cc4a44da7e61e4ca1afbf12030cd723ce7f03d85f69977e3860/aind_data_schema_models-5.4.1.tar.gz", hash = "sha256:f6550a1fc945c1954ea2c074d09df880cc8b44755f000d5ebe13f8b2507aa08c", size = 340521, upload-time = "2026-03-09T18:20:52.334Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/6e/f98fde74e466b736c46e5f71bf28e4dad130798d6048902acb8ac44fae60/aind_data_schema_models-5.4.2.tar.gz", hash = "sha256:e8a1a3fca2a13fb909f7c7915d2f03faf83b2c5e6567ac7721fe1f8f29482571", size = 341115, upload-time = "2026-03-26T01:29:56.322Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/d7/51e8abfd0919035f719ecc3d8223e6cca4de87f1a263da527fcda34df59f/aind_data_schema_models-5.4.1-py3-none-any.whl", hash = "sha256:2996e2856b04874019d336172b934bacbc7cb3c5079deed52cda09f063d3a856", size = 309923, upload-time = "2026-03-09T18:20:50.921Z" }, + { url = "https://files.pythonhosted.org/packages/67/fb/0ec99d2b17bc128908524bcf37c2df6b39134717d3c18fa65ad656bcb91e/aind_data_schema_models-5.4.2-py3-none-any.whl", hash = "sha256:4c11c390d993e48ba6308f5dfc7a426344f8436cf7d80f1c08641b040ad69b1e", size = 309923, upload-time = "2026-03-26T01:29:55.064Z" }, ] [[package]] @@ -639,61 +639,61 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.5" +version = "46.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, - { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, - { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, - { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, - { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, - { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, - { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, - { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, - { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, - { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, - { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, - { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, - { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, - { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, - { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, - { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, - { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, - { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, - { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, - { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, - { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, - { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, - { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, - { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, - { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, - { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, - { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, - { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605, upload-time = "2026-02-10T19:18:29.233Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a4/ba/04b1bd4218cbc58dc90ce967106d51582371b898690f3ae0402876cc4f34/cryptography-46.0.6.tar.gz", hash = "sha256:27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759", size = 750542, upload-time = "2026-03-25T23:34:53.396Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/23/9285e15e3bc57325b0a72e592921983a701efc1ee8f91c06c5f0235d86d9/cryptography-46.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8", size = 7176401, upload-time = "2026-03-25T23:33:22.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/f8/e61f8f13950ab6195b31913b42d39f0f9afc7d93f76710f299b5ec286ae6/cryptography-46.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30", size = 4275275, upload-time = "2026-03-25T23:33:23.844Z" }, + { url = "https://files.pythonhosted.org/packages/19/69/732a736d12c2631e140be2348b4ad3d226302df63ef64d30dfdb8db7ad1c/cryptography-46.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a", size = 4425320, upload-time = "2026-03-25T23:33:25.703Z" }, + { url = "https://files.pythonhosted.org/packages/d4/12/123be7292674abf76b21ac1fc0e1af50661f0e5b8f0ec8285faac18eb99e/cryptography-46.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175", size = 4278082, upload-time = "2026-03-25T23:33:27.423Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ba/d5e27f8d68c24951b0a484924a84c7cdaed7502bac9f18601cd357f8b1d2/cryptography-46.0.6-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463", size = 4926514, upload-time = "2026-03-25T23:33:29.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/71/1ea5a7352ae516d5512d17babe7e1b87d9db5150b21f794b1377eac1edc0/cryptography-46.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97", size = 4457766, upload-time = "2026-03-25T23:33:30.834Z" }, + { url = "https://files.pythonhosted.org/packages/01/59/562be1e653accee4fdad92c7a2e88fced26b3fdfce144047519bbebc299e/cryptography-46.0.6-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c", size = 3986535, upload-time = "2026-03-25T23:33:33.02Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8b/b1ebfeb788bf4624d36e45ed2662b8bd43a05ff62157093c1539c1288a18/cryptography-46.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507", size = 4277618, upload-time = "2026-03-25T23:33:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/dd/52/a005f8eabdb28df57c20f84c44d397a755782d6ff6d455f05baa2785bd91/cryptography-46.0.6-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19", size = 4890802, upload-time = "2026-03-25T23:33:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4d/8e7d7245c79c617d08724e2efa397737715ca0ec830ecb3c91e547302555/cryptography-46.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738", size = 4457425, upload-time = "2026-03-25T23:33:38.904Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5c/f6c3596a1430cec6f949085f0e1a970638d76f81c3ea56d93d564d04c340/cryptography-46.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c", size = 4405530, upload-time = "2026-03-25T23:33:40.842Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c9/9f9cea13ee2dbde070424e0c4f621c091a91ffcc504ffea5e74f0e1daeff/cryptography-46.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f", size = 4667896, upload-time = "2026-03-25T23:33:42.781Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b5/1895bc0821226f129bc74d00eccfc6a5969e2028f8617c09790bf89c185e/cryptography-46.0.6-cp311-abi3-win32.whl", hash = "sha256:bcb87663e1f7b075e48c3be3ecb5f0b46c8fc50b50a97cf264e7f60242dca3f2", size = 3026348, upload-time = "2026-03-25T23:33:45.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f8/c9bcbf0d3e6ad288b9d9aa0b1dee04b063d19e8c4f871855a03ab3a297ab/cryptography-46.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:6739d56300662c468fddb0e5e291f9b4d084bead381667b9e654c7dd81705124", size = 3483896, upload-time = "2026-03-25T23:33:46.649Z" }, + { url = "https://files.pythonhosted.org/packages/01/41/3a578f7fd5c70611c0aacba52cd13cb364a5dee895a5c1d467208a9380b0/cryptography-46.0.6-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275", size = 7117147, upload-time = "2026-03-25T23:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/887f35a6fca9dde90cad08e0de0c89263a8e59b2d2ff904fd9fcd8025b6f/cryptography-46.0.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4", size = 4266221, upload-time = "2026-03-25T23:33:49.874Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a8/0a90c4f0b0871e0e3d1ed126aed101328a8a57fd9fd17f00fb67e82a51ca/cryptography-46.0.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b", size = 4408952, upload-time = "2026-03-25T23:33:52.128Z" }, + { url = "https://files.pythonhosted.org/packages/16/0b/b239701eb946523e4e9f329336e4ff32b1247e109cbab32d1a7b61da8ed7/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707", size = 4270141, upload-time = "2026-03-25T23:33:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/976acdd4f0f30df7b25605f4b9d3d89295351665c2091d18224f7ad5cdbf/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361", size = 4904178, upload-time = "2026-03-25T23:33:55.725Z" }, + { url = "https://files.pythonhosted.org/packages/b1/1b/bf0e01a88efd0e59679b69f42d4afd5bced8700bb5e80617b2d63a3741af/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b", size = 4441812, upload-time = "2026-03-25T23:33:57.364Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8b/11df86de2ea389c65aa1806f331cae145f2ed18011f30234cc10ca253de8/cryptography-46.0.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca", size = 3963923, upload-time = "2026-03-25T23:33:59.361Z" }, + { url = "https://files.pythonhosted.org/packages/91/e0/207fb177c3a9ef6a8108f234208c3e9e76a6aa8cf20d51932916bd43bda0/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013", size = 4269695, upload-time = "2026-03-25T23:34:00.909Z" }, + { url = "https://files.pythonhosted.org/packages/21/5e/19f3260ed1e95bced52ace7501fabcd266df67077eeb382b79c81729d2d3/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4", size = 4869785, upload-time = "2026-03-25T23:34:02.796Z" }, + { url = "https://files.pythonhosted.org/packages/10/38/cd7864d79aa1d92ef6f1a584281433419b955ad5a5ba8d1eb6c872165bcb/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a", size = 4441404, upload-time = "2026-03-25T23:34:04.35Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/4fe7a8d25fed74419f91835cf5829ade6408fd1963c9eae9c4bce390ecbb/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d", size = 4397549, upload-time = "2026-03-25T23:34:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a0/7d738944eac6513cd60a8da98b65951f4a3b279b93479a7e8926d9cd730b/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736", size = 4651874, upload-time = "2026-03-25T23:34:07.916Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f1/c2326781ca05208845efca38bf714f76939ae446cd492d7613808badedf1/cryptography-46.0.6-cp314-cp314t-win32.whl", hash = "sha256:97c8115b27e19e592a05c45d0dd89c57f81f841cc9880e353e0d3bf25b2139ed", size = 3001511, upload-time = "2026-03-25T23:34:09.892Z" }, + { url = "https://files.pythonhosted.org/packages/c9/57/fe4a23eb549ac9d903bd4698ffda13383808ef0876cc912bcb2838799ece/cryptography-46.0.6-cp314-cp314t-win_amd64.whl", hash = "sha256:c797e2517cb7880f8297e2c0f43bb910e91381339336f75d2c1c2cbf811b70b4", size = 3471692, upload-time = "2026-03-25T23:34:11.613Z" }, + { url = "https://files.pythonhosted.org/packages/c4/cc/f330e982852403da79008552de9906804568ae9230da8432f7496ce02b71/cryptography-46.0.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a", size = 7162776, upload-time = "2026-03-25T23:34:13.308Z" }, + { url = "https://files.pythonhosted.org/packages/49/b3/dc27efd8dcc4bff583b3f01d4a3943cd8b5821777a58b3a6a5f054d61b79/cryptography-46.0.6-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8", size = 4270529, upload-time = "2026-03-25T23:34:15.019Z" }, + { url = "https://files.pythonhosted.org/packages/e6/05/e8d0e6eb4f0d83365b3cb0e00eb3c484f7348db0266652ccd84632a3d58d/cryptography-46.0.6-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77", size = 4414827, upload-time = "2026-03-25T23:34:16.604Z" }, + { url = "https://files.pythonhosted.org/packages/2f/97/daba0f5d2dc6d855e2dcb70733c812558a7977a55dd4a6722756628c44d1/cryptography-46.0.6-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290", size = 4271265, upload-time = "2026-03-25T23:34:18.586Z" }, + { url = "https://files.pythonhosted.org/packages/89/06/fe1fce39a37ac452e58d04b43b0855261dac320a2ebf8f5260dd55b201a9/cryptography-46.0.6-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410", size = 4916800, upload-time = "2026-03-25T23:34:20.561Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8a/b14f3101fe9c3592603339eb5d94046c3ce5f7fc76d6512a2d40efd9724e/cryptography-46.0.6-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d", size = 4448771, upload-time = "2026-03-25T23:34:22.406Z" }, + { url = "https://files.pythonhosted.org/packages/01/b3/0796998056a66d1973fd52ee89dc1bb3b6581960a91ad4ac705f182d398f/cryptography-46.0.6-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70", size = 3978333, upload-time = "2026-03-25T23:34:24.281Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3d/db200af5a4ffd08918cd55c08399dc6c9c50b0bc72c00a3246e099d3a849/cryptography-46.0.6-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d", size = 4271069, upload-time = "2026-03-25T23:34:25.895Z" }, + { url = "https://files.pythonhosted.org/packages/d7/18/61acfd5b414309d74ee838be321c636fe71815436f53c9f0334bf19064fa/cryptography-46.0.6-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa", size = 4878358, upload-time = "2026-03-25T23:34:27.67Z" }, + { url = "https://files.pythonhosted.org/packages/8b/65/5bf43286d566f8171917cae23ac6add941654ccf085d739195a4eacf1674/cryptography-46.0.6-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58", size = 4448061, upload-time = "2026-03-25T23:34:29.375Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/7e49c0fa7205cf3597e525d156a6bce5b5c9de1fd7e8cb01120e459f205a/cryptography-46.0.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb", size = 4399103, upload-time = "2026-03-25T23:34:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/44/46/466269e833f1c4718d6cd496ffe20c56c9c8d013486ff66b4f69c302a68d/cryptography-46.0.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72", size = 4659255, upload-time = "2026-03-25T23:34:33.679Z" }, + { url = "https://files.pythonhosted.org/packages/0a/09/ddc5f630cc32287d2c953fc5d32705e63ec73e37308e5120955316f53827/cryptography-46.0.6-cp38-abi3-win32.whl", hash = "sha256:7f6690b6c55e9c5332c0b59b9c8a3fb232ebf059094c17f9019a51e9827df91c", size = 3010660, upload-time = "2026-03-25T23:34:35.418Z" }, + { url = "https://files.pythonhosted.org/packages/1b/82/ca4893968aeb2709aacfb57a30dec6fa2ab25b10fa9f064b8882ce33f599/cryptography-46.0.6-cp38-abi3-win_amd64.whl", hash = "sha256:79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f", size = 3471160, upload-time = "2026-03-25T23:34:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/2e/84/7ccff00ced5bac74b775ce0beb7d1be4e8637536b522b5df9b73ada42da2/cryptography-46.0.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:2ea0f37e9a9cf0df2952893ad145fd9627d326a59daec9b0802480fa3bcd2ead", size = 3475444, upload-time = "2026-03-25T23:34:38.944Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1f/4c926f50df7749f000f20eede0c896769509895e2648db5da0ed55db711d/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a3e84d5ec9ba01f8fd03802b2147ba77f0c8f2617b2aff254cedd551844209c8", size = 4218227, upload-time = "2026-03-25T23:34:40.871Z" }, + { url = "https://files.pythonhosted.org/packages/c6/65/707be3ffbd5f786028665c3223e86e11c4cda86023adbc56bd72b1b6bab5/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:12f0fa16cc247b13c43d56d7b35287ff1569b5b1f4c5e87e92cc4fcc00cd10c0", size = 4381399, upload-time = "2026-03-25T23:34:42.609Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6d/73557ed0ef7d73d04d9aba745d2c8e95218213687ee5e76b7d236a5030fc/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:50575a76e2951fe7dbd1f56d181f8c5ceeeb075e9ff88e7ad997d2f42af06e7b", size = 4217595, upload-time = "2026-03-25T23:34:44.205Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c5/e1594c4eec66a567c3ac4400008108a415808be2ce13dcb9a9045c92f1a0/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:90e5f0a7b3be5f40c3a0a0eafb32c681d8d2c181fc2a1bdabe9b3f611d9f6b1a", size = 4380912, upload-time = "2026-03-25T23:34:46.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/89/843b53614b47f97fe1abc13f9a86efa5ec9e275292c457af1d4a60dc80e0/cryptography-46.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6728c49e3b2c180ef26f8e9f0a883a2c585638db64cf265b49c9ba10652d430e", size = 3409955, upload-time = "2026-03-25T23:34:48.465Z" }, ] [[package]] @@ -1968,7 +1968,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.5" +version = "2.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1976,9 +1976,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, ] [[package]] @@ -2065,27 +2065,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" }, - { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" }, - { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" }, - { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" }, - { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" }, - { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" }, - { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" }, - { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" }, - { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" }, - { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" }, - { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" }, - { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" }, - { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" }, +version = "0.15.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/b0/73cf7550861e2b4824950b8b52eebdcc5adc792a00c514406556c5b80817/ruff-0.15.8.tar.gz", hash = "sha256:995f11f63597ee362130d1d5a327a87cb6f3f5eae3094c620bcc632329a4d26e", size = 4610921, upload-time = "2026-03-26T18:39:38.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/92/c445b0cd6da6e7ae51e954939cb69f97e008dbe750cfca89b8cedc081be7/ruff-0.15.8-py3-none-linux_armv6l.whl", hash = "sha256:cbe05adeba76d58162762d6b239c9056f1a15a55bd4b346cfd21e26cd6ad7bc7", size = 10527394, upload-time = "2026-03-26T18:39:41.566Z" }, + { url = "https://files.pythonhosted.org/packages/eb/92/f1c662784d149ad1414cae450b082cf736430c12ca78367f20f5ed569d65/ruff-0.15.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d3e3d0b6ba8dca1b7ef9ab80a28e840a20070c4b62e56d675c24f366ef330570", size = 10905693, upload-time = "2026-03-26T18:39:30.364Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f2/7a631a8af6d88bcef997eb1bf87cc3da158294c57044aafd3e17030613de/ruff-0.15.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ee3ae5c65a42f273f126686353f2e08ff29927b7b7e203b711514370d500de3", size = 10323044, upload-time = "2026-03-26T18:39:33.37Z" }, + { url = "https://files.pythonhosted.org/packages/67/18/1bf38e20914a05e72ef3b9569b1d5c70a7ef26cd188d69e9ca8ef588d5bf/ruff-0.15.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdce027ada77baa448077ccc6ebb2fa9c3c62fd110d8659d601cf2f475858d94", size = 10629135, upload-time = "2026-03-26T18:39:44.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/e9/138c150ff9af60556121623d41aba18b7b57d95ac032e177b6a53789d279/ruff-0.15.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e617fc01a95e5821648a6df341d80456bd627bfab8a829f7cfc26a14a4b4a3", size = 10348041, upload-time = "2026-03-26T18:39:52.178Z" }, + { url = "https://files.pythonhosted.org/packages/02/f1/5bfb9298d9c323f842c5ddeb85f1f10ef51516ac7a34ba446c9347d898df/ruff-0.15.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432701303b26416d22ba696c39f2c6f12499b89093b61360abc34bcc9bf07762", size = 11121987, upload-time = "2026-03-26T18:39:55.195Z" }, + { url = "https://files.pythonhosted.org/packages/10/11/6da2e538704e753c04e8d86b1fc55712fdbdcc266af1a1ece7a51fff0d10/ruff-0.15.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d910ae974b7a06a33a057cb87d2a10792a3b2b3b35e33d2699fdf63ec8f6b17a", size = 11951057, upload-time = "2026-03-26T18:39:19.18Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/c9208c5fd5101bf87002fed774ff25a96eea313d305f1e5d5744698dc314/ruff-0.15.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2033f963c43949d51e6fdccd3946633c6b37c484f5f98c3035f49c27395a8ab8", size = 11464613, upload-time = "2026-03-26T18:40:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/22/d7f2fabdba4fae9f3b570e5605d5eb4500dcb7b770d3217dca4428484b17/ruff-0.15.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f29b989a55572fb885b77464cf24af05500806ab4edf9a0fd8977f9759d85b1", size = 11257557, upload-time = "2026-03-26T18:39:57.972Z" }, + { url = "https://files.pythonhosted.org/packages/71/8c/382a9620038cf6906446b23ce8632ab8c0811b8f9d3e764f58bedd0c9a6f/ruff-0.15.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ac51d486bf457cdc985a412fb1801b2dfd1bd8838372fc55de64b1510eff4bec", size = 11169440, upload-time = "2026-03-26T18:39:22.205Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0d/0994c802a7eaaf99380085e4e40c845f8e32a562e20a38ec06174b52ef24/ruff-0.15.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9861eb959edab053c10ad62c278835ee69ca527b6dcd72b47d5c1e5648964f6", size = 10605963, upload-time = "2026-03-26T18:39:46.682Z" }, + { url = "https://files.pythonhosted.org/packages/19/aa/d624b86f5b0aad7cef6bbf9cd47a6a02dfdc4f72c92a337d724e39c9d14b/ruff-0.15.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8d9a5b8ea13f26ae90838afc33f91b547e61b794865374f114f349e9036835fb", size = 10357484, upload-time = "2026-03-26T18:39:49.176Z" }, + { url = "https://files.pythonhosted.org/packages/35/c3/e0b7835d23001f7d999f3895c6b569927c4d39912286897f625736e1fd04/ruff-0.15.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c2a33a529fb3cbc23a7124b5c6ff121e4d6228029cba374777bd7649cc8598b8", size = 10830426, upload-time = "2026-03-26T18:40:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/f0/51/ab20b322f637b369383adc341d761eaaa0f0203d6b9a7421cd6e783d81b9/ruff-0.15.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:75e5cd06b1cf3f47a3996cfc999226b19aa92e7cce682dcd62f80d7035f98f49", size = 11345125, upload-time = "2026-03-26T18:39:27.799Z" }, + { url = "https://files.pythonhosted.org/packages/37/e6/90b2b33419f59d0f2c4c8a48a4b74b460709a557e8e0064cf33ad894f983/ruff-0.15.8-py3-none-win32.whl", hash = "sha256:bc1f0a51254ba21767bfa9a8b5013ca8149dcf38092e6a9eb704d876de94dc34", size = 10571959, upload-time = "2026-03-26T18:39:36.117Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a2/ef467cb77099062317154c63f234b8a7baf7cb690b99af760c5b68b9ee7f/ruff-0.15.8-py3-none-win_amd64.whl", hash = "sha256:04f79eff02a72db209d47d665ba7ebcad609d8918a134f86cb13dd132159fc89", size = 11743893, upload-time = "2026-03-26T18:39:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/77be4fff062fa78d9b2a4dea85d14785dac5f1d0c1fb58ed52331f0ebe28/ruff-0.15.8-py3-none-win_arm64.whl", hash = "sha256:cf891fa8e3bb430c0e7fac93851a5978fc99c8fa2c053b57b118972866f8e5f2", size = 11048175, upload-time = "2026-03-26T18:40:01.06Z" }, ] [[package]] From 0d382031c6517d1a853c66d48f37c74c98a08d4c Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:04:03 -0700 Subject: [PATCH 22/31] Add odor stimulation to metadata mapping --- .../data_mappers/_rig.py | 2 +- .../data_mappers/_session.py | 55 +++++++++++-------- .../data_mappers/_utils.py | 1 + 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/aind_behavior_vr_foraging/data_mappers/_rig.py b/src/aind_behavior_vr_foraging/data_mappers/_rig.py index 1444bb47..3d98a073 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_rig.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_rig.py @@ -528,7 +528,7 @@ def _get_olfactometer(rig: AindVrForagingRig) -> devices.Olfactometer: raise ValueError("Olfactometer calibration is not set.") return devices.Olfactometer( - name="harp_olfactometer", + name=TrackedDevices.OLFACTOMETER, harp_device_type=devices.HarpDeviceType.OLFACTOMETER, manufacturer=devices.Organization.CHAMPALIMAUD, is_clock_generator=False, diff --git a/src/aind_behavior_vr_foraging/data_mappers/_session.py b/src/aind_behavior_vr_foraging/data_mappers/_session.py index 8b8f773e..b84457b3 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_session.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_session.py @@ -224,31 +224,38 @@ def _get_stimulus_epochs(self) -> List[acquisition.StimulusEpoch]: ) # Olfactory Stimulation - # TODO needs aind-data-schema to be updated - # stimulus_modalities.append(acquisition.StimulusModality.OLFACTORY) - # olfactory_stimulus_channel_config: List[aind_data_schema.components.stimulus.OlfactometerChannelConfig] = [] - # olf_calibration = rig_model.harp_olfactometer.calibration - # if olf_calibration is None: - # raise ValueError("Olfactometer calibration is not set in the rig model.") - # for _, channel in olf_calibration.input.channel_config.items(): - # if channel.channel_type == OlfactometerChannelType.ODOR: - # olfactory_stimulus_channel_config.append( - # coerce_to_aind_data_schema(channel, aind_data_schema.components.stimulus.OlfactometerChannelConfig) - # ) - # stimulation_parameters.append( - # aind_data_schema.core.session.OlfactoryStimulation( - # stimulus_name="Olfactory", channels=olfactory_stimulus_channel_config - # ) - # ) - - # _olfactory_device = get_fields_of_type(rig_model, AbsRig.harp.HarpOlfactometer) - # if len(_olfactory_device) > 0: - # if _olfactory_device[0][0]: - # stimulation_devices.append(_olfactory_device[0][0]) - # else: - # logger.error("Olfactometer device not found in rig model.") - # raise ValueError("Olfactometer device not found in rig model.") + import aind_data_schema.components.configs + from aind_behavior_services.rig.olfactometer import OlfactometerChannelType + + stimulus_modalities.append(acquisition.StimulusModality.OLFACTORY) + olfactory_stimulus_channel_info: List[aind_data_schema.components.configs.OlfactometerChannelInfo] = [] + olf_calibration = self.rig_model.harp_olfactometer.calibration + if olf_calibration is None: + raise ValueError("Olfactometer calibration is not set in the rig model.") + for _, channel in olf_calibration.channel_config.items(): + if channel.channel_type == OlfactometerChannelType.ODOR: + # These fields are required, so... + if not (channel.odorant is None and channel.odorant_dilution is None): + olfactory_stimulus_channel_info.append( + aind_data_schema.components.configs.OlfactometerChannelInfo( + channel_index=channel.channel_index, + odorant=channel.odorant, + dilution=channel.odorant_dilution, + ) + ) + else: + logger.warning( + "Olfactometer channel %d is configured as ODOR but odorant or dilution is not set. Skipping this channel.", + channel.channel_index, + ) + stimulus_epoch_configurations.append( + aind_data_schema.components.configs.OlfactometerConfig( + device_name=TrackedDevices.OLFACTOMETER, channel_configs=olfactory_stimulus_channel_info + ) + ) + + # Animal performance, curriculum, and metrics performance_metrics: Optional[acquisition.PerformanceMetrics] = None curriculum_status: str = "false" diff --git a/src/aind_behavior_vr_foraging/data_mappers/_utils.py b/src/aind_behavior_vr_foraging/data_mappers/_utils.py index 529ae335..0810fd5e 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_utils.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_utils.py @@ -106,3 +106,4 @@ class TrackedDevices(enum.StrEnum): SCREEN = "screen" COMPUTER = "computer" WATER_VALVE_SOLENOID = "water_valve_solenoid" + OLFACTOMETER = "harp_olfactometer" From f3803774958d01eef0a116c651f0a5a78c3deddd Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sun, 29 Mar 2026 13:35:57 -0700 Subject: [PATCH 23/31] Add definition of olfactometer extension --- .../aind_behavior_vr_foraging.json | 9 ++++++ .../AindBehaviorVrForaging.Generated.cs | 30 +++++++++++++++++++ src/aind_behavior_vr_foraging/rig.py | 6 ++++ 3 files changed, 45 insertions(+) diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index 53367c5a..574197d7 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -208,6 +208,7 @@ "type": "object" }, "AindVrForagingRig": { + "description": "Represents the schema, and concrete instantiation, of a rig configuration to run the VrForaging behavior task.", "properties": { "aind_behavior_services_pkg_version": { "default": "0.13.5", @@ -261,6 +262,14 @@ "$ref": "#/$defs/Olfactometer", "description": "Harp olfactometer" }, + "harp_olfactometer_extension": { + "description": "A collection of subordinate olfactometers that can be added to increase the number of independently delivered odors. The order of the list determines the order by which odors are numbered", + "items": { + "$ref": "#/$defs/Olfactometer" + }, + "title": "Harp Olfactometer Extension", + "type": "array" + }, "harp_lickometer": { "$ref": "#/$defs/HarpLicketySplit", "description": "Harp lickometer" diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index bb66e2f4..eed1ed97 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -180,7 +180,12 @@ public override string ToString() } + /// + /// Represents the schema, and concrete instantiation, of a rig configuration to run the VrForaging behavior task. + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the schema, and concrete instantiation, of a rig configuration to run " + + "the VrForaging behavior task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class AindVrForagingRig @@ -204,6 +209,8 @@ public partial class AindVrForagingRig private Olfactometer _harpOlfactometer; + private System.Collections.Generic.List _harpOlfactometerExtension; + private HarpLicketySplit _harpLickometer; private HarpWhiteRabbit _harpClockGenerator; @@ -229,6 +236,7 @@ public AindVrForagingRig() _triggeredCameraController = new CameraControllerSpinnakerCamera(); _harpBehavior = new HarpBehavior(); _harpOlfactometer = new Olfactometer(); + _harpOlfactometerExtension = new System.Collections.Generic.List(); _harpLickometer = new HarpLicketySplit(); _harpClockGenerator = new HarpWhiteRabbit(); _harpTreadmill = new Treadmill(); @@ -248,6 +256,7 @@ protected AindVrForagingRig(AindVrForagingRig other) _monitoringCameraController = other._monitoringCameraController; _harpBehavior = other._harpBehavior; _harpOlfactometer = other._harpOlfactometer; + _harpOlfactometerExtension = other._harpOlfactometerExtension; _harpLickometer = other._harpLickometer; _harpClockGenerator = other._harpClockGenerator; _harpAnalogInput = other._harpAnalogInput; @@ -408,6 +417,26 @@ public Olfactometer HarpOlfactometer } } + /// + /// A collection of subordinate olfactometers that can be added to increase the number of independently delivered odors. The order of the list determines the order by which odors are numbered + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_olfactometer_extension")] + [System.ComponentModel.DescriptionAttribute("A collection of subordinate olfactometers that can be added to increase the numbe" + + "r of independently delivered odors. The order of the list determines the order b" + + "y which odors are numbered")] + public System.Collections.Generic.List HarpOlfactometerExtension + { + get + { + return _harpOlfactometerExtension; + } + set + { + _harpOlfactometerExtension = value; + } + } + /// /// Harp lickometer /// @@ -591,6 +620,7 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("MonitoringCameraController = " + _monitoringCameraController + ", "); stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); stringBuilder.Append("HarpOlfactometer = " + _harpOlfactometer + ", "); + stringBuilder.Append("HarpOlfactometerExtension = " + _harpOlfactometerExtension + ", "); stringBuilder.Append("HarpLickometer = " + _harpLickometer + ", "); stringBuilder.Append("HarpClockGenerator = " + _harpClockGenerator + ", "); stringBuilder.Append("HarpAnalogInput = " + _harpAnalogInput + ", "); diff --git a/src/aind_behavior_vr_foraging/rig.py b/src/aind_behavior_vr_foraging/rig.py index c1b11635..dcae8434 100644 --- a/src/aind_behavior_vr_foraging/rig.py +++ b/src/aind_behavior_vr_foraging/rig.py @@ -26,6 +26,8 @@ class RigCalibration(BaseModel): class AindVrForagingRig(rig.Rig): + """Represents the schema, and concrete instantiation, of a rig configuration to run the VrForaging behavior task.""" + version: Literal[__semver__] = __semver__ triggered_camera_controller: cameras.CameraController[cameras.SpinnakerCamera] = Field( description="Required camera controller to triggered cameras." @@ -35,6 +37,10 @@ class AindVrForagingRig(rig.Rig): ) harp_behavior: harp.HarpBehavior = Field(description="Harp behavior") harp_olfactometer: oc.Olfactometer = Field(description="Harp olfactometer") + harp_olfactometer_extension: list[oc.Olfactometer] = Field( + default_factory=list, + description="A collection of subordinate olfactometers that can be added to increase the number of independently delivered odors. The order of the list determines the order by which odors are numbered", + ) harp_lickometer: harp.HarpLicketySplit = Field(description="Harp lickometer") harp_clock_generator: harp.HarpWhiteRabbit = Field(description="Harp clock generator") harp_analog_input: Optional[harp.HarpAnalogInput] = Field(default=None, description="Harp analog input") From 1331d557a1d031476bc541adbd36b8dfa73851bf Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Sun, 29 Mar 2026 17:12:59 -0700 Subject: [PATCH 24/31] Multiplex messages to all olfactometers --- src/main.bonsai | 569 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 472 insertions(+), 97 deletions(-) diff --git a/src/main.bonsai b/src/main.bonsai index 6be5e9c6..65240bed 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -8,21 +8,21 @@ xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" xmlns:p2="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" - xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" + xmlns:p3="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" xmlns:sys="clr-namespace:System;assembly=mscorlib" + xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns:cv="clr-namespace:Bonsai.Vision;assembly=Bonsai.Vision" - xmlns:p3="clr-namespace:OpenCV.Net;assembly=OpenCV.Net" - xmlns:p4="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" + xmlns:p4="clr-namespace:OpenCV.Net;assembly=OpenCV.Net" + xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:spk="clr-namespace:Bonsai.Spinnaker;assembly=Bonsai.Spinnaker" xmlns:vid="clr-namespace:Bonsai.Video;assembly=Bonsai.Video" xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" - xmlns:p5="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" - xmlns:p6="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" - xmlns:p7="clr-namespace:System.Reactive;assembly=System.Reactive.Core" - xmlns:p8="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" - xmlns:p9="clr-namespace:;assembly=Extensions" - xmlns:p10="clr-namespace:OpenTK;assembly=OpenTK" - xmlns:p11="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" + xmlns:p6="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" + xmlns:p7="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" + xmlns:p8="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:p9="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" + xmlns:p10="clr-namespace:;assembly=Extensions" + xmlns:p11="clr-namespace:OpenTK;assembly=OpenTK" xmlns:dsp="clr-namespace:Bonsai.Dsp;assembly=Bonsai.Dsp" xmlns:p12="clr-namespace:AllenNeuralDynamics.Core.Design;assembly=AllenNeuralDynamics.Core.Design" xmlns:p13="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" @@ -410,39 +410,408 @@ Item3 as Right) HarpWhiteRabbitHeartbeat - - TriggerHarpReadDump + + + RigSchema + + + + + HarpOlfactometer.PortName + + + + + + + + + + + + COM6 + TriggerHarpReadDump + true + RigSchema - HarpClockGenerator.PortName + HarpOlfactometer - - - - + + RigSchema - - COMx + + HarpOlfactometerExtension + + + + + + + + + HarpOlfactometerExtensionManager + + + + Source1 + + + + + + InstantiateOlfactometer + + + + Source1 + + + + 1 + + + + thisOlfactometer + + + OlfactometerHubCommandsGroupedBy + + + thisOlfactometer + + + Index + + + + + + isThisOlfactometer? + it.Item1.Key == it.Item2 + + + + 1 + + + + Item1 + + + + + + Item2 + + + thisHarpOlfactometerCommands + + + thisHarpOlfactometerEvents + + + thisOlfactometer + + + Index + + + + + + Item2,Item1 + + + OlfactometerHubEvents + + + thisHarpOlfactometerCommands + + + thisOlfactometer + + + Value.PortName + + + + + + + + + Active + On + true + On + Enabled + false + COM6 + + + + thisHarpOlfactometerEvents + + + + + + TriggerHarpReadDump + + + Write + + Active + true + false + On + On + Enabled + + + + thisHarpOlfactometerCommands + + + thisHarpOlfactometerEvents + + + + 1 + + + + thisOlfactometer + + + Index + + + Channel3Range + FlowRate100 + + + Channel3Range + FlowRate1000 + + + + + + it.Item1 == 0 ? it.Item2 : it.Item3 + + + + + + + + Write + + FlowRate1000 + + + + thisHarpOlfactometerCommands + + + Write + + Flowmeter DI0Trigger ChannelActualFlow + + + + thisHarpOlfactometerCommands + + + Write + + Enabled + + + + thisHarpOlfactometerCommands + + + Write + + None + + + + thisHarpOlfactometerCommands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MultiplexIO + + + + OlfactometerHubCommands + + + Item1 + + + OlfactometerHubCommandsGroupedBy + + + + OlfactometerHubEvents + + + Item1 + + + OlfactometerHubEventsGroupedBy + + + + HarpOlfactometerCommands + + + + 0 + + + + BackwardsCompatible + + + + + + + OlfactometerHubCommands + + + + 0 + + + + + + + OlfactometerHubEventsGroupedBy + + + it.Key == 0 + it.Key == 0 + + + + 1 + + + + + + + Item2 + + + BackwardsCompatible + + + + HarpOlfactometerEvents + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TriggerHarpReadDump RigSchema - HarpOlfactometer.PortName + HarpClockGenerator.PortName - - COM6 + + COMx TriggerHarpReadDump - true RigSchema @@ -586,47 +955,53 @@ Item3 as Right) + - - + + + - - + - + - - + - + - + - + - - + + - - + + - - + + - - + + - - + + + + + + + + @@ -790,7 +1165,7 @@ Item3 as Right) - + RegionOfInterest 0 @@ -805,21 +1180,21 @@ Item3 as Right) - + Default - 19000 - 0 - 1 - - Mono8 - - 0 - 0 - 0 - 0 - - + 19000 + 0 + 1 + + Mono8 + + 0 + 0 + 0 + 0 + + @@ -1149,13 +1524,13 @@ Item3 as Right) - - 0 - 10 + + 0 + 10 - + @@ -1191,8 +1566,8 @@ Item3 as Right) RngSeed - - ../. + + ../. @@ -1331,7 +1706,7 @@ Item3 as Right) Initialization - + StartExperiment @@ -1340,30 +1715,30 @@ Item3 as Right) GlobalActiveSite - + UpdaterEvents - + SoftwareEvent - + RuntimeLogging - + EndExperiment - + StartLogging Annotations - + GlobalPatchState - - GlobalPatchState + + GlobalPatchState @@ -1373,13 +1748,13 @@ Item3 as Right) Position - + CurrentPosition IsStopped - + MaxPosition @@ -1471,8 +1846,8 @@ Item3 as Right) Repository - - false + + false @@ -1503,8 +1878,8 @@ Item3 as Right) - - Repository is not clean! Please discard all local changes. + + Repository is not clean! Please discard all local changes. @@ -1541,8 +1916,8 @@ Item3 as Right) HarpOlfactometerEvents - - + + Value @@ -1617,8 +1992,8 @@ Item3 as Right) it - - Flow on Channel3 is lower than expected. + + Flow on Channel3 is lower than expected. @@ -1729,8 +2104,8 @@ Item3 as Right) it - - Dropped frame detected during pre-session! + + Dropped frame detected during pre-session! @@ -1845,8 +2220,8 @@ Item3 as Right) it - - + + @@ -1870,8 +2245,8 @@ Item3 as Right) - - TriggeredCameraControl must specify a valid FrameRate property! + + TriggeredCameraControl must specify a valid FrameRate property! @@ -2245,8 +2620,8 @@ Item3 as Right) CurrentBlock - - Block + + Block @@ -2259,8 +2634,8 @@ Item3 as Right) EnvironmentStatistics.TransitionMatrix - - true + + true @@ -2294,7 +2669,7 @@ Item3 as Right) - + @@ -2373,8 +2748,8 @@ Item3 as Right) ActivePatch - - ActivePatch + + ActivePatch @@ -3420,7 +3795,7 @@ it.Item3 as SiteHasChoice) - + ActiveStateIndex @@ -3525,7 +3900,7 @@ it.Item3 as SiteHasChoice) StartCondition - + StartExperimentShortcut From 6d5ab5fb0631b623c9ba9a6090053f763b4d9492 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 31 Mar 2026 08:30:44 -0700 Subject: [PATCH 25/31] Simplify schema --- .../aind_behavior_vr_foraging.json | 40 +---- .../AindBehaviorVrForaging.Generated.cs | 154 +----------------- src/aind_behavior_vr_foraging/task_logic.py | 21 +-- 3 files changed, 4 insertions(+), 211 deletions(-) diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index 574197d7..daa29edd 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -2286,35 +2286,6 @@ "title": "NumericalUpdaterParameters", "type": "object" }, - "OdorControl": { - "description": "Controls the odor delivery system parameters.\n\nThis class manages the olfactory stimulus delivery system, including flow rates,\nvalve timing, and carrier gas configuration. It ensures proper odor concentration\nand delivery timing for the behavioral task.", - "properties": { - "target_total_flow": { - "default": 1000, - "description": "Target total flow (ml/s) of the odor mixture", - "maximum": 1000, - "minimum": 100, - "title": "Target Total Flow", - "type": "number" - }, - "use_channel_3_as_carrier": { - "default": true, - "description": "Whether to use channel 3 as carrier", - "title": "Use Channel 3 As Carrier", - "type": "boolean" - }, - "target_odor_flow": { - "default": 100, - "description": "Target odor flow (ml/s) in the odor mixture", - "maximum": 100, - "minimum": 0, - "title": "Target Odor Flow", - "type": "number" - } - }, - "title": "OdorControl", - "type": "object" - }, "OdorSpecification": { "description": "Specifies odor delivery parameters for olfactory cues in the VR environment.\n\nOdors can be delivered at specific locations to provide additional sensory\ninformation for navigation and foraging decisions.", "properties": { @@ -2613,15 +2584,6 @@ }, "description": "Control of the movable spout" }, - "odor_control": { - "$ref": "#/$defs/OdorControl", - "default": { - "target_total_flow": 1000.0, - "use_channel_3_as_carrier": true, - "target_odor_flow": 100.0 - }, - "description": "Control of the odor" - }, "position_control": { "$ref": "#/$defs/PositionControl", "default": { @@ -3434,7 +3396,7 @@ "y": 2.56, "z": 0.0 }, - "description": "Gain of the position control." + "description": "Initial position of the subject in the VR world." }, "frequency_filter_cutoff": { "default": 0.5, diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index eed1ed97..2b9d5706 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -4474,127 +4474,6 @@ public override string ToString() } - /// - /// Controls the odor delivery system parameters. - /// - ///This class manages the olfactory stimulus delivery system, including flow rates, - ///valve timing, and carrier gas configuration. It ensures proper odor concentration - ///and delivery timing for the behavioral task. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Controls the odor delivery system parameters.\n\nThis class manages the olfactory s" + - "timulus delivery system, including flow rates,\nvalve timing, and carrier gas con" + - "figuration. It ensures proper odor concentration\nand delivery timing for the beh" + - "avioral task.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OdorControl - { - - private double _targetTotalFlow; - - private bool _useChannel3AsCarrier; - - private double _targetOdorFlow; - - public OdorControl() - { - _targetTotalFlow = 1000D; - _useChannel3AsCarrier = true; - _targetOdorFlow = 100D; - } - - protected OdorControl(OdorControl other) - { - _targetTotalFlow = other._targetTotalFlow; - _useChannel3AsCarrier = other._useChannel3AsCarrier; - _targetOdorFlow = other._targetOdorFlow; - } - - /// - /// Target total flow (ml/s) of the odor mixture - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_total_flow")] - [System.ComponentModel.DescriptionAttribute("Target total flow (ml/s) of the odor mixture")] - public double TargetTotalFlow - { - get - { - return _targetTotalFlow; - } - set - { - _targetTotalFlow = value; - } - } - - /// - /// Whether to use channel 3 as carrier - /// - [Newtonsoft.Json.JsonPropertyAttribute("use_channel_3_as_carrier")] - [System.ComponentModel.DescriptionAttribute("Whether to use channel 3 as carrier")] - public bool UseChannel3AsCarrier - { - get - { - return _useChannel3AsCarrier; - } - set - { - _useChannel3AsCarrier = value; - } - } - - /// - /// Target odor flow (ml/s) in the odor mixture - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_odor_flow")] - [System.ComponentModel.DescriptionAttribute("Target odor flow (ml/s) in the odor mixture")] - public double TargetOdorFlow - { - get - { - return _targetOdorFlow; - } - set - { - _targetOdorFlow = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorControl(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OdorControl(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("TargetTotalFlow = " + _targetTotalFlow + ", "); - stringBuilder.Append("UseChannel3AsCarrier = " + _useChannel3AsCarrier + ", "); - stringBuilder.Append("TargetOdorFlow = " + _targetOdorFlow); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - /// /// Specifies odor delivery parameters for olfactory cues in the VR environment. /// @@ -5410,8 +5289,6 @@ public partial class OperationControl private MovableSpoutControl _movableSpoutControl; - private OdorControl _odorControl; - private PositionControl _positionControl; private AudioControl _audioControl; @@ -5419,7 +5296,6 @@ public partial class OperationControl public OperationControl() { _movableSpoutControl = new MovableSpoutControl(); - _odorControl = new OdorControl(); _positionControl = new PositionControl(); _audioControl = new AudioControl(); } @@ -5427,7 +5303,6 @@ public OperationControl() protected OperationControl(OperationControl other) { _movableSpoutControl = other._movableSpoutControl; - _odorControl = other._odorControl; _positionControl = other._positionControl; _audioControl = other._audioControl; } @@ -5450,24 +5325,6 @@ public MovableSpoutControl MovableSpoutControl } } - /// - /// Control of the odor - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_control")] - [System.ComponentModel.DescriptionAttribute("Control of the odor")] - public OdorControl OdorControl - { - get - { - return _odorControl; - } - set - { - _odorControl = value; - } - } - /// /// Control of the position /// @@ -5517,7 +5374,6 @@ public System.IObservable Generate(System.IObservable protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("MovableSpoutControl = " + _movableSpoutControl + ", "); - stringBuilder.Append("OdorControl = " + _odorControl + ", "); stringBuilder.Append("PositionControl = " + _positionControl + ", "); stringBuilder.Append("AudioControl = " + _audioControl); return true; @@ -6765,11 +6621,11 @@ public AindBehaviorVrForagingTaskLogicVector3 Gain } /// - /// Gain of the position control. + /// Initial position of the subject in the VR world. /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] - [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] + [System.ComponentModel.DescriptionAttribute("Initial position of the subject in the VR world.")] public AindBehaviorVrForagingTaskLogicVector3 InitialPosition { get @@ -11795,11 +11651,6 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -12079,7 +11930,6 @@ public System.IObservable Process(System.IObservable))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index 77c43e8d..e4fb3f1f 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -870,24 +870,6 @@ class MovableSpoutControl(BaseModel): ) -class OdorControl(BaseModel): - """ - Controls the odor delivery system parameters. - - This class manages the olfactory stimulus delivery system, including flow rates, - valve timing, and carrier gas configuration. It ensures proper odor concentration - and delivery timing for the behavioral task. - """ - - target_total_flow: float = Field( - default=1000, ge=100, le=1000, description="Target total flow (ml/s) of the odor mixture" - ) - use_channel_3_as_carrier: bool = Field(default=True, description="Whether to use channel 3 as carrier") - target_odor_flow: float = Field( - default=100, ge=0, le=100, description="Target odor flow (ml/s) in the odor mixture" - ) - - class PositionControl(BaseModel): """ Controls the position tracking and movement detection parameters. @@ -898,7 +880,7 @@ class PositionControl(BaseModel): """ gain: Vector3 = Field(default=Vector3(x=1, y=1, z=1), description="Gain of the position control.") - initial_position: Vector3 = Field(default=Vector3(x=0, y=2.56, z=0), description="Gain of the position control.") + initial_position: Vector3 = Field(default=Vector3(x=0, y=2.56, z=0), description="Initial position of the subject in the VR world.") frequency_filter_cutoff: float = Field( default=0.5, ge=0, @@ -934,7 +916,6 @@ class OperationControl(BaseModel): movable_spout_control: MovableSpoutControl = Field( default=MovableSpoutControl(), description="Control of the movable spout" ) - odor_control: OdorControl = Field(default=OdorControl(), description="Control of the odor", validate_default=True) position_control: PositionControl = Field( default=PositionControl(), description="Control of the position", validate_default=True ) From b855ae62bf6cbf9c8a951e4b613ec4aa89ff9eac Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:14:09 -0700 Subject: [PATCH 26/31] Add common types --- pyproject.toml | 2 +- .../aind_behavior_vr_foraging.json | 95 ++--- .../AindBehaviorVrForaging.Generated.cs | 403 ++++++------------ src/aind_behavior_vr_foraging/task_logic.py | 45 +- uv.lock | 270 ++++++------ 5 files changed, 312 insertions(+), 503 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 39e429c8..1402caa8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ version = "0.7.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.13.5", + "aind_behavior_services>=0.13.6", "pydantic-settings" ] diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index daa29edd..fd445cec 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -211,7 +211,7 @@ "description": "Represents the schema, and concrete instantiation, of a rig configuration to run the VrForaging behavior task.", "properties": { "aind_behavior_services_pkg_version": { - "default": "0.13.5", + "default": "0.13.6", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -483,7 +483,7 @@ "title": "Rng Seed" }, "aind_behavior_services_pkg_version": { - "default": "0.13.5", + "default": "0.13.6", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" @@ -1273,7 +1273,7 @@ "description": "Represents the extrinsic parameters of a display.", "properties": { "rotation": { - "$ref": "#/$defs/aind_behavior_services__common__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 0.0, "y": 0.0, @@ -1282,7 +1282,7 @@ "description": "Rotation vector (radians)" }, "translation": { - "$ref": "#/$defs/aind_behavior_services__common__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 0.0, "y": 1.309016, @@ -3381,7 +3381,7 @@ "description": "Controls the position tracking and movement detection parameters.\n\nThis class manages the position control system including coordinate transformations,\ninitial positioning, signal filtering, and movement detection thresholds for the\nvirtual reality foraging task.", "properties": { "gain": { - "$ref": "#/$defs/aind_behavior_vr_foraging__task_logic__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 1.0, "y": 1.0, @@ -3390,7 +3390,7 @@ "description": "Gain of the position control." }, "initial_position": { - "$ref": "#/$defs/aind_behavior_vr_foraging__task_logic__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 0.0, "y": 2.56, @@ -3880,14 +3880,14 @@ "Session": { "properties": { "aind_behavior_services_pkg_version": { - "default": "0.13.5", + "default": "0.13.6", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "title": "aind_behavior_services package version", "type": "string" }, "version": { - "const": "0.13.5", - "default": "0.13.5", + "const": "0.13.6", + "default": "0.13.6", "title": "Version", "type": "string" }, @@ -4003,7 +4003,7 @@ "type": "object" }, "Size": { - "description": "Represents 2D dimensions with width and height.\n\nUsed for defining texture sizes, corridor dimensions, and other 2D measurements\nin the VR foraging environment.", + "description": "Represents 2D dimensions with width and height.", "properties": { "width": { "default": 0, @@ -4735,6 +4735,31 @@ "title": "UpdaterTarget", "type": "string" }, + "Vector3": { + "description": "Represents a 3D vector with float coordinates.", + "properties": { + "x": { + "default": 0, + "description": "X coordinate of the vector", + "title": "X", + "type": "number" + }, + "y": { + "default": 0, + "description": "Y coordinate of the vector", + "title": "Y", + "type": "number" + }, + "z": { + "default": 0, + "description": "Z coordinate of the vector", + "title": "Z", + "type": "number" + } + }, + "title": "Vector3", + "type": "object" + }, "VideoWriter": { "discriminator": { "mapping": { @@ -5189,56 +5214,6 @@ }, "title": "WebCamera", "type": "object" - }, - "aind_behavior_services__common__Vector3": { - "description": "Represents a 3D vector with float coordinates.", - "properties": { - "x": { - "default": 0, - "description": "X coordinate of the vector", - "title": "X", - "type": "number" - }, - "y": { - "default": 0, - "description": "Y coordinate of the vector", - "title": "Y", - "type": "number" - }, - "z": { - "default": 0, - "description": "Z coordinate of the vector", - "title": "Z", - "type": "number" - } - }, - "title": "Vector3", - "type": "object" - }, - "aind_behavior_vr_foraging__task_logic__Vector3": { - "description": "Represents a 3D point or vector with x, y, and z coordinates.\n\nUsed for 3D positioning and movement in the virtual reality environment,\nincluding camera positions, object locations, and 3D transformations.", - "properties": { - "x": { - "default": 0, - "description": "X coordinate of the point", - "title": "X", - "type": "number" - }, - "y": { - "default": 0, - "description": "Y coordinate of the point", - "title": "Y", - "type": "number" - }, - "z": { - "default": 0, - "description": "Z coordinate of the point", - "title": "Z", - "type": "number" - } - }, - "title": "Vector3", - "type": "object" } } } \ No newline at end of file diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 2b9d5706..970dfd99 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -231,7 +231,7 @@ public partial class AindVrForagingRig public AindVrForagingRig() { - _aindBehaviorServicesPkgVersion = "0.13.5"; + _aindBehaviorServicesPkgVersion = "0.13.6"; _version = "0.7.0-rc0"; _triggeredCameraController = new CameraControllerSpinnakerCamera(); _harpBehavior = new HarpBehavior(); @@ -840,7 +840,7 @@ public partial class AindVrForagingTaskParameters public AindVrForagingTaskParameters() { - _aindBehaviorServicesPkgVersion = "0.13.5"; + _aindBehaviorServicesPkgVersion = "0.13.6"; _environment = new BlockStructure(); _operationControl = new OperationControl(); } @@ -2559,14 +2559,14 @@ public override string ToString() public partial class DisplayExtrinsics { - private AindBehaviorServicesCommonVector3 _rotation; + private Vector3 _rotation; - private AindBehaviorServicesCommonVector3 _translation; + private Vector3 _translation; public DisplayExtrinsics() { - _rotation = new AindBehaviorServicesCommonVector3(); - _translation = new AindBehaviorServicesCommonVector3(); + _rotation = new Vector3(); + _translation = new Vector3(); } protected DisplayExtrinsics(DisplayExtrinsics other) @@ -2581,7 +2581,7 @@ protected DisplayExtrinsics(DisplayExtrinsics other) [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("rotation")] [System.ComponentModel.DescriptionAttribute("Rotation vector (radians)")] - public AindBehaviorServicesCommonVector3 Rotation + public Vector3 Rotation { get { @@ -2599,7 +2599,7 @@ public AindBehaviorServicesCommonVector3 Rotation [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("translation")] [System.ComponentModel.DescriptionAttribute("Translation (in cm)")] - public AindBehaviorServicesCommonVector3 Translation + public Vector3 Translation { get { @@ -6578,9 +6578,9 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) public partial class PositionControl { - private AindBehaviorVrForagingTaskLogicVector3 _gain; + private Vector3 _gain; - private AindBehaviorVrForagingTaskLogicVector3 _initialPosition; + private Vector3 _initialPosition; private double _frequencyFilterCutoff; @@ -6588,8 +6588,8 @@ public partial class PositionControl public PositionControl() { - _gain = new AindBehaviorVrForagingTaskLogicVector3(); - _initialPosition = new AindBehaviorVrForagingTaskLogicVector3(); + _gain = new Vector3(); + _initialPosition = new Vector3(); _frequencyFilterCutoff = 0.5D; _velocityThreshold = 1D; } @@ -6608,7 +6608,7 @@ protected PositionControl(PositionControl other) [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("gain")] [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] - public AindBehaviorVrForagingTaskLogicVector3 Gain + public Vector3 Gain { get { @@ -6626,7 +6626,7 @@ public AindBehaviorVrForagingTaskLogicVector3 Gain [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] [System.ComponentModel.DescriptionAttribute("Initial position of the subject in the VR world.")] - public AindBehaviorVrForagingTaskLogicVector3 InitialPosition + public Vector3 InitialPosition { get { @@ -7600,8 +7600,8 @@ public partial class Session public Session() { - _aindBehaviorServicesPkgVersion = "0.13.5"; - _version = "0.13.5"; + _aindBehaviorServicesPkgVersion = "0.13.6"; + _version = "0.13.6"; _experimenter = new System.Collections.Generic.List(); _allowDirtyRepo = false; _skipHardwareValidation = false; @@ -7935,13 +7935,9 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) /// /// Represents 2D dimensions with width and height. - /// - ///Used for defining texture sizes, corridor dimensions, and other 2D measurements - ///in the VR foraging environment. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents 2D dimensions with width and height.\n\nUsed for defining texture sizes," + - " corridor dimensions, and other 2D measurements\nin the VR foraging environment.")] + [System.ComponentModel.DescriptionAttribute("Represents 2D dimensions with width and height.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] public partial class Size @@ -9302,6 +9298,120 @@ public enum UpdaterTarget } + /// + /// Represents a 3D vector with float coordinates. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a 3D vector with float coordinates.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Vector3 + { + + private double _x; + + private double _y; + + private double _z; + + public Vector3() + { + _x = 0D; + _y = 0D; + _z = 0D; + } + + protected Vector3(Vector3 other) + { + _x = other._x; + _y = other._y; + _z = other._z; + } + + /// + /// X coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the vector")] + public double X + { + get + { + return _x; + } + set + { + _x = value; + } + } + + /// + /// Y coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the vector")] + public double Y + { + get + { + return _y; + } + set + { + _y = value; + } + } + + /// + /// Z coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("z")] + [System.ComponentModel.DescriptionAttribute("Z coordinate of the vector")] + public double Z + { + get + { + return _z; + } + set + { + _z = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Vector3(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Vector3(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Z = " + _z); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + /// /// FFMPEG video writer configuration. /// @@ -10750,239 +10860,6 @@ public override string ToString() } - /// - /// Represents a 3D vector with float coordinates. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a 3D vector with float coordinates.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorServicesCommonVector3 - { - - private double _x; - - private double _y; - - private double _z; - - public AindBehaviorServicesCommonVector3() - { - _x = 0D; - _y = 0D; - _z = 0D; - } - - protected AindBehaviorServicesCommonVector3(AindBehaviorServicesCommonVector3 other) - { - _x = other._x; - _y = other._y; - _z = other._z; - } - - /// - /// X coordinate of the vector - /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the vector")] - public double X - { - get - { - return _x; - } - set - { - _x = value; - } - } - - /// - /// Y coordinate of the vector - /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the vector")] - public double Y - { - get - { - return _y; - } - set - { - _y = value; - } - } - - /// - /// Z coordinate of the vector - /// - [Newtonsoft.Json.JsonPropertyAttribute("z")] - [System.ComponentModel.DescriptionAttribute("Z coordinate of the vector")] - public double Z - { - get - { - return _z; - } - set - { - _z = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorServicesCommonVector3(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorServicesCommonVector3(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Z = " + _z); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Represents a 3D point or vector with x, y, and z coordinates. - /// - ///Used for 3D positioning and movement in the virtual reality environment, - ///including camera positions, object locations, and 3D transformations. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a 3D point or vector with x, y, and z coordinates.\n\nUsed for 3D positi" + - "oning and movement in the virtual reality environment,\nincluding camera position" + - "s, object locations, and 3D transformations.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorVrForagingTaskLogicVector3 - { - - private double _x; - - private double _y; - - private double _z; - - public AindBehaviorVrForagingTaskLogicVector3() - { - _x = 0D; - _y = 0D; - _z = 0D; - } - - protected AindBehaviorVrForagingTaskLogicVector3(AindBehaviorVrForagingTaskLogicVector3 other) - { - _x = other._x; - _y = other._y; - _z = other._z; - } - - /// - /// X coordinate of the point - /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the point")] - public double X - { - get - { - return _x; - } - set - { - _x = value; - } - } - - /// - /// Y coordinate of the point - /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the point")] - public double Y - { - get - { - return _y; - } - set - { - _y = value; - } - } - - /// - /// Z coordinate of the point - /// - [Newtonsoft.Json.JsonPropertyAttribute("z")] - [System.ComponentModel.DescriptionAttribute("Z coordinate of the point")] - public double Z - { - get - { - return _z; - } - set - { - _z = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorVrForagingTaskLogicVector3(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorVrForagingTaskLogicVector3(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Z = " + _z); - return true; - } - - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum BlockStructureSamplingMode @@ -11826,6 +11703,11 @@ public System.IObservable Process(System.IObservable(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -11875,16 +11757,6 @@ public System.IObservable Process(System.IObservable source) { return Process(source); } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } } @@ -11965,6 +11837,7 @@ public System.IObservable Process(System.IObservable))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -11975,8 +11848,6 @@ public System.IObservable Process(System.IObservable))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder { diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index e4fb3f1f..5563c901 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -3,6 +3,7 @@ from typing import TYPE_CHECKING, Annotated, Any, Dict, List, Literal, Optional, Self, Union, cast import aind_behavior_services.task.distributions as distributions +from aind_behavior_services.common import Size, Vector3 from aind_behavior_services.task import Task, TaskParameters from pydantic import BaseModel, Field, NonNegativeFloat, field_validator, model_validator from typing_extensions import TypeAliasType @@ -27,46 +28,6 @@ def scalar_value(value: float) -> distributions.Scalar: return distributions.Scalar(distribution_parameters=distributions.ScalarDistributionParameter(value=value)) -# ==================== BASIC DATA STRUCTURES ==================== - - -class Size(BaseModel): - """ - Represents 2D dimensions with width and height. - - Used for defining texture sizes, corridor dimensions, and other 2D measurements - in the VR foraging environment. - """ - - width: float = Field(default=0, description="Width of the texture") - height: float = Field(default=0, description="Height of the texture") - - -class Vector2(BaseModel): - """ - Represents a 2D point or vector with x and y coordinates. - - Used for positioning elements in 2D space within the VR environment, - such as texture coordinates or 2D movement vectors. - """ - - x: float = Field(default=0, description="X coordinate of the point") - y: float = Field(default=0, description="Y coordinate of the point") - - -class Vector3(BaseModel): - """ - Represents a 3D point or vector with x, y, and z coordinates. - - Used for 3D positioning and movement in the virtual reality environment, - including camera positions, object locations, and 3D transformations. - """ - - x: float = Field(default=0, description="X coordinate of the point") - y: float = Field(default=0, description="Y coordinate of the point") - z: float = Field(default=0, description="Z coordinate of the point") - - # ==================== NUMERICAL UPDATERS ==================== class NumericalUpdaterOperation(str, Enum): """ @@ -880,7 +841,9 @@ class PositionControl(BaseModel): """ gain: Vector3 = Field(default=Vector3(x=1, y=1, z=1), description="Gain of the position control.") - initial_position: Vector3 = Field(default=Vector3(x=0, y=2.56, z=0), description="Initial position of the subject in the VR world.") + initial_position: Vector3 = Field( + default=Vector3(x=0, y=2.56, z=0), description="Initial position of the subject in the VR world." + ) frequency_filter_cutoff: float = Field( default=0.5, ge=0, diff --git a/uv.lock b/uv.lock index 5f5be9f7..6f92fe2b 100644 --- a/uv.lock +++ b/uv.lock @@ -41,7 +41,7 @@ wheels = [ [[package]] name = "aind-behavior-services" -version = "0.13.5" +version = "0.13.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-curriculum" }, @@ -50,9 +50,9 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/89/17cad4b1c9c75de7f71dc735ed07334eab9ea01876ddffdf6f9f64b5978a/aind_behavior_services-0.13.5.tar.gz", hash = "sha256:f771f3d1ebfc60c17cff53a2c4ad8d0919411e26066e712ef4f6cb10cd857b57", size = 29399, upload-time = "2026-03-23T18:47:18.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/ed/ccf529e8e53a3a22f956cb30a36e53c127b3aeb9ff31f63438d458696d4e/aind_behavior_services-0.13.6.tar.gz", hash = "sha256:aa37ae991e07c454a0c4fbc8b977f22ae81dd04f2a8acabeb13d587b187b6494", size = 29469, upload-time = "2026-03-31T15:46:30.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/3d/a92f31e7ce1886bcaac017f25ae578589dc6ef3060f4ba10792f8c5b2e14/aind_behavior_services-0.13.5-py3-none-any.whl", hash = "sha256:bbd6ff52903a4d8d97c84f908f745a7784ded0047388225d8dee6515cd77b588", size = 39453, upload-time = "2026-03-23T18:47:19.678Z" }, + { url = "https://files.pythonhosted.org/packages/71/26/5645935312184f8d1bf3982f2d114247c43c461577caa49a16099f3679ee/aind_behavior_services-0.13.6-py3-none-any.whl", hash = "sha256:c0d28959a39c152d9ddbf290b3b3c87b8ad6fa1d5044d81d3507c6a167e45e26", size = 39516, upload-time = "2026-03-31T15:46:29.809Z" }, ] [[package]] @@ -95,7 +95,7 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aind-behavior-services", specifier = ">=0.13.5" }, + { name = "aind-behavior-services", specifier = ">=0.13.6" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.10" }, { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.6" }, @@ -1344,81 +1344,81 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb", size = 16957183, upload-time = "2026-03-09T07:55:57.774Z" }, - { url = "https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147", size = 14968734, upload-time = "2026-03-09T07:56:00.494Z" }, - { url = "https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920", size = 5475288, upload-time = "2026-03-09T07:56:02.857Z" }, - { url = "https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9", size = 6805253, upload-time = "2026-03-09T07:56:04.53Z" }, - { url = "https://files.pythonhosted.org/packages/21/bc/e7aa3f6817e40c3f517d407742337cbb8e6fc4b83ce0b55ab780c829243b/numpy-2.4.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a016db5c5dba78fa8fe9f5d80d6708f9c42ab087a739803c0ac83a43d686a470", size = 15969479, upload-time = "2026-03-09T07:56:06.638Z" }, - { url = "https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71", size = 16901035, upload-time = "2026-03-09T07:56:09.405Z" }, - { url = "https://files.pythonhosted.org/packages/64/6e/b221dd847d7181bc5ee4857bfb026182ef69499f9305eb1371cbb1aea626/numpy-2.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2ddb7919366ee468342b91dea2352824c25b55814a987847b6c52003a7c97f15", size = 17325657, upload-time = "2026-03-09T07:56:12.067Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b8/8f3fd2da596e1063964b758b5e3c970aed1949a05200d7e3d46a9d46d643/numpy-2.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a315e5234d88067f2d97e1f2ef670a7569df445d55400f1e33d117418d008d52", size = 18635512, upload-time = "2026-03-09T07:56:14.629Z" }, - { url = "https://files.pythonhosted.org/packages/5c/24/2993b775c37e39d2f8ab4125b44337ab0b2ba106c100980b7c274a22bee7/numpy-2.4.3-cp311-cp311-win32.whl", hash = "sha256:2b3f8d2c4589b1a2028d2a770b0fc4d1f332fb5e01521f4de3199a896d158ddd", size = 6238100, upload-time = "2026-03-09T07:56:17.243Z" }, - { url = "https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec", size = 12609816, upload-time = "2026-03-09T07:56:19.089Z" }, - { url = "https://files.pythonhosted.org/packages/92/82/190b99153480076c8dce85f4cfe7d53ea84444145ffa54cb58dcd460d66b/numpy-2.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:eb610595dd91560905c132c709412b512135a60f1851ccbd2c959e136431ff67", size = 10485757, upload-time = "2026-03-09T07:56:21.753Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ed/6388632536f9788cea23a3a1b629f25b43eaacd7d7377e5d6bc7b9deb69b/numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef", size = 16669628, upload-time = "2026-03-09T07:56:24.252Z" }, - { url = "https://files.pythonhosted.org/packages/74/1b/ee2abfc68e1ce728b2958b6ba831d65c62e1b13ce3017c13943f8f9b5b2e/numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e", size = 14696872, upload-time = "2026-03-09T07:56:26.991Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d1/780400e915ff5638166f11ca9dc2c5815189f3d7cf6f8759a1685e586413/numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4", size = 5203489, upload-time = "2026-03-09T07:56:29.414Z" }, - { url = "https://files.pythonhosted.org/packages/0b/bb/baffa907e9da4cc34a6e556d6d90e032f6d7a75ea47968ea92b4858826c4/numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18", size = 6550814, upload-time = "2026-03-09T07:56:32.225Z" }, - { url = "https://files.pythonhosted.org/packages/7b/12/8c9f0c6c95f76aeb20fc4a699c33e9f827fa0d0f857747c73bb7b17af945/numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5", size = 15666601, upload-time = "2026-03-09T07:56:34.461Z" }, - { url = "https://files.pythonhosted.org/packages/bd/79/cc665495e4d57d0aa6fbcc0aa57aa82671dfc78fbf95fe733ed86d98f52a/numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97", size = 16621358, upload-time = "2026-03-09T07:56:36.852Z" }, - { url = "https://files.pythonhosted.org/packages/a8/40/b4ecb7224af1065c3539f5ecfff879d090de09608ad1008f02c05c770cb3/numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c", size = 17016135, upload-time = "2026-03-09T07:56:39.337Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b1/6a88e888052eed951afed7a142dcdf3b149a030ca59b4c71eef085858e43/numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc", size = 18345816, upload-time = "2026-03-09T07:56:42.31Z" }, - { url = "https://files.pythonhosted.org/packages/f3/8f/103a60c5f8c3d7fc678c19cd7b2476110da689ccb80bc18050efbaeae183/numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9", size = 5960132, upload-time = "2026-03-09T07:56:44.851Z" }, - { url = "https://files.pythonhosted.org/packages/d7/7c/f5ee1bf6ed888494978046a809df2882aad35d414b622893322df7286879/numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5", size = 12316144, upload-time = "2026-03-09T07:56:47.057Z" }, - { url = "https://files.pythonhosted.org/packages/71/46/8d1cb3f7a00f2fb6394140e7e6623696e54c6318a9d9691bb4904672cf42/numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e", size = 10220364, upload-time = "2026-03-09T07:56:49.849Z" }, - { url = "https://files.pythonhosted.org/packages/b6/d0/1fe47a98ce0df229238b77611340aff92d52691bcbc10583303181abf7fc/numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3", size = 16665297, upload-time = "2026-03-09T07:56:52.296Z" }, - { url = "https://files.pythonhosted.org/packages/27/d9/4e7c3f0e68dfa91f21c6fb6cf839bc829ec920688b1ce7ec722b1a6202fb/numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9", size = 14691853, upload-time = "2026-03-09T07:56:54.992Z" }, - { url = "https://files.pythonhosted.org/packages/3a/66/bd096b13a87549683812b53ab211e6d413497f84e794fb3c39191948da97/numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee", size = 5198435, upload-time = "2026-03-09T07:56:57.184Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2f/687722910b5a5601de2135c891108f51dfc873d8e43c8ed9f4ebb440b4a2/numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f", size = 6546347, upload-time = "2026-03-09T07:56:59.531Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ec/7971c4e98d86c564750393fab8d7d83d0a9432a9d78bb8a163a6dc59967a/numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f", size = 15664626, upload-time = "2026-03-09T07:57:01.385Z" }, - { url = "https://files.pythonhosted.org/packages/7e/eb/7daecbea84ec935b7fc732e18f532073064a3816f0932a40a17f3349185f/numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc", size = 16608916, upload-time = "2026-03-09T07:57:04.008Z" }, - { url = "https://files.pythonhosted.org/packages/df/58/2a2b4a817ffd7472dca4421d9f0776898b364154e30c95f42195041dc03b/numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476", size = 17015824, upload-time = "2026-03-09T07:57:06.347Z" }, - { url = "https://files.pythonhosted.org/packages/4a/ca/627a828d44e78a418c55f82dd4caea8ea4a8ef24e5144d9e71016e52fb40/numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92", size = 18334581, upload-time = "2026-03-09T07:57:09.114Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c0/76f93962fc79955fcba30a429b62304332345f22d4daec1cb33653425643/numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687", size = 5958618, upload-time = "2026-03-09T07:57:11.432Z" }, - { url = "https://files.pythonhosted.org/packages/b1/3c/88af0040119209b9b5cb59485fa48b76f372c73068dbf9254784b975ac53/numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd", size = 12312824, upload-time = "2026-03-09T07:57:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/58/ce/3d07743aced3d173f877c3ef6a454c2174ba42b584ab0b7e6d99374f51ed/numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d", size = 10221218, upload-time = "2026-03-09T07:57:16.183Z" }, - { url = "https://files.pythonhosted.org/packages/62/09/d96b02a91d09e9d97862f4fc8bfebf5400f567d8eb1fe4b0cc4795679c15/numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875", size = 14819570, upload-time = "2026-03-09T07:57:18.564Z" }, - { url = "https://files.pythonhosted.org/packages/b5/ca/0b1aba3905fdfa3373d523b2b15b19029f4f3031c87f4066bd9d20ef6c6b/numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070", size = 5326113, upload-time = "2026-03-09T07:57:21.052Z" }, - { url = "https://files.pythonhosted.org/packages/c0/63/406e0fd32fcaeb94180fd6a4c41e55736d676c54346b7efbce548b94a914/numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73", size = 6646370, upload-time = "2026-03-09T07:57:22.804Z" }, - { url = "https://files.pythonhosted.org/packages/b6/d0/10f7dc157d4b37af92720a196be6f54f889e90dcd30dce9dc657ed92c257/numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368", size = 15723499, upload-time = "2026-03-09T07:57:24.693Z" }, - { url = "https://files.pythonhosted.org/packages/66/f1/d1c2bf1161396629701bc284d958dc1efa3a5a542aab83cf11ee6eb4cba5/numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22", size = 16657164, upload-time = "2026-03-09T07:57:27.676Z" }, - { url = "https://files.pythonhosted.org/packages/1a/be/cca19230b740af199ac47331a21c71e7a3d0ba59661350483c1600d28c37/numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a", size = 17081544, upload-time = "2026-03-09T07:57:30.664Z" }, - { url = "https://files.pythonhosted.org/packages/b9/c5/9602b0cbb703a0936fb40f8a95407e8171935b15846de2f0776e08af04c7/numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349", size = 18380290, upload-time = "2026-03-09T07:57:33.763Z" }, - { url = "https://files.pythonhosted.org/packages/ed/81/9f24708953cd30be9ee36ec4778f4b112b45165812f2ada4cc5ea1c1f254/numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c", size = 6082814, upload-time = "2026-03-09T07:57:36.491Z" }, - { url = "https://files.pythonhosted.org/packages/e2/9e/52f6eaa13e1a799f0ab79066c17f7016a4a8ae0c1aefa58c82b4dab690b4/numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26", size = 12452673, upload-time = "2026-03-09T07:57:38.281Z" }, - { url = "https://files.pythonhosted.org/packages/c4/04/b8cece6ead0b30c9fbd99bb835ad7ea0112ac5f39f069788c5558e3b1ab2/numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02", size = 10290907, upload-time = "2026-03-09T07:57:40.747Z" }, - { url = "https://files.pythonhosted.org/packages/70/ae/3936f79adebf8caf81bd7a599b90a561334a658be4dcc7b6329ebf4ee8de/numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4", size = 16664563, upload-time = "2026-03-09T07:57:43.817Z" }, - { url = "https://files.pythonhosted.org/packages/9b/62/760f2b55866b496bb1fa7da2a6db076bef908110e568b02fcfc1422e2a3a/numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168", size = 14702161, upload-time = "2026-03-09T07:57:46.169Z" }, - { url = "https://files.pythonhosted.org/packages/32/af/a7a39464e2c0a21526fb4fb76e346fb172ebc92f6d1c7a07c2c139cc17b1/numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b", size = 5208738, upload-time = "2026-03-09T07:57:48.506Z" }, - { url = "https://files.pythonhosted.org/packages/29/8c/2a0cf86a59558fa078d83805589c2de490f29ed4fb336c14313a161d358a/numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950", size = 6543618, upload-time = "2026-03-09T07:57:50.591Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b8/612ce010c0728b1c363fa4ea3aa4c22fe1c5da1de008486f8c2f5cb92fae/numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd", size = 15680676, upload-time = "2026-03-09T07:57:52.34Z" }, - { url = "https://files.pythonhosted.org/packages/a9/7e/4f120ecc54ba26ddf3dc348eeb9eb063f421de65c05fc961941798feea18/numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24", size = 16613492, upload-time = "2026-03-09T07:57:54.91Z" }, - { url = "https://files.pythonhosted.org/packages/2c/86/1b6020db73be330c4b45d5c6ee4295d59cfeef0e3ea323959d053e5a6909/numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0", size = 17031789, upload-time = "2026-03-09T07:57:57.641Z" }, - { url = "https://files.pythonhosted.org/packages/07/3a/3b90463bf41ebc21d1b7e06079f03070334374208c0f9a1f05e4ae8455e7/numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0", size = 18339941, upload-time = "2026-03-09T07:58:00.577Z" }, - { url = "https://files.pythonhosted.org/packages/a8/74/6d736c4cd962259fd8bae9be27363eb4883a2f9069763747347544c2a487/numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a", size = 6007503, upload-time = "2026-03-09T07:58:03.331Z" }, - { url = "https://files.pythonhosted.org/packages/48/39/c56ef87af669364356bb011922ef0734fc49dad51964568634c72a009488/numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc", size = 12444915, upload-time = "2026-03-09T07:58:06.353Z" }, - { url = "https://files.pythonhosted.org/packages/9d/1f/ab8528e38d295fd349310807496fabb7cf9fe2e1f70b97bc20a483ea9d4a/numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7", size = 10494875, upload-time = "2026-03-09T07:58:08.734Z" }, - { url = "https://files.pythonhosted.org/packages/e6/ef/b7c35e4d5ef141b836658ab21a66d1a573e15b335b1d111d31f26c8ef80f/numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657", size = 14822225, upload-time = "2026-03-09T07:58:11.034Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8d/7730fa9278cf6648639946cc816e7cc89f0d891602584697923375f801ed/numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7", size = 5328769, upload-time = "2026-03-09T07:58:13.67Z" }, - { url = "https://files.pythonhosted.org/packages/47/01/d2a137317c958b074d338807c1b6a383406cdf8b8e53b075d804cc3d211d/numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093", size = 6649461, upload-time = "2026-03-09T07:58:15.912Z" }, - { url = "https://files.pythonhosted.org/packages/5c/34/812ce12bc0f00272a4b0ec0d713cd237cb390666eb6206323d1cc9cedbb2/numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a", size = 15725809, upload-time = "2026-03-09T07:58:17.787Z" }, - { url = "https://files.pythonhosted.org/packages/25/c0/2aed473a4823e905e765fee3dc2cbf504bd3e68ccb1150fbdabd5c39f527/numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611", size = 16655242, upload-time = "2026-03-09T07:58:20.476Z" }, - { url = "https://files.pythonhosted.org/packages/f2/c8/7e052b2fc87aa0e86de23f20e2c42bd261c624748aa8efd2c78f7bb8d8c6/numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720", size = 17080660, upload-time = "2026-03-09T07:58:23.067Z" }, - { url = "https://files.pythonhosted.org/packages/f3/3d/0876746044db2adcb11549f214d104f2e1be00f07a67edbb4e2812094847/numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5", size = 18380384, upload-time = "2026-03-09T07:58:25.839Z" }, - { url = "https://files.pythonhosted.org/packages/07/12/8160bea39da3335737b10308df4f484235fd297f556745f13092aa039d3b/numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0", size = 6154547, upload-time = "2026-03-09T07:58:28.289Z" }, - { url = "https://files.pythonhosted.org/packages/42/f3/76534f61f80d74cc9cdf2e570d3d4eeb92c2280a27c39b0aaf471eda7b48/numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b", size = 12633645, upload-time = "2026-03-09T07:58:30.384Z" }, - { url = "https://files.pythonhosted.org/packages/1f/b6/7c0d4334c15983cec7f92a69e8ce9b1e6f31857e5ee3a413ac424e6bd63d/numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e", size = 10565454, upload-time = "2026-03-09T07:58:33.031Z" }, - { url = "https://files.pythonhosted.org/packages/64/e4/4dab9fb43c83719c29241c535d9e07be73bea4bc0c6686c5816d8e1b6689/numpy-2.4.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c6b124bfcafb9e8d3ed09130dbee44848c20b3e758b6bbf006e641778927c028", size = 16834892, upload-time = "2026-03-09T07:58:35.334Z" }, - { url = "https://files.pythonhosted.org/packages/c9/29/f8b6d4af90fed3dfda84ebc0df06c9833d38880c79ce954e5b661758aa31/numpy-2.4.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76dbb9d4e43c16cf9aa711fcd8de1e2eeb27539dcefb60a1d5e9f12fae1d1ed8", size = 14893070, upload-time = "2026-03-09T07:58:37.7Z" }, - { url = "https://files.pythonhosted.org/packages/9a/04/a19b3c91dbec0a49269407f15d5753673a09832daed40c45e8150e6fa558/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:29363fbfa6f8ee855d7569c96ce524845e3d726d6c19b29eceec7dd555dab152", size = 5399609, upload-time = "2026-03-09T07:58:39.853Z" }, - { url = "https://files.pythonhosted.org/packages/79/34/4d73603f5420eab89ea8a67097b31364bf7c30f811d4dd84b1659c7476d9/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:bc71942c789ef415a37f0d4eab90341425a00d538cd0642445d30b41023d3395", size = 6714355, upload-time = "2026-03-09T07:58:42.365Z" }, - { url = "https://files.pythonhosted.org/packages/58/ad/1100d7229bb248394939a12a8074d485b655e8ed44207d328fdd7fcebc7b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e58765ad74dcebd3ef0208a5078fba32dc8ec3578fe84a604432950cd043d79", size = 15800434, upload-time = "2026-03-09T07:58:44.837Z" }, - { url = "https://files.pythonhosted.org/packages/0c/fd/16d710c085d28ba4feaf29ac60c936c9d662e390344f94a6beaa2ac9899b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e236dbda4e1d319d681afcbb136c0c4a8e0f1a5c58ceec2adebb547357fe857", size = 16729409, upload-time = "2026-03-09T07:58:47.972Z" }, - { url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" }, +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, + { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, + { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, + { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, + { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, + { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, + { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, + { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, + { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" }, ] [[package]] @@ -1450,62 +1450,62 @@ wheels = [ [[package]] name = "pandas" -version = "3.0.1" +version = "3.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/0c/b28ed414f080ee0ad153f848586d61d1878f91689950f037f976ce15f6c8/pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8", size = 4641901, upload-time = "2026-02-17T22:20:16.434Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea", size = 10323380, upload-time = "2026-02-17T22:18:16.133Z" }, - { url = "https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796", size = 9923455, upload-time = "2026-02-17T22:18:19.13Z" }, - { url = "https://files.pythonhosted.org/packages/0e/f1/ed17d927f9950643bc7631aa4c99ff0cc83a37864470bc419345b656a41f/pandas-3.0.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:406ce835c55bac912f2a0dcfaf27c06d73c6b04a5dde45f1fd3169ce31337389", size = 10753464, upload-time = "2026-02-17T22:18:21.134Z" }, - { url = "https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7", size = 11255234, upload-time = "2026-02-17T22:18:24.175Z" }, - { url = "https://files.pythonhosted.org/packages/5c/39/3653fe59af68606282b989c23d1a543ceba6e8099cbcc5f1d506a7bae2aa/pandas-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a64ce8b0f2de1d2efd2ae40b0abe7f8ae6b29fbfb3812098ed5a6f8e235ad9bf", size = 11767299, upload-time = "2026-02-17T22:18:26.824Z" }, - { url = "https://files.pythonhosted.org/packages/9b/31/1daf3c0c94a849c7a8dab8a69697b36d313b229918002ba3e409265c7888/pandas-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9832c2c69da24b602c32e0c7b1b508a03949c18ba08d4d9f1c1033426685b447", size = 12333292, upload-time = "2026-02-17T22:18:28.996Z" }, - { url = "https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79", size = 9892176, upload-time = "2026-02-17T22:18:31.79Z" }, - { url = "https://files.pythonhosted.org/packages/79/ab/9c776b14ac4b7b4140788eca18468ea39894bc7340a408f1d1e379856a6b/pandas-3.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:4a68773d5a778afb31d12e34f7dd4612ab90de8c6fb1d8ffe5d4a03b955082a1", size = 9151328, upload-time = "2026-02-17T22:18:35.721Z" }, - { url = "https://files.pythonhosted.org/packages/37/51/b467209c08dae2c624873d7491ea47d2b47336e5403309d433ea79c38571/pandas-3.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:476f84f8c20c9f5bc47252b66b4bb25e1a9fc2fa98cead96744d8116cb85771d", size = 10344357, upload-time = "2026-02-17T22:18:38.262Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f1/e2567ffc8951ab371db2e40b2fe068e36b81d8cf3260f06ae508700e5504/pandas-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ab749dfba921edf641d4036c4c21c0b3ea70fea478165cb98a998fb2a261955", size = 9884543, upload-time = "2026-02-17T22:18:41.476Z" }, - { url = "https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b", size = 10396030, upload-time = "2026-02-17T22:18:43.822Z" }, - { url = "https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4", size = 10876435, upload-time = "2026-02-17T22:18:45.954Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a6/2a75320849dd154a793f69c951db759aedb8d1dd3939eeacda9bdcfa1629/pandas-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:356e5c055ed9b0da1580d465657bc7d00635af4fd47f30afb23025352ba764d1", size = 11405133, upload-time = "2026-02-17T22:18:48.533Z" }, - { url = "https://files.pythonhosted.org/packages/58/53/1d68fafb2e02d7881df66aa53be4cd748d25cbe311f3b3c85c93ea5d30ca/pandas-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d810036895f9ad6345b8f2a338dd6998a74e8483847403582cab67745bff821", size = 11932065, upload-time = "2026-02-17T22:18:50.837Z" }, - { url = "https://files.pythonhosted.org/packages/75/08/67cc404b3a966b6df27b38370ddd96b3b023030b572283d035181854aac5/pandas-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:536232a5fe26dd989bd633e7a0c450705fdc86a207fec7254a55e9a22950fe43", size = 9741627, upload-time = "2026-02-17T22:18:53.905Z" }, - { url = "https://files.pythonhosted.org/packages/86/4f/caf9952948fb00d23795f09b893d11f1cacb384e666854d87249530f7cbe/pandas-3.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f463ebfd8de7f326d38037c7363c6dacb857c5881ab8961fb387804d6daf2f7", size = 9052483, upload-time = "2026-02-17T22:18:57.31Z" }, - { url = "https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262", size = 10317509, upload-time = "2026-02-17T22:18:59.498Z" }, - { url = "https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56", size = 9860561, upload-time = "2026-02-17T22:19:02.265Z" }, - { url = "https://files.pythonhosted.org/packages/fa/80/f01ff54664b6d70fed71475543d108a9b7c888e923ad210795bef04ffb7d/pandas-3.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75e6e292ff898679e47a2199172593d9f6107fd2dd3617c22c2946e97d5df46e", size = 10365506, upload-time = "2026-02-17T22:19:05.017Z" }, - { url = "https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791", size = 10873196, upload-time = "2026-02-17T22:19:07.204Z" }, - { url = "https://files.pythonhosted.org/packages/48/a9/9301c83d0b47c23ac5deab91c6b39fd98d5b5db4d93b25df8d381451828f/pandas-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eca8b4510f6763f3d37359c2105df03a7a221a508f30e396a51d0713d462e68a", size = 11370859, upload-time = "2026-02-17T22:19:09.436Z" }, - { url = "https://files.pythonhosted.org/packages/59/fe/0c1fc5bd2d29c7db2ab372330063ad555fb83e08422829c785f5ec2176ca/pandas-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06aff2ad6f0b94a17822cf8b83bbb563b090ed82ff4fe7712db2ce57cd50d9b8", size = 11924584, upload-time = "2026-02-17T22:19:11.562Z" }, - { url = "https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25", size = 9742769, upload-time = "2026-02-17T22:19:13.926Z" }, - { url = "https://files.pythonhosted.org/packages/c4/cb/810a22a6af9a4e97c8ab1c946b47f3489c5bca5adc483ce0ffc84c9cc768/pandas-3.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a8d37a43c52917427e897cb2e429f67a449327394396a81034a4449b99afda59", size = 9043855, upload-time = "2026-02-17T22:19:16.09Z" }, - { url = "https://files.pythonhosted.org/packages/92/fa/423c89086cca1f039cf1253c3ff5b90f157b5b3757314aa635f6bf3e30aa/pandas-3.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d54855f04f8246ed7b6fc96b05d4871591143c46c0b6f4af874764ed0d2d6f06", size = 10752673, upload-time = "2026-02-17T22:19:18.304Z" }, - { url = "https://files.pythonhosted.org/packages/22/23/b5a08ec1f40020397f0faba72f1e2c11f7596a6169c7b3e800abff0e433f/pandas-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e1b677accee34a09e0dc2ce5624e4a58a1870ffe56fc021e9caf7f23cd7668f", size = 10404967, upload-time = "2026-02-17T22:19:20.726Z" }, - { url = "https://files.pythonhosted.org/packages/5c/81/94841f1bb4afdc2b52a99daa895ac2c61600bb72e26525ecc9543d453ebc/pandas-3.0.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9cabbdcd03f1b6cd254d6dda8ae09b0252524be1592594c00b7895916cb1324", size = 10320575, upload-time = "2026-02-17T22:19:24.919Z" }, - { url = "https://files.pythonhosted.org/packages/0a/8b/2ae37d66a5342a83adadfd0cb0b4bf9c3c7925424dd5f40d15d6cfaa35ee/pandas-3.0.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ae2ab1f166668b41e770650101e7090824fd34d17915dd9cd479f5c5e0065e9", size = 10710921, upload-time = "2026-02-17T22:19:27.181Z" }, - { url = "https://files.pythonhosted.org/packages/a2/61/772b2e2757855e232b7ccf7cb8079a5711becb3a97f291c953def15a833f/pandas-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6bf0603c2e30e2cafac32807b06435f28741135cb8697eae8b28c7d492fc7d76", size = 11334191, upload-time = "2026-02-17T22:19:29.411Z" }, - { url = "https://files.pythonhosted.org/packages/1b/08/b16c6df3ef555d8495d1d265a7963b65be166785d28f06a350913a4fac78/pandas-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c426422973973cae1f4a23e51d4ae85974f44871b24844e4f7de752dd877098", size = 11782256, upload-time = "2026-02-17T22:19:32.34Z" }, - { url = "https://files.pythonhosted.org/packages/55/80/178af0594890dee17e239fca96d3d8670ba0f5ff59b7d0439850924a9c09/pandas-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b03f91ae8c10a85c1613102c7bef5229b5379f343030a3ccefeca8a33414cf35", size = 10485047, upload-time = "2026-02-17T22:19:34.605Z" }, - { url = "https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a", size = 10322465, upload-time = "2026-02-17T22:19:36.803Z" }, - { url = "https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f", size = 9910632, upload-time = "2026-02-17T22:19:39.001Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f7/b449ffb3f68c11da12fc06fbf6d2fa3a41c41e17d0284d23a79e1c13a7e4/pandas-3.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56cf59638bf24dc9bdf2154c81e248b3289f9a09a6d04e63608c159022352749", size = 10440535, upload-time = "2026-02-17T22:19:41.157Z" }, - { url = "https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249", size = 10893940, upload-time = "2026-02-17T22:19:43.493Z" }, - { url = "https://files.pythonhosted.org/packages/03/30/f1b502a72468c89412c1b882a08f6eed8a4ee9dc033f35f65d0663df6081/pandas-3.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1849f0bba9c8a2fb0f691d492b834cc8dadf617e29015c66e989448d58d011ee", size = 11442711, upload-time = "2026-02-17T22:19:46.074Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f0/ebb6ddd8fc049e98cabac5c2924d14d1dda26a20adb70d41ea2e428d3ec4/pandas-3.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3d288439e11b5325b02ae6e9cc83e6805a62c40c5a6220bea9beb899c073b1c", size = 11963918, upload-time = "2026-02-17T22:19:48.838Z" }, - { url = "https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66", size = 9862099, upload-time = "2026-02-17T22:19:51.081Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b7/6af9aac41ef2456b768ef0ae60acf8abcebb450a52043d030a65b4b7c9bd/pandas-3.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:97ca08674e3287c7148f4858b01136f8bdfe7202ad25ad04fec602dd1d29d132", size = 9185333, upload-time = "2026-02-17T22:19:53.266Z" }, - { url = "https://files.pythonhosted.org/packages/66/fc/848bb6710bc6061cb0c5badd65b92ff75c81302e0e31e496d00029fe4953/pandas-3.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:58eeb1b2e0fb322befcf2bbc9ba0af41e616abadb3d3414a6bc7167f6cbfce32", size = 10772664, upload-time = "2026-02-17T22:19:55.806Z" }, - { url = "https://files.pythonhosted.org/packages/69/5c/866a9bbd0f79263b4b0db6ec1a341be13a1473323f05c122388e0f15b21d/pandas-3.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cd9af1276b5ca9e298bd79a26bda32fa9cc87ed095b2a9a60978d2ca058eaf87", size = 10421286, upload-time = "2026-02-17T22:19:58.091Z" }, - { url = "https://files.pythonhosted.org/packages/51/a4/2058fb84fb1cfbfb2d4a6d485e1940bb4ad5716e539d779852494479c580/pandas-3.0.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f87a04984d6b63788327cd9f79dda62b7f9043909d2440ceccf709249ca988", size = 10342050, upload-time = "2026-02-17T22:20:01.376Z" }, - { url = "https://files.pythonhosted.org/packages/22/1b/674e89996cc4be74db3c4eb09240c4bb549865c9c3f5d9b086ff8fcfbf00/pandas-3.0.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85fe4c4df62e1e20f9db6ebfb88c844b092c22cd5324bdcf94bfa2fc1b391221", size = 10740055, upload-time = "2026-02-17T22:20:04.328Z" }, - { url = "https://files.pythonhosted.org/packages/d0/f8/e954b750764298c22fa4614376531fe63c521ef517e7059a51f062b87dca/pandas-3.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:331ca75a2f8672c365ae25c0b29e46f5ac0c6551fdace8eec4cd65e4fac271ff", size = 11357632, upload-time = "2026-02-17T22:20:06.647Z" }, - { url = "https://files.pythonhosted.org/packages/6d/02/c6e04b694ffd68568297abd03588b6d30295265176a5c01b7459d3bc35a3/pandas-3.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15860b1fdb1973fffade772fdb931ccf9b2f400a3f5665aef94a00445d7d8dd5", size = 11810974, upload-time = "2026-02-17T22:20:08.946Z" }, - { url = "https://files.pythonhosted.org/packages/89/41/d7dfb63d2407f12055215070c42fc6ac41b66e90a2946cdc5e759058398b/pandas-3.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:44f1364411d5670efa692b146c748f4ed013df91ee91e9bec5677fb1fd58b937", size = 10884622, upload-time = "2026-02-17T22:20:11.711Z" }, - { url = "https://files.pythonhosted.org/packages/68/b0/34937815889fa982613775e4b97fddd13250f11012d769949c5465af2150/pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d", size = 9452085, upload-time = "2026-02-17T22:20:14.331Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a727a73cbdba2f7458dc82449e2315899d5140b449015d822f515749a46cbbe0", size = 10326926, upload-time = "2026-03-31T06:46:08.29Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbbd4aa20ca51e63b53bbde6a0fa4254b1aaabb74d2f542df7a7959feb1d760c", size = 9926987, upload-time = "2026-03-31T06:46:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/52/77/9b1c2d6070b5dbe239a7bc889e21bfa58720793fb902d1e070695d87c6d0/pandas-3.0.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:339dda302bd8369dedeae979cb750e484d549b563c3f54f3922cb8ff4978c5eb", size = 10757067, upload-time = "2026-03-31T06:46:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61c2fd96d72b983a9891b2598f286befd4ad262161a609c92dc1652544b46b76", size = 11258787, upload-time = "2026-03-31T06:46:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/90/e3/3f1126d43d3702ca8773871a81c9f15122a1f412342cc56284ffda5b1f70/pandas-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c934008c733b8bbea273ea308b73b3156f0181e5b72960790b09c18a2794fe1e", size = 11771616, upload-time = "2026-03-31T06:46:20.532Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cf/0f4e268e1f5062e44a6bda9f925806721cd4c95c2b808a4c82ebe914f96b/pandas-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:60a80bb4feacbef5e1447a3f82c33209c8b7e07f28d805cfd1fb951e5cb443aa", size = 12337623, upload-time = "2026-03-31T06:46:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed72cb3f45190874eb579c64fa92d9df74e98fd63e2be7f62bce5ace0ade61df", size = 9897372, upload-time = "2026-03-31T06:46:26.703Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/781516b808a99ddf288143cec46b342b3016c3414d137da1fdc3290d8860/pandas-3.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f12b1a9e332c01e09510586f8ca9b108fd631fd656af82e452d7315ef6df5f9f", size = 9154922, upload-time = "2026-03-31T06:46:30.284Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b0/c20bd4d6d3f736e6bd6b55794e9cd0a617b858eaad27c8f410ea05d953b7/pandas-3.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:232a70ebb568c0c4d2db4584f338c1577d81e3af63292208d615907b698a0f18", size = 10347921, upload-time = "2026-03-31T06:46:33.36Z" }, + { url = "https://files.pythonhosted.org/packages/35/d0/4831af68ce30cc2d03c697bea8450e3225a835ef497d0d70f31b8cdde965/pandas-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:970762605cff1ca0d3f71ed4f3a769ea8f85fc8e6348f6e110b8fea7e6eb5a14", size = 9888127, upload-time = "2026-03-31T06:46:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/61/a9/16ea9346e1fc4a96e2896242d9bc674764fb9049b0044c0132502f7a771e/pandas-3.0.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aff4e6f4d722e0652707d7bcb190c445fe58428500c6d16005b02401764b1b3d", size = 10399577, upload-time = "2026-03-31T06:46:39.224Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a8/3a61a721472959ab0ce865ef05d10b0d6bfe27ce8801c99f33d4fa996e65/pandas-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef8b27695c3d3dc78403c9a7d5e59a62d5464a7e1123b4e0042763f7104dc74f", size = 10880030, upload-time = "2026-03-31T06:46:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/da/65/7225c0ea4d6ce9cb2160a7fb7f39804871049f016e74782e5dade4d14109/pandas-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f8d68083e49e16b84734eb1a4dcae4259a75c90fb6e2251ab9a00b61120c06ab", size = 11409468, upload-time = "2026-03-31T06:46:45.2Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/46e7c76032639f2132359b5cf4c785dd8cf9aea5ea64699eac752f02b9db/pandas-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32cc41f310ebd4a296d93515fcac312216adfedb1894e879303987b8f1e2b97d", size = 11936381, upload-time = "2026-03-31T06:46:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8b/721a9cff6fa6a91b162eb51019c6243b82b3226c71bb6c8ef4a9bd65cbc6/pandas-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:a4785e1d6547d8427c5208b748ae2efb64659a21bd82bf440d4262d02bfa02a4", size = 9744993, upload-time = "2026-03-31T06:46:51.488Z" }, + { url = "https://files.pythonhosted.org/packages/d5/18/7f0bd34ae27b28159aa80f2a6799f47fda34f7fb938a76e20c7b7fe3b200/pandas-3.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:08504503f7101300107ecdc8df73658e4347586db5cfdadabc1592e9d7e7a0fd", size = 9056118, upload-time = "2026-03-31T06:46:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105, upload-time = "2026-03-31T06:46:57.327Z" }, + { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088, upload-time = "2026-03-31T06:46:59.935Z" }, + { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066, upload-time = "2026-03-31T06:47:02.792Z" }, + { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780, upload-time = "2026-03-31T06:47:06.205Z" }, + { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181, upload-time = "2026-03-31T06:47:09.383Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899, upload-time = "2026-03-31T06:47:12.686Z" }, + { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574, upload-time = "2026-03-31T06:47:15.64Z" }, + { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156, upload-time = "2026-03-31T06:47:18.595Z" }, + { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238, upload-time = "2026-03-31T06:47:22.012Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520, upload-time = "2026-03-31T06:47:25.197Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154, upload-time = "2026-03-31T06:47:28.097Z" }, + { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449, upload-time = "2026-03-31T06:47:30.85Z" }, + { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475, upload-time = "2026-03-31T06:47:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568, upload-time = "2026-03-31T06:47:36.941Z" }, + { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652, upload-time = "2026-03-31T06:47:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084, upload-time = "2026-03-31T06:47:43.834Z" }, + { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146, upload-time = "2026-03-31T06:47:46.67Z" }, + { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081, upload-time = "2026-03-31T06:47:49.681Z" }, + { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535, upload-time = "2026-03-31T06:47:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992, upload-time = "2026-03-31T06:47:56.193Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257, upload-time = "2026-03-31T06:47:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893, upload-time = "2026-03-31T06:48:02.038Z" }, + { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644, upload-time = "2026-03-31T06:48:05.045Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246, upload-time = "2026-03-31T06:48:07.789Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801, upload-time = "2026-03-31T06:48:10.897Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643, upload-time = "2026-03-31T06:48:13.7Z" }, + { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641, upload-time = "2026-03-31T06:48:16.659Z" }, + { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993, upload-time = "2026-03-31T06:48:19.475Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274, upload-time = "2026-03-31T06:48:22.695Z" }, + { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530, upload-time = "2026-03-31T06:48:25.806Z" }, + { url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" }, ] [[package]] @@ -1808,11 +1808,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +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/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { 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]] @@ -1968,7 +1968,7 @@ wheels = [ [[package]] name = "requests" -version = "2.33.0" +version = "2.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1976,9 +1976,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, ] [[package]] From 48e407f28d12b82aab0d8f00b9c7b252f504b2cb Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:50:40 -0700 Subject: [PATCH 27/31] Add validation for rig and task logic olfactometer definition --- .../aind_behavior_vr_foraging.json | 77 ++-- .../AindBehaviorVrForaging.Generated.cs | 112 +++-- src/Extensions/OperationControl.bonsai | 389 ++++-------------- .../ValidateOlfactometerDefinition.cs | 40 ++ src/aind_behavior_vr_foraging/task_logic.py | 43 +- src/main.bonsai | 259 +++++++----- 6 files changed, 429 insertions(+), 491 deletions(-) create mode 100644 src/Extensions/ValidateOlfactometerDefinition.cs diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index fd445cec..287e3bad 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -2286,29 +2286,29 @@ "title": "NumericalUpdaterParameters", "type": "object" }, - "OdorSpecification": { - "description": "Specifies odor delivery parameters for olfactory cues in the VR environment.\n\nOdors can be delivered at specific locations to provide additional sensory\ninformation for navigation and foraging decisions.", + "OdorControl": { + "description": "Controls the odor delivery system parameters.\n\nThis class manages the olfactory stimulus delivery system, including flow rates,\nvalve timing, and carrier gas configuration. It ensures proper odor concentration\nand delivery timing for the behavioral task.", "properties": { - "index": { - "description": "Index of the odor to be used", - "maximum": 3, - "minimum": 0, - "title": "Index", + "target_total_flow": { + "const": 1000, + "default": 1000, + "description": "Target total flow (ml/s) of the odor mixture", + "ge": 100, + "le": 1000, + "title": "Target Total Flow", "type": "integer" }, - "concentration": { - "default": 1, - "description": "Concentration of the odor", - "maximum": 1, - "minimum": 0, - "title": "Concentration", - "type": "number" + "target_odor_flow": { + "const": 100, + "default": 100, + "description": "Target odor flow (ml/s) in the odor mixture", + "ge": 0, + "le": 100, + "title": "Target Odor Flow", + "type": "integer" } }, - "required": [ - "index" - ], - "title": "OdorSpecification", + "title": "OdorControl", "type": "object" }, "Olfactometer": { @@ -2584,6 +2584,14 @@ }, "description": "Control of the movable spout" }, + "odor_control": { + "$ref": "#/$defs/OdorControl", + "default": { + "target_total_flow": 1000, + "target_odor_flow": 100 + }, + "description": "Control of the odor" + }, "position_control": { "$ref": "#/$defs/PositionControl", "default": { @@ -2699,16 +2707,15 @@ "type": "integer" }, "odor_specification": { - "default": null, - "description": "The optional odor specification of the patch", - "oneOf": [ - { - "$ref": "#/$defs/OdorSpecification" - }, - { - "type": "null" - } - ] + "description": "A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel", + "items": { + "description": "Concentration of the odor", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "title": "Odor Specification", + "type": "array" }, "reward_specification": { "$ref": "#/$defs/RewardSpecification", @@ -2832,6 +2839,9 @@ "type": "array" } }, + "required": [ + "odor_specification" + ], "title": "Patch", "type": "object" }, @@ -4880,12 +4890,19 @@ "description": "The optional odor specification of the virtual site", "oneOf": [ { - "$ref": "#/$defs/OdorSpecification" + "items": { + "description": "Concentration of the odor", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "type": "array" }, { "type": "null" } - ] + ], + "title": "Odor Specification" }, "reward_specification": { "default": null, diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 970dfd99..26b2ace6 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -4475,83 +4475,86 @@ public override string ToString() /// - /// Specifies odor delivery parameters for olfactory cues in the VR environment. + /// Controls the odor delivery system parameters. /// - ///Odors can be delivered at specific locations to provide additional sensory - ///information for navigation and foraging decisions. + ///This class manages the olfactory stimulus delivery system, including flow rates, + ///valve timing, and carrier gas configuration. It ensures proper odor concentration + ///and delivery timing for the behavioral task. /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Specifies odor delivery parameters for olfactory cues in the VR environment.\n\nOdo" + - "rs can be delivered at specific locations to provide additional sensory\ninformat" + - "ion for navigation and foraging decisions.")] + [System.ComponentModel.DescriptionAttribute("Controls the odor delivery system parameters.\n\nThis class manages the olfactory s" + + "timulus delivery system, including flow rates,\nvalve timing, and carrier gas con" + + "figuration. It ensures proper odor concentration\nand delivery timing for the beh" + + "avioral task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OdorSpecification + public partial class OdorControl { - private int _index; + private int _targetTotalFlow; - private double _concentration; + private int _targetOdorFlow; - public OdorSpecification() + public OdorControl() { - _concentration = 1D; + _targetTotalFlow = 1000; + _targetOdorFlow = 100; } - protected OdorSpecification(OdorSpecification other) + protected OdorControl(OdorControl other) { - _index = other._index; - _concentration = other._concentration; + _targetTotalFlow = other._targetTotalFlow; + _targetOdorFlow = other._targetOdorFlow; } /// - /// Index of the odor to be used + /// Target total flow (ml/s) of the odor mixture /// - [Newtonsoft.Json.JsonPropertyAttribute("index", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Index of the odor to be used")] - public int Index + [Newtonsoft.Json.JsonPropertyAttribute("target_total_flow")] + [System.ComponentModel.DescriptionAttribute("Target total flow (ml/s) of the odor mixture")] + public int TargetTotalFlow { get { - return _index; + return _targetTotalFlow; } set { - _index = value; + _targetTotalFlow = value; } } /// - /// Concentration of the odor + /// Target odor flow (ml/s) in the odor mixture /// - [Newtonsoft.Json.JsonPropertyAttribute("concentration")] - [System.ComponentModel.DescriptionAttribute("Concentration of the odor")] - public double Concentration + [Newtonsoft.Json.JsonPropertyAttribute("target_odor_flow")] + [System.ComponentModel.DescriptionAttribute("Target odor flow (ml/s) in the odor mixture")] + public int TargetOdorFlow { get { - return _concentration; + return _targetOdorFlow; } set { - _concentration = value; + _targetOdorFlow = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorSpecification(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorControl(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OdorSpecification(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OdorControl(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Index = " + _index + ", "); - stringBuilder.Append("Concentration = " + _concentration); + stringBuilder.Append("TargetTotalFlow = " + _targetTotalFlow + ", "); + stringBuilder.Append("TargetOdorFlow = " + _targetOdorFlow); return true; } @@ -5289,6 +5292,8 @@ public partial class OperationControl private MovableSpoutControl _movableSpoutControl; + private OdorControl _odorControl; + private PositionControl _positionControl; private AudioControl _audioControl; @@ -5296,6 +5301,7 @@ public partial class OperationControl public OperationControl() { _movableSpoutControl = new MovableSpoutControl(); + _odorControl = new OdorControl(); _positionControl = new PositionControl(); _audioControl = new AudioControl(); } @@ -5303,6 +5309,7 @@ public OperationControl() protected OperationControl(OperationControl other) { _movableSpoutControl = other._movableSpoutControl; + _odorControl = other._odorControl; _positionControl = other._positionControl; _audioControl = other._audioControl; } @@ -5325,6 +5332,24 @@ public MovableSpoutControl MovableSpoutControl } } + /// + /// Control of the odor + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("odor_control")] + [System.ComponentModel.DescriptionAttribute("Control of the odor")] + public OdorControl OdorControl + { + get + { + return _odorControl; + } + set + { + _odorControl = value; + } + } + /// /// Control of the position /// @@ -5374,6 +5399,7 @@ public System.IObservable Generate(System.IObservable protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("MovableSpoutControl = " + _movableSpoutControl + ", "); + stringBuilder.Append("OdorControl = " + _odorControl + ", "); stringBuilder.Append("PositionControl = " + _positionControl + ", "); stringBuilder.Append("AudioControl = " + _audioControl); return true; @@ -5558,7 +5584,7 @@ public partial class Patch private int _stateIndex; - private OdorSpecification _odorSpecification; + private System.Collections.Generic.List _odorSpecification; private RewardSpecification _rewardSpecification; @@ -5570,6 +5596,7 @@ public Patch() { _label = ""; _stateIndex = 0; + _odorSpecification = new System.Collections.Generic.List(); _rewardSpecification = new RewardSpecification(); _patchVirtualSitesGenerator = new PatchVirtualSitesGenerator(); _patchTerminators = new System.Collections.Generic.List(); @@ -5620,12 +5647,13 @@ public int StateIndex } /// - /// The optional odor specification of the patch + /// A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] - [System.ComponentModel.DescriptionAttribute("The optional odor specification of the patch")] - public OdorSpecification OdorSpecification + [Newtonsoft.Json.JsonPropertyAttribute("odor_specification", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("A list of odor concentrations for the patch, where the index of the list correspo" + + "nds to the odor channel")] + public System.Collections.Generic.List OdorSpecification { get { @@ -9731,7 +9759,7 @@ public partial class VirtualSite private double _startPosition; - private OdorSpecification _odorSpecification; + private System.Collections.Generic.List _odorSpecification; private VirtualSiteRewardSpecification _rewardSpecification; @@ -9834,7 +9862,7 @@ public double StartPosition [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] [System.ComponentModel.DescriptionAttribute("The optional odor specification of the virtual site")] - public OdorSpecification OdorSpecification + public System.Collections.Generic.List OdorSpecification { get { @@ -11528,9 +11556,9 @@ public System.IObservable Process(System.IObservable(source); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } public System.IObservable Process(System.IObservable source) @@ -11802,7 +11830,7 @@ public System.IObservable Process(System.IObservable source) [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] diff --git a/src/Extensions/OperationControl.bonsai b/src/Extensions/OperationControl.bonsai index b77f069f..70f4f2e2 100644 --- a/src/Extensions/OperationControl.bonsai +++ b/src/Extensions/OperationControl.bonsai @@ -2,24 +2,24 @@ @@ -31,191 +31,6 @@ OlfactometerInitialConfiguration - - HarpOlfactometerEvents - - - - 1 - - - - Channel3Setting - - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate1000 - - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate100 - - - - - - - - - - - - - - - - - - - - - - - - - - Write - - FlowRate1000 - - - - HarpOlfactometerCommands - - - Write - - Flowmeter DI0Trigger ChannelActualFlow - - - - HarpOlfactometerCommands - - - Write - - Enabled - - - - HarpOlfactometerCommands - - - - Channel3Setting - - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate1000 - - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate100 - - - - - - - - - - - - - - - - - - - - - - FlowRate1000 - - - - - - - Source1 - - - - - - - - HarpOlfactometerEvents @@ -225,18 +40,15 @@ - - - - - true - 0 - 0 - 0 - NaN - true - 100 - 1000 + + true + 0 + 0 + 0 + NaN + true + 100 + 1000 @@ -245,22 +57,8 @@ - + - - - - - - - - - - - - - - @@ -268,36 +66,26 @@ ArmOdor - + ArmOdor ArmOdor - - ArmOdor + + ArmOdor SoftwareEvent - - ArmOdor - - - Index,Concentration + + TODO + - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - + ArmOdor TaskLogicParameters @@ -322,15 +110,15 @@ - - false - 0 - 0 - 0 - 0 - false - 100 - 1000 + + true + 0 + 0 + 0 + NaN + true + 100 + 1000 @@ -341,17 +129,14 @@ - + - + - + - - - @@ -392,7 +177,7 @@ - + EndValvesState EndValve0 @@ -411,16 +196,16 @@ - + EndValvesState None - + Write - + HarpOlfactometerCommands @@ -442,7 +227,7 @@ - + SetOdorMix @@ -722,7 +507,7 @@ TriggerValve - + TriggerValve @@ -882,8 +667,8 @@ GiveReward - - GiveReward + + GiveReward @@ -893,8 +678,8 @@ ForceGiveReward - - ForceGiveReward + + ForceGiveReward @@ -1032,7 +817,7 @@ - + Axis Y1 @@ -1065,11 +850,11 @@ - - 0 - 0 - 0 - 0 + + 0 + 0 + 0 + 0 @@ -1093,8 +878,8 @@ - - None + + None @@ -1145,8 +930,8 @@ SpoutParkingPositions - - SpoutParkingPositions + + SpoutParkingPositions @@ -1378,7 +1163,7 @@ FeedbackControl - + ChoiceFeedback @@ -1399,8 +1184,8 @@ ChoiceFeedback - - ChoiceFeedback + + ChoiceFeedback @@ -1443,14 +1228,14 @@ HarpLickometerEvents - - + + Value - + Channel0 @@ -1701,8 +1486,8 @@ HarpSniffDetectorEvents - - + + RigSchema @@ -1767,8 +1552,8 @@ - - Number of attempts ot clear the current limit state register has been exceeded. + + Number of attempts ot clear the current limit state register has been exceeded. @@ -1780,10 +1565,10 @@ - + Write - - 0 + + 0 @@ -1798,8 +1583,8 @@ Write - - + + @@ -1868,8 +1653,8 @@ HarpTreadmillEvents - - + + TreadmillSamplingRate @@ -1934,8 +1719,8 @@ HarpTreadmillEvents - - + + @@ -2036,7 +1821,7 @@ Item1 as Displacement, - + @@ -2060,11 +1845,11 @@ Item1 as Displacement, - + - + Write - + SendMessage @@ -2084,8 +1869,8 @@ Item1 as Displacement, HarpTreadmillEvents - - + + HarpMessage @@ -2273,7 +2058,7 @@ Item1 as Displacement, HarpBehaviorCommands - + AudioTrigger diff --git a/src/Extensions/ValidateOlfactometerDefinition.cs b/src/Extensions/ValidateOlfactometerDefinition.cs new file mode 100644 index 00000000..4db80a79 --- /dev/null +++ b/src/Extensions/ValidateOlfactometerDefinition.cs @@ -0,0 +1,40 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Linq; +using AindVrForagingDataSchema; + +[Combinator] +[Description("Validates that the olfactometer definition in the task logic is compatible with the number of olfactometers defined in the rig. Throws an exception if the definition is invalid.")] +[WorkflowElementCategory(ElementCategory.Combinator)] +public class ValidateOlfactometerDefinition +{ + public IObservable Process(IObservable> source) + { + return source.Select(value => + { + var taskLogic = value.Item1; + var rig = value.Item2; + var nChannels = 3 + 4 * rig.HarpOlfactometerExtension.Count; // 3 for the main olfactometer, 4 for each additional olfactometer + var patches = taskLogic.TaskParameters.Environment.Blocks.SelectMany(block => block.EnvironmentStatistics.Patches); + int maxIdx = 0; + foreach (var patch in patches) + { + for (int i = patch.OdorSpecification.Count - 1; i >= 0; i--) + { + if (patch.OdorSpecification[i] > 0) + { + maxIdx = Math.Max(maxIdx, i); + break; + } + } + } + if (maxIdx >= nChannels) + { + throw new InvalidOperationException("The olfactometer definition in the task logic requires at least " + (maxIdx + 1) + " channels, but the rig only supports " + nChannels + " channels."); + } + return maxIdx < nChannels; + }); + } +} diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index 5563c901..c00fb9ad 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -165,18 +165,6 @@ class VisualCorridor(BaseModel): textures: WallTextures = Field(description="The textures of the corridor") -class OdorSpecification(BaseModel): - """ - Specifies odor delivery parameters for olfactory cues in the VR environment. - - Odors can be delivered at specific locations to provide additional sensory - information for navigation and foraging decisions. - """ - - index: int = Field(ge=0, le=3, description="Index of the odor to be used") - concentration: float = Field(default=1, ge=0, le=1, description="Concentration of the odor") - - # ==================== PATCH REWARD LOGIC ==================== @@ -423,6 +411,9 @@ class _RewardFunction(BaseModel): ) +OdorConcentration = Annotated[float, Field(ge=0, le=1, description="Concentration of the odor")] + + class PatchRewardFunction(_RewardFunction): """ A RewardFunction that is applied when the animal is inside the patch. @@ -665,7 +656,7 @@ class VirtualSite(BaseModel): label: VirtualSiteLabels = Field(default=VirtualSiteLabels.UNSPECIFIED, description="Label of the virtual site") length: float = Field(default=20, description="Length of the virtual site (cm)") start_position: float = Field(default=0, ge=0, description="Start position of the virtual site (cm)") - odor_specification: Optional[OdorSpecification] = Field( + odor_specification: Optional[List[OdorConcentration]] = Field( default=None, description="The optional odor specification of the virtual site" ) reward_specification: Optional[VirtualSiteRewardSpecification] = Field( @@ -763,8 +754,8 @@ class Patch(BaseModel): label: str = Field(default="", description="Label of the patch") state_index: int = Field(default=0, ge=0, description="Index of the state") - odor_specification: Optional[OdorSpecification] = Field( - default=None, description="The optional odor specification of the patch" + odor_specification: List[OdorConcentration] = Field( + description="A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel" ) reward_specification: RewardSpecification = Field( default=RewardSpecification(), @@ -867,6 +858,23 @@ class AudioControl(BaseModel): frequency: float = Field(default=1000, ge=100, le=9999, description="Frequency (Hz) of the audio cue") +class OdorControl(BaseModel): + """ + Controls the odor delivery system parameters. + + This class manages the olfactory stimulus delivery system, including flow rates, + valve timing, and carrier gas configuration. It ensures proper odor concentration + and delivery timing for the behavioral task. + """ + + target_total_flow: Literal[1000] = Field( + default=1000, ge=100, le=1000, description="Target total flow (ml/s) of the odor mixture" + ) + target_odor_flow: Literal[100] = Field( + default=100, ge=0, le=100, description="Target odor flow (ml/s) in the odor mixture" + ) + + class OperationControl(BaseModel): """ Master control class for all operational hardware systems. @@ -879,6 +887,11 @@ class OperationControl(BaseModel): movable_spout_control: MovableSpoutControl = Field( default=MovableSpoutControl(), description="Control of the movable spout" ) + odor_control: OdorControl = Field( + default=OdorControl(target_odor_flow=100, target_total_flow=1000), + description="Control of the odor", + validate_default=True, + ) position_control: PositionControl = Field( default=PositionControl(), description="Control of the position", validate_default=True ) diff --git a/src/main.bonsai b/src/main.bonsai index 65240bed..09dae507 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -1882,120 +1882,184 @@ Item3 as Right) Repository is not clean! Please discard all local changes. - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - + + Olfactometer - - Source1 + + + TaskLogicParameters + + + + + OperationControl.OdorControl.UseChannel3AsCarrier + + + + + + + + Source1 + + + + + + + + + + + + SampleFlow + + + + StartExperiment + + + + 1 + + + + HarpOlfactometerEvents + + + + + + Value + + + + + + + 950 + + + + + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + Source1 + + + Item1 + + + + + + + + + + + + + Item2 + + + + + Flow on Channel3 is lower than expected. Reading {0}. + it + + + + + + + + it + - - - - - - - - - SampleFlow - - - - StartExperiment + + TODO + - - - 1 - + + + + Flow on Channel3 is lower than expected. + + - HarpOlfactometerEvents - - - - - - Value - - - + TaskLogicSchema - - - 950 - + + RigSchema - + + 1 + - - Item2 + + - - + - - - + + - - - - - - - - - 1 - - - - - - - Source1 - - - Item1 - - - - - - + + + + + + + - - Item2 - - - Flow on Channel3 is lower than expected. Reading {0}. - it - - - - - - it - - - - Flow on Channel3 is lower than expected. - - CameraChecks @@ -2492,17 +2556,8 @@ Item3 as Right) - - - - - - - - - - - + + From 6f30bd0ccd7f32fd1e90bd936ea03ab5131458f8 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 31 Mar 2026 12:04:40 -0700 Subject: [PATCH 28/31] Implement odor mixture control --- bonsai/Bonsai.config | 4 +- src/Extensions.csproj | 2 +- src/Extensions/CreateHubOdorMixture.cs | 93 + src/Extensions/Hardware.bonsai | 1320 ++++++++ src/Extensions/HardwareChecks.bonsai | 758 +++++ src/Extensions/HarpBehaviorGetMetadata.bonsai | 540 --- src/Extensions/Logging.bonsai | 442 ++- src/Extensions/OperationControl.bonsai | 669 ++-- src/aind_behavior_vr_foraging/task_logic.py | 8 +- src/main.bonsai | 2889 +++-------------- 10 files changed, 3239 insertions(+), 3486 deletions(-) create mode 100644 src/Extensions/CreateHubOdorMixture.cs create mode 100644 src/Extensions/Hardware.bonsai create mode 100644 src/Extensions/HardwareChecks.bonsai delete mode 100644 src/Extensions/HarpBehaviorGetMetadata.bonsai diff --git a/bonsai/Bonsai.config b/bonsai/Bonsai.config index 86498157..a220b5a6 100644 --- a/bonsai/Bonsai.config +++ b/bonsai/Bonsai.config @@ -51,7 +51,7 @@ - + @@ -178,7 +178,7 @@ - + diff --git a/src/Extensions.csproj b/src/Extensions.csproj index 1e4e1f78..19ff4931 100644 --- a/src/Extensions.csproj +++ b/src/Extensions.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Extensions/CreateHubOdorMixture.cs b/src/Extensions/CreateHubOdorMixture.cs new file mode 100644 index 00000000..3c70b3a2 --- /dev/null +++ b/src/Extensions/CreateHubOdorMixture.cs @@ -0,0 +1,93 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Linq; +using Harp.Olfactometer; +using Bonsai.Harp; +using System.Collections.Generic; + + +[Description("Returns a list of pairs of Harp messages necessary to configure all olfactometers in a hub to deliver a given odor mixture.")] +public class CreateHubOdorMixture : Transform, IList> +{ + private int totalOdorFlow = 100; + [Range(0, 900)] + [Editor(DesignTypes.SliderEditor, DesignTypes.UITypeEditor)] + [Description("The total desired flow of the odor mixture. This value will be used to automatically calculate the carrier(s) flow based on the total flow.")] + public int TotalOdorFlow + { + get { return totalOdorFlow; } + set { totalOdorFlow = value; } + } + + + private int totalFlow = 1000; + [Range(100, 1000)] + [Editor(DesignTypes.SliderEditor, DesignTypes.UITypeEditor)] + [Description("The total desired flow at the end of the manifold. This value will be used to automatically calculate the carrier(s) flow.")] + public int TotalFlow + { + get { return totalFlow; } + set { totalFlow = value; } + } + + private const int _MINIMUM_CARRIER_FLOW = 100; + + private IList ConstructMessage(IList channelConcentrations) + { + int nChannels = channelConcentrations.Count(); + // We make sure all odors sum to 1 and then calculate the "real" flow for each channel based on the target odor flow + var adjustedFlow = channelConcentrations.Select(c => c / channelConcentrations.Sum()).Select(c => (int)(TotalOdorFlow * c)); + var carrierFlow = totalFlow - totalOdorFlow; + if (carrierFlow < _MINIMUM_CARRIER_FLOW) + { + throw new InvalidOperationException("The total odor flow exceeds the total flow minus the minimum carrier flow. Reduce the total target odor flow or the concentrations."); + } + var indexedConcentrations = Enumerable.Range(0, nChannels).Select(i => i < 3 ? 0 : ((i - 3) / 4) + 1).Zip(adjustedFlow, (index, flow) => Tuple.Create(index, flow)).ToList(); + + List messages = new List(); + foreach (var group in indexedConcentrations.GroupBy(x => x.Item1)) // Group by olfactometer index + { + var concentrationList = group.Select(x => x.Item2); + var olfactometerIndex = group.Key; + var channel3Flow = olfactometerIndex > 0 ? concentrationList.ElementAtOrDefault(3) : totalFlow; // for the first olfactometer we use it as a carrier for the blank, + var flows = Enumerable.Range(0, 4).Select(i => i < 3 ? concentrationList.ElementAtOrDefault(i) : channel3Flow).ToList(); + + var channelsTargetFlow = ChannelsTargetFlow.FromPayload(MessageType.Write, new ChannelsTargetFlowPayload( + flows[0], + flows[1], + flows[2], + flows[3], + carrierFlow)); + + OdorValves valves = OdorValves.None; + for (int i = 0; i < flows.Count; i++) + { + if (flows[i] > 0) + valves |= (OdorValves)(1 << i); + } + var odorValveState = OdorValveState.FromPayload(MessageType.Write, valves); + messages.Add(new OdorMixMessages() + { + ChannelsTargetFlow = channelsTargetFlow, + OdorValveState = odorValveState, + OlfactometerIndex = olfactometerIndex + }); + } + return messages; + } + + public override IObservable> Process(IObservable> source) + { + return source.Select(value => ConstructMessage(value)); + } +} + +public class OdorMixMessages +{ + public HarpMessage ChannelsTargetFlow { get; set; } + public HarpMessage OdorValveState { get; set; } + + public int OlfactometerIndex { get; set; } +} diff --git a/src/Extensions/Hardware.bonsai b/src/Extensions/Hardware.bonsai new file mode 100644 index 00000000..ea62712d --- /dev/null +++ b/src/Extensions/Hardware.bonsai @@ -0,0 +1,1320 @@ + + + + + + ScreenConfiguration + + + + RigSchema + + + Screen + + + + + + + + + + + 1000 + 1000 + VrForaging + Off + false + Black + DepthBufferBit ColorBufferBit + false + + Resizable + Fullscreen + Second + 60 + 120 + + + + 8 + 8 + 8 + 8 + + 16 + 0 + 0 + + 0 + 0 + 0 + 0 + + 2 + false + + + + + + + + + + RigSchema + + + Screen.Calibration + + + LoadDisplayCalibration + + + + Source1 + + + calibration + + + calibration + + + Left + + + + calibration + + + Center + + + + calibration + + + Right + + + + + + + new( +Item1 as Left, +Item2 as Center, +Item3 as Right) + + + + + + + + + + + + + + + + + + + + + + 1 + + + + DisplayCalibration + + + RenderLoop + + + + FarClipHorizon + + + + + + + + + 0 + 0 + 0 + + 1E-05 + 1000 + + 0 + 0 + 0 + + + + 2 + 6 + + + + 1 + + + + + 1 + + + + WorldContrast + + + RigSchema + + + Screen + + + Contrast + + + WorldContrast + + + + + + + DisplayContrast + + + RigSchema + + + Screen + + + Brightness + + + DisplayBrightness + + + + + + + + + + + + + + + + + + + + + RigSchema + + + Screen.TextureAssetsDirectory + + + + + + + + Textures + *.jpg + + + + + + + + + + + + + + + + + + + + + + PT2S + + + + HarpDevices + + + + HarpWhiteRabbitEvents + + + + Include + Event + + + + + + + Seconds + + + HarpTimestampSource + + + HarpWhiteRabbitEvents + + + + + + HarpWhiteRabbitHeartbeat + + + RigSchema + + + HarpOlfactometer + + + RigSchema + + + HarpOlfactometerExtension + + + + + + + + + HarpOlfactometerExtensionManager + + + + Source1 + + + + + + InstantiateOlfactometer + + + + Source1 + + + + 1 + + + + thisOlfactometer + + + OlfactometerHubCommandsGroupedBy + + + thisOlfactometer + + + Index + + + + + + isThisOlfactometer? + it.Item1.Key == it.Item2 + + + + 1 + + + + Item1 + + + + + + Item2 + + + thisHarpOlfactometerCommands + + + thisHarpOlfactometerEvents + + + thisOlfactometer + + + Index + + + + + + Item2,Item1 + + + OlfactometerHubEvents + + + thisHarpOlfactometerCommands + + + thisOlfactometer + + + Value.PortName + + + + + + + + + Active + On + true + On + Enabled + false + COM6 + + + + thisHarpOlfactometerEvents + + + + + + TriggerHarpReadDump + + + Write + + Active + true + false + On + On + Enabled + + + + thisHarpOlfactometerCommands + + + thisHarpOlfactometerEvents + + + + 1 + + + + thisOlfactometer + + + Index + + + Channel3Range + FlowRate100 + + + Channel3Range + FlowRate1000 + + + + + + it.Item1 == 0 ? it.Item2 : it.Item3 + + + + + + + + Write + + FlowRate1000 + + + + thisHarpOlfactometerCommands + + + Write + + Flowmeter DI0Trigger ChannelActualFlow + + + + thisHarpOlfactometerCommands + + + Write + + Enabled + + + + thisHarpOlfactometerCommands + + + Write + + None + + + + thisHarpOlfactometerCommands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MultiplexIO + + + + OlfactometerHubCommands + + + Item1 + + + OlfactometerHubCommandsGroupedBy + + + + OlfactometerHubEvents + + + Item1 + + + OlfactometerHubEventsGroupedBy + + + + + + + + + + + + + + + + + + TriggerHarpReadDump + + + RigSchema + + + HarpClockGenerator.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpLickometer.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpTreadmill + + + PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + Manipulator + + + Calibration + + + RigSchema + + + Manipulator + + + PortName + + + + + + + + COMx + + + RigSchema + + + HarpSniffDetector.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpSniffDetector + + + + + + + RigSchema + + + HarpAnalogInput.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpAnalogInput + + + + + + + RigSchema + + + HarpEnvironmentSensor.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpEnvironmentSensor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cameras + + + + TriggeredCameras + + + + RigSchema + + + + 1 + + + + TriggeredCameraController + + + TriggeredCameraController + + + FrameRate.Value + + + CameraFrameRate + + + TriggeredCameraController + + + Cameras + + + CameraFrameRate + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + Include + Event + + + + + + + Value + + + + FrameAcquired + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + + + Item2.Seconds + + + FrameEvent + + + TriggeredCameraController + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + + true + + + + TriggeredCamerasInitialized + + + + 1 + + + + ThisCamera + + + Value + + + + + + + + + + + + + + + ThisCamera + + + Value + + + RegionOfInterest + + + + + + + + RegionOfInterest + + 0 + 0 + 0 + 0 + + + + + + + + + + + Default + 19000 + 0 + 1 + + Mono8 + + 0 + 0 + 0 + 0 + + + + + + FrameEvent + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SpinnakerApiNote + + + + + PT0S + PT0.1S + + + + + + + Item1 + + + + + + Item2 + Item1 + + + TriggeredCamerasStream + + + + TriggeredCamerasInitialized + + + + 1 + + + + + 0 + + + + + 1 + + + + + + + + TriggeredCameraController + + + Cameras + + + Count + + + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + 1 + + + + + PT0.1S + + + + TriggeredCamerasReady + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MonitoringCameras + + + + RigSchema + + + MonitoringCameraController + + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + ThisCamera + + + Value + + + Index + + + + + + + + + 0 + + + + + HarpTimestampSource + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + Item2 + Item1 + + + MonitoringCamerasStream + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/HardwareChecks.bonsai b/src/Extensions/HardwareChecks.bonsai new file mode 100644 index 00000000..cca80e77 --- /dev/null +++ b/src/Extensions/HardwareChecks.bonsai @@ -0,0 +1,758 @@ + + + + + + HardwareChecks + + + + ProtocolValidation + + + + Repository + + + + false + + + + + SubjectSchema + + + AllowDirtyRepo + + + + + + AllowDirty? + Item2 ? False : Item1 + + + + + + Source1 + + + + + + + + + + + Repository is not clean! Please discard all local changes. + + + + Olfactometer + + + + SampleFlow + + + + StartExperiment + + + + 1 + + + + OlfactometerHubEventsGroupedBy + + + it.Key == 0 + + + + + + Item2 + + + + + + Value + + + + + + + 950 + + + + + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + Source1 + + + Item1 + + + + + + + + + + + Item2 + + + Flow on Channel3 is lower than expected. Reading {0}. + it + + + + + + it + + + + Flow on Channel3 of main Olfactometer is lower than expected. + + + + TaskLogicSchema + + + RigSchema + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + CameraChecks + + + + TriggeredCamerasStream + + + CheckDroppedFrames + + + + Source1 + + + + 1 + + + + InputSequence + + + InputSequence + + + + + + Value.ChunkData + + + FrameID + + + + 1 + + + + + 1 + + + + + 0 + + + + + + + Source1 + + + + + + + + + + InputSequence + + + Key + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + Camera {0} dropped frame detected during pre-session! + it + + + + + + it + + + + Dropped frame detected during pre-session! + + + + StartExperiment + + + + + + TriggeredCameraController + + + Cameras + + + + + + CheckCameraSettings + + + + Source1 + + + + 1 + + + + ThisCamera + + + ThisCamera + + + Value.Exposure + + + TriggeredCameraController + + + FrameRate + + + Value + + + + + + ((1.0 / Item2) * 1000000) < double(Item1) + 1000 + + + + + + Source1 + + + + + + + + + + + 1 + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Camera {0} exposure setting not compatible with requested frame rate! + it + + + + + + it + + + + + + + + TriggeredCameraController + + + FrameRate.HasValue + + + + + + + Source1 + + + + + + + + + + + TriggeredCameraControl must specify a valid FrameRate property! + + + + TriggeredCamerasStream + + + OnlineQC + + + + Source1 + + + + 1 + + + + InputSequence + + + InputSequence + + + + + + Value.ChunkData + + + Timestamp + + + + 1 + + + + + 1E-09 + + + + Seconds + + + + 1 + + + + + + + + + + + + + + + 0.0005 + + + + + + + Source1 + + + + + + + + + + + TaskPoolScheduler + + + + + + + + PT0S + PT10S + + + + + + + MakeUI + + + + InputSequence + + + Key + + + Camera {0} out-of-alignment qc was triggered. + it + + + + + + + + + + Warning + Exclamation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Treadmill + + + + HarpTreadmillEvents + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + The treadmill current limit has been triggered. If this is a problem, please restart the session. + Treadmill limit trigger + Exclamation + + + + + + + + + + + + + StartExperiment + + + + + + + + + + + + + + + + + + + + + + SubjectSchema + + + SkipHardwareValidation + + + + + + + Source1 + + + + + + + + + + + + + + PT2S + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/HarpBehaviorGetMetadata.bonsai b/src/Extensions/HarpBehaviorGetMetadata.bonsai deleted file mode 100644 index 108ca1fc..00000000 --- a/src/Extensions/HarpBehaviorGetMetadata.bonsai +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - %YAML 1.1 ---- -# yaml-language-server: $schema=https://harp-tech.org/draft-02/schema/device.json -device: Behavior -whoAmI: 1216 -firmwareVersion: "3.2" -hardwareTargets: "1.1" -registers: - DigitalInputState: - address: 32 - access: Event - type: U8 - maskType: DigitalInputs - description: Reflects the state of DI digital lines of each Port - Reserved0: &reserved - address: 33 - type: U8 - access: Read - description: Reserved for future use - visibility: private - OutputSet: &output - address: 34 - type: U16 - access: Write - maskType: DigitalOutputs - description: Set the specified digital output lines. - OutputClear: - <<: *output - address: 35 - description: Clear the specified digital output lines - OutputToggle: - <<: *output - address: 36 - description: Toggle the specified digital output lines - OutputState: - <<: *output - address: 37 - description: Write the state of all digital output lines - PortDIOSet: &portDIO - address: 38 - type: U8 - access: Write - maskType: PortDigitalIOS - description: Set the specified port DIO lines - PortDIOClear: - <<: *portDIO - address: 39 - description: Clear the specified port DIO lines - PortDIOToggle: - <<: *portDIO - address: 40 - description: Toggle the specified port DIO lines - PortDIOState: - <<: *portDIO - address: 41 - description: Write the state of all port DIO lines - PortDIODirection: - <<: *portDIO - address: 42 - description: Specifies which of the port DIO lines are outputs - PortDIOStateEvent: - <<: *portDIO - address: 43 - access: Event - description: Specifies the state of the port DIO lines on a line change - AnalogData: - address: 44 - type: S16 - length: 3 - access: Event - description: Voltage at the ADC input and encoder value on Port 2 - payloadSpec: - AnalogInput0: - offset: 0 - description: The voltage at the output of the ADC channel 0. - Encoder: - offset: 1 - description: The quadrature counter value on Port 2 - AnalogInput1: - offset: 2 - description: The voltage at the output of the ADC channel 1. - OutputPulseEnable: - <<: *output - address: 45 - description: Enables the pulse function for the specified output lines - PulseDOPort0: &pulseDO - address: 46 - type: U16 - access: Write - minValue: 1 - description: Specifies the duration of the output pulse in milliseconds. - PulseDOPort1: - <<: *pulseDO - address: 47 - PulseDOPort2: - <<: *pulseDO - address: 48 - PulseSupplyPort0: - <<: *pulseDO - address: 49 - PulseSupplyPort1: - <<: *pulseDO - address: 50 - PulseSupplyPort2: - <<: *pulseDO - address: 51 - PulseLed0: - <<: *pulseDO - address: 52 - PulseLed1: - <<: *pulseDO - address: 53 - PulseRgb0: - <<: *pulseDO - address: 54 - PulseRgb1: - <<: *pulseDO - address: 55 - PulseDO0: - <<: *pulseDO - address: 56 - PulseDO1: - <<: *pulseDO - address: 57 - PulseDO2: - <<: *pulseDO - address: 58 - PulseDO3: - <<: *pulseDO - address: 59 - PwmFrequencyDO0: &pwmFreq - address: 60 - type: U16 - access: Write - minValue: 1 - description: Specifies the frequency of the PWM at DO0. - PwmFrequencyDO1: - <<: *pwmFreq - address: 61 - description: Specifies the frequency of the PWM at DO1. - PwmFrequencyDO2: - <<: *pwmFreq - address: 62 - description: Specifies the frequency of the PWM at DO2. - PwmFrequencyDO3: - <<: *pwmFreq - address: 63 - description: Specifies the frequency of the PWM at DO3. - PwmDutyCycleDO0: &pwmDutyCycle - address: 64 - type: U8 - access: Write - minValue: 1 - maxValue: 99 - description: Specifies the duty cycle of the PWM at DO0. - PwmDutyCycleDO1: - <<: *pwmDutyCycle - address: 65 - description: Specifies the duty cycle of the PWM at DO1. - PwmDutyCycleDO2: - <<: *pwmDutyCycle - address: 66 - description: Specifies the duty cycle of the PWM at DO2. - PwmDutyCycleDO3: - <<: *pwmDutyCycle - address: 67 - description: Specifies the duty cycle of the PWM at DO3. - PwmStart: &pwmStartStop - address: 68 - type: U8 - access: Write - maskType: PwmOutputs - description: Starts the PWM on the selected output lines. - PwmStop: - <<: *pwmStartStop - address: 69 - description: Stops the PWM on the selected output lines. - RgbAll: - address: 70 - type: &rgbType U8 - length: 6 - access: &rgbAccess Write - description: Specifies the state of all RGB LED channels. - payloadSpec: - Green0: - offset: 0 - description: The intensity of the green channel in the RGB0 LED. - Red0: - offset: 1 - description: The intensity of the red channel in the RGB0 LED. - Blue0: - offset: 2 - description: The intensity of the blue channel in the RGB0 LED. - Green1: - offset: 3 - description: The intensity of the green channel in the RGB1 LED. - Red1: - offset: 4 - description: The intensity of the red channel in the RGB1 LED. - Blue1: - offset: 5 - description: The intensity of the blue channel in the RGB1 LED. - Rgb0: &rgbRegister - address: 71 - type: *rgbType - length: 3 - access: *rgbAccess - description: Specifies the state of the RGB0 LED channels. - interfaceType: RgbPayload - payloadSpec: - Green: - offset: 0 - description: The intensity of the green channel in the RGB LED. - Red: - offset: 1 - description: The intensity of the red channel in the RGB LED. - Blue: - offset: 2 - description: The intensity of the blue channel in the RGB LED. - Rgb1: - <<: *rgbRegister - address: 72 - description: Specifies the state of the RGB1 LED channels. - Led0Current: &ledCurrent - address: 73 - type: U8 - access: Write - minValue: 2 - maxValue: 100 - description: Specifies the configuration of current to drive LED 0. - Led1Current: - <<: *ledCurrent - address: 74 - description: Specifies the configuration of current to drive LED 1. - Led0MaxCurrent: &ledMaxCurrent - address: 75 - type: U8 - access: Write - minValue: 5 - maxValue: 100 - description: Specifies the configuration of current to drive LED 0. - Led1MaxCurrent: - <<: *ledMaxCurrent - address: 76 - description: Specifies the configuration of current to drive LED 1. - EventEnable: - address: 77 - type: U8 - access: Write - maskType: Events - description: Specifies the active events in the device. - StartCameras: &cameraControl - address: 78 - type: U8 - access: Write - maskType: CameraOutputs - description: Specifies the camera outputs to enable in the device. - StopCameras: - <<: *cameraControl - access: [Write, Event] - address: 79 - description: Specifies the camera outputs to disable in the device. An event will be issued when the trigger signal is actually stopped being generated. - EnableServos: &servoControl - address: 80 - type: U8 - access: Write - maskType: ServoOutputs - description: Specifies the servo outputs to enable in the device. - DisableServos: - <<: *servoControl - address: 81 - description: Specifies the servo outputs to disable in the device. - EnableEncoders: - address: 82 - type: U8 - access: Write - maskType: EncoderInputs - description: Specifies the port quadrature counters to enable in the device. - EncoderMode: - address: 83 - type: U8 - access: Write - maskType: EncoderModeConfig - description: Configures the operation mode of the quadrature encoders. - Reserved2: - <<: *reserved - address: 84 - Reserved3: - <<: *reserved - address: 85 - Reserved4: - <<: *reserved - address: 86 - Reserved5: - <<: *reserved - address: 87 - Reserved6: - <<: *reserved - address: 88 - Reserved7: - <<: *reserved - address: 89 - Reserved8: - <<: *reserved - address: 90 - Reserved9: - <<: *reserved - address: 91 - Camera0Frame: &frameAcquired - address: 92 - type: U8 - access: Event - maskType: FrameAcquired - description: Specifies that a frame was acquired on camera 0. - Camera0Frequency: &cameraFreq - address: 93 - type: U16 - access: Write - minValue: 1 - maxValue: 600 - description: Specifies the trigger frequency for camera 0. - Camera1Frame: - <<: *frameAcquired - address: 94 - description: Specifies that a frame was acquired on camera 1. - Camera1Frequency: - <<: *cameraFreq - address: 95 - description: Specifies the trigger frequency for camera 1. - Reserved10: - <<: *reserved - address: 96 - Reserved11: - <<: *reserved - address: 97 - Reserved12: - <<: *reserved - address: 98 - Reserved13: - <<: *reserved - address: 99 - ServoMotor2Period: &servoPeriod - address: 100 - type: U16 - access: Write - minValue: 2 - maxValue: 65534 - description: Specifies the period of the servo motor in DO2, in microseconds. - ServoMotor2Pulse: &servoPulse - address: 101 - type: U16 - access: Write - minValue: 6 - maxValue: 65530 - description: Specifies the pulse of the servo motor in DO2, in microseconds. - ServoMotor3Period: - <<: *servoPeriod - address: 102 - description: Specifies the period of the servo motor in DO3, in microseconds. - ServoMotor3Pulse: - <<: *servoPulse - address: 103 - description: Specifies the pulse of the servo motor in DO3, in microseconds. - Reserved14: - <<: *reserved - address: 104 - Reserved15: - <<: *reserved - address: 105 - Reserved16: - <<: *reserved - address: 106 - Reserved17: - <<: *reserved - address: 107 - EncoderReset: - address: 108 - type: U8 - access: Write - maskType: EncoderInputs - description: Reset the counter of the specified encoders to zero. - Reserved18: - <<: *reserved - address: 109 - EnableSerialTimestamp: - address: 110 - type: U8 - access: Write - description: Enables the timestamp for serial TX. - MimicPort0IR: &mimic - address: 111 - type: U8 - access: Write - maskType: MimicOutput - description: Specifies the digital output to mimic the Port 0 IR state. - MimicPort1IR: - <<: *mimic - address: 112 - description: Specifies the digital output to mimic the Port 1 IR state. - MimicPort2IR: - <<: *mimic - address: 113 - description: Specifies the digital output to mimic the Port 2 IR state. - Reserved20: - <<: *reserved - address: 114 - Reserved21: - <<: *reserved - address: 115 - Reserved22: - <<: *reserved - address: 116 - MimicPort0Valve: - <<: *mimic - address: 117 - description: Specifies the digital output to mimic the Port 0 valve state. - MimicPort1Valve: - <<: *mimic - address: 118 - description: Specifies the digital output to mimic the Port 1 valve state. - MimicPort2Valve: - <<: *mimic - address: 119 - description: Specifies the digital output to mimic the Port 2 valve state. - Reserved23: - <<: *reserved - address: 120 - Reserved24: - <<: *reserved - address: 121 - PokeInputFilter: - address: 122 - type: U8 - access: Write - description: Specifies the low pass filter time value for poke inputs, in ms. -bitMasks: - DigitalInputs: - description: Specifies the state of port digital input lines. - bits: - DIPort0: 0x1 - DIPort1: 0x2 - DIPort2: 0x4 - DI3: 0x8 - DigitalOutputs: - description: Specifies the state of port digital output lines. - bits: - DOPort0: 0x1 - DOPort1: 0x2 - DOPort2: 0x4 - SupplyPort0: 0x8 - SupplyPort1: 0x10 - SupplyPort2: 0x20 - Led0: 0x40 - Led1: 0x80 - Rgb0: 0x100 - Rgb1: 0x200 - DO0: 0x400 - DO1: 0x800 - DO2: 0x1000 - DO3: 0x2000 - PortDigitalIOS: - description: Specifies the state of the port DIO lines. - bits: - DIO0: 0x1 - DIO1: 0x2 - DIO2: 0x4 - PwmOutputs: - description: Specifies the state of PWM output lines. - bits: - PwmDO0: 0x1 - PwmDO1: 0x2 - PwmDO2: 0x4 - PwmDO3: 0x8 - Events: - description: Specifies the active events in the device. - bits: - PortDI: 0x1 - PortDIO: 0x2 - AnalogData: 0x4 - Camera0: 0x8 - Camera1: 0x10 - CameraOutputs: - description: Specifies camera output enable bits. - bits: - CameraOutput0: 0x1 - CameraOutput1: 0x2 - ServoOutputs: - description: Specifies servo output enable bits. - bits: - ServoOutput2: 0x4 - ServoOutput3: 0x8 - EncoderInputs: - description: Specifies quadrature counter enable bits. - bits: - EncoderPort2: 0x4 - FrameAcquired: - description: Specifies that camera frame was acquired. - bits: - FrameAcquired: 0x1 -groupMasks: - MimicOutput: - description: Specifies the target IO on which to mimic the specified register. - values: - None: 0 - DIO0: 1 - DIO1: 2 - DIO2: 3 - DO0: 4 - DO1: 5 - DO2: 6 - DO3: 7 - EncoderModeConfig: - description: Specifies the type of reading made from the quadrature encoder. - values: - Position: 0 - Displacement: 1 - - - - - 1 - - - - - - - - - - \ No newline at end of file diff --git a/src/Extensions/Logging.bonsai b/src/Extensions/Logging.bonsai index a57d5923..99f30bb5 100644 --- a/src/Extensions/Logging.bonsai +++ b/src/Extensions/Logging.bonsai @@ -4,7 +4,9 @@ xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:sys="clr-namespace:System;assembly=mscorlib" + xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns:p2="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" + xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p3="clr-namespace:AllenNeuralDynamics.LicketySplit;assembly=AllenNeuralDynamics.LicketySplit" xmlns:p4="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" xmlns:p5="clr-namespace:AllenNeuralDynamics.SniffDetector;assembly=AllenNeuralDynamics.SniffDetector" @@ -13,7 +15,6 @@ xmlns:p8="clr-namespace:AllenNeuralDynamics.EnvironmentSensor;assembly=AllenNeuralDynamics.EnvironmentSensor" xmlns:p9="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" - xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p10="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" xmlns:p11="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:p12="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" @@ -58,7 +59,9 @@ - + + + @@ -92,28 +95,88 @@ StepperDriver - HarpOlfactometerEvents - - - Modality + OlfactometerHubEventsGroupedBy - - - - + + LogOlfactometerHub + + + + Source1 + + + + 1 + + + + thisOlfactometer + + + + thisOlfactometer + + + + + + Item2 + + + Modality + + + + + + + + + + + + + + + + thisOlfactometer + + + Key + + + it > 0 ? "OlfactometerExtension" + it.ToString() : "Olfactometer" + + + + + + + + + Behavior + Olfactometer + + + + + + + + + + + + + + + + + + - - - - - - - - - - Behavior - Olfactometer + HarpLickometerEvents @@ -301,53 +364,50 @@ - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - + + @@ -378,7 +438,9 @@ - + + + @@ -424,40 +486,108 @@ HarpCommands/StepperDriver - HarpOlfactometerCommands + OlfactometerHubCommandsGroupedBy - - HarpTimestampSource - - - - - - - - - - - - Modality - - - - - + + LogOlfactometerHub + + + + Source1 + + + + 1 + + + + thisOlfactometer + + + + thisOlfactometer + + + + + + Item2 + + + HarpTimestampSource + + + + + + + + + + + + Modality + + + + + + + + + + + + + + + + thisOlfactometer + + + Key + + + it > 0 ? "OlfactometerExtension" + it.ToString() : "Olfactometer" + + + HarpCommands/{0} + it + + + + + + + + + Behavior + Olfactometer + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - Behavior - HarpCommands/Olfactometer + HarpLickometerCommands @@ -723,74 +853,68 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - - - + + + + + + + - - - - + + + - - - - - - + + + + + + + - - - - - - - + diff --git a/src/Extensions/OperationControl.bonsai b/src/Extensions/OperationControl.bonsai index 70f4f2e2..1ddf0cc7 100644 --- a/src/Extensions/OperationControl.bonsai +++ b/src/Extensions/OperationControl.bonsai @@ -1,25 +1,24 @@  @@ -27,27 +26,336 @@ OdorControl + + RigSchema + + + HarpOlfactometerExtension + + + 3 + 4*it.Count() + + + olfactometerChannelsCount + + + SetOdorMix + + + + + + BroadcastToOlfactometerHub + + + + Source1 + + + + 1 + + + + thisBundle + + + SetChannelsTargetFlow + + + + thisBundle + + + OlfactometerIndex,ChannelsTargetFlow + + + OlfactometerHubCommands + + + OlfactometerHubEventsGroupedBy + + + thisBundle + + + OlfactometerIndex + + + + + + it.Item1.Key == it.Item2 + + + Item1 + + + + + + Item2 + + + + Include + Write + + + + thisBundle + + + ChannelsTargetFlow + + + Address + + + + + + + + Include + + + + + + + + PT0.01S + + + + + + + + + 1 + + + + thisBundle + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SetOdorValveState + + + + thisBundle + + + OlfactometerIndex,OdorValveState + + + OlfactometerHubCommands + + + OlfactometerHubEventsGroupedBy + + + thisBundle + + + OlfactometerIndex + + + + + + it.Item1.Key == it.Item2 + + + Item1 + + + + + + Item2 + + + + Include + Write + + + + thisBundle + + + OdorValveState + + + Address + + + + + + + + Include + + + + + + + + PT0.01S + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OlfactometerInitialConfiguration - HarpOlfactometerEvents + OlfactometerHubEvents + + + RigSchema + + + HarpOlfactometerExtension + + + Count + + + + 1 + + + + + + 1 + + olfactometerChannelsCount + + + + + + + + + 0 + 0 + + + + + 0 + + + + + + + + + + Item2 + - - true - 0 - 0 - 0 - NaN - true - 100 + + 100 1000 @@ -56,9 +364,21 @@ - + + + + + + + + + + + + + @@ -80,10 +400,6 @@ SoftwareEvent - - TODO - - ArmOdor @@ -95,7 +411,7 @@ - + @@ -110,14 +426,8 @@ - - true - 0 - 0 - 0 - NaN - true - 100 + + 100 1000 @@ -128,15 +438,14 @@ - - + + - - + + - - - + + @@ -145,7 +454,26 @@ - HarpOlfactometerEvents + OlfactometerHubEvents + + + RigSchema + + + HarpOlfactometerExtension + + + Count + + + + 1 + + + + + + @@ -207,225 +535,50 @@ Write - - HarpOlfactometerCommands - - - - - - - - - - - - - - - - - - - - SetOdorMix - - - SetChannelsTargetFlow - - - - Source1 - - - Mix - - - Mix - - - ChannelsTargetFlow - - - HarpOlfactometerCommands - - - HarpOlfactometerEvents - - - - Include - Write - - - - Mix - - - ChannelsTargetFlow - - - Address - - - - - - - - Include - - - - - - - - PT0.01S - - - - - - - - 1 + + 0 - - Mix - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - - - - - SetOdorValveState - - - - Source1 - - - Mix - - - Mix - - - OdorValveState + - HarpOlfactometerCommands - - - HarpOlfactometerEvents + OlfactometerHubCommands - - - Include - Write - - - - Mix - - - OdorValveState - - - Address - - - - - - - - Include - - - - - - - - PT0.01S - - - - - - - - - 1 - - - - Mix - - - - - - Item2 - - - + + - - + + + - - - - + + + + - - + + + - - + + + + + @@ -878,8 +1031,8 @@ - - None + + None @@ -1228,14 +1381,14 @@ HarpLickometerEvents - - + + Value - + Channel0 @@ -1486,8 +1639,8 @@ HarpSniffDetectorEvents - - + + RigSchema @@ -1565,10 +1718,10 @@ - + Write - - 0 + + 0 @@ -1583,8 +1736,8 @@ Write - - + + @@ -1653,8 +1806,8 @@ HarpTreadmillEvents - - + + TreadmillSamplingRate @@ -1719,8 +1872,8 @@ HarpTreadmillEvents - - + + @@ -1821,7 +1974,7 @@ Item1 as Displacement, - + @@ -1845,11 +1998,11 @@ Item1 as Displacement, - + - + Write - + SendMessage @@ -1869,8 +2022,8 @@ Item1 as Displacement, HarpTreadmillEvents - - + + HarpMessage diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index c00fb9ad..7410e8c4 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -410,10 +410,6 @@ class _RewardFunction(BaseModel): default=None, description="Defines the amount of reward available replenished in the patch per rule unit." ) - -OdorConcentration = Annotated[float, Field(ge=0, le=1, description="Concentration of the odor")] - - class PatchRewardFunction(_RewardFunction): """ A RewardFunction that is applied when the animal is inside the patch. @@ -656,7 +652,7 @@ class VirtualSite(BaseModel): label: VirtualSiteLabels = Field(default=VirtualSiteLabels.UNSPECIFIED, description="Label of the virtual site") length: float = Field(default=20, description="Length of the virtual site (cm)") start_position: float = Field(default=0, ge=0, description="Start position of the virtual site (cm)") - odor_specification: Optional[List[OdorConcentration]] = Field( + odor_specification: Optional[List[NonNegativeFloat]] = Field( default=None, description="The optional odor specification of the virtual site" ) reward_specification: Optional[VirtualSiteRewardSpecification] = Field( @@ -754,7 +750,7 @@ class Patch(BaseModel): label: str = Field(default="", description="Label of the patch") state_index: int = Field(default=0, ge=0, description="Index of the state") - odor_specification: List[OdorConcentration] = Field( + odor_specification: List[NonNegativeFloat] = Field( description="A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel" ) reward_specification: RewardSpecification = Field( diff --git a/src/main.bonsai b/src/main.bonsai index 09dae507..f0ce8c47 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -3,32 +3,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" - xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" - xmlns:res="clr-namespace:Bonsai.Resources;assembly=Bonsai.System" + xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" + xmlns:p2="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" - xmlns:p2="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" - xmlns:p3="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" + xmlns:p3="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" + xmlns:p4="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:p5="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" xmlns:sys="clr-namespace:System;assembly=mscorlib" - xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" - xmlns:cv="clr-namespace:Bonsai.Vision;assembly=Bonsai.Vision" - xmlns:p4="clr-namespace:OpenCV.Net;assembly=OpenCV.Net" - xmlns:p5="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" - xmlns:spk="clr-namespace:Bonsai.Spinnaker;assembly=Bonsai.Spinnaker" - xmlns:vid="clr-namespace:Bonsai.Video;assembly=Bonsai.Video" - xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" - xmlns:p6="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" - xmlns:p7="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" - xmlns:p8="clr-namespace:System.Reactive;assembly=System.Reactive.Core" - xmlns:p9="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" - xmlns:p10="clr-namespace:;assembly=Extensions" - xmlns:p11="clr-namespace:OpenTK;assembly=OpenTK" - xmlns:dsp="clr-namespace:Bonsai.Dsp;assembly=Bonsai.Dsp" - xmlns:p12="clr-namespace:AllenNeuralDynamics.Core.Design;assembly=AllenNeuralDynamics.Core.Design" - xmlns:p13="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" - xmlns:p14="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" - xmlns:p15="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" - xmlns:p16="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" + xmlns:p6="clr-namespace:;assembly=Extensions" + xmlns:p7="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" + xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" + xmlns:p8="clr-namespace:OpenTK;assembly=OpenTK" + xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" + xmlns:p9="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" + xmlns:p10="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" + xmlns:p11="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -113,2495 +102,334 @@ + - Hardware + SessionSettings - - ScreenConfiguration - - - - RigSchema - - - Screen - - - - - - - - - - - 1000 - 1000 - VrForaging - Off - false - Black - DepthBufferBit ColorBufferBit - false - - Resizable - Fullscreen - Second - 60 - 120 - - - - 8 - 8 - 8 - 8 - - 16 - 0 - 0 - - 0 - 0 - 0 - 0 - - 2 - false - - - - - - - - - - RigSchema - - - Screen.Calibration - - - LoadDisplayCalibration - - - - Source1 - - - calibration - - - calibration - - - Left - - - - calibration - - - Center - - - - calibration - - - Right - - - - - - - new( -Item1 as Left, -Item2 as Center, -Item3 as Right) - - - - - - - - - - - - - - - - - - - - - - 1 - - - - DisplayCalibration - - - RenderLoop - - - - FarClipHorizon - - - - - - - - - 0 - 0 - 0 - - 1E-05 - 1000 - - 0 - 0 - 0 - - - - 2 - 6 - - - - 1 - - - - - 1 - - - - WorldContrast - - - RigSchema - - - Screen - - - Contrast - - - WorldContrast - - - - - - - DisplayContrast - - - RigSchema - - - Screen - - - Brightness - - - DisplayBrightness - - - - - - - - - - - - - - - - - - - - - RigSchema - - - Screen.TextureAssetsDirectory - - - - - - - - Textures - *.jpg - - - - - - - - - - - - - - - - - - + + TaskLogicParameters + + + RngSeed - - PT2S + + - - HarpDevices - - - - HarpWhiteRabbitEvents - - - - Include - Event - - - - - - - Seconds - - - HarpTimestampSource - - - HarpWhiteRabbitEvents - - - - - - HarpWhiteRabbitHeartbeat - - - - RigSchema - - - - - HarpOlfactometer.PortName - - - - - - - - - - - - COM6 - TriggerHarpReadDump - true - - - - RigSchema - - - HarpOlfactometer - - - RigSchema - - - HarpOlfactometerExtension - - - - - - - - - HarpOlfactometerExtensionManager - - - - Source1 - - - - - - InstantiateOlfactometer - - - - Source1 - - - - 1 - - - - thisOlfactometer - - - OlfactometerHubCommandsGroupedBy - - - thisOlfactometer - - - Index - - - - - - isThisOlfactometer? - it.Item1.Key == it.Item2 - - - - 1 - - - - Item1 - - - - - - Item2 - - - thisHarpOlfactometerCommands - - - thisHarpOlfactometerEvents - - - thisOlfactometer - - - Index - - - - - - Item2,Item1 - - - OlfactometerHubEvents - - - thisHarpOlfactometerCommands - - - thisOlfactometer - - - Value.PortName - - - - - - - - - Active - On - true - On - Enabled - false - COM6 - - - - thisHarpOlfactometerEvents - - - - - - TriggerHarpReadDump - - - Write - - Active - true - false - On - On - Enabled - - - - thisHarpOlfactometerCommands - - - thisHarpOlfactometerEvents - - - - 1 - - - - thisOlfactometer - - - Index - - - Channel3Range - FlowRate100 - - - Channel3Range - FlowRate1000 - - - - - - it.Item1 == 0 ? it.Item2 : it.Item3 - - - - - - - - Write - - FlowRate1000 - - - - thisHarpOlfactometerCommands - - - Write - - Flowmeter DI0Trigger ChannelActualFlow - - - - thisHarpOlfactometerCommands - - - Write - - Enabled - - - - thisHarpOlfactometerCommands - - - Write - - None - - - - thisHarpOlfactometerCommands - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MultiplexIO - - - - OlfactometerHubCommands - - - Item1 - - - OlfactometerHubCommandsGroupedBy - - - - OlfactometerHubEvents - - - Item1 - - - OlfactometerHubEventsGroupedBy - - - - HarpOlfactometerCommands - - - - 0 - - - - BackwardsCompatible - - - - - - - OlfactometerHubCommands - - - - 0 - - - - - - - OlfactometerHubEventsGroupedBy - - - it.Key == 0 - it.Key == 0 - - - - 1 - - - - - - - Item2 - - - BackwardsCompatible - - - - HarpOlfactometerEvents - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TriggerHarpReadDump - - - RigSchema - - - HarpClockGenerator.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpLickometer.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpTreadmill - - - PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - Manipulator - - - Calibration - - - RigSchema - - - Manipulator - - - PortName - - - - - - - - COMx - - - RigSchema - - - HarpSniffDetector.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpSniffDetector - - - - - - - RigSchema - - - HarpAnalogInput.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpAnalogInput - - - - - - - RigSchema - - - HarpEnvironmentSensor.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpEnvironmentSensor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 0 + 10 + - - Cameras - - - - TriggeredCameras - - - - RigSchema - - - - 1 - - - - TriggeredCameraController - - - TriggeredCameraController - - - FrameRate.Value - - - CameraFrameRate - - - TriggeredCameraController - - - Cameras - - - CameraFrameRate - - - Write - - - - HarpBehaviorCommands - - - HarpBehaviorEvents - - - - Include - Event - - - - - - - Value - - - - FrameAcquired - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - - - Item2.Seconds - - - FrameEvent - - - TriggeredCameraController - - - Cameras - - - - - - InstantiateCamera - - - - Source1 - - - - 1 - - - - ThisCamera - - - - true - - - - TriggeredCamerasInitialized - - - - 1 - - - - ThisCamera - - - Value - - - - - - - - - - - - - - - ThisCamera - - - Value - - - RegionOfInterest - - - - - - - - RegionOfInterest - - 0 - 0 - 0 - 0 - - - - - - - - - - - Default - 19000 - 0 - 1 - - Mono8 - - 0 - 0 - 0 - 0 - - - - - - FrameEvent - - - - - - - - - ThisCamera - - - Key - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpinnakerApiNote - - - - - PT0S - PT0.1S - - - - - - - Item1 - - - - - - Item2 - Item1 - - - TriggeredCamerasStream - - - - TriggeredCamerasInitialized - - - - 1 - - - - - 0 - - - - - 1 - - - - - - - - TriggeredCameraController - - - Cameras - - - Count - - - - - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - 1 - - - - - PT0.1S - - - - TriggeredCamerasReady - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MonitoringCameras - - - - RigSchema - - - MonitoringCameraController - - - - Cameras - - - - - - InstantiateCamera - - - - Source1 - - - - 1 - - - - ThisCamera - - - ThisCamera - - - Value - - - Index - - - - - - - - - 0 - - - - - HarpTimestampSource - - - - - - - - - ThisCamera - - - Key - - - - - - - - - - - - - - - - - - - - - - - - - - - - Item2 - Item1 - - - MonitoringCamerasStream - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SessionSettings - - - - TaskLogicParameters - - - RngSeed - - - - - - - - - 0 - 10 - - - - - - - - - - CheckNull - Item1.HasValue ? Item1.Value : Item2 - - - - 1 - - - - RngSeedValue - - - - - - - - - - - - - - 1 - - - - RngSeed - - - - ../. - - - - Repository - - - - - - - 0 - - - - - 1 - - - - SigmaZ - - - - - - - 1000 - - - - - 1 - - - - FarClipHorizon - - - - - - - - - - 20 - - - - - 1 - - - - DisposingTreshold - - - - - - - - PT0.1S - - - - - 1 - - - - RefreshEnvironmentRate - - - SubjectSchema - - - - - - - - RigSchema - - - DataDirectory - - - - - - - - - - LoggingRootPath - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initialization - - - - StartExperiment - - - GlobalActivePatch - - - GlobalActiveSite - - - UpdaterEvents - - - SoftwareEvent - - - RuntimeLogging - - - EndExperiment - - - StartLogging - - - Annotations - - - GlobalPatchState - - - - GlobalPatchState - - - - SoftwareEvent - - - Position - - - - CurrentPosition - - - IsStopped - - - MaxPosition - - - StopVelocityThreshold - - - FilteredCurrentVelocity - - - - - - - - false - - - - - 1 - - - - StartExperiment - - - - 1 - - - - - true - - - - EndExperiment - - - - 1 - - - - - false - - - - - - - ExperimentState - - - StartExperiment - - - - TriggerHarpReadDump - - - - - - - - - - - - - - - - - - - - - HardwareChecks - - - - ProtocolValidation - - - - Repository - - - - false - - - - - SubjectSchema - - - AllowDirtyRepo - - - - - - AllowDirty? - Item2 ? False : Item1 - - - - - - Source1 - - - - - - - - - - - Repository is not clean! Please discard all local changes. - - - - Olfactometer - - - - - TaskLogicParameters - - - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - - - Source1 - - - - - - - - - - - - SampleFlow - - - - StartExperiment - - - - 1 - - - - HarpOlfactometerEvents - - - - - - Value - - - - - - - 950 - - - - - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - Source1 - - - Item1 - - - - - - - - - - - - - Item2 - - - - - Flow on Channel3 is lower than expected. Reading {0}. - it - - - - - - - - it - - - - TODO - - - - - - Flow on Channel3 is lower than expected. - - - - - TaskLogicSchema - - - RigSchema - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - CameraChecks - - - - TriggeredCamerasStream - - - CheckDroppedFrames - - - - Source1 - - - - 1 - - - - InputSequence - - - InputSequence - - - - - - Value.ChunkData - - - FrameID - - - - 1 - - - - - 1 - - - - - 0 - - - - - - - Source1 - - - - - - - - - - InputSequence - - - Key - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - - - - Camera {0} dropped frame detected during pre-session! - it - - - - - - it - - - - Dropped frame detected during pre-session! - - - - StartExperiment - - - - - - TriggeredCameraController - - - Cameras - - - - - - CheckCameraSettings - - - - Source1 - - - - 1 - - - - ThisCamera - - - ThisCamera - - - Value.Exposure - - - TriggeredCameraController - - - FrameRate - - - Value - - - - - - ((1.0 / Item2) * 1000000) < double(Item1) + 1000 - - - - - - Source1 - - - - - - - - - - - 1 - - - - ThisCamera - - - Key - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Camera {0} exposure setting not compatible with requested frame rate! - it - - - - - - it - - - - - - - - TriggeredCameraController - - - FrameRate.HasValue - - - - - - - Source1 - - - - - - - - - - - TriggeredCameraControl must specify a valid FrameRate property! - - - - TriggeredCamerasStream - - - OnlineQC - - - - Source1 - - - - 1 - - - - InputSequence - - - InputSequence - - - - - - Value.ChunkData - - - Timestamp - - - - 1 - - - - - 1E-09 - - - - Seconds - - - - 1 - - - - - - - - - - - - - - - 0.0005 - - - - - - - Source1 - - - - - - - - - - - TaskPoolScheduler - - - - - - - - PT0S - PT10S - - - - - - - MakeUI - - - - InputSequence - - - Key - - - Camera {0} out-of-alignment qc was triggered. - it - - - - - - - - - - Warning - Exclamation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Treadmill - - - - HarpTreadmillEvents - - - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - The treadmill current limit has been triggered. If this is a problem, please restart the session. - Treadmill limit trigger - Exclamation - - - - - - - - - - - - - StartExperiment - - - - - - - - - - - - - - - - - - - + + + + + + + + CheckNull + Item1.HasValue ? Item1.Value : Item2 + + + + 1 + + + + RngSeedValue + + + + + + + + + + + + + + 1 + + + + RngSeed + + + + ../. + + + + Repository + + + + + + + 0 + + + + + 1 + + + + SigmaZ + + + + + + + 1000 + + + + + 1 + + + + FarClipHorizon + + + + + + + + + + 20 + + + + + 1 + + + + DisposingTreshold + + + + + + + + PT0.1S + + + + + 1 + + + + RefreshEnvironmentRate SubjectSchema + + + + + + + RigSchema + - SkipHardwareValidation + DataDirectory + + + + + + + + + + LoggingRootPath + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Initialization + + + + StartExperiment + + + GlobalActivePatch + + + GlobalActiveSite - - + + UpdaterEvents + + + SoftwareEvent + + + RuntimeLogging + + + EndExperiment + + + StartLogging + + + Annotations + + + GlobalPatchState + + + + GlobalPatchState + + + + SoftwareEvent + + + Position - - Source1 + + CurrentPosition + + + IsStopped + + + MaxPosition + + + StopVelocityThreshold + + + FilteredCurrentVelocity - - - - + - + + false + - - PT2S + + 1 - + + StartExperiment + + + + 1 + + + + + true + + + + EndExperiment + + + + 1 + + + + + false + + + + + + + ExperimentState + + + StartExperiment + + + + TriggerHarpReadDump + - - - - - - - + + + + + + + + + + + + + + EndExperiment @@ -2675,8 +503,8 @@ Item3 as Right) CurrentBlock - - Block + + Block @@ -2689,8 +517,8 @@ Item3 as Right) EnvironmentStatistics.TransitionMatrix - - true + + true @@ -2724,7 +552,7 @@ Item3 as Right) - + @@ -2803,8 +631,8 @@ Item3 as Right) ActivePatch - - ActivePatch + + ActivePatch @@ -2969,7 +797,7 @@ Item3 as Right) - + @@ -3061,7 +889,7 @@ Item3 as Right) - + @@ -3151,7 +979,7 @@ Item3 as Right) - + @@ -3239,7 +1067,7 @@ Item3 as Right) - + @@ -3850,7 +1678,7 @@ it.Item3 as SiteHasChoice) - + ActiveStateIndex @@ -3955,7 +1783,7 @@ it.Item3 as SiteHasChoice) StartCondition - + StartExperimentShortcut @@ -4022,16 +1850,32 @@ it.Item3 as SiteHasChoice) EndRoutine + + olfactometerChannelsCount + + + + + + + + + 0 + 0 + + + + + 0 + + + + + - - true - 0 - 0 - 0 - NaN - true - 100 - 1000 + + 100 + 1000 @@ -4045,10 +1889,10 @@ it.Item3 as SiteHasChoice) OdorEndValveState - + Write - - 0 + + 0 @@ -4088,12 +1932,12 @@ it.Item3 as SiteHasChoice) Axis - + Y1 - + Y2 @@ -4213,10 +2057,10 @@ it.Item3 as SiteHasChoice) 1 - + Write - - 0 + + 0 @@ -4236,17 +2080,22 @@ it.Item3 as SiteHasChoice) - + - - - - + + + + - - + + + + + + + From eadafb07fcbbbc3d2941a2dfa34997815a0fca5e Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 31 Mar 2026 12:15:07 -0700 Subject: [PATCH 29/31] Update examples --- examples/task_mcm.py | 6 +++++- examples/task_patch_foraging.py | 4 ++-- examples/test_single_site_patch.py | 6 +++++- src/aind_behavior_vr_foraging/task_logic.py | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/examples/task_mcm.py b/examples/task_mcm.py index 5664c1b8..90e0593f 100644 --- a/examples/task_mcm.py +++ b/examples/task_mcm.py @@ -85,6 +85,10 @@ def compute_cmc_transition_probability(n_states, rep_rate, T=3.5, dt=0.1) -> np. rhos = [0.9, 0.9, 0.9] +def odor_concentration_from_index(odor_index: int) -> list[float]: + return [1.0 if i == odor_index else 0.0 for i in range(3)] + + def make_patch( label: str, state_index: int, @@ -118,7 +122,7 @@ def make_patch( return vr_task_logic.Patch( label=label, state_index=state_index, - odor_specification=vr_task_logic.OdorSpecification(index=odor_index, concentration=1), + odor_specification=odor_concentration_from_index(odor_index), reward_specification=vr_task_logic.RewardSpecification( amount=vr_task_logic.scalar_value(reward_amount), probability=vr_task_logic.scalar_value(p_max), diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 8442925b..3117810c 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -114,7 +114,7 @@ def PostPatchVirtualSiteGeneratorHelper(contrast: float = 1, friction: float = 0 patch1 = vr_task_logic.Patch( label="reset", state_index=0, - odor_specification=vr_task_logic.OdorSpecification(index=1, concentration=1), + odor_specification=[0.0, 1.0, 0.0], reward_specification=vr_task_logic.RewardSpecification( amount=vr_task_logic.scalar_value(1), probability=vr_task_logic.scalar_value(1), @@ -134,7 +134,7 @@ def PostPatchVirtualSiteGeneratorHelper(contrast: float = 1, friction: float = 0 patch2 = vr_task_logic.Patch( label="slow-replenish", state_index=1, - odor_specification=vr_task_logic.OdorSpecification(index=0, concentration=1), + odor_specification=[0.1, 0.0, 0.0], reward_specification=vr_task_logic.RewardSpecification( reward_function=[reward_function, replenish_function], operant_logic=OperantLogicHelper(), diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index ce424ccd..36f438b9 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -31,6 +31,10 @@ ] +def odor_concentration_from_index(odor_index: int) -> list[float]: + return [1.0 if i == odor_index else 0.0 for i in range(3)] + + def make_patch( label: str, state_index: int, @@ -59,7 +63,7 @@ def make_patch( return vr_task_logic.Patch( label=label, state_index=state_index, - odor_specification=vr_task_logic.OdorSpecification(index=odor_index, concentration=1), + odor_specification=odor_concentration_from_index(odor_index), patch_terminators=[ vr_task_logic.PatchTerminatorOnChoice(count=vr_task_logic.scalar_value(1)), vr_task_logic.PatchTerminatorOnRejection(count=vr_task_logic.scalar_value(1)), diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index 7410e8c4..99dbf250 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -410,6 +410,7 @@ class _RewardFunction(BaseModel): default=None, description="Defines the amount of reward available replenished in the patch per rule unit." ) + class PatchRewardFunction(_RewardFunction): """ A RewardFunction that is applied when the animal is inside the patch. From 0c7d09e2ef4d037a3cc43013c682bd7a96384616 Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 31 Mar 2026 12:35:11 -0700 Subject: [PATCH 30/31] Maintain backwards compatibility with odor specification --- src/aind_behavior_vr_foraging/task_logic.py | 42 ++++++- tests/test_task_logic.py | 117 ++++++++++++++++++++ 2 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 tests/test_task_logic.py diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index 99dbf250..f4853bc6 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -1,12 +1,12 @@ import logging from enum import Enum -from typing import TYPE_CHECKING, Annotated, Any, Dict, List, Literal, Optional, Self, Union, cast +from typing import TYPE_CHECKING, Annotated, Any, Dict, List, Literal, Optional, Self, TypeAlias, Union, cast import aind_behavior_services.task.distributions as distributions from aind_behavior_services.common import Size, Vector3 from aind_behavior_services.task import Task, TaskParameters -from pydantic import BaseModel, Field, NonNegativeFloat, field_validator, model_validator -from typing_extensions import TypeAliasType +from pydantic import BaseModel, BeforeValidator, Field, NonNegativeFloat, field_validator, model_validator +from typing_extensions import TypeAliasType, deprecated from aind_behavior_vr_foraging import ( __semver__, @@ -636,6 +636,38 @@ class VirtualSiteRewardSpecification(BaseModel): ) +def _odor_mixture_from_odor_specification(value: Any): + if isinstance(value, list): + return value + else: + try: + odor_spec = OdorSpecification.model_validate(value) + return [odor_spec.concentration if i == odor_spec.index else 0 for i in range(3)] + except ValueError: + pass + return value + + +OdorMixture: TypeAlias = Annotated[ + List[NonNegativeFloat], + Field(description="The optional odor specification of the virtual site"), + BeforeValidator(_odor_mixture_from_odor_specification), +] + + +@deprecated("OdorSpecification is deprecated, use OdorMixture instead") +class OdorSpecification(BaseModel): + """ + Specifies odor delivery parameters for olfactory cues in the VR environment. + + Odors can be delivered at specific locations to provide additional sensory + information for navigation and foraging decisions. + """ + + index: int = Field(ge=0, le=3, description="Index of the odor to be used") + concentration: float = Field(default=1, ge=0, le=1, description="Concentration of the odor") + + class VirtualSite(BaseModel): """ THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. @@ -653,7 +685,7 @@ class VirtualSite(BaseModel): label: VirtualSiteLabels = Field(default=VirtualSiteLabels.UNSPECIFIED, description="Label of the virtual site") length: float = Field(default=20, description="Length of the virtual site (cm)") start_position: float = Field(default=0, ge=0, description="Start position of the virtual site (cm)") - odor_specification: Optional[List[NonNegativeFloat]] = Field( + odor_specification: Optional[OdorMixture] = Field( default=None, description="The optional odor specification of the virtual site" ) reward_specification: Optional[VirtualSiteRewardSpecification] = Field( @@ -751,7 +783,7 @@ class Patch(BaseModel): label: str = Field(default="", description="Label of the patch") state_index: int = Field(default=0, ge=0, description="Index of the state") - odor_specification: List[NonNegativeFloat] = Field( + odor_specification: OdorMixture = Field( description="A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel" ) reward_specification: RewardSpecification = Field( diff --git a/tests/test_task_logic.py b/tests/test_task_logic.py new file mode 100644 index 00000000..b03422da --- /dev/null +++ b/tests/test_task_logic.py @@ -0,0 +1,117 @@ +"""Tests for task_logic validation helpers.""" + +import unittest + +from pydantic import ValidationError + +from aind_behavior_vr_foraging.task_logic import ( + OdorSpecification, + VirtualSite, + _odor_mixture_from_odor_specification, +) + + +class TestOdorMixtureFromOdorSpecification(unittest.TestCase): + """Tests for _odor_mixture_from_odor_specification backwards-compatible validator.""" + + # --- New format: list passthrough --- + + def test_list_is_returned_as_is(self): + value = [0.5, 0.0, 0.0] + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0.5, 0.0, 0.0]) + + def test_empty_list_is_returned_as_is(self): + value = [] + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, []) + + def test_list_with_multiple_values_is_returned_as_is(self): + value = [0.1, 0.2, 0.7] + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0.1, 0.2, 0.7]) + + # --- Old format: OdorSpecification dict --- + + def test_odor_spec_dict_index_0(self): + value = {"index": 0, "concentration": 0.5} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0.5, 0, 0]) + + def test_odor_spec_dict_index_1(self): + value = {"index": 1, "concentration": 0.75} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0, 0.75, 0]) + + def test_odor_spec_dict_index_2(self): + value = {"index": 2, "concentration": 0.3} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0, 0, 0.3]) + + def test_odor_spec_dict_default_concentration(self): + """OdorSpecification.concentration defaults to 1.""" + value = {"index": 1} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0, 1, 0]) + + # --- Old format: OdorSpecification model instance --- + + def test_odor_spec_instance_index_0(self): + spec = OdorSpecification(index=0, concentration=0.6) + result = _odor_mixture_from_odor_specification(spec) + self.assertEqual(result, [0.6, 0, 0]) + + def test_odor_spec_instance_index_2(self): + spec = OdorSpecification(index=2, concentration=1.0) + result = _odor_mixture_from_odor_specification(spec) + self.assertEqual(result, [0, 0, 1.0]) + + # --- Invalid input passes through (downstream validation will reject it) --- + + def test_invalid_value_passes_through(self): + """Non-list, non-OdorSpecification values pass through for downstream validation.""" + value = "not_valid" + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, "not_valid") + + def test_invalid_dict_passes_through(self): + """Dicts that fail OdorSpecification validation pass through unchanged.""" + value = {"unknown_field": 99} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, value) + + +class TestOdorMixtureBackwardsCompatibilityViaModel(unittest.TestCase): + """Integration tests: validates backwards-compat through VirtualSite.odor_specification.""" + + def test_virtual_site_accepts_new_format_list(self): + site = VirtualSite(odor_specification=[0.5, 0.0, 0.0]) + self.assertEqual(site.odor_specification, [0.5, 0.0, 0.0]) + + def test_virtual_site_accepts_old_format_odor_spec_dict(self): + site = VirtualSite(odor_specification={"index": 0, "concentration": 0.5}) + self.assertEqual(site.odor_specification, [0.5, 0, 0]) + + def test_virtual_site_accepts_old_format_odor_spec_instance(self): + spec = OdorSpecification(index=1, concentration=0.8) + site = VirtualSite(odor_specification=spec) + self.assertEqual(site.odor_specification, [0, 0.8, 0]) + + def test_virtual_site_round_trip_from_json(self): + """Old-schema JSON with OdorSpecification fields deserializes correctly.""" + json_data = '{"odor_specification": {"index": 2, "concentration": 0.4}}' + site = VirtualSite.model_validate_json(json_data) + self.assertEqual(site.odor_specification, [0, 0, 0.4]) + + def test_virtual_site_rejects_invalid_odor_mixture(self): + """A list with negative values violates NonNegativeFloat constraint.""" + with self.assertRaises(ValidationError): + VirtualSite(odor_specification=[-0.1, 0.0, 0.0]) + + def test_virtual_site_none_odor_specification(self): + site = VirtualSite(odor_specification=None) + self.assertIsNone(site.odor_specification) + + +if __name__ == "__main__": + unittest.main() From a369e55324f3e994cfa3e63e627c86dfb9be9d0f Mon Sep 17 00:00:00 2001 From: bruno-f-cruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 31 Mar 2026 12:35:43 -0700 Subject: [PATCH 31/31] Ensure odor definition is padded to the number of existing olfactometers --- .../aind_behavior_vr_foraging.json | 5 +- src/Extensions/CreateHubOdorMixture.cs | 16 ++++- src/Extensions/OperationControl.bonsai | 58 +++++++++++++++++-- src/main.bonsai | 57 +++++++++++++++--- 4 files changed, 117 insertions(+), 19 deletions(-) diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index 287e3bad..a358dba4 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -2709,8 +2709,6 @@ "odor_specification": { "description": "A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel", "items": { - "description": "Concentration of the odor", - "maximum": 1, "minimum": 0, "type": "number" }, @@ -4890,9 +4888,8 @@ "description": "The optional odor specification of the virtual site", "oneOf": [ { + "description": "The optional odor specification of the virtual site", "items": { - "description": "Concentration of the odor", - "maximum": 1, "minimum": 0, "type": "number" }, diff --git a/src/Extensions/CreateHubOdorMixture.cs b/src/Extensions/CreateHubOdorMixture.cs index 3c70b3a2..f8296da0 100644 --- a/src/Extensions/CreateHubOdorMixture.cs +++ b/src/Extensions/CreateHubOdorMixture.cs @@ -32,13 +32,25 @@ public int TotalFlow set { totalFlow = value; } } + private int olfactometerChannelCount = 3; + public int OlfactometerChannelCount + { + get { return olfactometerChannelCount; } + set { olfactometerChannelCount = value; } + } + private const int _MINIMUM_CARRIER_FLOW = 100; private IList ConstructMessage(IList channelConcentrations) { - int nChannels = channelConcentrations.Count(); + int nChannels = OlfactometerChannelCount; + if (channelConcentrations.Count > nChannels) + { + throw new ArgumentException("The number of channel concentrations provided " + channelConcentrations.Count + " does not match the expected number based on the olfactometer count " + nChannels + "."); + } // We make sure all odors sum to 1 and then calculate the "real" flow for each channel based on the target odor flow - var adjustedFlow = channelConcentrations.Select(c => c / channelConcentrations.Sum()).Select(c => (int)(TotalOdorFlow * c)); + var adjustedFlow = channelConcentrations.Select(c => c / channelConcentrations.Sum()).Select(c => (int)(TotalOdorFlow * c)) + .Concat(Enumerable.Repeat(0, nChannels - channelConcentrations.Count)); // We pad with zeros if there are fewer concentrations than channels var carrierFlow = totalFlow - totalOdorFlow; if (carrierFlow < _MINIMUM_CARRIER_FLOW) { diff --git a/src/Extensions/OperationControl.bonsai b/src/Extensions/OperationControl.bonsai index 1ddf0cc7..d3ecfe67 100644 --- a/src/Extensions/OperationControl.bonsai +++ b/src/Extensions/OperationControl.bonsai @@ -353,10 +353,41 @@ Item2 + + olfactometerChannelsCount + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetOdorFlow + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetTotalFlow + + + + + + 100 1000 + 3 @@ -377,8 +408,16 @@ - + + + + + + + + + @@ -425,10 +464,19 @@ + + olfactometerChannelsCount + + + + + + 100 1000 + 3 @@ -438,14 +486,16 @@ - + - + - + + + diff --git a/src/main.bonsai b/src/main.bonsai index f0ce8c47..2027f3ac 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -1872,10 +1872,41 @@ it.Item3 as SiteHasChoice) + + olfactometerChannelsCount + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetOdorFlow + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetTotalFlow + + + + + + 100 1000 + 3 @@ -2081,21 +2112,29 @@ it.Item3 as SiteHasChoice) - + - + - - + + - - + + - + - - + + + + + + + + + +