From 33539c8de6e3a0c15b14faff4dff1730ffc66f0d Mon Sep 17 00:00:00 2001 From: Alise Au <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 12 Jun 2024 13:41:37 -0400 Subject: [PATCH] feat(api): add protocol api and engine support for absorbance plate reader (#15266) # Overview This PR adds protocol api and engine support for absorbance plate reader. Requires OE-core changes in https://github.com/Opentrons/oe-core/pull/151 --- api-client/src/modules/api-types.ts | 8 + api-client/src/modules/types.ts | 9 + .../drivers/absorbance_reader/abstract.py | 7 +- .../drivers/absorbance_reader/async_byonoy.py | 30 +- .../drivers/absorbance_reader/driver.py | 13 +- .../drivers/absorbance_reader/hid_protocol.py | 23 +- .../drivers/absorbance_reader/simulator.py | 9 +- api/src/opentrons/drivers/types.py | 11 +- .../hardware_control/modules/__init__.py | 2 + .../modules/absorbance_reader.py | 66 +- .../hardware_control/modules/types.py | 9 + api/src/opentrons/protocol_api/__init__.py | 2 + api/src/opentrons/protocol_api/core/common.py | 2 + .../protocol_api/core/engine/module_core.py | 22 + .../protocol_api/core/engine/protocol.py | 2 + api/src/opentrons/protocol_api/core/module.py | 18 + .../opentrons/protocol_api/module_contexts.py | 29 + .../protocol_api/protocol_context.py | 5 + api/src/opentrons/protocol_api/validation.py | 2 + .../protocol_engine/clients/sync_client.py | 28 + .../commands/absorbance_reader/__init__.py | 32 + .../commands/absorbance_reader/initialize.py | 81 + .../commands/absorbance_reader/measure.py | 94 + .../commands/command_unions.py | 11 + .../protocol_engine/execution/equipment.py | 9 + .../state/module_substates/__init__.py | 5 +- .../absorbance_reader_substate.py | 13 +- .../protocol_engine/state/modules.py | 78 + api/src/opentrons/protocol_engine/types.py | 12 + .../engine/test_absorbance_reader_core.py | 96 + .../test_absorbance_reader_context.py | 66 + .../commands/test_load_module.py | 56 + .../opentrons/protocol_engine/conftest.py | 7 + .../AddFixtureModal.tsx | 21 + .../ModuleCard/AbsorbanceReaderData.tsx | 28 + .../ModuleCard/AbsorbanceReaderSlideout.tsx | 44 + app/src/organisms/ModuleCard/hooks.tsx | 1 + app/src/organisms/ModuleCard/index.tsx | 17 + app/src/redux/modules/api-types.ts | 15 + app/src/redux/modules/types.ts | 10 + .../AbsorbanceReaderFixture.tsx | 93 + .../hardware-sim/DeckConfigurator/index.tsx | 17 + components/src/icons/ModuleIcon.tsx | 2 + components/src/icons/icon-data.ts | 6 + .../LabwareSelectionModal.tsx | 2 + .../CreateFileWizard/ModulesAndOtherTile.tsx | 12 +- .../components/modules/EditModulesCard.tsx | 5 + .../src/components/modules/ModuleDiagram.tsx | 6 + protocol-designer/src/constants.ts | 9 + .../src/feature-flags/reducers.ts | 2 + .../src/feature-flags/selectors.ts | 4 + protocol-designer/src/feature-flags/types.ts | 7 +- .../src/localization/en/feature_flags.json | 4 + .../src/localization/en/modules.json | 9 +- protocol-designer/src/modules/moduleData.ts | 9 + .../src/step-forms/selectors/index.ts | 18 +- protocol-designer/src/step-forms/types.ts | 5 + protocol-designer/src/ui/modules/utils.ts | 2 + .../src/utils/labwareModuleCompatibility.ts | 2 + .../modules/module_data_mapper.py | 18 + .../robot_server/modules/module_models.py | 40 + .../deck_configuration/test_validation.py | 1 + shared-data/command/schemas/8.json | 107 +- .../deck/definitions/5/ot3_standard.json | 58 + shared-data/deck/types/schemaV5.ts | 5 + shared-data/js/constants.ts | 33 + shared-data/js/fixtures.ts | 8 + shared-data/js/helpers/getModuleVizDims.ts | 83 +- shared-data/js/modules.ts | 5 + shared-data/js/types.ts | 6 + .../definitions/3/absorbanceReaderV1.json | 3685 +---------------- step-generation/src/types.ts | 5 + 72 files changed, 1555 insertions(+), 3706 deletions(-) create mode 100644 api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py create mode 100644 api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py create mode 100644 api/src/opentrons/protocol_engine/commands/absorbance_reader/measure.py create mode 100644 api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py create mode 100644 api/tests/opentrons/protocol_api/test_absorbance_reader_context.py create mode 100644 app/src/organisms/ModuleCard/AbsorbanceReaderData.tsx create mode 100644 app/src/organisms/ModuleCard/AbsorbanceReaderSlideout.tsx create mode 100644 components/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx diff --git a/api-client/src/modules/api-types.ts b/api-client/src/modules/api-types.ts index 60203dba15e7..c8560ae39800 100644 --- a/api-client/src/modules/api-types.ts +++ b/api-client/src/modules/api-types.ts @@ -80,6 +80,12 @@ export interface HeaterShakerData { errorDetails: string | null status: HeaterShakerStatus } +export interface AbsorbanceReaderData { + lidStatus: 'open' | 'closed' | 'unknown' + platePresence: 'present' | 'absent' | 'unknown' + sampleWavelength: number | null + status: AbsorbanceReaderStatus +} export type TemperatureStatus = | 'idle' @@ -112,3 +118,5 @@ export type LatchStatus = | 'idle_closed' | 'idle_unknown' | 'unknown' + +export type AbsorbanceReaderStatus = 'idle' | 'measuring' | 'error' diff --git a/api-client/src/modules/types.ts b/api-client/src/modules/types.ts index f138680dafdd..07b6ec27bda4 100644 --- a/api-client/src/modules/types.ts +++ b/api-client/src/modules/types.ts @@ -3,10 +3,12 @@ import type { ThermocyclerModuleModel, MagneticModuleModel, HeaterShakerModuleModel, + AbsorbanceReaderModel, TEMPERATURE_MODULE_TYPE, MAGNETIC_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, + ABSORBANCE_READER_TYPE, } from '@opentrons/shared-data' import type * as ApiTypes from './api-types' @@ -44,11 +46,18 @@ export interface HeaterShakerModule extends CommonModuleInfo { data: ApiTypes.HeaterShakerData } +export interface AbsorbanceReaderModule extends CommonModuleInfo { + moduleType: typeof ABSORBANCE_READER_TYPE + moduleModel: AbsorbanceReaderModel + data: ApiTypes.AbsorbanceReaderData +} + export type AttachedModule = | TemperatureModule | MagneticModule | ThermocyclerModule | HeaterShakerModule + | AbsorbanceReaderModule export interface ModulesMeta { cursor: number diff --git a/api/src/opentrons/drivers/absorbance_reader/abstract.py b/api/src/opentrons/drivers/absorbance_reader/abstract.py index 769de38253e0..e344af956181 100644 --- a/api/src/opentrons/drivers/absorbance_reader/abstract.py +++ b/api/src/opentrons/drivers/absorbance_reader/abstract.py @@ -1,6 +1,9 @@ from abc import ABC, abstractmethod from typing import Dict, List -from opentrons.drivers.types import AbsorbanceReaderLidStatus +from opentrons.drivers.types import ( + AbsorbanceReaderLidStatus, + AbsorbanceReaderDeviceState, +) class AbstractAbsorbanceReaderDriver(ABC): @@ -36,7 +39,7 @@ async def initialize_measurement(self, wavelength: int) -> None: ... @abstractmethod - async def get_status(self) -> None: + async def get_status(self) -> AbsorbanceReaderDeviceState: ... @abstractmethod diff --git a/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py index 1d5465db3422..d67883cd062a 100644 --- a/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py +++ b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py @@ -5,13 +5,17 @@ from concurrent.futures.thread import ThreadPoolExecutor from functools import partial from typing import Optional, List, Dict -import usb.core as usb_core # type: ignore[import-untyped] -from .hid_protocol import AbsorbanceHidInterface as AbsProtocol, ErrorCodeNames +from .hid_protocol import ( + AbsorbanceHidInterface as AbsProtocol, + ErrorCodeNames, + DeviceStateNames, +) from opentrons.drivers.types import ( AbsorbanceReaderLidStatus, AbsorbanceReaderPlatePresence, + AbsorbanceReaderDeviceState, ) from opentrons.drivers.rpi_drivers.types import USBPort @@ -36,6 +40,8 @@ def serial_number_from_port(name: str) -> str: """ Get the serial number from a port using pyusb. """ + import usb.core as usb_core # type: ignore[import-untyped] + port_numbers = tuple(int(s) for s in name.split("-")[1].split(".")) device = usb_core.find(port_numbers=port_numbers) if device: @@ -232,6 +238,7 @@ async def get_device_static_info(self) -> Dict[str, str]: return { "serial": self._device.sn, "model": "ABS96", + "version": "1.0", } async def get_device_information(self) -> Dict[str, str]: @@ -270,3 +277,22 @@ async def get_single_measurement(self, wavelength: int) -> List[float]: async def get_plate_presence(self) -> AbsorbanceReaderPlatePresence: return AbsorbanceReaderPlatePresence.UNKNOWN + + async def get_device_status(self) -> AbsorbanceReaderDeviceState: + status = await self._loop.run_in_executor( + executor=self._executor, + func=self._get_device_status, + ) + return self.convert_device_state(status.name) + + @staticmethod + def convert_device_state( + device_state: DeviceStateNames, + ) -> AbsorbanceReaderDeviceState: + state_map: Dict[DeviceStateNames, AbsorbanceReaderDeviceState] = { + "BYONOY_DEVICE_STATE_UNKNOWN": AbsorbanceReaderDeviceState.UNKNOWN, + "BYONOY_DEVICE_STATE_OK": AbsorbanceReaderDeviceState.OK, + "BYONOY_DEVICE_STATE_BROKEN_FW": AbsorbanceReaderDeviceState.BROKEN_FW, + "BYONOY_DEVICE_STATE_ERROR": AbsorbanceReaderDeviceState.ERROR, + } + return state_map[device_state] diff --git a/api/src/opentrons/drivers/absorbance_reader/driver.py b/api/src/opentrons/drivers/absorbance_reader/driver.py index 8777f8cbbf74..b3fbb5031e10 100644 --- a/api/src/opentrons/drivers/absorbance_reader/driver.py +++ b/api/src/opentrons/drivers/absorbance_reader/driver.py @@ -3,7 +3,11 @@ import asyncio from typing import Dict, Optional, List, TYPE_CHECKING -from opentrons.drivers.types import AbsorbanceReaderLidStatus +from opentrons.drivers.types import ( + AbsorbanceReaderLidStatus, + AbsorbanceReaderDeviceState, + AbsorbanceReaderPlatePresence, +) from opentrons.drivers.absorbance_reader.abstract import AbstractAbsorbanceReaderDriver from opentrons.drivers.rpi_drivers.types import USBPort @@ -61,5 +65,8 @@ async def get_single_measurement(self, wavelength: int) -> List[float]: async def initialize_measurement(self, wavelength: int) -> None: await self._connection.initialize(wavelength) - async def get_status(self) -> None: - pass + async def get_status(self) -> AbsorbanceReaderDeviceState: + return await self._connection.get_device_status() + + async def get_plate_presence(self) -> AbsorbanceReaderPlatePresence: + return await self._connection.get_plate_presence() diff --git a/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py b/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py index 6ddd82aa030d..2efee337846c 100644 --- a/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py +++ b/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py @@ -4,7 +4,6 @@ List, Literal, Tuple, - ClassVar, runtime_checkable, TypeVar, ) @@ -36,6 +35,20 @@ "BYONOY_ERROR_INTERNAL", ] +SlotStateNames = Literal[ + "BYONOY_SLOT_UNKNOWN", + "BYONOY_SLOT_EMPTY", + "BYONOY_SLOT_OCCUPIED", + "BYONOY_SLOT_UNDETERMINED", +] + +DeviceStateNames = Literal[ + "BYONOY_DEVICE_STATE_UNKNOWN", + "BYONOY_DEVICE_STATE_OK", + "BYONOY_DEVICE_STATE_BROKEN_FW", + "BYONOY_DEVICE_STATE_ERROR", +] + @runtime_checkable class AbsorbanceHidInterface(Protocol): @@ -51,7 +64,9 @@ class ErrorCode(Protocol): @runtime_checkable class SlotState(Protocol): - __members__: ClassVar[Dict[str, int]] + __members__: Dict[SlotStateNames, int] + name: SlotStateNames + value: int @runtime_checkable class MeasurementConfig(Protocol): @@ -65,7 +80,9 @@ class DeviceInfo(Protocol): @runtime_checkable class DeviceState(Protocol): - __members__: ClassVar[Dict[str, int]] + __members__: Dict[DeviceStateNames, int] + name: DeviceStateNames + value: int def ByonoyAbs96SingleMeasurementConfig(self) -> MeasurementConfig: ... diff --git a/api/src/opentrons/drivers/absorbance_reader/simulator.py b/api/src/opentrons/drivers/absorbance_reader/simulator.py index b189030b6537..94758bd6e3ea 100644 --- a/api/src/opentrons/drivers/absorbance_reader/simulator.py +++ b/api/src/opentrons/drivers/absorbance_reader/simulator.py @@ -1,7 +1,10 @@ from typing import Dict, List, Optional from opentrons.util.async_helpers import ensure_yield -from opentrons.drivers.types import AbsorbanceReaderLidStatus +from opentrons.drivers.types import ( + AbsorbanceReaderLidStatus, + AbsorbanceReaderDeviceState, +) from .abstract import AbstractAbsorbanceReaderDriver @@ -51,5 +54,5 @@ async def initialize_measurement(self, wavelength: int) -> None: pass @ensure_yield - async def get_status(self) -> None: - pass + async def get_status(self) -> AbsorbanceReaderDeviceState: + return AbsorbanceReaderDeviceState.OK diff --git a/api/src/opentrons/drivers/types.py b/api/src/opentrons/drivers/types.py index 09691ff051ff..a4047ca64daa 100644 --- a/api/src/opentrons/drivers/types.py +++ b/api/src/opentrons/drivers/types.py @@ -73,4 +73,13 @@ class AbsorbanceReaderPlatePresence(str, Enum): UNKNOWN = "unknown" PRESENT = "present" - ABSENCE = "absence" + ABSENT = "absent" + + +class AbsorbanceReaderDeviceState(str, Enum): + """Absorbance reader device state.""" + + UNKNOWN = "unknown" + OK = "ok" + BROKEN_FW = "broken_fw" + ERROR = "error" diff --git a/api/src/opentrons/hardware_control/modules/__init__.py b/api/src/opentrons/hardware_control/modules/__init__.py index 3e4c14f0baf5..9bac782ef364 100644 --- a/api/src/opentrons/hardware_control/modules/__init__.py +++ b/api/src/opentrons/hardware_control/modules/__init__.py @@ -19,6 +19,7 @@ TemperatureStatus, MagneticStatus, HeaterShakerStatus, + AbsorbanceReaderStatus, SpeedStatus, LiveData, ) @@ -47,4 +48,5 @@ "SpeedStatus", "LiveData", "AbsorbanceReader", + "AbsorbanceReaderStatus", ] diff --git a/api/src/opentrons/hardware_control/modules/absorbance_reader.py b/api/src/opentrons/hardware_control/modules/absorbance_reader.py index 8f3c65e3acea..e49c0e5c3111 100644 --- a/api/src/opentrons/hardware_control/modules/absorbance_reader.py +++ b/api/src/opentrons/hardware_control/modules/absorbance_reader.py @@ -7,7 +7,14 @@ AbsorbanceReaderDriver, SimulatingDriver, ) +from opentrons.drivers.types import ( + AbsorbanceReaderLidStatus, + AbsorbanceReaderPlatePresence, + AbsorbanceReaderDeviceState, +) + from opentrons.hardware_control.execution_manager import ExecutionManager +from opentrons.hardware_control.poller import Reader from opentrons.hardware_control.modules import mod_abc from opentrons.hardware_control.modules.types import ( ModuleType, @@ -56,6 +63,7 @@ async def build( driver=driver, hw_control_loop=hw_control_loop, ) + await module.setup() return module def __init__( @@ -83,6 +91,14 @@ def status(self) -> AbsorbanceReaderStatus: """Return some string describing status.""" return AbsorbanceReaderStatus.IDLE + @property + def lid_status(self) -> AbsorbanceReaderLidStatus: + return AbsorbanceReaderLidStatus.UNKNOWN + + @property + def plate_presence(self) -> AbsorbanceReaderPlatePresence: + return AbsorbanceReaderPlatePresence.UNKNOWN + @property def device_info(self) -> Mapping[str, str]: """Return a dict of the module's static information (serial, etc)""" @@ -92,8 +108,10 @@ def device_info(self) -> Mapping[str, str]: def live_data(self) -> LiveData: """Return a dict of the module's dynamic information""" return { - "status": "idle", + "status": self.status.value, "data": { + "lidStatus": self.lid_status.value, + "platePresence": self.plate_presence.value, "sampleWavelength": 400, }, } @@ -159,14 +177,50 @@ async def set_sample_wavelength(self, wavelength: int) -> None: """Set the Absorbance Reader's active wavelength.""" await self._driver.initialize_measurement(wavelength) - async def start_measure(self, wavelength: int) -> None: + async def start_measure(self, wavelength: int) -> List[float]: """Initiate a single measurement.""" - await self._driver.get_single_measurement(wavelength) + return await self._driver.get_single_measurement(wavelength) - async def get_supported_wavelengths(self) -> List[int]: - """Get the Absorbance Reader's supported wavelengths.""" - return await self._driver.get_available_wavelengths() + async def setup(self) -> None: + """Setup the Absorbance Reader.""" + is_open = await self._driver.is_connected() + if not is_open: + await self._driver.connect() async def get_current_wavelength(self) -> None: """Get the Absorbance Reader's current active wavelength.""" pass + + +class AbsorbanceReaderReader(Reader): + device_state: AbsorbanceReaderDeviceState + lid_status: AbsorbanceReaderLidStatus + plate_presence: AbsorbanceReaderPlatePresence + supported_wavelengths: List[int] + + def __init__(self, driver: AbsorbanceReaderDriver) -> None: + self.device_state = AbsorbanceReaderDeviceState.UNKNOWN + self.lid_status = AbsorbanceReaderLidStatus.UNKNOWN + self.plate_presence = AbsorbanceReaderPlatePresence.UNKNOWN + self.supported_wavelengths = [] + self._driver = driver + + async def read(self) -> None: + await self.get_device_status() + await self.get_supported_wavelengths() + + async def get_device_status(self) -> None: + """Get the Absorbance Reader's current status.""" + self.device_state = await self._driver.get_status() + + async def get_supported_wavelengths(self) -> None: + """Get the Absorbance Reader's supported wavelengths.""" + self.supported_wavelengths = await self._driver.get_available_wavelengths() + + async def get_lid_status(self) -> None: + """Get the Absorbance Reader's lid status.""" + self.lid_status = await self._driver.get_lid_status() + + async def get_plate_presence(self) -> None: + """Get the Absorbance Reader's plate presence.""" + self.plate_presence = await self._driver.get_plate_presence() diff --git a/api/src/opentrons/hardware_control/modules/types.py b/api/src/opentrons/hardware_control/modules/types.py index e538e603f8d0..1382961dc21a 100644 --- a/api/src/opentrons/hardware_control/modules/types.py +++ b/api/src/opentrons/hardware_control/modules/types.py @@ -80,6 +80,8 @@ def to_module_fixture_id(cls, module_type: ModuleType) -> str: return "heaterShakerModuleV1" if module_type == ModuleType.MAGNETIC_BLOCK: return "magneticBlockV1" + if module_type == ModuleType.ABSORBANCE_READER: + return "absorbanceReaderV1" else: raise ValueError( f"Module Type {module_type} does not have a related fixture ID." @@ -210,3 +212,10 @@ class AbsorbanceReaderStatus(str, Enum): IDLE = "idle" MEASURING = "measuring" ERROR = "error" + + +class LidStatus(str, Enum): + ON = "on" + OFF = "off" + UNKNOWN = "unknown" + ERROR = "error" diff --git a/api/src/opentrons/protocol_api/__init__.py b/api/src/opentrons/protocol_api/__init__.py index 1e817c7a882b..b9f1090164b2 100644 --- a/api/src/opentrons/protocol_api/__init__.py +++ b/api/src/opentrons/protocol_api/__init__.py @@ -21,6 +21,7 @@ TemperatureModuleContext, HeaterShakerContext, MagneticBlockContext, + AbsorbanceReaderContext, ) from .disposal_locations import TrashBin, WasteChute from ._liquid import Liquid @@ -50,6 +51,7 @@ "ThermocyclerContext", "HeaterShakerContext", "MagneticBlockContext", + "AbsorbanceReaderContext", "ParameterContext", "Labware", "TrashBin", diff --git a/api/src/opentrons/protocol_api/core/common.py b/api/src/opentrons/protocol_api/core/common.py index 1df2542ff0ca..5a63abb46b3f 100644 --- a/api/src/opentrons/protocol_api/core/common.py +++ b/api/src/opentrons/protocol_api/core/common.py @@ -10,6 +10,7 @@ AbstractThermocyclerCore, AbstractHeaterShakerCore, AbstractMagneticBlockCore, + AbstractAbsorbanceReaderCore, ) from .protocol import AbstractProtocol from .well import AbstractWellCore @@ -24,4 +25,5 @@ ThermocyclerCore = AbstractThermocyclerCore HeaterShakerCore = AbstractHeaterShakerCore MagneticBlockCore = AbstractMagneticBlockCore +AbsorbanceReaderCore = AbstractAbsorbanceReaderCore ProtocolCore = AbstractProtocol[InstrumentCore, LabwareCore, ModuleCore] diff --git a/api/src/opentrons/protocol_api/core/engine/module_core.py b/api/src/opentrons/protocol_api/core/engine/module_core.py index d0c395358050..835601ca0fd5 100644 --- a/api/src/opentrons/protocol_api/core/engine/module_core.py +++ b/api/src/opentrons/protocol_api/core/engine/module_core.py @@ -33,6 +33,7 @@ AbstractThermocyclerCore, AbstractHeaterShakerCore, AbstractMagneticBlockCore, + AbstractAbsorbanceReaderCore, ) from .exceptions import InvalidMagnetEngageHeightError @@ -467,3 +468,24 @@ def get_labware_latch_status(self) -> HeaterShakerLabwareLatchStatus: class MagneticBlockCore(NonConnectedModuleCore, AbstractMagneticBlockCore): """Magnetic Block control interface via a ProtocolEngine.""" + + +class AbsorbanceReaderCore(ModuleCore, AbstractAbsorbanceReaderCore): + """Absorbance Reader core logic implementation for Python protocols.""" + + _sync_module_hardware: SynchronousAdapter[hw_modules.AbsorbanceReader] + _initialized_value: Optional[int] = None + + def initialize(self, wavelength: int) -> None: + """Initialize the Absorbance Reader by taking zero reading.""" + self._engine_client.absorbance_reader_initialize( + module_id=self.module_id, wavelength=wavelength + ) + self._initialized_value = wavelength + + def initiate_read(self) -> None: + """Initiate read on the Absorbance Reader.""" + if self._initialized_value: + self._engine_client.absorbance_reader_measure( + module_id=self.module_id, wavelength=self._initialized_value + ) diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index 4089dff4b4d1..ed9ba0c5eeec 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -64,6 +64,7 @@ HeaterShakerModuleCore, NonConnectedModuleCore, MagneticBlockCore, + AbsorbanceReaderCore, ) from .exceptions import InvalidModuleLocationError from . import load_labware_params @@ -455,6 +456,7 @@ def _create_module_core( ModuleType.MAGNETIC: MagneticModuleCore, ModuleType.THERMOCYCLER: ThermocyclerModuleCore, ModuleType.HEATER_SHAKER: HeaterShakerModuleCore, + ModuleType.ABSORBANCE_READER: AbsorbanceReaderCore, } module_type = load_module_result.model.as_type() diff --git a/api/src/opentrons/protocol_api/core/module.py b/api/src/opentrons/protocol_api/core/module.py index b26a2ce91c81..004bd5c85b61 100644 --- a/api/src/opentrons/protocol_api/core/module.py +++ b/api/src/opentrons/protocol_api/core/module.py @@ -343,3 +343,21 @@ class AbstractMagneticBlockCore(AbstractModuleCore): """Core control interface for an attached Magnetic Block.""" MODULE_TYPE: ClassVar = ModuleType.MAGNETIC_BLOCK + + +class AbstractAbsorbanceReaderCore(AbstractModuleCore): + """Core control interface for an attached Absorbance Reader Module.""" + + MODULE_TYPE: ClassVar = ModuleType.ABSORBANCE_READER + + @abstractmethod + def get_serial_number(self) -> str: + """Get the module's unique hardware serial number.""" + + @abstractmethod + def initialize(self, wavelength: int) -> None: + """Initialize the Absorbance Reader by taking zero reading.""" + + @abstractmethod + def initiate_read(self) -> None: + """Initiate read on the Absorbance Reader.""" diff --git a/api/src/opentrons/protocol_api/module_contexts.py b/api/src/opentrons/protocol_api/module_contexts.py index 654a6ec46c14..e1a2fce844b2 100644 --- a/api/src/opentrons/protocol_api/module_contexts.py +++ b/api/src/opentrons/protocol_api/module_contexts.py @@ -22,6 +22,7 @@ ThermocyclerCore, HeaterShakerCore, MagneticBlockCore, + AbsorbanceReaderCore, ) from .core.core_map import LoadedCoreMap from .core.engine import ENGINE_CORE_API_VERSION @@ -955,3 +956,31 @@ class MagneticBlockContext(ModuleContext): """ _core: MagneticBlockCore + + +class AbsorbanceReaderContext(ModuleContext): + """An object representing a connected Absorbance Reader Module. + + It should not be instantiated directly; instead, it should be + created through :py:meth:`.ProtocolContext.load_module`. + + .. versionadded:: 2.18 + """ + + _core: AbsorbanceReaderCore + + @property + @requires_version(2, 18) + def serial_number(self) -> str: + """Get the module's unique hardware serial number.""" + return self._core.get_serial_number() + + @requires_version(2, 18) + def initialize(self, wavelength: int) -> None: + """Initialize the Absorbance Reader by taking zero reading.""" + self._core.initialize(wavelength) + + @requires_version(2, 18) + def initiate_read(self) -> None: + """Initiate read on the Absorbance Reader.""" + self._core.initiate_read() diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index 07c4bdfff5d5..1f724bd743be 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -50,6 +50,7 @@ AbstractThermocyclerCore, AbstractHeaterShakerCore, AbstractMagneticBlockCore, + AbstractAbsorbanceReaderCore, ) from .core.engine import ENGINE_CORE_API_VERSION from .core.legacy.legacy_protocol_core import LegacyProtocolCore @@ -66,6 +67,7 @@ ThermocyclerContext, HeaterShakerContext, MagneticBlockContext, + AbsorbanceReaderContext, ModuleContext, ) from ._parameters import Parameters @@ -80,6 +82,7 @@ ThermocyclerContext, HeaterShakerContext, MagneticBlockContext, + AbsorbanceReaderContext, ] @@ -1213,6 +1216,8 @@ def _create_module_context( module_cls = HeaterShakerContext elif isinstance(module_core, AbstractMagneticBlockCore): module_cls = MagneticBlockContext + elif isinstance(module_core, AbstractAbsorbanceReaderCore): + module_cls = AbsorbanceReaderContext else: assert False, "Unsupported module type" diff --git a/api/src/opentrons/protocol_api/validation.py b/api/src/opentrons/protocol_api/validation.py index eb72c6b6dfdf..e1c1902023fe 100644 --- a/api/src/opentrons/protocol_api/validation.py +++ b/api/src/opentrons/protocol_api/validation.py @@ -29,6 +29,7 @@ ThermocyclerModuleModel, HeaterShakerModuleModel, MagneticBlockModel, + AbsorbanceReaderModel, ThermocyclerStep, ) @@ -272,6 +273,7 @@ def ensure_definition_is_labware(definition: LabwareDefinition) -> None: "thermocyclerModuleV2": ThermocyclerModuleModel.THERMOCYCLER_V2, "heaterShakerModuleV1": HeaterShakerModuleModel.HEATER_SHAKER_V1, "magneticBlockV1": MagneticBlockModel.MAGNETIC_BLOCK_V1, + "absorbanceReaderV1": AbsorbanceReaderModel.ABSORBANCE_READER_V1, } diff --git a/api/src/opentrons/protocol_engine/clients/sync_client.py b/api/src/opentrons/protocol_engine/clients/sync_client.py index f29cbb02f71d..cbb4f0c26601 100644 --- a/api/src/opentrons/protocol_engine/clients/sync_client.py +++ b/api/src/opentrons/protocol_engine/clients/sync_client.py @@ -900,3 +900,31 @@ def load_liquid( ) result = self._transport.execute_command(request=request) return cast(commands.LoadLiquidResult, result) + + def absorbance_reader_initialize( + self, + module_id: str, + wavelength: int, + ) -> commands.absorbance_reader.InitializeResult: + """Execute a `absorbanceReader/initialize` command and return the result.""" + request = commands.absorbance_reader.InitializeCreate( + params=commands.absorbance_reader.InitializeParams( + moduleId=module_id, sampleWavelength=wavelength + ) + ) + result = self._transport.execute_command(request=request) + return cast(commands.absorbance_reader.InitializeResult, result) + + def absorbance_reader_measure( + self, + module_id: str, + wavelength: int, + ) -> commands.absorbance_reader.MeasureAbsorbanceResult: + """Execute a `absorbanceReader/measure` command and return the result.""" + request = commands.absorbance_reader.MeasureAbsorbanceCreate( + params=commands.absorbance_reader.MeasureAbsorbanceParams( + moduleId=module_id, sampleWavelength=wavelength + ) + ) + result = self._transport.execute_command(request=request) + return cast(commands.absorbance_reader.MeasureAbsorbanceResult, result) diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py new file mode 100644 index 000000000000..6f2db320b4f8 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py @@ -0,0 +1,32 @@ +"""Command models for Absorbance Reader commands.""" + +from .initialize import ( + InitializeCommandType, + InitializeParams, + InitializeResult, + Initialize, + InitializeCreate, +) + +from .measure import ( + MeasureAbsorbanceCommandType, + MeasureAbsorbanceParams, + MeasureAbsorbanceResult, + MeasureAbsorbance, + MeasureAbsorbanceCreate, +) + +__all__ = [ + # absorbanace_reader/initialize + "InitializeCommandType", + "InitializeParams", + "InitializeResult", + "Initialize", + "InitializeCreate", + # absorbanace_reader/measure + "MeasureAbsorbanceCommandType", + "MeasureAbsorbanceParams", + "MeasureAbsorbanceResult", + "MeasureAbsorbance", + "MeasureAbsorbanceCreate", +] diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py new file mode 100644 index 000000000000..469732ee9fd9 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py @@ -0,0 +1,81 @@ +"""Command models to initialize an Absorbance Reader.""" +from __future__ import annotations +from typing import Optional, Literal, TYPE_CHECKING +from typing_extensions import Type + +from pydantic import BaseModel, Field + +from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData +from ...errors.error_occurrence import ErrorOccurrence + +if TYPE_CHECKING: + from opentrons.protocol_engine.state import StateView + from opentrons.protocol_engine.execution import EquipmentHandler + + +InitializeCommandType = Literal["absorbanceReader/initialize"] + + +class InitializeParams(BaseModel): + """Input parameters to initialize an absorbance reading.""" + + moduleId: str = Field(..., description="Unique ID of the absorbance reader.") + sampleWavelength: int = Field(..., description="Sample wavelength in nm.") + + +class InitializeResult(BaseModel): + """Result data from initializing an aborbance reading.""" + + +class InitializeImpl( + AbstractCommandImpl[InitializeParams, SuccessData[InitializeResult, None]] +): + """Execution implementation of initializing an Absorbance Reader.""" + + def __init__( + self, + state_view: StateView, + equipment: EquipmentHandler, + **unused_dependencies: object, + ) -> None: + self._state_view = state_view + self._equipment = equipment + + async def execute( + self, params: InitializeParams + ) -> SuccessData[InitializeResult, None]: + """Initiate a single absorbance measurement.""" + abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate( + module_id=params.moduleId + ) + # Allow propagation of ModuleNotAttachedError. + abs_reader = self._equipment.get_module_hardware_api( + abs_reader_substate.module_id + ) + + if abs_reader is not None: + await abs_reader.set_sample_wavelength(wavelength=params.sampleWavelength) + + return SuccessData( + public=InitializeResult(), + private=None, + ) + + +class Initialize(BaseCommand[InitializeParams, InitializeResult, ErrorOccurrence]): + """A command to initialize an Absorbance Reader.""" + + commandType: InitializeCommandType = "absorbanceReader/initialize" + params: InitializeParams + result: Optional[InitializeResult] + + _ImplementationCls: Type[InitializeImpl] = InitializeImpl + + +class InitializeCreate(BaseCommandCreate[InitializeParams]): + """A request to execute an Absorbance Reader measurement.""" + + commandType: InitializeCommandType = "absorbanceReader/initialize" + params: InitializeParams + + _CommandCls: Type[Initialize] = Initialize diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/measure.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/measure.py new file mode 100644 index 000000000000..53b87bd26498 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/measure.py @@ -0,0 +1,94 @@ +"""Command models to measure absorbance.""" +from __future__ import annotations +from typing import List, Optional, TYPE_CHECKING +from typing_extensions import Literal, Type + +from pydantic import BaseModel, Field + +from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData +from ...errors.error_occurrence import ErrorOccurrence + +if TYPE_CHECKING: + from opentrons.protocol_engine.state import StateView + from opentrons.protocol_engine.execution import EquipmentHandler + + +MeasureAbsorbanceCommandType = Literal["absorbanceReader/measure"] + + +class MeasureAbsorbanceParams(BaseModel): + """Input parameters for a single absorbance reading.""" + + moduleId: str = Field(..., description="Unique ID of the Absorbance Reader.") + sampleWavelength: int = Field(..., description="Sample wavelength in nm.") + + +class MeasureAbsorbanceResult(BaseModel): + """Result data from running an aborbance reading.""" + + # TODO: Transform this into a more complex model, such as a map with well names. + data: Optional[List[float]] = Field( + ..., min_items=96, max_items=96, description="Absorbance data points." + ) + + +class MeasureAbsorbanceImpl( + AbstractCommandImpl[ + MeasureAbsorbanceParams, SuccessData[MeasureAbsorbanceResult, None] + ] +): + """Execution implementation of an Absorbance Reader measurement.""" + + def __init__( + self, + state_view: StateView, + equipment: EquipmentHandler, + **unused_dependencies: object, + ) -> None: + self._state_view = state_view + self._equipment = equipment + + async def execute( + self, params: MeasureAbsorbanceParams + ) -> SuccessData[MeasureAbsorbanceResult, None]: + """Initiate a single absorbance measurement.""" + abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate( + module_id=params.moduleId + ) + # Allow propagation of ModuleNotAttachedError. + abs_reader = self._equipment.get_module_hardware_api( + abs_reader_substate.module_id + ) + + if abs_reader is not None: + result = await abs_reader.start_measure(wavelength=params.sampleWavelength) + return SuccessData( + public=MeasureAbsorbanceResult(data=result), + private=None, + ) + + return SuccessData( + public=MeasureAbsorbanceResult(data=None), + private=None, + ) + + +class MeasureAbsorbance( + BaseCommand[MeasureAbsorbanceParams, MeasureAbsorbanceResult, ErrorOccurrence] +): + """A command to execute an Absorbance Reader measurement.""" + + commandType: MeasureAbsorbanceCommandType = "absorbanceReader/measure" + params: MeasureAbsorbanceParams + result: Optional[MeasureAbsorbanceResult] + + _ImplementationCls: Type[MeasureAbsorbanceImpl] = MeasureAbsorbanceImpl + + +class MeasureAbsorbanceCreate(BaseCommandCreate[MeasureAbsorbanceParams]): + """A request to execute an Absorbance Reader measurement.""" + + commandType: MeasureAbsorbanceCommandType = "absorbanceReader/measure" + params: MeasureAbsorbanceParams + + _CommandCls: Type[MeasureAbsorbance] = MeasureAbsorbance diff --git a/api/src/opentrons/protocol_engine/commands/command_unions.py b/api/src/opentrons/protocol_engine/commands/command_unions.py index 362b2eb0a02b..6544b9a8c56b 100644 --- a/api/src/opentrons/protocol_engine/commands/command_unions.py +++ b/api/src/opentrons/protocol_engine/commands/command_unions.py @@ -8,6 +8,7 @@ from .command import DefinedErrorData from .pipetting_common import OverpressureError, OverpressureErrorInternalData +from . import absorbance_reader from . import heater_shaker from . import magnetic_module from . import temperature_module @@ -358,6 +359,8 @@ thermocycler.OpenLid, thermocycler.CloseLid, thermocycler.RunProfile, + absorbance_reader.Initialize, + absorbance_reader.MeasureAbsorbance, calibration.CalibrateGripper, calibration.CalibratePipette, calibration.CalibrateModule, @@ -424,6 +427,8 @@ thermocycler.CloseLidParams, thermocycler.RunProfileParams, thermocycler.RunProfileStepParams, + absorbance_reader.InitializeParams, + absorbance_reader.MeasureAbsorbanceParams, calibration.CalibrateGripperParams, calibration.CalibratePipetteParams, calibration.CalibrateModuleParams, @@ -487,6 +492,8 @@ thermocycler.OpenLidCommandType, thermocycler.CloseLidCommandType, thermocycler.RunProfileCommandType, + absorbance_reader.InitializeCommandType, + absorbance_reader.MeasureAbsorbanceCommandType, calibration.CalibrateGripperCommandType, calibration.CalibratePipetteCommandType, calibration.CalibrateModuleCommandType, @@ -551,6 +558,8 @@ thermocycler.OpenLidCreate, thermocycler.CloseLidCreate, thermocycler.RunProfileCreate, + absorbance_reader.InitializeCreate, + absorbance_reader.MeasureAbsorbanceCreate, calibration.CalibrateGripperCreate, calibration.CalibratePipetteCreate, calibration.CalibrateModuleCreate, @@ -616,6 +625,8 @@ thermocycler.OpenLidResult, thermocycler.CloseLidResult, thermocycler.RunProfileResult, + absorbance_reader.InitializeResult, + absorbance_reader.MeasureAbsorbanceResult, calibration.CalibrateGripperResult, calibration.CalibratePipetteResult, calibration.CalibrateModuleResult, diff --git a/api/src/opentrons/protocol_engine/execution/equipment.py b/api/src/opentrons/protocol_engine/execution/equipment.py index 7dc2f3bcfaaf..d41894a4cb21 100644 --- a/api/src/opentrons/protocol_engine/execution/equipment.py +++ b/api/src/opentrons/protocol_engine/execution/equipment.py @@ -14,6 +14,7 @@ HeaterShaker, TempDeck, Thermocycler, + AbsorbanceReader, ) from opentrons.hardware_control.nozzle_manager import NozzleMap from opentrons.protocol_engine.state.module_substates import ( @@ -21,6 +22,7 @@ HeaterShakerModuleId, TemperatureModuleId, ThermocyclerModuleId, + AbsorbanceReaderId, ) from ..errors import ( FailedToLoadPipetteError, @@ -488,6 +490,13 @@ def get_module_hardware_api( ) -> Optional[Thermocycler]: ... + @overload + def get_module_hardware_api( + self, + module_id: AbsorbanceReaderId, + ) -> Optional[AbsorbanceReader]: + ... + def get_module_hardware_api(self, module_id: str) -> Optional[AbstractModule]: """Get the hardware API for a given module.""" use_virtual_modules = self._state_store.config.use_virtual_modules diff --git a/api/src/opentrons/protocol_engine/state/module_substates/__init__.py b/api/src/opentrons/protocol_engine/state/module_substates/__init__.py index 2e9b18ba17ba..3865982612be 100644 --- a/api/src/opentrons/protocol_engine/state/module_substates/__init__.py +++ b/api/src/opentrons/protocol_engine/state/module_substates/__init__.py @@ -12,7 +12,7 @@ ThermocyclerModuleId, ) from .magnetic_block_substate import MagneticBlockSubState, MagneticBlockId - +from .absorbance_reader_substate import AbsorbanceReaderSubState, AbsorbanceReaderId ModuleSubStateType = Union[ HeaterShakerModuleSubState, @@ -20,6 +20,7 @@ TemperatureModuleSubState, ThermocyclerModuleSubState, MagneticBlockSubState, + AbsorbanceReaderSubState, ] __all__ = [ @@ -33,6 +34,8 @@ "ThermocyclerModuleId", "MagneticBlockSubState", "MagneticBlockId", + "AbsorbanceReaderSubState", + "AbsorbanceReaderId", # Union of all module substates "ModuleSubStateType", ] diff --git a/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py index f694f798a71e..03daa32e1479 100644 --- a/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +++ b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py @@ -1,6 +1,6 @@ """Heater-Shaker Module sub-state.""" from dataclasses import dataclass -from typing import List, NewType, Optional +from typing import NewType, Optional, List AbsorbanceReaderId = NewType("AbsorbanceReaderId", str) @@ -11,10 +11,7 @@ class AbsorbanceReaderSubState: """Absorbance-Plate-Reader-specific state.""" module_id: AbsorbanceReaderId - initialized: bool - is_lid_open: bool - is_loaded: bool - is_measuring: bool - temperature: float - sample_wavelength: Optional[int] - supported_wavelengths: Optional[List[int]] + configured: bool + measured: bool + data: Optional[List[float]] + configured_wavelength: Optional[int] diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index 0e79dd53cf25..49794ce329df 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -54,6 +54,7 @@ heater_shaker, temperature_module, thermocycler, + absorbance_reader, ) from ..actions import Action, SucceedCommandAction, AddModuleAction from .abstract_store import HasState, HandlesActions @@ -62,10 +63,12 @@ HeaterShakerModuleSubState, TemperatureModuleSubState, ThermocyclerModuleSubState, + AbsorbanceReaderSubState, MagneticModuleId, HeaterShakerModuleId, TemperatureModuleId, ThermocyclerModuleId, + AbsorbanceReaderId, MagneticBlockSubState, MagneticBlockId, ModuleSubStateType, @@ -263,6 +266,15 @@ def _handle_command(self, command: Command) -> None: ): self._handle_thermocycler_module_commands(command) + if isinstance( + command.result, + ( + absorbance_reader.InitializeResult, + absorbance_reader.MeasureAbsorbanceResult, + ), + ): + self._handle_absorbance_reader_commands(command) + def _add_module_substate( self, module_id: str, @@ -321,6 +333,14 @@ def _add_module_substate( self._state.substate_by_module_id[module_id] = MagneticBlockSubState( module_id=MagneticBlockId(module_id) ) + elif ModuleModel.is_absorbance_reader(actual_model): + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=False, + measured=False, + data=None, + configured_wavelength=None, + ) def _update_additional_slots_occupied_by_thermocycler( self, @@ -509,6 +529,40 @@ def _handle_thermocycler_module_commands( target_lid_temperature=lid_temperature, ) + def _handle_absorbance_reader_commands( + self, + command: Union[ + absorbance_reader.Initialize, + absorbance_reader.MeasureAbsorbance, + ], + ) -> None: + module_id = command.params.moduleId + absorbance_reader_substate = self._state.substate_by_module_id[module_id] + assert isinstance( + absorbance_reader_substate, AbsorbanceReaderSubState + ), f"{module_id} is not an absorbance plate reader." + + # Get current values + configured = absorbance_reader_substate.configured + configured_wavelength = absorbance_reader_substate.configured_wavelength + + if isinstance(command.result, absorbance_reader.InitializeResult): + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=True, + measured=False, + data=None, + configured_wavelength=command.params.sampleWavelength, + ) + elif isinstance(command.result, absorbance_reader.MeasureAbsorbanceResult): + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=configured, + configured_wavelength=configured_wavelength, + measured=True, + data=command.result.data, + ) + class ModuleView(HasState[ModuleState]): """Read-only view of computed module state.""" @@ -644,6 +698,22 @@ def get_thermocycler_module_substate( expected_name="Thermocycler Module", ) + def get_absorbance_reader_substate( + self, module_id: str + ) -> AbsorbanceReaderSubState: + """Return a `AbsorbanceReaderSubState` for the given Absorbance Reader. + + Raises: + ModuleNotLoadedError: If module_id has not been loaded. + WrongModuleTypeError: If module_id has been loaded, + but it's not an Absorbance Reader. + """ + return self._get_module_substate( + module_id=module_id, + expected_type=AbsorbanceReaderSubState, + expected_name="Thermocycler Module", + ) + def get_location(self, module_id: str) -> DeckSlotLocation: """Get the slot location of the given module.""" location = self.get(module_id).location @@ -1187,6 +1257,14 @@ def ensure_and_convert_module_fixture_location( ] elif model == ModuleModel.THERMOCYCLER_MODULE_V2: return "thermocyclerModuleV2" + elif model == ModuleModel.ABSORBANCE_READER_V1: + valid_slots = ["A3", "B3", "C3", "D3"] + addressable_areas = [ + "absorbanceReaderV1A3", + "absorbanceReaderV1B3", + "absorbanceReaderV1C3", + "absorbanceReaderV1D3", + ] else: raise ValueError( f"Unknown module {model.name} has no addressable areas to provide." diff --git a/api/src/opentrons/protocol_engine/types.py b/api/src/opentrons/protocol_engine/types.py index 26c9a3d82ddc..abad53efed16 100644 --- a/api/src/opentrons/protocol_engine/types.py +++ b/api/src/opentrons/protocol_engine/types.py @@ -314,6 +314,7 @@ class ModuleModel(str, Enum): THERMOCYCLER_MODULE_V2 = "thermocyclerModuleV2" HEATER_SHAKER_MODULE_V1 = "heaterShakerModuleV1" MAGNETIC_BLOCK_V1 = "magneticBlockV1" + ABSORBANCE_READER_V1 = "absorbanceReaderV1" def as_type(self) -> ModuleType: """Get the ModuleType of this model.""" @@ -327,6 +328,8 @@ def as_type(self) -> ModuleType: return ModuleType.HEATER_SHAKER elif ModuleModel.is_magnetic_block(self): return ModuleType.MAGNETIC_BLOCK + elif ModuleModel.is_absorbance_reader(self): + return ModuleType.ABSORBANCE_READER assert False, f"Invalid ModuleModel {self}" @@ -363,6 +366,13 @@ def is_magnetic_block(cls, model: ModuleModel) -> TypeGuard[MagneticBlockModel]: """Whether a given model is a Magnetic block.""" return model == cls.MAGNETIC_BLOCK_V1 + @classmethod + def is_absorbance_reader( + cls, model: ModuleModel + ) -> TypeGuard[AbsorbanceReaderModel]: + """Whether a given model is an Absorbance Plate Reader.""" + return model == cls.ABSORBANCE_READER_V1 + TemperatureModuleModel = Literal[ ModuleModel.TEMPERATURE_MODULE_V1, ModuleModel.TEMPERATURE_MODULE_V2 @@ -375,6 +385,7 @@ def is_magnetic_block(cls, model: ModuleModel) -> TypeGuard[MagneticBlockModel]: ] HeaterShakerModuleModel = Literal[ModuleModel.HEATER_SHAKER_MODULE_V1] MagneticBlockModel = Literal[ModuleModel.MAGNETIC_BLOCK_V1] +AbsorbanceReaderModel = Literal[ModuleModel.ABSORBANCE_READER_V1] class ModuleDimensions(BaseModel): @@ -729,6 +740,7 @@ class AreaType(Enum): HEATER_SHAKER = "heaterShaker" TEMPERATURE = "temperatureModule" MAGNETICBLOCK = "magneticBlock" + ABSORBANCE_READER = "absorbanceReader" @dataclass(frozen=True) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py b/api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py new file mode 100644 index 000000000000..6d03af9e4582 --- /dev/null +++ b/api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py @@ -0,0 +1,96 @@ +"""Tests for the engine based Protocol API module core implementations.""" +import pytest +from decoy import Decoy + +from opentrons.hardware_control import SynchronousAdapter +from opentrons.hardware_control.modules import AbsorbanceReader +from opentrons.hardware_control.modules.types import ( + ModuleType, +) +from opentrons.protocol_engine.clients import SyncClient as EngineClient +from opentrons.protocol_api.core.engine.module_core import AbsorbanceReaderCore +from opentrons.protocol_api import MAX_SUPPORTED_VERSION + +SyncAbsorbanceReaderHardware = SynchronousAdapter[AbsorbanceReader] + + +@pytest.fixture +def mock_engine_client(decoy: Decoy) -> EngineClient: + """Get a mock ProtocolEngine synchronous client.""" + return decoy.mock(cls=EngineClient) + + +@pytest.fixture +def mock_sync_module_hardware(decoy: Decoy) -> SyncAbsorbanceReaderHardware: + """Get a mock synchronous module hardware.""" + return decoy.mock(name="SyncAbsorbanceReaderHardware") # type: ignore[no-any-return] + + +@pytest.fixture +def subject( + mock_engine_client: EngineClient, + mock_sync_module_hardware: SyncAbsorbanceReaderHardware, +) -> AbsorbanceReaderCore: + """Get a AbsorbanceReaderCore test subject.""" + return AbsorbanceReaderCore( + module_id="1234", + engine_client=mock_engine_client, + api_version=MAX_SUPPORTED_VERSION, + sync_module_hardware=mock_sync_module_hardware, + ) + + +def test_create( + decoy: Decoy, + mock_engine_client: EngineClient, + mock_sync_module_hardware: SyncAbsorbanceReaderHardware, +) -> None: + """It should be able to create an absorbance plate reader module core.""" + result = AbsorbanceReaderCore( + module_id="1234", + engine_client=mock_engine_client, + api_version=MAX_SUPPORTED_VERSION, + sync_module_hardware=mock_sync_module_hardware, + ) + + assert result.module_id == "1234" + assert result.MODULE_TYPE == ModuleType.ABSORBANCE_READER + + +def test_initialize( + decoy: Decoy, mock_engine_client: EngineClient, subject: AbsorbanceReaderCore +) -> None: + """It should set the sample wavelength with the engine client.""" + subject.initialize(wavelength=123) + + decoy.verify( + mock_engine_client.absorbance_reader_initialize( + module_id="1234", wavelength=123 + ), + times=1, + ) + assert subject._initialized_value == 123 + + +def test_initiate_read( + decoy: Decoy, mock_engine_client: EngineClient, subject: AbsorbanceReaderCore +) -> None: + """It should call absorbance reader to read with the engine client.""" + subject._initialized_value = 123 + subject.initiate_read() + + decoy.verify( + mock_engine_client.absorbance_reader_measure(module_id="1234", wavelength=123), + times=1, + ) + + +def test_get_serial_number( + decoy: Decoy, subject: AbsorbanceReaderCore, mock_engine_client: EngineClient +) -> None: + """It should return a serial number.""" + decoy.when(mock_engine_client.state.modules.get_serial_number("1234")).then_return( + "abc" + ) + + assert subject.get_serial_number() == "abc" diff --git a/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py b/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py new file mode 100644 index 000000000000..132e6d1cae63 --- /dev/null +++ b/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py @@ -0,0 +1,66 @@ +"""Tests for Protocol API absorbance plate reader contexts.""" +import pytest +from decoy import Decoy + +from opentrons.legacy_broker import LegacyBroker +from opentrons.protocols.api_support.types import APIVersion +from opentrons.protocol_api import MAX_SUPPORTED_VERSION, AbsorbanceReaderContext +from opentrons.protocol_api.core.common import ProtocolCore, AbsorbanceReaderCore +from opentrons.protocol_api.core.core_map import LoadedCoreMap + + +@pytest.fixture +def mock_core(decoy: Decoy) -> AbsorbanceReaderCore: + """Get a mock module implementation core.""" + return decoy.mock(cls=AbsorbanceReaderCore) + + +@pytest.fixture +def mock_protocol_core(decoy: Decoy) -> ProtocolCore: + """Get a mock protocol implementation core.""" + return decoy.mock(cls=ProtocolCore) + + +@pytest.fixture +def mock_core_map(decoy: Decoy) -> LoadedCoreMap: + """Get a mock LoadedCoreMap.""" + return decoy.mock(cls=LoadedCoreMap) + + +@pytest.fixture +def mock_broker(decoy: Decoy) -> LegacyBroker: + """Get a mock command message broker.""" + return decoy.mock(cls=LegacyBroker) + + +@pytest.fixture +def api_version() -> APIVersion: + """Get an API version to apply to the interface.""" + return MAX_SUPPORTED_VERSION + + +@pytest.fixture +def subject( + api_version: APIVersion, + mock_core: AbsorbanceReaderCore, + mock_protocol_core: ProtocolCore, + mock_core_map: LoadedCoreMap, + mock_broker: LegacyBroker, +) -> AbsorbanceReaderContext: + """Get an absorbance reader context with its dependencies mocked out.""" + return AbsorbanceReaderContext( + core=mock_core, + protocol_core=mock_protocol_core, + core_map=mock_core_map, + broker=mock_broker, + api_version=api_version, + ) + + +def test_get_serial_number( + decoy: Decoy, mock_core: AbsorbanceReaderCore, subject: AbsorbanceReaderContext +) -> None: + """It should get the serial number from the core.""" + decoy.when(mock_core.get_serial_number()).then_return("12345") + result = subject.serial_number + assert result == "12345" diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_module.py b/api/tests/opentrons/protocol_engine/commands/test_load_module.py index 88a43d6e5573..9f5692b53b0f 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_module.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_module.py @@ -152,6 +152,62 @@ async def test_load_module_implementation_mag_block( ) +async def test_load_module_implementation_abs_reader( + decoy: Decoy, + equipment: EquipmentHandler, + state_view: StateView, + abs_reader_v1_def: ModuleDefinition, +) -> None: + """A loadModule command for abs reader should have an execution implementation.""" + subject = LoadModuleImplementation(equipment=equipment, state_view=state_view) + + data = LoadModuleParams( + model=ModuleModel.ABSORBANCE_READER_V1, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_D3), + moduleId="some-id", + ) + + deck_def = load_deck(STANDARD_OT3_DECK, 5) + + decoy.when(state_view.addressable_areas.state.deck_definition).then_return(deck_def) + decoy.when( + state_view.addressable_areas.get_cutout_id_by_deck_slot_name( + DeckSlotName.SLOT_D3 + ) + ).then_return("cutout" + DeckSlotName.SLOT_D3.value) + + decoy.when( + state_view.geometry.ensure_location_not_occupied( + DeckSlotLocation(slotName=DeckSlotName.SLOT_D3) + ) + ).then_return(DeckSlotLocation(slotName=DeckSlotName.SLOT_D3)) + + decoy.when( + await equipment.load_module( + model=ModuleModel.ABSORBANCE_READER_V1, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_D3), + module_id="some-id", + ) + ).then_return( + LoadedModuleData( + module_id="module-id", + serial_number=None, + definition=abs_reader_v1_def, + ) + ) + + result = await subject.execute(data) + assert result == SuccessData( + public=LoadModuleResult( + moduleId="module-id", + serialNumber=None, + model=ModuleModel.ABSORBANCE_READER_V1, + definition=abs_reader_v1_def, + ), + private=None, + ) + + async def test_load_module_raises_if_location_occupied( decoy: Decoy, equipment: EquipmentHandler, diff --git a/api/tests/opentrons/protocol_engine/conftest.py b/api/tests/opentrons/protocol_engine/conftest.py index ab23f7e9e088..df02b53ce382 100644 --- a/api/tests/opentrons/protocol_engine/conftest.py +++ b/api/tests/opentrons/protocol_engine/conftest.py @@ -212,6 +212,13 @@ def mag_block_v1_def() -> ModuleDefinition: return ModuleDefinition.parse_raw(definition) +@pytest.fixture(scope="session") +def abs_reader_v1_def() -> ModuleDefinition: + """Get the definition of a V1 absorbance plate reader.""" + definition = load_shared_data("module/definitions/3/absorbanceReaderV1.json") + return ModuleDefinition.parse_raw(definition) + + @pytest.fixture(scope="session") def supported_tip_fixture() -> pipette_definition.SupportedTipsDefinition: """Get a mock supported tip definition.""" diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx index e61a3c76eddc..501d1c246708 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx @@ -22,6 +22,9 @@ import { import { getCutoutDisplayName, getFixtureDisplayName, + ABSORBANCE_READER_CUTOUTS, + ABSORBANCE_READER_V1, + ABSORBANCE_READER_V1_FIXTURE, HEATER_SHAKER_CUTOUTS, HEATERSHAKER_MODULE_V1, HEATERSHAKER_MODULE_V1_FIXTURE, @@ -227,6 +230,24 @@ export function AddFixtureModal({ ...unconfiguredTemperatureModules, ] } + if ( + ABSORBANCE_READER_CUTOUTS.includes(cutoutId) && + unconfiguredMods.some(m => m.moduleModel === ABSORBANCE_READER_V1) + ) { + const unconfiguredAbsorbanceReaders = unconfiguredMods + .filter(mod => mod.moduleModel === ABSORBANCE_READER_V1) + .map(mod => [ + { + cutoutId, + cutoutFixtureId: ABSORBANCE_READER_V1_FIXTURE, + opentronsModuleSerialNumber: mod.serialNumber, + }, + ]) + availableOptions = [ + ...availableOptions, + ...unconfiguredAbsorbanceReaders, + ] + } } } else if (optionStage === 'wasteChuteOptions') { availableOptions = WASTE_CHUTE_FIXTURES.map(fixture => [ diff --git a/app/src/organisms/ModuleCard/AbsorbanceReaderData.tsx b/app/src/organisms/ModuleCard/AbsorbanceReaderData.tsx new file mode 100644 index 000000000000..8bcb496e7fa2 --- /dev/null +++ b/app/src/organisms/ModuleCard/AbsorbanceReaderData.tsx @@ -0,0 +1,28 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { TYPOGRAPHY, StyledText } from '@opentrons/components' +import type { AbsorbanceReaderModule } from '../../redux/modules/types' + +interface AbsorbanceReaderProps { + moduleData: AbsorbanceReaderModule['data'] +} + +export const AbsorbanceReaderData = ( + props: AbsorbanceReaderProps +): JSX.Element | null => { + const { moduleData } = props + const { t } = useTranslation('device_details') + + return ( + <> + + {t('abs_reader_status', { + status: moduleData.status, + })} + + + ) +} diff --git a/app/src/organisms/ModuleCard/AbsorbanceReaderSlideout.tsx b/app/src/organisms/ModuleCard/AbsorbanceReaderSlideout.tsx new file mode 100644 index 000000000000..1224357435cf --- /dev/null +++ b/app/src/organisms/ModuleCard/AbsorbanceReaderSlideout.tsx @@ -0,0 +1,44 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { getModuleDisplayName } from '@opentrons/shared-data' +import { SPACING, StyledText, TYPOGRAPHY } from '@opentrons/components' +import { Slideout } from '../../atoms/Slideout' + +import type { AbsorbanceReaderModule } from '../../redux/modules/types' + +interface AbsorbanceReaderSlideoutProps { + module: AbsorbanceReaderModule + onCloseClick: () => unknown + isExpanded: boolean +} + +export const AbsorbanceReaderSlideout = ( + props: AbsorbanceReaderSlideoutProps +): JSX.Element | null => { + const { module, onCloseClick, isExpanded } = props + const { t } = useTranslation('device_details') + const moduleName = getModuleDisplayName(module.moduleModel) + + const handleCloseSlideout = (): void => { + onCloseClick() + } + + return ( + + + {t('set_absorbance_reader')} + + + ) +} diff --git a/app/src/organisms/ModuleCard/hooks.tsx b/app/src/organisms/ModuleCard/hooks.tsx index 3c9d3dce6c3d..5f515b75a8df 100644 --- a/app/src/organisms/ModuleCard/hooks.tsx +++ b/app/src/organisms/ModuleCard/hooks.tsx @@ -349,6 +349,7 @@ export function useModuleOverflowMenu( }, }, ], + absorbanceReaderType: [], } return { diff --git a/app/src/organisms/ModuleCard/index.tsx b/app/src/organisms/ModuleCard/index.tsx index 945b9857b8f6..eac70fc46281 100644 --- a/app/src/organisms/ModuleCard/index.tsx +++ b/app/src/organisms/ModuleCard/index.tsx @@ -26,6 +26,7 @@ import { TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, MODULE_MODELS_OT2_ONLY, + ABSORBANCE_READER_TYPE, } from '@opentrons/shared-data' import { RUN_STATUS_FINISHING, RUN_STATUS_RUNNING } from '@opentrons/api-client' @@ -74,6 +75,8 @@ import type { } from '../../redux/modules/types' import type { State, Dispatch } from '../../redux/types' import type { RequestState } from '../../redux/robot-api/types' +import { AbsorbanceReaderData } from './AbsorbanceReaderData' +import { AbsorbanceReaderSlideout } from './AbsorbanceReaderSlideout' interface ModuleCardProps { module: AttachedModule @@ -210,6 +213,12 @@ export const ModuleCard = (props: ModuleCardProps): JSX.Element | null => { showTemperatureData={true} /> ) + break + } + + case 'absorbanceReaderType': { + moduleData = + break } } @@ -526,6 +535,14 @@ const ModuleSlideout = (props: ModuleSlideoutProps): JSX.Element => { isExpanded={showSlideout} /> ) + } else if (module.moduleType === ABSORBANCE_READER_TYPE) { + return ( + + ) } else { return ( void + selected?: boolean +} + +const ABSORBANCE_READER_FIXTURE_DISPLAY_NAME = 'Absorbance Reader' + +export function AbsorbanceReaderFixture( + props: AbsorbanceReaderFixtureProps +): JSX.Element { + const { + deckDefinition, + handleClickRemove, + fixtureLocation, + cutoutFixtureId, + selected = false, + } = props + + const cutoutDef = deckDefinition.locations.cutouts.find( + cutout => cutout.id === fixtureLocation + ) + + /** + * deck definition cutout position is the position of the single slot located within that cutout + * so, to get the position of the cutout itself we must add an adjustment to the slot position + * the adjustment for x is different for right side/left side + */ + // TODO (AA): fix the slot length for the absorbance reader fixture + const [xSlotPosition = 0, ySlotPosition = 0] = cutoutDef?.position ?? [] + + const x = xSlotPosition + COLUMN_3_X_ADJUSTMENT + + const y = ySlotPosition + Y_ADJUSTMENT + + const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE + return ( + + { + handleClickRemove(fixtureLocation, cutoutFixtureId) + } + : () => {} + } + > + + {ABSORBANCE_READER_FIXTURE_DISPLAY_NAME} + + {handleClickRemove != null ? ( + + ) : null} + + + ) +} diff --git a/components/src/hardware-sim/DeckConfigurator/index.tsx b/components/src/hardware-sim/DeckConfigurator/index.tsx index 67e9f972e25e..9f1a9506a2f0 100644 --- a/components/src/hardware-sim/DeckConfigurator/index.tsx +++ b/components/src/hardware-sim/DeckConfigurator/index.tsx @@ -12,6 +12,7 @@ import { HEATERSHAKER_MODULE_V1_FIXTURE, TEMPERATURE_MODULE_V2_FIXTURE, MAGNETIC_BLOCK_V1_FIXTURE, + ABSORBANCE_READER_V1_FIXTURE, STAGING_AREA_SLOT_WITH_MAGNETIC_BLOCK_V1_FIXTURE, } from '@opentrons/shared-data' @@ -34,6 +35,7 @@ import { TemperatureModuleFixture } from './TemperatureModuleFixture' import { HeaterShakerFixture } from './HeaterShakerFixture' import { MagneticBlockFixture } from './MagneticBlockFixture' import { ThermocyclerFixture } from './ThermocyclerFixture' +import { AbsorbanceReaderFixture } from './AbsorbanceReaderFixture' interface DeckConfiguratorProps { deckConfig: DeckConfiguration @@ -105,6 +107,9 @@ export function DeckConfigurator(props: DeckConfiguratorProps): JSX.Element { STAGING_AREA_SLOT_WITH_MAGNETIC_BLOCK_V1_FIXTURE, ] as CutoutFixtureId[]).includes(cutoutFixtureId) ) + const absorbanceReaderFixtures = deckConfig.filter( + ({ cutoutFixtureId }) => cutoutFixtureId === ABSORBANCE_READER_V1_FIXTURE + ) return ( ))} + {absorbanceReaderFixtures.map(({ cutoutId, cutoutFixtureId }) => ( + + ))} {additionalStaticFixtures?.map(staticFixture => ( module.type) : [] @@ -208,16 +214,16 @@ function FlexModuleFields(props: WizardTileProps): JSX.Element { modules, trashType: 'trashBin', }) - React.useEffect(() => { if (trashBinDisabled) { setValue('additionalEquipment', without(additionalEquipment, 'trashBin')) } }, [trashBinDisabled, setValue]) - return ( - {FLEX_SUPPORTED_MODULE_MODELS.map(moduleModel => { + {FLEX_SUPPORTED_MODULE_MODELS.filter(moduleModel => + enableAbsorbanceReader ? true : moduleModel !== 'absorbanceReaderV1' + ).map(moduleModel => { const moduleType = getModuleType(moduleModel) const isModuleOnDeck = moduleTypesOnDeck.includes(moduleType) diff --git a/protocol-designer/src/components/modules/EditModulesCard.tsx b/protocol-designer/src/components/modules/EditModulesCard.tsx index f1507f01f148..c64ff4632e6e 100644 --- a/protocol-designer/src/components/modules/EditModulesCard.tsx +++ b/protocol-designer/src/components/modules/EditModulesCard.tsx @@ -83,6 +83,9 @@ export function EditModulesCard(props: Props): JSX.Element { const moduleRestrictionsDisabled = Boolean( useSelector(featureFlagSelectors.getDisableModuleRestrictions) ) + const enableAbsorbanceReader = Boolean( + useSelector(featureFlagSelectors.getEnableAbsorbanceReader) + ) const showHeaterShakerPipetteCollisions = isHeaterShakerOnDeck && @@ -99,6 +102,8 @@ export function EditModulesCard(props: Props): JSX.Element { isFlex ? moduleType !== 'magneticModuleType' : moduleType !== 'magneticBlockType' + ).filter(moduleType => + enableAbsorbanceReader ? true : moduleType !== 'absorbanceReaderType' ) const handleDeleteStagingAreas = (): void => { diff --git a/protocol-designer/src/components/modules/ModuleDiagram.tsx b/protocol-designer/src/components/modules/ModuleDiagram.tsx index 297ed5ce29d7..3763e4679613 100644 --- a/protocol-designer/src/components/modules/ModuleDiagram.tsx +++ b/protocol-designer/src/components/modules/ModuleDiagram.tsx @@ -14,6 +14,8 @@ import { THERMOCYCLER_MODULE_V2, MAGNETIC_BLOCK_TYPE, MAGNETIC_BLOCK_V1, + ABSORBANCE_READER_TYPE, + ABSORBANCE_READER_V1, } from '@opentrons/shared-data' import magdeck_gen1 from '../../images/modules/magdeck_gen1.png' @@ -56,6 +58,10 @@ const MODULE_IMG_BY_TYPE: ModuleImg = { [MAGNETIC_BLOCK_TYPE]: { [MAGNETIC_BLOCK_V1]: mag_block, }, + [ABSORBANCE_READER_TYPE]: { + // TODO (AA): update absorbance reader image + [ABSORBANCE_READER_V1]: heater_shaker_module_transparent, + }, } export function ModuleDiagram(props: Props): JSX.Element { diff --git a/protocol-designer/src/constants.ts b/protocol-designer/src/constants.ts index 6c0c2db38163..b28f6ebee354 100644 --- a/protocol-designer/src/constants.ts +++ b/protocol-designer/src/constants.ts @@ -13,6 +13,8 @@ import { THERMOCYCLER_MODULE_V2, MAGNETIC_BLOCK_TYPE, MAGNETIC_BLOCK_V1, + ABSORBANCE_READER_TYPE, + ABSORBANCE_READER_V1, } from '@opentrons/shared-data' import type { LabwareDefinition2, @@ -138,6 +140,12 @@ export const MODELS_FOR_MODULE_TYPE: Record< value: MAGNETIC_BLOCK_V1, }, ], + [ABSORBANCE_READER_TYPE]: [ + { + name: 'GEN1', + value: ABSORBANCE_READER_V1, + }, + ], } export const DEFAULT_MODEL_FOR_MODULE_TYPE: Record = { @@ -146,6 +154,7 @@ export const DEFAULT_MODEL_FOR_MODULE_TYPE: Record = { [THERMOCYCLER_MODULE_TYPE]: THERMOCYCLER_MODULE_V2, [HEATERSHAKER_MODULE_TYPE]: HEATERSHAKER_MODULE_V1, [MAGNETIC_BLOCK_TYPE]: MAGNETIC_BLOCK_V1, + [ABSORBANCE_READER_TYPE]: ABSORBANCE_READER_V1, } // Values for pauseAction field export const PAUSE_UNTIL_RESUME: 'untilResume' = 'untilResume' diff --git a/protocol-designer/src/feature-flags/reducers.ts b/protocol-designer/src/feature-flags/reducers.ts index 3220828e0c61..3e60f923a081 100644 --- a/protocol-designer/src/feature-flags/reducers.ts +++ b/protocol-designer/src/feature-flags/reducers.ts @@ -23,6 +23,8 @@ const initialFlags: Flags = { process.env.OT_PD_DISABLE_MODULE_RESTRICTIONS === '1' || false, OT_PD_ALLOW_ALL_TIPRACKS: process.env.OT_PD_ALLOW_ALL_TIPRACKS === '1' || false, + OT_PD_ENABLE_ABSORBANCE_READER: + process.env.OT_PD_ENABLE_ABSORBANCE_READER === '1' || false, } // @ts-expect-error(sa, 2021-6-10): cannot use string literals as action type // TODO IMMEDIATELY: refactor this to the old fashioned way if we cannot have type safety: https://github.com/redux-utilities/redux-actions/issues/282#issuecomment-595163081 diff --git a/protocol-designer/src/feature-flags/selectors.ts b/protocol-designer/src/feature-flags/selectors.ts index 82b846c0da1f..fe18b33fb490 100644 --- a/protocol-designer/src/feature-flags/selectors.ts +++ b/protocol-designer/src/feature-flags/selectors.ts @@ -19,3 +19,7 @@ export const getAllowAllTipracks: Selector = createSelector( getFeatureFlagData, flags => flags.OT_PD_ALLOW_ALL_TIPRACKS ?? false ) +export const getEnableAbsorbanceReader: Selector = createSelector( + getFeatureFlagData, + flags => flags.OT_PD_ENABLE_ABSORBANCE_READER ?? false +) diff --git a/protocol-designer/src/feature-flags/types.ts b/protocol-designer/src/feature-flags/types.ts index 7a9c04b5af92..5f2ade969d73 100644 --- a/protocol-designer/src/feature-flags/types.ts +++ b/protocol-designer/src/feature-flags/types.ts @@ -30,10 +30,15 @@ export type FlagTypes = | 'PRERELEASE_MODE' | 'OT_PD_DISABLE_MODULE_RESTRICTIONS' | 'OT_PD_ALLOW_ALL_TIPRACKS' + | 'OT_PD_ENABLE_ABSORBANCE_READER' // flags that are not in this list only show in prerelease mode export const userFacingFlags: FlagTypes[] = [ 'OT_PD_DISABLE_MODULE_RESTRICTIONS', 'OT_PD_ALLOW_ALL_TIPRACKS', ] -export const allFlags: FlagTypes[] = [...userFacingFlags, 'PRERELEASE_MODE'] +export const allFlags: FlagTypes[] = [ + ...userFacingFlags, + 'PRERELEASE_MODE', + 'OT_PD_ENABLE_ABSORBANCE_READER', +] export type Flags = Partial> diff --git a/protocol-designer/src/localization/en/feature_flags.json b/protocol-designer/src/localization/en/feature_flags.json index 7f2f9883bbdc..4902fa784d7e 100644 --- a/protocol-designer/src/localization/en/feature_flags.json +++ b/protocol-designer/src/localization/en/feature_flags.json @@ -11,5 +11,9 @@ "OT_PD_ALLOW_ALL_TIPRACKS": { "title": "Allow all tip rack options", "description": "Enable selection of all tip racks for each pipette." + }, + "OT_PD_ENABLE_ABSORBANCE_READER": { + "title": "Enable absorbance plate reader", + "description": "Enable absorbance plate reader support." } } diff --git a/protocol-designer/src/localization/en/modules.json b/protocol-designer/src/localization/en/modules.json index 0f7911f45c42..9774e98a3393 100644 --- a/protocol-designer/src/localization/en/modules.json +++ b/protocol-designer/src/localization/en/modules.json @@ -13,14 +13,16 @@ "magneticModuleType": "Magnetic", "thermocyclerModuleType": "Thermocycler", "heaterShakerModuleType": "Heater-Shaker", - "magneticBlockType": "Magnetic Block" + "magneticBlockType": "Magnetic Block", + "absorbanceReaderType": "Absorbance Plate Reader" }, "module_long_names": { "temperatureModuleType": "Temperature module", "magneticModuleType": "Magnetic module", "thermocyclerModuleType": "Thermocycler module", "heaterShakerModuleType": "Heater-Shaker module", - "magneticBlockType": "Magnetic block" + "magneticBlockType": "Magnetic block", + "absorbanceReaderType": "Absorbance Plate Reader" }, "model_display_name": { "temperatureModuleV1": "GEN1", @@ -31,7 +33,8 @@ "thermocyclerModuleV2": "GEN2", "heaterShakerModuleV1": "GEN1", "magneticBlockV1": "GEN1", - "gripperV1": "GEN1" + "gripperV1": "GEN1", + "absorbanceReaderV1": "GEN1" }, "status": { "engaged": "engaged", diff --git a/protocol-designer/src/modules/moduleData.ts b/protocol-designer/src/modules/moduleData.ts index 240a2e11eae9..c6d8d4ec00c3 100644 --- a/protocol-designer/src/modules/moduleData.ts +++ b/protocol-designer/src/modules/moduleData.ts @@ -8,6 +8,7 @@ import { MOVABLE_TRASH_ADDRESSABLE_AREAS, WASTE_CHUTE_ADDRESSABLE_AREAS, FIXED_TRASH_ID, + ABSORBANCE_READER_TYPE, } from '@opentrons/shared-data' import { SPAN7_8_10_11_SLOT } from '../constants' import { getStagingAreaAddressableAreas } from '../utils' @@ -28,6 +29,7 @@ export const SUPPORTED_MODULE_TYPES: ModuleType[] = [ MAGNETIC_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, + ABSORBANCE_READER_TYPE, ] type SupportedSlotMap = Record export const SUPPORTED_MODULE_SLOTS_OT2: SupportedSlotMap = { @@ -61,6 +63,7 @@ export const SUPPORTED_MODULE_SLOTS_OT2: SupportedSlotMap = { value: '1', }, ], + [ABSORBANCE_READER_TYPE]: [], } export const SUPPORTED_MODULE_SLOTS_FLEX: SupportedSlotMap = { [MAGNETIC_MODULE_TYPE]: [ @@ -93,6 +96,12 @@ export const SUPPORTED_MODULE_SLOTS_FLEX: SupportedSlotMap = { value: 'D2', }, ], + [ABSORBANCE_READER_TYPE]: [ + { + name: 'Slot D3', + value: 'D3', + }, + ], } const ALL_MODULE_SLOTS_OT2: DropdownOption[] = [ diff --git a/protocol-designer/src/step-forms/selectors/index.ts b/protocol-designer/src/step-forms/selectors/index.ts index 372ea86f0a22..51a2eaee7780 100644 --- a/protocol-designer/src/step-forms/selectors/index.ts +++ b/protocol-designer/src/step-forms/selectors/index.ts @@ -11,6 +11,7 @@ import { THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, + ABSORBANCE_READER_TYPE, getPipetteSpecsV2, } from '@opentrons/shared-data' import { TEMPERATURE_DEACTIVATED } from '@opentrons/step-generation' @@ -68,6 +69,7 @@ import type { ThermocyclerModuleState, HeaterShakerModuleState, MagneticBlockState, + AbsorbanceReaderState, } from '../types' import type { PresavedStepFormState, @@ -205,6 +207,9 @@ const HEATERSHAKER_MODULE_INITIAL_STATE: HeaterShakerModuleState = { const MAGNETIC_BLOCK_INITIAL_STATE: MagneticBlockState = { type: MAGNETIC_BLOCK_TYPE, } +const ABSORBANCE_READER_INITIAL_STATE: AbsorbanceReaderState = { + type: ABSORBANCE_READER_TYPE, +} const _getInitialDeckSetup = ( initialSetupStep: FormData, @@ -296,6 +301,14 @@ const _getInitialDeckSetup = ( slot, moduleState: MAGNETIC_BLOCK_INITIAL_STATE, } + case ABSORBANCE_READER_TYPE: + return { + id: moduleEntity.id, + model: moduleEntity.model, + type: ABSORBANCE_READER_TYPE, + slot, + moduleState: ABSORBANCE_READER_INITIAL_STATE, + } } } ), @@ -599,13 +612,15 @@ export const getInvariantContext: Selector< getAdditionalEquipmentEntities, featureFlagSelectors.getDisableModuleRestrictions, featureFlagSelectors.getAllowAllTipracks, + featureFlagSelectors.getEnableAbsorbanceReader, ( labwareEntities, moduleEntities, pipetteEntities, additionalEquipmentEntities, disableModuleRestrictions, - allowAllTipracks + allowAllTipracks, + enableAbsorbanceReader ) => ({ labwareEntities, moduleEntities, @@ -614,6 +629,7 @@ export const getInvariantContext: Selector< config: { OT_PD_ALLOW_ALL_TIPRACKS: Boolean(allowAllTipracks), OT_PD_DISABLE_MODULE_RESTRICTIONS: Boolean(disableModuleRestrictions), + OT_PD_ENABLE_ABSORBANCE_READER: Boolean(enableAbsorbanceReader), }, }) ) diff --git a/protocol-designer/src/step-forms/types.ts b/protocol-designer/src/step-forms/types.ts index bffcda77c798..b170a1288439 100644 --- a/protocol-designer/src/step-forms/types.ts +++ b/protocol-designer/src/step-forms/types.ts @@ -7,6 +7,7 @@ import type { THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, + ABSORBANCE_READER_TYPE, NozzleConfigurationStyle, } from '@opentrons/shared-data' import type { DeckSlot } from '../types' @@ -61,6 +62,9 @@ export interface HeaterShakerModuleState { export interface MagneticBlockState { type: typeof MAGNETIC_BLOCK_TYPE } +export interface AbsorbanceReaderState { + type: typeof ABSORBANCE_READER_TYPE +} export interface ModuleTemporalProperties { slot: DeckSlot moduleState: @@ -69,6 +73,7 @@ export interface ModuleTemporalProperties { | ThermocyclerModuleState | HeaterShakerModuleState | MagneticBlockState + | AbsorbanceReaderState } export type ModuleOnDeck = ModuleEntity & ModuleTemporalProperties export type ModulesForEditModulesCard = Partial< diff --git a/protocol-designer/src/ui/modules/utils.ts b/protocol-designer/src/ui/modules/utils.ts index 54b7b4c4b762..80560fab6ec0 100644 --- a/protocol-designer/src/ui/modules/utils.ts +++ b/protocol-designer/src/ui/modules/utils.ts @@ -86,6 +86,8 @@ export const getModuleShortNames = (type: ModuleType): string => { return 'Temperature Module' case 'thermocyclerModuleType': return 'Thermocycler' + case 'absorbanceReaderType': + return 'Absorbance Reader' } } diff --git a/protocol-designer/src/utils/labwareModuleCompatibility.ts b/protocol-designer/src/utils/labwareModuleCompatibility.ts index 2c6b6c0913bc..30b62883ec94 100644 --- a/protocol-designer/src/utils/labwareModuleCompatibility.ts +++ b/protocol-designer/src/utils/labwareModuleCompatibility.ts @@ -5,6 +5,7 @@ import { THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, + ABSORBANCE_READER_TYPE, } from '@opentrons/shared-data' import type { LabwareDefByDefURI } from '../labware-defs' import type { LabwareOnDeck } from '../step-forms' @@ -66,6 +67,7 @@ export const COMPATIBLE_LABWARE_ALLOWLIST_BY_MODULE_TYPE: Record< 'armadillo_96_wellplate_200ul_pcr_full_skirt', 'biorad_96_wellplate_200ul_pcr', ], + [ABSORBANCE_READER_TYPE]: [], } export const getLabwareIsCompatible = ( def: LabwareDefinition2, diff --git a/robot-server/robot_server/modules/module_data_mapper.py b/robot-server/robot_server/modules/module_data_mapper.py index dafcf4e3fce5..6b7ca918e095 100644 --- a/robot-server/robot_server/modules/module_data_mapper.py +++ b/robot-server/robot_server/modules/module_data_mapper.py @@ -11,11 +11,14 @@ TemperatureStatus, HeaterShakerStatus, SpeedStatus, + AbsorbanceReaderStatus, ) from opentrons.hardware_control.modules.magdeck import OFFSET_TO_LABWARE_BOTTOM from opentrons.drivers.types import ( ThermocyclerLidStatus, HeaterShakerLabwareLatchStatus, + AbsorbanceReaderLidStatus, + AbsorbanceReaderPlatePresence, ) from opentrons.drivers.rpi_drivers.types import USBPort as HardwareUSBPort @@ -34,6 +37,8 @@ ThermocyclerModuleData, HeaterShakerModule, HeaterShakerModuleData, + AbsorbanceReaderModule, + AbsorbanceReaderModuleData, UsbPort, ) @@ -131,6 +136,19 @@ def map_data( targetTemperature=cast(float, live_data["data"].get("targetTemp")), errorDetails=cast(str, live_data["data"].get("errorDetails")), ) + elif module_type == ModuleType.ABSORBANCE_READER: + module_cls = AbsorbanceReaderModule + module_data = AbsorbanceReaderModuleData( + status=AbsorbanceReaderStatus(live_data["status"]), + lidStatus=cast( + AbsorbanceReaderLidStatus, live_data["data"].get("lidStatus") + ), + platePresence=cast( + AbsorbanceReaderPlatePresence, + live_data["data"].get("platePresence"), + ), + sampleWavelength=cast(int, live_data["data"].get("sampleWavelength")), + ) else: assert False, f"Invalid module type {module_type}" diff --git a/robot-server/robot_server/modules/module_models.py b/robot-server/robot_server/modules/module_models.py index f05e2ff0a99c..3f59911cd398 100644 --- a/robot-server/robot_server/modules/module_models.py +++ b/robot-server/robot_server/modules/module_models.py @@ -12,10 +12,13 @@ MagneticStatus, HeaterShakerStatus, SpeedStatus, + AbsorbanceReaderStatus, ) from opentrons.drivers.types import ( ThermocyclerLidStatus, HeaterShakerLabwareLatchStatus, + AbsorbanceReaderLidStatus, + AbsorbanceReaderPlatePresence, ) from opentrons.protocol_engine import ModuleModel from opentrons.protocol_engine.types import Vec3f @@ -305,11 +308,47 @@ class HeaterShakerModule( data: HeaterShakerModuleData +class AbsorbanceReaderModuleData(BaseModel): + """Live data from an Absorbance Reader module.""" + + status: AbsorbanceReaderStatus = Field( + ..., + description="Overall status of the module.", + ) + lidStatus: AbsorbanceReaderLidStatus = Field( + ..., + description="Lid status.", + ) + platePresence: AbsorbanceReaderPlatePresence = Field( + ..., + description="Plate presence status.", + ) + sampleWavelength: int = Field( + ..., + description="The current sample wavelength, in nanometers.", + ) + + +class AbsorbanceReaderModule( + _GenericModule[ + Literal[ModuleType.ABSORBANCE_READER], + Literal[ModuleModel.ABSORBANCE_READER_V1], + AbsorbanceReaderModuleData, + ] +): + """An attached Heater-Shaker Module.""" + + moduleType: Literal[ModuleType.ABSORBANCE_READER] + moduleModel: Literal[ModuleModel.ABSORBANCE_READER_V1] + data: AbsorbanceReaderModuleData + + AttachedModule = Union[ TemperatureModule, MagneticModule, ThermocyclerModule, HeaterShakerModule, + AbsorbanceReaderModule, ] @@ -318,4 +357,5 @@ class HeaterShakerModule( MagneticModuleData, ThermocyclerModuleData, HeaterShakerModuleData, + AbsorbanceReaderModuleData, ] diff --git a/robot-server/tests/deck_configuration/test_validation.py b/robot-server/tests/deck_configuration/test_validation.py index 24aecf9117a4..3f8de00a60b4 100644 --- a/robot-server/tests/deck_configuration/test_validation.py +++ b/robot-server/tests/deck_configuration/test_validation.py @@ -226,6 +226,7 @@ def test_unrecognized_cutout_fixture() -> None: "heaterShakerModuleV1", "temperatureModuleV2", "magneticBlockV1", + "absorbanceReaderV1", "stagingAreaSlotWithMagneticBlockV1", ] ), diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index 5aea97fe94f9..dc58d5445108 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -61,6 +61,8 @@ "thermocycler/openLid": "#/definitions/OpenLidCreate", "thermocycler/closeLid": "#/definitions/CloseLidCreate", "thermocycler/runProfile": "#/definitions/RunProfileCreate", + "absorbanceReader/initialize": "#/definitions/InitializeCreate", + "absorbanceReader/measure": "#/definitions/MeasureAbsorbanceCreate", "calibration/calibrateGripper": "#/definitions/CalibrateGripperCreate", "calibration/calibratePipette": "#/definitions/CalibratePipetteCreate", "calibration/calibrateModule": "#/definitions/CalibrateModuleCreate", @@ -236,6 +238,12 @@ { "$ref": "#/definitions/RunProfileCreate" }, + { + "$ref": "#/definitions/InitializeCreate" + }, + { + "$ref": "#/definitions/MeasureAbsorbanceCreate" + }, { "$ref": "#/definitions/CalibrateGripperCreate" }, @@ -1521,7 +1529,8 @@ "thermocyclerModuleV1", "thermocyclerModuleV2", "heaterShakerModuleV1", - "magneticBlockV1" + "magneticBlockV1", + "absorbanceReaderV1" ], "type": "string" }, @@ -3721,6 +3730,102 @@ }, "required": ["params"] }, + "InitializeParams": { + "title": "InitializeParams", + "description": "Input parameters to initialize an absorbance reading.", + "type": "object", + "properties": { + "moduleId": { + "title": "Moduleid", + "description": "Unique ID of the absorbance reader.", + "type": "string" + }, + "sampleWavelength": { + "title": "Samplewavelength", + "description": "Sample wavelength in nm.", + "type": "integer" + } + }, + "required": ["moduleId", "sampleWavelength"] + }, + "InitializeCreate": { + "title": "InitializeCreate", + "description": "A request to execute an Absorbance Reader measurement.", + "type": "object", + "properties": { + "commandType": { + "title": "Commandtype", + "default": "absorbanceReader/initialize", + "enum": ["absorbanceReader/initialize"], + "type": "string" + }, + "params": { + "$ref": "#/definitions/InitializeParams" + }, + "intent": { + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "allOf": [ + { + "$ref": "#/definitions/CommandIntent" + } + ] + }, + "key": { + "title": "Key", + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "type": "string" + } + }, + "required": ["params"] + }, + "MeasureAbsorbanceParams": { + "title": "MeasureAbsorbanceParams", + "description": "Input parameters for a single absorbance reading.", + "type": "object", + "properties": { + "moduleId": { + "title": "Moduleid", + "description": "Unique ID of the Absorbance Reader.", + "type": "string" + }, + "sampleWavelength": { + "title": "Samplewavelength", + "description": "Sample wavelength in nm.", + "type": "integer" + } + }, + "required": ["moduleId", "sampleWavelength"] + }, + "MeasureAbsorbanceCreate": { + "title": "MeasureAbsorbanceCreate", + "description": "A request to execute an Absorbance Reader measurement.", + "type": "object", + "properties": { + "commandType": { + "title": "Commandtype", + "default": "absorbanceReader/measure", + "enum": ["absorbanceReader/measure"], + "type": "string" + }, + "params": { + "$ref": "#/definitions/MeasureAbsorbanceParams" + }, + "intent": { + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "allOf": [ + { + "$ref": "#/definitions/CommandIntent" + } + ] + }, + "key": { + "title": "Key", + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "type": "string" + } + }, + "required": ["params"] + }, "CalibrateGripperParamsJaw": { "title": "CalibrateGripperParamsJaw", "description": "An enumeration.", diff --git a/shared-data/deck/definitions/5/ot3_standard.json b/shared-data/deck/definitions/5/ot3_standard.json index 85dcbf64792e..0cd6c72f49d1 100644 --- a/shared-data/deck/definitions/5/ot3_standard.json +++ b/shared-data/deck/definitions/5/ot3_standard.json @@ -672,6 +672,50 @@ "zDimension": 0 }, "displayName": "Magnetic Block in A3" + }, + { + "id": "absorbanceReaderV1D3", + "areaType": "absorbanceReader", + "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader in D3" + }, + { + "id": "absorbanceReaderV1C3", + "areaType": "absorbanceReader", + "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader in C3" + }, + { + "id": "absorbanceReaderV1B3", + "areaType": "absorbanceReader", + "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader in B3" + }, + { + "id": "absorbanceReaderV1A3", + "areaType": "absorbanceReader", + "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader in A3" } ], "cutouts": [ @@ -1023,6 +1067,20 @@ }, "fixtureGroup": {}, "height": 38.0 + }, + { + "id": "absorbanceReaderV1", + "expectOpentronsModuleSerialNumber": true, + "mayMountTo": ["cutoutD3", "cutoutC3", "cutoutB3", "cutoutA3"], + "displayName": "Slot With an Absorbance Reader and a Lid Dock", + "providesAddressableAreas": { + "cutoutD3": ["absorbanceReaderV1D3"], + "cutoutC3": ["absorbanceReaderV1C3"], + "cutoutB3": ["absorbanceReaderV1B3"], + "cutoutA3": ["absorbanceReaderV1A3"] + }, + "fixtureGroup": {}, + "height": 10.65 } ], "gripperOffsets": { diff --git a/shared-data/deck/types/schemaV5.ts b/shared-data/deck/types/schemaV5.ts index e763b893bdeb..e558f3f44f61 100644 --- a/shared-data/deck/types/schemaV5.ts +++ b/shared-data/deck/types/schemaV5.ts @@ -56,6 +56,10 @@ export type FlexAddressableAreaName = | 'magneticBlockV1B3' | 'magneticBlockV1C3' | 'magneticBlockV1D3' + | 'absorbanceReaderV1A3' + | 'absorbanceReaderV1B3' + | 'absorbanceReaderV1C3' + | 'absorbanceReaderV1D3' export type OT2AddressableAreaName = | '1' @@ -126,6 +130,7 @@ export type FlexModuleCutoutFixtureId = | 'stagingAreaSlotWithMagneticBlockV1' | 'thermocyclerModuleV2Rear' | 'thermocyclerModuleV2Front' + | 'absorbanceReaderV1' export type OT2SingleStandardSlot = 'singleStandardSlot' diff --git a/shared-data/js/constants.ts b/shared-data/js/constants.ts index 71b4813c07ef..d1ce19a8a561 100644 --- a/shared-data/js/constants.ts +++ b/shared-data/js/constants.ts @@ -41,6 +41,7 @@ export const THERMOCYCLER_MODULE_V2: 'thermocyclerModuleV2' = 'thermocyclerModuleV2' export const HEATERSHAKER_MODULE_V1: 'heaterShakerModuleV1' = 'heaterShakerModuleV1' +export const ABSORBANCE_READER_V1: 'absorbanceReaderV1' = 'absorbanceReaderV1' export const MAGNETIC_BLOCK_V1: 'magneticBlockV1' = 'magneticBlockV1' @@ -75,6 +76,8 @@ export const THERMOCYCLER_MODULE_TYPE: 'thermocyclerModuleType' = export const HEATERSHAKER_MODULE_TYPE: 'heaterShakerModuleType' = 'heaterShakerModuleType' export const MAGNETIC_BLOCK_TYPE: 'magneticBlockType' = 'magneticBlockType' +export const ABSORBANCE_READER_TYPE: 'absorbanceReaderType' = + 'absorbanceReaderType' export const MAGNETIC_MODULE_MODELS = [MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2] @@ -92,6 +95,8 @@ export const THERMOCYCLER_MODULE_MODELS = [ export const HEATERSHAKER_MODULE_MODELS = [HEATERSHAKER_MODULE_V1] +export const ABSORBANCE_READER_MODELS = [ABSORBANCE_READER_V1] + export const MAGNETIC_BLOCK_MODELS = [MAGNETIC_BLOCK_V1] export const MODULE_MODELS = [ @@ -100,6 +105,7 @@ export const MODULE_MODELS = [ ...THERMOCYCLER_MODULE_MODELS, ...HEATERSHAKER_MODULE_MODELS, ...MAGNETIC_BLOCK_MODELS, + ...ABSORBANCE_READER_MODELS, ] export const MODULE_MODELS_OT2_ONLY = [ @@ -114,6 +120,7 @@ export const MODULE_TYPES = [ THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, + ABSORBANCE_READER_TYPE, ] export const GEN_ONE_MULTI_PIPETTES = ['p10_multi', 'p50_multi', 'p300_multi'] @@ -239,6 +246,12 @@ export const HEATER_SHAKER_CUTOUTS: CutoutId[] = [ ...SINGLE_LEFT_CUTOUTS, ] export const THERMOCYCLER_MODULE_CUTOUTS: CutoutId[] = ['cutoutA1', 'cutoutB1'] +export const ABSORBANCE_READER_CUTOUTS: CutoutId[] = [ + 'cutoutA3', + 'cutoutB3', + 'cutoutC3', + 'cutoutD3', +] export const WASTE_CHUTE_CUTOUT: 'cutoutD3' = 'cutoutD3' @@ -344,6 +357,14 @@ export const MAGNETIC_BLOCK_C3_ADDRESSABLE_AREA: 'magneticBlockV1C3' = 'magneticBlockV1C3' export const MAGNETIC_BLOCK_D3_ADDRESSABLE_AREA: 'magneticBlockV1D3' = 'magneticBlockV1D3' +export const ABSORBANCE_READER_D3_ADDRESSABLE_AREA: 'absorbanceReaderV1D3' = + 'absorbanceReaderV1D3' +export const ABSORBANCE_READER_C3_ADDRESSABLE_AREA: 'absorbanceReaderV1C3' = + 'absorbanceReaderV1C3' +export const ABSORBANCE_READER_B3_ADDRESSABLE_AREA: 'absorbanceReaderV1B3' = + 'absorbanceReaderV1B3' +export const ABSORBANCE_READER_A3_ADDRESSABLE_AREA: 'absorbanceReaderV1A3' = + 'absorbanceReaderV1A3' export const MAGNETIC_BLOCK_ADDRESSABLE_AREAS: AddressableAreaName[] = [ MAGNETIC_BLOCK_A1_ADDRESSABLE_AREA, @@ -382,8 +403,16 @@ export const HEATERSHAKER_ADDRESSABLE_AREAS: AddressableAreaName[] = [ HEATERSHAKER_D3_ADDRESSABLE_AREA, ] +export const ABSORBANCE_READER_ADDRESSABLE_AREAS: AddressableAreaName[] = [ + ABSORBANCE_READER_A3_ADDRESSABLE_AREA, + ABSORBANCE_READER_B3_ADDRESSABLE_AREA, + ABSORBANCE_READER_C3_ADDRESSABLE_AREA, + ABSORBANCE_READER_D3_ADDRESSABLE_AREA, +] + export const FLEX_USB_MODULE_ADDRESSABLE_AREAS: AddressableAreaName[] = [ THERMOCYCLER_ADDRESSABLE_AREA, + ...ABSORBANCE_READER_ADDRESSABLE_AREAS, ...HEATERSHAKER_ADDRESSABLE_AREAS, ...TEMPERATURE_MODULE_ADDRESSABLE_AREAS, ] @@ -488,6 +517,8 @@ export const THERMOCYCLER_V2_REAR_FIXTURE: 'thermocyclerModuleV2Rear' = 'thermocyclerModuleV2Rear' export const THERMOCYCLER_V2_FRONT_FIXTURE: 'thermocyclerModuleV2Front' = 'thermocyclerModuleV2Front' +export const ABSORBANCE_READER_V1_FIXTURE: 'absorbanceReaderV1' = + 'absorbanceReaderV1' export const MODULE_FIXTURES_BY_MODEL: { [moduleModel in ModuleModel]?: CutoutFixtureId[] @@ -499,6 +530,7 @@ export const MODULE_FIXTURES_BY_MODEL: { THERMOCYCLER_V2_REAR_FIXTURE, THERMOCYCLER_V2_FRONT_FIXTURE, ], + [ABSORBANCE_READER_V1]: [ABSORBANCE_READER_V1_FIXTURE], } export const FLEX_USB_MODULE_FIXTURES: CutoutFixtureId[] = [ @@ -506,6 +538,7 @@ export const FLEX_USB_MODULE_FIXTURES: CutoutFixtureId[] = [ TEMPERATURE_MODULE_V2_FIXTURE, THERMOCYCLER_V2_REAR_FIXTURE, THERMOCYCLER_V2_FRONT_FIXTURE, + ABSORBANCE_READER_V1_FIXTURE, ] export const MAGNETIC_BLOCK_FIXTURES: CutoutFixtureId[] = [ diff --git a/shared-data/js/fixtures.ts b/shared-data/js/fixtures.ts index 057bce01503d..4f13a8b03210 100644 --- a/shared-data/js/fixtures.ts +++ b/shared-data/js/fixtures.ts @@ -38,6 +38,8 @@ import { THERMOCYCLER_V2_REAR_FIXTURE, THERMOCYCLER_MODULE_V2, THERMOCYCLER_V2_FRONT_FIXTURE, + ABSORBANCE_READER_V1_FIXTURE, + ABSORBANCE_READER_V1, MODULE_FIXTURES_BY_MODEL, STAGING_AREA_SLOT_WITH_MAGNETIC_BLOCK_V1_FIXTURE, } from './constants' @@ -282,6 +284,12 @@ export function getFixtureDisplayName( THERMOCYCLER_MODULE_V2 )} in USB-${usbPortNumber}` : getModuleDisplayName(THERMOCYCLER_MODULE_V2) + case ABSORBANCE_READER_V1_FIXTURE: + return usbPortNumber != null + ? `${getModuleDisplayName( + ABSORBANCE_READER_V1 + )} in USB-${usbPortNumber}` + : getModuleDisplayName(ABSORBANCE_READER_V1) default: return 'Slot' } diff --git a/shared-data/js/helpers/getModuleVizDims.ts b/shared-data/js/helpers/getModuleVizDims.ts index 91ac2c226541..30e2f654f8bc 100644 --- a/shared-data/js/helpers/getModuleVizDims.ts +++ b/shared-data/js/helpers/getModuleVizDims.ts @@ -1,17 +1,7 @@ // NOTE: Ian 2019-10-24 these are by-eye numbers that intentionally // ignore the real-life data to emphasize overhangs etc -import { - MAGNETIC_MODULE_TYPE, - TEMPERATURE_MODULE_TYPE, - THERMOCYCLER_MODULE_TYPE, - HEATERSHAKER_MODULE_TYPE, - STD_SLOT_X_DIM as SLOT_X, - STD_SLOT_Y_DIM as SLOT_Y, - STD_SLOT_DIVIDER_WIDTH as DIVIDER, - SPAN7_8_10_11_SLOT, - MAGNETIC_BLOCK_TYPE, -} from '../constants' -import type { ModuleType, ModuleOrientation } from '../types' +import { SPAN7_8_10_11_SLOT } from '../constants' +import type { ModuleOrientation } from '../types' // NOTE: all dims are in 'left' orientation. Rotate & transform to obtain 'right' orientation. export interface ModuleVizDims { @@ -24,75 +14,6 @@ export interface ModuleVizDims { childXDimension: number childYDimension: number } -const MODULE_VIZ_DIMS: Record = { - [MAGNETIC_MODULE_TYPE]: { - xOffset: -1 * (SLOT_X * 0.2 + DIVIDER), - yOffset: -1 * DIVIDER, - xDimension: SLOT_X * 1.2 + DIVIDER * 2, - yDimension: SLOT_Y + DIVIDER * 2, - childXOffset: 0, - childYOffset: 0, - childXDimension: SLOT_X, - childYDimension: SLOT_Y, - }, - [TEMPERATURE_MODULE_TYPE]: { - xOffset: -1 * (SLOT_X * 0.4 + DIVIDER), - yOffset: -1 * DIVIDER, - xDimension: SLOT_X * 1.4 + DIVIDER * 2, - yDimension: SLOT_Y + DIVIDER * 2, - childXOffset: 0, - childYOffset: 0, - childXDimension: SLOT_X, - childYDimension: SLOT_Y, - }, - [THERMOCYCLER_MODULE_TYPE]: { - xOffset: -8, - yOffset: 0, - xDimension: SLOT_X + DIVIDER + 32, - yDimension: SLOT_Y * 2.4, - childXOffset: 12, - childYOffset: SLOT_Y, - childXDimension: SLOT_X, - childYDimension: SLOT_Y, - }, - // TODO(sh, 2022-02-28): This is stubbed out using magdeck dimensions, all of this logic should be deprecated - [HEATERSHAKER_MODULE_TYPE]: { - xOffset: -1 * (SLOT_X * 0.2 + DIVIDER), - yOffset: -1 * DIVIDER, - xDimension: SLOT_X * 1.2 + DIVIDER * 2, - yDimension: SLOT_Y + DIVIDER * 2, - childXOffset: 0, - childYOffset: 0, - childXDimension: SLOT_X, - childYDimension: SLOT_Y, - }, - // TODO(sh, 2022-02-28): This is stubbed out using magdeck dimensions, all of this logic should be deprecated - [MAGNETIC_BLOCK_TYPE]: { - xOffset: -1 * (SLOT_X * 0.2 + DIVIDER), - yOffset: -1 * DIVIDER, - xDimension: SLOT_X * 1.2 + DIVIDER * 2, - yDimension: SLOT_Y + DIVIDER * 2, - childXOffset: 0, - childYOffset: 0, - childXDimension: SLOT_X, - childYDimension: SLOT_Y, - }, -} -export const getModuleVizDims = ( - orientation: ModuleOrientation, - moduleType: ModuleType -): ModuleVizDims => { - const dims = MODULE_VIZ_DIMS[moduleType] - if (orientation === 'left') return dims - // if orientation is 'right', get origins by rotating 180 about slot center - return { - ...dims, - xOffset: SLOT_X - dims.xOffset - dims.xDimension, - yOffset: SLOT_Y - dims.yOffset - dims.yDimension, - childXOffset: SLOT_X - dims.childXOffset - dims.childXDimension, - childYOffset: SLOT_Y - dims.childYOffset - dims.childYDimension, - } -} type DeckSlot = string const LEFT_SIDE_SLOTS: DeckSlot[] = ['1', '4', '7', '10', SPAN7_8_10_11_SLOT] export const inferModuleOrientationFromSlot = ( diff --git a/shared-data/js/modules.ts b/shared-data/js/modules.ts index c3e8f6b5c625..4771f748558c 100644 --- a/shared-data/js/modules.ts +++ b/shared-data/js/modules.ts @@ -6,6 +6,7 @@ import thermocyclerModuleV1 from '../module/definitions/3/thermocyclerModuleV1.j import thermocyclerModuleV2 from '../module/definitions/3/thermocyclerModuleV2.json' import heaterShakerModuleV1 from '../module/definitions/3/heaterShakerModuleV1.json' import magneticBlockV1 from '../module/definitions/3/magneticBlockV1.json' +import absorbanceReaderV1 from '../module/definitions/3/absorbanceReaderV1.json' import { MAGDECK, @@ -19,6 +20,7 @@ import { THERMOCYCLER_MODULE_V2, HEATERSHAKER_MODULE_V1, MAGNETIC_BLOCK_V1, + ABSORBANCE_READER_V1, } from './constants' import type { @@ -56,6 +58,9 @@ export const getModuleDef2 = (moduleModel: ModuleModel): ModuleDefinition => { case MAGNETIC_BLOCK_V1: return (magneticBlockV1 as unknown) as ModuleDefinition + case ABSORBANCE_READER_V1: + return (absorbanceReaderV1 as unknown) as ModuleDefinition + default: throw new Error(`Invalid module model ${moduleModel as string}`) } diff --git a/shared-data/js/types.ts b/shared-data/js/types.ts index 159cd5538115..0afed5ea851b 100644 --- a/shared-data/js/types.ts +++ b/shared-data/js/types.ts @@ -9,11 +9,13 @@ import type { THERMOCYCLER_MODULE_V1, THERMOCYCLER_MODULE_V2, HEATERSHAKER_MODULE_V1, + ABSORBANCE_READER_V1, MAGNETIC_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, + ABSORBANCE_READER_TYPE, GEN1, GEN2, FLEX, @@ -203,6 +205,7 @@ export type ModuleType = | typeof THERMOCYCLER_MODULE_TYPE | typeof HEATERSHAKER_MODULE_TYPE | typeof MAGNETIC_BLOCK_TYPE + | typeof ABSORBANCE_READER_TYPE // ModuleModel corresponds to top-level keys in shared-data/module/definitions/2 export type MagneticModuleModel = @@ -221,12 +224,15 @@ export type HeaterShakerModuleModel = typeof HEATERSHAKER_MODULE_V1 export type MagneticBlockModel = typeof MAGNETIC_BLOCK_V1 +export type AbsorbanceReaderModel = typeof ABSORBANCE_READER_V1 + export type ModuleModel = | MagneticModuleModel | TemperatureModuleModel | ThermocyclerModuleModel | HeaterShakerModuleModel | MagneticBlockModel + | AbsorbanceReaderModel export type GripperModel = | typeof GRIPPER_V1 diff --git a/shared-data/module/definitions/3/absorbanceReaderV1.json b/shared-data/module/definitions/3/absorbanceReaderV1.json index bed2c21302ea..36da3585d6c0 100644 --- a/shared-data/module/definitions/3/absorbanceReaderV1.json +++ b/shared-data/module/definitions/3/absorbanceReaderV1.json @@ -5,20 +5,20 @@ "labwareOffset": { "x": 0.0, "y": 0.0, - "z": 108.96 + "z": 16.0 }, "dimensions": { - "bareOverallHeight": 108.96, + "bareOverallHeight": 18.5, "overLabwareHeight": 0.0, - "lidHeight": 61.7, - "xDimension": 172, - "yDimension": 245.2, - "labwareInterfaceXDimension": 128, - "labwareInterfaceYDimension": 86 + "lidHeight": 60.0, + "xDimension": 95.5, + "yDimension": 155.3, + "labwareInterfaceXDimension": 127.8, + "labwareInterfaceYDimension": 85.5 }, "cornerOffsetFromSlot": { - "x": -22.125, - "y": 0, + "x": -4.875, + "y": -4.875, "z": 0 }, "calibrationPoint": { @@ -26,14 +26,6 @@ "y": 64.93, "z": 97.8 }, - "config": { - "minBlockTemperature": 0, - "maxBlockTemperature": 99, - "minLidTemperature": 37, - "maxLidTemperature": 110, - "minBlockVolume": 0, - "maxBlockVolume": 100 - }, "gripperOffsets": { "default": { "pickUpOffset": { @@ -48,25 +40,12 @@ } } }, - "displayName": "Thermocycler Module GEN2", + "displayName": "Absorbance Plate Reader Module GEN1", "quirks": [], "slotTransforms": { - "ot3_standard": { - "B1": { - "labwareOffset": [ - [1, 0, 0, -20.005], - [0, 1, 0, -0.84], - [0, 0, 1, -98], - [0, 0, 0, 1] - ], - "cornerOffsetFromSlot": [ - [1, 0, 0, -20.005], - [0, 1, 0, -0.84], - [0, 0, 1, -98], - [0, 0, 0, 1] - ] - } - } + "ot2_standard": {}, + "ot2_short_trash": {}, + "ot3_standard": {} }, "compatibleWith": [], "incompatibleWithDecks": ["ot2_standard"], @@ -76,30 +55,36 @@ "value": "", "attributes": { "version": "1.1", - "id": "thermocycler", + "id": "magneticblock", "xmlns": "http://www.w3.org/2000/svg", "xmlns:xlink": "http://www.w3.org/1999/xlink", - "x": "0px", - "y": "0px", - "viewBox": "0 0 172 258", - "style": "enable-background:new 0 0 172 258;", + "width": "134", + "height": "96", + "viewBox": "0 0 134 96", + "style": "enable-background:new 0 0 148.6 91.8;", "xml:space": "preserve" }, "children": [ { - "name": "style", + "name": "defs", "type": "element", "value": "", - "attributes": { - "type": "text/css" - }, + "attributes": {}, "children": [ { - "name": "", - "type": "text", - "value": "\n.st0{fill:#FFFFFF;}\n.st1{fill:#E6E6E6;}\n", + "name": "style", + "type": "element", + "value": "", "attributes": {}, - "children": [] + "children": [ + { + "name": "", + "type": "text", + "value": "\n\t\t.cls-1{fill:none;}.cls-1,.cls-2{stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:.71px;}.cls-2{fill:#e6e6e6;}", + "attributes": {}, + "children": [] + } + ] } ] }, @@ -108,695 +93,23 @@ "type": "element", "value": "", "attributes": { - "id": "closed" + "id": "Foot_Print" }, "children": [ { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "d": "M145.2,232.7V186c0-4-2.7-7.2-6-7.2H32.5c-3.3,0-5.7,3.2-5.7,7.2v46.7H0.4V0.4h171.2v232.3H145.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st1", - "d": "M139.1,178.8h-106c-3.3,0-6,2.7-6,6v47.9h118v-47.9C145.1,181.5,142.4,178.8,139.1,178.8z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "rect", - "type": "element", - "value": "", - "attributes": { - "x": "4.2", - "y": "0.4", - "class": "st1", - "width": "163.4", - "height": "38.3" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "d": "M141,191.8H31.1c-1.1,0-2,0.9-2,2v49.2c0,1.1,0.9,2,2,2H141c1.1,0,2-0.9,2-2v-49.2\n C143,192.7,142.1,191.8,141,191.8z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "rect", - "type": "element", - "value": "", - "attributes": { - "x": "32.7", - "y": "195.4", - "class": "st1", - "width": "106.8", - "height": "49.5" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "d": "M130.8,18.5H41.2c-1.6,0-3,1.3-3,3l0,0c0,1.7,1.3,3,3,3h89.6c1.6,0,3-1.3,3-3l0,0\n C133.8,19.9,132.5,18.5,130.8,18.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M130.8,18.3H41.2c-1.7,0-3.2,1.4-3.2,3.2c0,1.7,1.4,3.2,3.2,3.2h89.6c1.7,0,3.2-1.4,3.2-3.2\n C133.9,19.8,132.5,18.3,130.8,18.3z M41.2,24.3c-1.5,0-2.8-1.3-2.8-2.8c0-1.6,1.3-2.8,2.8-2.8h89.6c1.5,0,2.8,1.3,2.8,2.8\n c0,1.6-1.3,2.8-2.8,2.8H41.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M4.4,0.2c-0.1,0-0.2,0.1-0.2,0.2v232.3c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2V0.4C4.6,0.3,4.5,0.2,4.4,0.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", + "name": "rect", "type": "element", "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M171.6,38.3H0.4c-0.2,0-0.4,0.2-0.4,0.4S0.2,39,0.4,39h171.2c0.2,0,0.4-0.2,0.4-0.4S171.8,38.3,171.6,38.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M167.6,0.2c-0.1,0-0.2,0.1-0.2,0.2v232.4c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2V0.4\n C167.8,0.3,167.7,0.2,167.6,0.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M139.5,242.3c-0.1,0-0.1,0.1-0.1,0.1v2.5c0,0.1,0.1,0.1,0.1,0.1s0.1-0.1,0.1-0.1v-2.5\n C139.6,242.4,139.5,242.3,139.5,242.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M139.1,195.1H139c-0.1,0-0.1,0.1-0.1,0.1s0.1,0.1,0.1,0.1h0.1l0.2,0.1l0.1,0.1l0,0.1c0,0.1,0.1,0.1,0.1,0.1\n s0.1-0.1,0.1-0.1v-0.1c0,0,0,0,0,0l-0.1-0.2l-0.1-0.1c0,0,0,0,0,0L139.1,195.1C139.1,195.1,139.1,195.1,139.1,195.1z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M33.1,195.1H33c0,0,0,0,0,0l-0.1,0c0,0,0,0,0,0l-0.1,0.1l-0.1,0c0,0,0,0,0,0l-0.1,0.2l0,0.1c0,0,0,0,0,0v0.1\n c0,0.1,0.1,0.1,0.1,0.1c0.1,0,0.1-0.1,0.1-0.1v0l0.1-0.1l0-0.1l0,0c0,0,0,0,0,0l0,0l0.1,0h0.1c0.1,0,0.1-0.1,0.1-0.1\n C33.2,195.2,33.1,195.1,33.1,195.1z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M32.6,242.3c-0.1,0-0.1,0.1-0.1,0.1v2.5c0,0.1,0.1,0.1,0.1,0.1c0.1,0,0.1-0.1,0.1-0.1v-2.5\n C32.7,242.4,32.6,242.3,32.6,242.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M0.4,0C0.2,0,0.1,0.2,0.1,0.4v232.3c0,0.2,0.2,0.4,0.4,0.4h28.7c0.2,0,0.4-0.2,0.4-0.4c0-0.2-0.2-0.4-0.4-0.4H0.8V0.7\n h170.5v231.7H143c-0.2,0-0.4,0.2-0.4,0.4s0.2,0.4,0.4,0.4h28.7c0.2,0,0.4-0.2,0.4-0.4V0.4c0-0.2-0.2-0.4-0.4-0.4H0.5\n C0.5,0,0.4,0,0.4,0z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M171.6,4.2H0.4c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h171.2c0.1,0,0.2-0.1,0.2-0.2\n C171.8,4.3,171.7,4.2,171.6,4.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M150.6,12.4c-5,0-9.1,4.1-9.1,9.1s4.1,9.1,9.1,9.1s9.1-4.1,9.1-9.1S155.6,12.4,150.6,12.4z M150.6,30.2\n c-4.8,0-8.7-3.9-8.7-8.7s3.9-8.7,8.7-8.7s8.7,3.9,8.7,8.7S155.4,30.2,150.6,30.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "ellipse", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "cx": "150.6", - "cy": "21.5", - "rx": "5.8", - "ry": "5.8" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M150.6,15.5c-3.3,0-6,2.7-6,6s2.7,6,6,6s6-2.7,6-6S153.9,15.5,150.6,15.5z M150.6,27.2c-3.1,0-5.7-2.5-5.7-5.7\n s2.5-5.7,5.7-5.7s5.7,2.5,5.7,5.7S153.7,27.2,150.6,27.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "ellipse", - "type": "element", - "value": "", - "attributes": { - "class": "st1", - "cx": "150.6", - "cy": "21.5", - "rx": "3.8", - "ry": "3.8" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M150.6,17.6c-2.2,0-3.9,1.8-3.9,4s1.8,4,3.9,4c2.2,0,3.9-1.8,3.9-4C154.5,19.3,152.8,17.6,150.6,17.6z M150.6,25.1\n c-2,0-3.6-1.6-3.6-3.6s1.6-3.6,3.6-3.6s3.6,1.6,3.6,3.6S152.6,25.1,150.6,25.1z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M141,191.4H31.1c-1.3,0-2.3,1.1-2.3,2.3v51.2c0,0.2,0.2,0.4,0.4,0.4H143c0.2,0,0.4-0.2,0.4-0.4v-51.2\n C143.3,192.5,142.3,191.4,141,191.4z M29.5,244.6v-50.8c0-0.9,0.7-1.6,1.6-1.6H141c0.9,0,1.6,0.7,1.6,1.6v50.8H29.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M139,195.1H33.1c-0.4,0-0.7,0.3-0.7,0.7v49.2c0,0.1,0.1,0.2,0.2,0.2h106.9c0.1,0,0.2-0.1,0.2-0.2v-49.2\n C139.7,195.4,139.4,195.1,139,195.1z M32.8,244.8v-49c0-0.2,0.1-0.3,0.3-0.3H139c0.2,0,0.3,0.1,0.3,0.3v49H32.8z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M139.1,178.4H32.7c-3.5,0-6.3,2.8-6.3,6.3V233h0.7v-48.2c0-3.1,2.5-5.6,5.6-5.6h106.4c3.1,0,5.6,2.5,5.6,5.6v47.7h0.7\n v-47.7C145.4,181.3,142.6,178.4,139.1,178.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M51.7,79.2c-0.1,0-0.1,0.1-0.1,0.1v99.4c0,0.1,0.1,0.1,0.1,0.1c0.1,0,0.1-0.1,0.1-0.1V79.3\n C51.8,79.2,51.8,79.2,51.7,79.2z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M120.4,79.1c-0.1,0-0.2,0.1-0.2,0.2v99.4c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2V79.3\n C120.6,79.2,120.5,79.1,120.4,79.1z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M120.4,79.1H51.6c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h68.7c0.1,0,0.2-0.1,0.2-0.2\n C120.6,79.2,120.5,79.1,120.4,79.1z" - }, - "children": [] - } - ] - } - ] - } - ] + "attributes": { + "class": "cls-2", + "x": ".35", + "y": ".36", + "width": "136", + "height": "94", + "rx": "5", + "ry": "5" + }, + "children": [] } ] }, @@ -805,2880 +118,78 @@ "type": "element", "value": "", "attributes": { - "id": "open" + "id": "Slot_Clips" }, "children": [ { - "name": "g", + "name": "path", "type": "element", "value": "", "attributes": { - "id": "shading_00000140696093821789790550000002253882697550769834_" + "class": "cls-1", + "d": "m17.37.36v2.6m-2-.93V.36m2,2.6c0-.52-.9-.93-2-.93m104,.93V.36m2,1.67c-1.1,0-2,.42-2,.93m2-2.6v1.67m-2,92.33v-2.6m2,.93v1.67m-2-2.6c0,.52.9.93,2,.93M5.37,2.03v1.99m.18.12c-.06-.05-.12-.08-.18-.12m.18.12c.18.14.4.22.63.22m11.19,0H6.18m11.19-1.4v1.4M5.37,2.03h10M6.18,90.35h11.19m-11.19,0c-.23,0-.45.08-.63.22m-.18.12c.06-.03.13-.07.18-.12m-.18,2.11v-1.99m10,1.99H5.37m10,0c1.1,0,2-.42,2-.93m0-1.4v1.4m-15.33-2.4h1.99m.12-.18c-.05.06-.08.12-.12.18m.12-.18c.14-.18.22-.4.22-.63m0-11.19v11.19m-1.4-11.19h1.4m-1.4,0c-.52,0-.93.9-.93,2m0,10v-10m130.33,9.19v-11.19m0,11.19c0,.23.08.45.22.63m.12.18c-.03-.06-.07-.13-.12-.18m2.11.18h-1.99m1.99-10v10m0-10c0-1.1-.42-2-.93-2m-1.4,0h1.4m-2.4,15.33v-1.99m-.18-.12c.06.05.12.08.18.12m-.18-.12c-.18-.14-.4-.22-.63-.22m-11.19,0h11.19m-11.19,1.4v-1.4m12,2.33h-10m9.19-88.33h-11.19m11.19,0c.23,0,.45-.08.63-.22m.18-.12c-.06.03-.13.07-.18.12m.18-2.11v1.99m-10-1.99h10m-12,2.33v-1.4m15.33,2.4h-1.99m-.12.18c.05-.06.08-.12.12-.18m-.12.18c-.14.18-.22.4-.22.63m0,11.19V6.18m1.4,11.19h-1.4m1.4,0c.52,0,.93-.9.93-2m0-10v10M4.37,6.18v11.19m0-11.19c0-.23-.08-.45-.22-.63m-.12-.18c.03.06.07.13.12.18m-2.11-.19h1.99m-1.99,10V5.36m0,10c0,1.1.42,2,.93,2m1.4,0h-1.4m133.4,0h-2.6m.93-2h1.67m-2.6,62h2.6m0,2h-1.67M2.97,17.37H.36m0-2h1.67m15.33,76.4v2.6m-2,0v-1.67M.36,77.35h2.6m-.93,2H.36M134.68,5.36c0-1.84-1.49-3.33-3.33-3.33m0,1.99c.81-.44,1.78.53,1.34,1.34M2.04,89.37c0,1.84,1.49,3.33,3.33,3.33M5.36,2.04c-1.84,0-3.33,1.49-3.33,3.33m129.33,87.33c1.84,0,3.33-1.49,3.33-3.33m-1.99,0c.44.81-.53,1.78-1.34,1.34m-126,0c-.81.44-1.78-.53-1.34-1.34M4.03,5.37c-.44-.81.53-1.78,1.34-1.34m112,90.34v-4m0,0h2M4.37,19.37H.36m4-2v2M.36,75.35h4m0,0v2M136.36,19.37h-4m0,0v-2m0,58h4m-4,2v-2M117.35,4.37V.36m2,4h-2M19.37.36v4m0,0h-2m2,86v4m-2-4h2" }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "d": "M51.7,247.3c0,2.4,0,9.8,0,11.1c0,1.4,0,2.8,1.1,3.9c1.2,1.2,2.6,1.2,4.1,1.2c1.6,0,58,0,59.1,0\n c1.3,0,2.5-0.3,3.3-1.3c1.3-1.4,1-3.3,1-5c0-1.8,0-8.4,0-9.9" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "rect", - "type": "element", - "value": "", - "attributes": { - "x": "55.6", - "y": "246.9", - "class": "st1", - "width": "60.7", - "height": "12.7" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "d": "M171.6,38.7H0.4v206.3c0,1.1,0.9,2,2,2h167.3c1.1,0,2-0.9,2-2L171.6,38.7L171.6,38.7z" - }, - "children": [] - }, - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M171.6,38.3H0.4c-0.2,0-0.4,0.2-0.4,0.4v206.3c0,1.3,1.1,2.3,2.3,2.3h167.3c1.3,0,2.3-1.1,2.3-2.3V38.7\n C172,38.5,171.8,38.3,171.6,38.3z M0.7,39h170.6v205.9c0,0.9-0.7,1.6-1.6,1.6H2.3c-0.9,0-1.6-0.7-1.6-1.6\n C0.7,244.9,0.7,39,0.7,39z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "base_grey_00000027585544793631977930000012329166542688174233_" - }, - "children": [ - { - "name": "rect", - "type": "element", - "value": "", - "attributes": { - "x": "4.4", - "y": "39.1", - "class": "st1", - "width": "163.4", - "height": "203.4" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "d": "M19.3,70.9v-4.4c0-1.2,1-2.2,2.2-2.2h129c1.2,0,2.2,1,2.2,2.2v4.4h-5.9c-0.6,0-1,0.4-1,1v2.5\n c0,0.6,0.4,1,1,1h5.9v65.3h-5.9c-0.6,0-1,0.4-1,1v2.5c0,0.6,0.4,1,1,1h5.9V156c0,1.2-1,2.2-2.2,2.2h-129l0,0\n c-1.2,0-2.2-1-2.2-2.2v0v-10.8h5.9c0.6,0,1-0.4,1-1v-2.5c0-0.6-0.4-1-1-1h-5.9V75.4h5.9c0.6,0,1-0.4,1-1v-2.5c0-0.6-0.4-1-1-1\n L19.3,70.9" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "class": "st0", - "d": "M143,203v-9.2c0-1.1-0.9-2-2-2H31.1c-1.1,0-2,0.9-2,2v9.2" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "polyline", - "type": "element", - "value": "", - "attributes": { - "class": "st1", - "points": "139.5,203.1 139.5,195.4 32.8,195.4 32.8,203.3 \t\t\t" - }, - "children": [] - } - ] - } - ] - }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "Module_Title" + }, + "children": [ { - "name": "g", + "name": "path", "type": "element", "value": "", "attributes": { - "id": "stroke" + "class": "cls-1", + "d": "m73.92,6.86h-.49m0,.5h.49m-.54-.04s.02.04.04.04m2.44-2.71s.04,0,.04-.01m-.36-.03c.11,0,.24.02.32.04m-.78.68c0-.55.1-.72.46-.72m0,1.48c-.35,0-.46-.17-.46-.77m.79.73c-.08.02-.21.04-.33.04m.37-.03s-.01-.02-.04-.02m.05.38v-.36m-.02.39s.02,0,.02-.03m-.48.09c.2,0,.37-.02.46-.06m-1.4-1.13c0,.73.24,1.19.94,1.19m0-2.35c-.69,0-.94.41-.94,1.16m1.42-1.1c-.12-.04-.3-.06-.47-.06m1.83,2.92h.91m-.95-.04s.02.04.04.04m1.48-1.41c.21-.08.41-.25.41-.7m-.06,1.39c0-.39-.16-.5-.32-.6m-.6,1.32c.57,0,.92-.17.92-.72m1.44-2.16c-.09-.02-.19-.04-.32-.04m-24.18,1.46c0,1.45-1.04,2.65-2.42,2.89m-4.39-2.89c0,1.9,1.37,3.48,3.18,3.8m.69-7.67c-2.14,0-3.87,1.73-3.87,3.87m5.13.3h0m31.38-.73v-.95m.07.99c-.06,0-.07-.01-.07-.04m1.4-.95s.01-.05-.05-.05m-.72,1.17c.18-.25.67-.98.77-1.13m-1.41,1.41s.03-.04.08-.04m-1.08.43s-.01-.02-.04-.02m.05.38l-.02-.36m.01-1.83c-.12-.04-.3-.06-.47-.06m-1.67,2.13c.36-.33.35-1.57,0-1.9m-1.45,1.9c.23.3,1.22.3,1.45,0m-22.12-.81l.47,1.56m-.55-1.56s.02-.06.04-.06m-.49,1.61l.45-1.56m-.5,1.6s.04-.02.05-.04m-.8.04h.75m-.79-.04s.02.04.04.04m-.04-2.84v2.79m.04-2.84s-.04.02-.04.04m.52-.04h-.47m.52.04s-.02-.04-.04-.04m0,2.19l.03-2.15m0,2.22s-.02-.01-.02-.06m.07,0s-.02.06-.04.06m.47-1.54l-.43,1.49m.52-1.55s-.06,0-.08.06m.48-.06h-.4m.98,1.61s-.03-.02-.04-.06m.06,0s0,.05-.02.05m0-2.22l.02,2.17m.02-2.21s-.04.02-.04.04m.52-.04h-.48m.52.04s-.02-.04-.04-.04m.04,2.84v-2.79m-.04,2.84s.04-.02.04-.04m-.75.04h.71m-.77-.04s.03.04.06.04m2.52-1.33c0,.25-.12.31-.45.31m.45-.48v.17m-.02-.19l.02.02m-.52-.09l.5.06m-.23-1.4c-.76,0-.99.14-.99.63m1.73-.55c-.15-.05-.45-.08-.74-.08m.8.14s-.01-.05-.06-.06m.06,1.6v-1.53m-1.58,2.13c.16.05.46.08.74.08m-.77-.14s0,.05.02.06m0-.38l-.03.32m.09-.35s-.06,0-.06.02m.59.02c-.15,0-.39-.02-.53-.04m3.92.4l.04-.04m-.82.13c.24,0,.62-.02.79-.09m-1.88-1.04c0,.8.29,1.13,1.09,1.13m-.11-2.17c-.72,0-.98.23-.98,1.03m1.34-1.01c-.11-.01-.23-.02-.36-.02m.39-.01s0,.03-.02.03m-.51-.5c.5,0,.53.13.53.47m-1.19-.39c.16-.04.45-.08.66-.08m.06-.42c-.19,0-.62.05-.78.11m1.8.7c0-.67-.4-.81-1.02-.81m3.45.76h-.47m.51.04s-.02-.04-.04-.04m.04,1.5v-1.46m-.94,2.26c.74,0,.94-.19.94-.81m-1.82.72c.23.04.61.09.87.09m-.92-.13s.02.04.04.04m-.04-2.17v2.13m.04-2.17s-.04.02-.04.04m.51-.04h-.47m.51.04s-.02-.04-.04-.04m.04,1.81v-1.77m.04,1.81s-.04-.02-.04-.04m.34.07c-.13,0-.23,0-.3-.02m.71-.38c0,.32-.07.41-.41.41m.41-1.84v1.43m.04-1.47s-.04.02-.04.04m2.9.08s0-.03-.03-.04m0,.37l.03-.33m-.08.35l.05-.02m-.64-.08c.22,0,.47.06.6.1m-1.21.47c0-.46.22-.57.61-.57m-.59.59l-.02-.02m1.22.02h-1.2m1.31.36c0-.29-.01-.36-.11-.36m-.77,1.34c.67,0,.88-.37.88-.98m-1.89-.2c0,.76.32,1.18,1.01,1.18m.07-2.35c-.83,0-1.09.45-1.09,1.17m1.81-1.04c-.17-.08-.43-.12-.72-.12m2.37.38v-.29m-.04.33s.04,0,.04-.04m-.17.04h.13m-.31.18c0-.14.05-.18.18-.18m-.18,1.43v-1.26m.42,1.32s-.02-.04-.04-.04m.04.39v-.34m-.04.38s.04-.02.04-.04m-.4.04h.35m-.38.02l.02-.02m-.03.55v-.53m-.04.57s.04-.02.04-.04m-.51.04h.47m-.51-.04s.02.04.04.04m-.04-.57v.53m-.02-.55l.02.02m-.32-.02h.29m-.34-.04s.02.04.04.04m-.04-.38v.34m.04-.38s-.04.02-.04.04m.34-.05h-.29m.32-.02l-.02.02m.02-1.41v1.39m.51-1.85c-.34,0-.51.16-.51.47m.85-.43c-.09-.02-.22-.04-.34-.04m.83,2.72v.42m-.77-1.27l-.02-.02m1.35.41v-2.18m-.55,2.18s.02.04.04.04m0-2.26s-.04.02-.04.04m-8.66-.33s.01.03.04.02m-.09-.36l.05.33m-.02-.36l-.03.04m19.59.58c-.69,0-.94.41-.94,1.16m2.41-1.08s-.02-.04-.04-.04m-23.41.59c0,.43.1.62.72.7m24.09-1.29h-.54m-23.33,2.31c.53,0,.84-.18.84-.67m21.74-.21l.08.02m-24.74.77l-.47-1.48m-7.07,3.59l.16.91m19.16-5.17s-.02-.05-.04-.06m9.71.19c-.25-.31-1.22-.31-1.46,0m-.95,2.92s.04-.02.04-.05m-.02-3.1c-.35,0-.53.12-.53.52m-19.25.75s.03.01.04.06m26.08-1.28s-.04,0-.06.04m-7.73,1.52s-.05-.04-.05-.06m-18.04-.78c-.02-.06-.02-.07-.07-.07m15.29-.23l.02-.36m-23.52,5.17l.17-.91m32.19-4.25l-.02-.04m-.01.4l.02-.36m-.07.38s.04,0,.04-.01m-.36-.03c.11,0,.24.02.32.04m-.78.68c0-.55.1-.72.46-.72m0,1.48c-.35,0-.46-.17-.46-.77m.79.73c-.08.02-.21.04-.33.04m.36.36s.02,0,.02-.03m.98.85v-1.61m-.04,1.65s.04-.02.04-.04m-.5.04h.46m-.5-.04s.02.04.04.04m-.04-3.07v3.03m.04-3.07s-.04.02-.04.04m.5-.04h-.46m-11.84.04v2.18m12.52-1.24s-.06.04-.11.04m.54.2s.01-.04.04-.06m-.01.11l-.02-.05m.77.99c-.07-.1-.49-.64-.75-.94m.7.98s.06-.01.05-.04m-.61.04h.56m-.62-.04s.03.04.06.04m-.61-.83c.18.23.43.6.54.79m-6.2-1.68c0-.13.05-.18.18-.18m-4.49-.32l-.02-.04m-22.82,3.56l1.26-1.86m-2.53,0h0m-.29-.89c0,.33.11.64.29.89m1.26-2.44c-.85,0-1.55.69-1.55,1.55m3.09,0c0-.85-.69-1.55-1.55-1.55m1.26,2.44c.18-.25.28-.56.28-.89m-1.55-2.34c1.62,0,2.94,1.32,2.94,2.94m17.89,1.72s.04-.02.04-.04m7.19-2.91c-.36.32-.38,1.58,0,1.9m-24.19-.66c0-2.14-1.73-3.87-3.87-3.87m27.49,2.49s-.02-.05-.04-.05m.05.33v-.28m-.04.32s.04,0,.04-.04m-.35,2.73v-2.51m.18-.18h.13m-.82,2.74h.47m3.13-1.99c0,.73.24,1.19.94,1.19m-7.04-2.26v2.79m9.28-2.8c-.14.25-.44.72-.59.95m-12.49,1.65s-.04.02-.04.04m4.92-2.68h-1.04m1.89.77c0-.58-.43-.77-.85-.77m.42,1.5s0-.03.02-.04m-12.23.71v-2.12m-13.94,4.27c-1.38-.25-2.42-1.45-2.42-2.89m23.8,1.26s-.02-.04-.04-.04m-22.09-.92l1.26,1.86m20.81-3.57h-.47m.51.04s-.02-.04-.04-.04m0,2.26s.04-.02.04-.04m-.51.04h.47m10.36.04c.2,0,.37-.02.46-.06m-5.04.82s.02.05.04.05m-.04-2.64v2.59m-29.53-1.64c0-1.62,1.32-2.94,2.94-2.94m20.87,4.62v-.42m3.31-2.68s-.04.02-.04.04m-4.25,1.79h-.35m-18.84,3.39c1.81-.32,3.18-1.9,3.18-3.8m13.54.5c.32,0,.4-.17.4-.49m0,0c0-.12-.01-.12-.05-.12m0,0h-.78m0,0l-.02.03m0,0c0,.33.07.59.45.59m7.59.55c.35,0,.45-.11.45-.38m-.43-.45h-.27m-.01.83h.27m-.3-.8v.77m.04-.8s-.04,0-.04.04m.74.42c0-.35-.15-.44-.43-.45m-.31.8s0,.03.03.03m-14.28-2.11s0-.02-.03-.03m0,0c-.06-.01-.17-.02-.27-.02m0,.69h.28m0,0l.02-.02m0,0v-.62m-.71.28c0,.3.1.36.4.36m0-.69c-.33,0-.41.04-.41.34m2.34.55c0,.59.11.7.5.7m.3-.07v-1.25m0,0s0-.03-.03-.04m0,0s-.13-.02-.25-.02m0,0c-.45,0-.52.11-.52.68m.77.67l.02-.04m-.3.07c.12,0,.21-.01.27-.04m-11.92-.31c.16-.2.25-.45.25-.72m0,0c0-.65-.53-1.17-1.17-1.17m.35,1.94c.22.21.4.19.57-.05m-2.09-.72c.79,0,1.14.43,1.52.77m-.35-1.94c-.65,0-1.17.53-1.17,1.17m25.9.46h.26m-.3-.84v.8m0,0s.01.04.04.04m.75-.43c0-.35-.12-.43-.53-.43m0,0h-.24m.26.87c.29,0,.5-.08.5-.44m-.77-.43s-.03,0-.03.03m4.4.03c-.05-.12-.57-.12-.63,0m0,0c-.17.17-.18,1.15,0,1.33m.63,0c.17-.17.16-1.16,0-1.33m-.63,1.33c.05.12.58.12.63,0m0,0c.17-.17.16-1.16,0-1.33m-.63,0c-.17.17-.18,1.15,0,1.33m1.04.28c.36-.33.35-1.57,0-1.9m-1.45,0c-.36.32-.38,1.58,0,1.9" }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M116.5,246.7h-0.4v12.7H55.8v-12.7h-0.4v12.9c0,0.1,0.1,0.2,0.2,0.2h60.7c0.1,0,0.2-0.1,0.2-0.2V246.7z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M120.4,246.6c-0.2,0-0.4,0.2-0.4,0.4v10.2c0,0.3,0,0.5,0,0.8c0,1.5,0.1,3-0.9,4.2c-0.7,0.8-1.7,1.2-3.1,1.2H56.9\n c-1.4,0-2.8,0-3.8-1.1c-1-1.1-1-2.5-1-3.8v-11.4c0-0.2-0.2-0.4-0.4-0.4s-0.4,0.2-0.4,0.4v11.4c0,1.4,0,3,1.2,4.3\n c1.3,1.3,2.8,1.3,4.4,1.3H116c1.5,0,2.7-0.5,3.6-1.5c1.2-1.3,1.1-3.1,1.1-4.6c0-0.3,0-0.5,0-0.8v-10.2\n C120.7,246.7,120.6,246.6,120.4,246.6z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000072973290214693693960000017318416397027368577_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,139.7,45.7,139.7z M45.7,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,145.3,45.7,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,139.7,54.7,139.7z M54.7,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,145.3,54.7,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,139.7,63.6,139.7z M63.6,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,145.3,63.6,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,139.7,72.6,139.7z M72.6,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,145.3,72.6,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,139.7,81.6,139.7z M81.6,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,145.3,81.6,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,139.7,90.5,139.7z M90.5,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,145.3,90.5,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,139.7,99.5,139.7z M99.5,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,145.3,99.5,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,139.7,108.4,139.7z M108.4,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,145.3,108.4,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,139.7,117.4,139.7z M117.4,145.3\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,145.3,117.4,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,139.7,126.3,139.7z M126.3,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,145.3,126.3,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,139.7,135.3,139.7z M135.3,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,145.3,135.3,145.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,139.7,36.7,139.7z M36.7,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,145.3,36.7,145.3z" - }, - "children": [] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000153665527845359773540000012752985171215028372_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,130.7,45.7,130.7z M45.7,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,136.3,45.7,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,130.7,54.7,130.7z M54.7,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,136.3,54.7,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,130.7,63.6,130.7z M63.6,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,136.3,63.6,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,130.7,72.6,130.7z M72.6,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,136.3,72.6,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,130.7,81.6,130.7z M81.6,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,136.3,81.6,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,130.7,90.5,130.7z M90.5,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,136.3,90.5,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,130.7,99.5,130.7z M99.5,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,136.3,99.5,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,130.7,108.4,130.7z M108.4,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,136.3,108.4,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,130.7,117.4,130.7z M117.4,136.3\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,136.3,117.4,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,130.7,126.3,130.7z M126.3,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,136.3,126.3,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,130.7,135.3,130.7z M135.3,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,136.3,135.3,136.3z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,130.7,36.7,130.7z M36.7,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,136.3,36.7,136.3z" - }, - "children": [] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000001654953178113305770000001548480951139594390_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C48.7,123.1,47.3,121.8,45.7,121.8z M45.7,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,127.4,45.7,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C57.7,123.1,56.3,121.8,54.7,121.8z M54.7,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,127.4,54.7,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C66.6,123.1,65.3,121.8,63.6,121.8z M63.6,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,127.4,63.6,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C75.6,123.1,74.2,121.8,72.6,121.8z M72.6,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,127.4,72.6,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C84.5,123.1,83.2,121.8,81.6,121.8z M81.6,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,127.4,81.6,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C93.5,123.1,92.1,121.8,90.5,121.8z M90.5,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,127.4,90.5,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C102.4,123.1,101.1,121.8,99.5,121.8z M99.5,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,127.4,99.5,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C111.4,123.1,110.1,121.8,108.4,121.8z M108.4,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,127.4,108.4,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C120.3,123.1,119,121.8,117.4,121.8z M117.4,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,127.4,117.4,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C129.3,123.1,128,121.8,126.3,121.8z M126.3,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,127.4,126.3,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C138.3,123.1,137,121.8,135.3,121.8z M135.3,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,127.4,135.3,127.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C39.7,123.1,38.4,121.8,36.7,121.8z M36.7,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,127.4,36.7,127.4z" - }, - "children": [] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000142157505160117839040000001831267897535693211_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,112.8,45.7,112.8z M45.7,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C48.3,117.2,47.2,118.4,45.7,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,112.8,54.7,112.8z M54.7,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C57.3,117.2,56.1,118.4,54.7,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,112.8,63.6,112.8z M63.6,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C66.3,117.2,65.1,118.4,63.6,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,112.8,72.6,112.8z M72.6,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C75.2,117.2,74,118.4,72.6,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,112.8,81.6,112.8z M81.6,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C84.2,117.2,83,118.4,81.6,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,112.8,90.5,112.8z M90.5,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C93.1,117.2,91.9,118.4,90.5,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,112.8,99.5,112.8z M99.5,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C102.1,117.2,100.9,118.4,99.5,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,112.8,108.4,112.8z M108.4,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C111,117.2,109.9,118.4,108.4,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,112.8,117.4,112.8z M117.4,118.4\n c-1.4,0-2.6-1.2-2.6-2.6c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C120,117.2,118.8,118.4,117.4,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,112.8,126.3,112.8z M126.3,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C129,117.2,127.8,118.4,126.3,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,112.8,135.3,112.8z M135.3,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C137.9,117.2,136.8,118.4,135.3,118.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,112.8,36.7,112.8z M36.7,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C39.4,117.2,38.2,118.4,36.7,118.4z" - }, - "children": [] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000023262343608832889980000007837414120611036803_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,103.8,45.7,103.8z M45.7,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C48.3,108.2,47.2,109.4,45.7,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,103.8,54.7,103.8z M54.7,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C57.3,108.2,56.1,109.4,54.7,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,103.8,63.6,103.8z M63.6,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C66.3,108.2,65.1,109.4,63.6,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,103.8,72.6,103.8z M72.6,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C75.2,108.2,74,109.4,72.6,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,103.8,81.6,103.8z M81.6,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C84.2,108.2,83,109.4,81.6,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,103.8,90.5,103.8z M90.5,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C93.1,108.2,91.9,109.4,90.5,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,103.8,99.5,103.8z M99.5,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C102.1,108.2,100.9,109.4,99.5,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,103.8,108.4,103.8z M108.4,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C111,108.2,109.9,109.4,108.4,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,103.8,117.4,103.8z M117.4,109.4\n c-1.4,0-2.6-1.2-2.6-2.6c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C120,108.2,118.8,109.4,117.4,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,103.8,126.3,103.8z M126.3,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C129,108.2,127.8,109.4,126.3,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,103.8,135.3,103.8z M135.3,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C137.9,108.2,136.8,109.4,135.3,109.4z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,103.8,36.7,103.8z M36.7,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C39.4,108.2,38.2,109.4,36.7,109.4z" - }, - "children": [] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000032644834021452807300000012529714203134445742_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,94.9,45.7,94.9z M45.7,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C48.3,99.3,47.2,100.5,45.7,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,94.9,54.7,94.9z M54.7,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C57.3,99.3,56.1,100.5,54.7,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,94.9,63.6,94.9z M63.6,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C66.3,99.3,65.1,100.5,63.6,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,94.9,72.6,94.9z M72.6,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C75.2,99.3,74,100.5,72.6,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,94.9,81.6,94.9z M81.6,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C84.2,99.3,83,100.5,81.6,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,94.9,90.5,94.9z M90.5,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C93.1,99.3,91.9,100.5,90.5,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,94.9,99.5,94.9z M99.5,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C102.1,99.3,100.9,100.5,99.5,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,94.9,108.4,94.9z M108.4,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C111,99.3,109.9,100.5,108.4,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,94.9,117.4,94.9z M117.4,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C120,99.3,118.8,100.5,117.4,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,94.9,126.3,94.9z M126.3,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C129,99.3,127.8,100.5,126.3,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,94.9,135.3,94.9z M135.3,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C137.9,99.3,136.8,100.5,135.3,100.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,94.9,36.7,94.9z M36.7,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C39.4,99.3,38.2,100.5,36.7,100.5z" - }, - "children": [] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000046301211336714059340000011006363706714132412_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,85.9,45.7,85.9z M45.7,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,91.5,45.7,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,85.9,54.7,85.9z M54.7,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,91.5,54.7,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,85.9,63.6,85.9z M63.6,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,91.5,63.6,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,85.9,72.6,85.9z M72.6,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,91.5,72.6,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,85.9,81.6,85.9z M81.6,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,91.5,81.6,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,85.9,90.5,85.9z M90.5,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,91.5,90.5,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,85.9,99.5,85.9z M99.5,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,91.5,99.5,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,85.9,108.4,85.9z M108.4,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,91.5,108.4,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,85.9,117.4,85.9z M117.4,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,91.5,117.4,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,85.9,126.3,85.9z M126.3,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,91.5,126.3,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,85.9,135.3,85.9z M135.3,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,91.5,135.3,91.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,85.9,36.7,85.9z M36.7,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,91.5,36.7,91.5z" - }, - "children": [] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": { - "id": "row_1_00000090987415974105529780000012985790832784842890_" - }, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M45.7,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C48.7,78.2,47.3,76.9,45.7,76.9z M45.7,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,82.5,45.7,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M54.7,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C57.7,78.2,56.3,76.9,54.7,76.9z M54.7,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,82.5,54.7,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M63.6,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C66.6,78.2,65.3,76.9,63.6,76.9z M63.6,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,82.5,63.6,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M72.6,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C75.6,78.2,74.2,76.9,72.6,76.9z M72.6,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,82.5,72.6,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M81.6,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C84.5,78.2,83.2,76.9,81.6,76.9z M81.6,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,82.5,81.6,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M90.5,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C93.5,78.2,92.1,76.9,90.5,76.9z M90.5,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,82.5,90.5,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M99.5,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C102.4,78.2,101.1,76.9,99.5,76.9z M99.5,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,82.5,99.5,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M108.4,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C111.4,78.2,110.1,76.9,108.4,76.9z M108.4,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,82.5,108.4,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M117.4,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C120.3,78.2,119,76.9,117.4,76.9z M117.4,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,82.5,117.4,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M126.3,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C129.3,78.2,128,76.9,126.3,76.9z M126.3,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,82.5,126.3,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M135.3,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C138.3,78.2,137,76.9,135.3,76.9z M135.3,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,82.5,135.3,82.5z" - }, - "children": [] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M36.7,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C39.7,78.2,38.4,76.9,36.7,76.9z M36.7,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,82.5,36.7,82.5z" - }, - "children": [] - } - ] - } - ] - } - ] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M171.6,208.8H0.4c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h171.3c0.1,0,0.2-0.1,0.2-0.2\n C171.8,208.9,171.7,208.8,171.6,208.8z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M171.6,212.8H0.4c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h171.3c0.1,0,0.2-0.1,0.2-0.2\n C171.8,212.9,171.7,212.8,171.6,212.8z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M10.9,202.8h-0.4c-0.1,0-0.2,0.1-0.2,0.2s0.1,0.2,0.2,0.2h0.4c0.3,0,0.6,0.1,0.8,0.4l3.3,4.5c0.4,0.5,0.8,0.9,1.3,1.1\n c0.1,0,0.2,0,0.2-0.1c0-0.1,0-0.2-0.1-0.2c-0.5-0.2-0.9-0.6-1.2-1l-3.3-4.5C11.7,203,11.3,202.8,10.9,202.8z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M161.6,202.8h-0.4c-0.4,0-0.8,0.2-1.1,0.5l-3.3,4.5c-0.3,0.4-0.7,0.8-1.2,1c-0.1,0-0.1,0.1-0.1,0.2\n c0,0.1,0.1,0.1,0.2,0.1c0.5-0.2,1-0.6,1.3-1.1l3.3-4.5c0.2-0.3,0.5-0.4,0.8-0.4h0.4c0.1,0,0.2-0.1,0.2-0.2\n C161.8,202.9,161.7,202.8,161.6,202.8z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M161.6,202.7H10.5c-0.2,0-0.4,0.2-0.4,0.4s0.2,0.4,0.4,0.4h151.2c0.2,0,0.4-0.2,0.4-0.4S161.8,202.7,161.6,202.7z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M0.4,103.9H0.3c-0.1,0-0.1,0.1-0.1,0.1c0,0.1,0.1,0.1,0.1,0.1h0.1c0.1,0,0.1-0.1,0.1-0.1C0.5,104,0.5,103.9,0.4,103.9z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M167.6,38.9c-0.1,0-0.2,0.1-0.2,0.2v203.4H4.6V39.1c0-0.1-0.1-0.2-0.2-0.2c-0.1,0-0.2,0.1-0.2,0.2v203.6\n c0,0.1,0.1,0.2,0.2,0.2h163.2c0.1,0,0.2-0.1,0.2-0.2V39.1C167.8,39,167.7,38.9,167.6,38.9z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M150.5,63.9h-129c-1.4,0-2.6,1.2-2.6,2.6v4.4c0,0.2,0.2,0.4,0.4,0.4h5.9c0.4,0,0.6,0.3,0.6,0.6v2.5\n c0,0.4-0.3,0.6-0.6,0.6h-5.9c-0.2,0-0.4,0.2-0.4,0.4v65.3c0,0.2,0.2,0.4,0.4,0.4h5.9c0.4,0,0.6,0.3,0.6,0.6v2.5\n c0,0.4-0.3,0.6-0.6,0.6h-5.9c-0.2,0-0.4,0.2-0.4,0.4V156c0,1.4,1.2,2.6,2.6,2.6h129c1.4,0,2.6-1.2,2.6-2.6v-10.9\n c0-0.2-0.2-0.4-0.4-0.4h-5.9c-0.4,0-0.6-0.3-0.6-0.6v-2.5c0-0.4,0.3-0.6,0.6-0.6h5.9c0.2,0,0.4-0.2,0.4-0.4V75.4\n c0-0.2-0.2-0.4-0.4-0.4h-5.9c-0.4,0-0.6-0.3-0.6-0.6v-2.5c0-0.4,0.3-0.6,0.6-0.6h5.9c0.2,0,0.4-0.2,0.4-0.4v-4.4\n C153.1,65.1,151.9,63.9,150.5,63.9z M19.7,70.5v-4c0-1,0.8-1.9,1.9-1.9h129c1,0,1.9,0.8,1.9,1.9v4h-5.5c-0.7,0-1.3,0.6-1.3,1.3\n v2.5c0,0.7,0.6,1.3,1.3,1.3h5.5v64.6h-5.5c-0.7,0-1.3,0.6-1.3,1.3v2.5c0,0.7,0.6,1.3,1.3,1.3h5.5V156c0,1-0.8,1.9-1.9,1.9h-129\n c-1,0-1.9-0.8-1.9-1.9v-10.5h5.5c0.7,0,1.3-0.6,1.3-1.3v-2.5c0-0.7-0.6-1.3-1.3-1.3h-5.5V75.7h5.5c0.7,0,1.3-0.6,1.3-1.3v-2.5\n c0-0.7-0.6-1.3-1.3-1.3L19.7,70.5L19.7,70.5z" - }, - "children": [] - } - ] - }, - { - "name": "g", - "type": "element", - "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M47.7,52.7c-3.2,0-5.2,3.4-6.3,5.5c-0.1,0.1-0.1,0.2-0.2,0.3c-0.4,0.8-0.9,1.7-1.8,1.7H21c-3.5,0-6.3,2.8-6.3,6.3v95.9\n c0,3.5,2.8,6.3,6.3,6.3h130c3.5,0,6.3-2.8,6.3-6.3V66.6c0-3.5-2.8-6.3-6.3-6.3h-18.4c-0.9,0-1.3-0.9-1.8-1.7\n c-0.1-0.1-0.1-0.2-0.2-0.3c-1-1.9-2.2-3.9-4.2-5c-0.8-0.4-1.7-0.6-2.5-0.5H48.1C47.9,52.7,47.8,52.7,47.7,52.7z M21,168.1\n c-3.1,0-5.6-2.5-5.6-5.6V66.6c0-3.1,2.5-5.6,5.6-5.6h18.4c1.3,0,1.9-1.2,2.4-2.1c0.1-0.1,0.1-0.2,0.2-0.3\n c1.5-2.7,3.2-5.4,6.1-5.1h76c0,0,0,0,0,0c0.7-0.1,1.5,0.1,2.2,0.4c1.8,0.9,2.9,2.9,3.9,4.7c0.1,0.1,0.1,0.2,0.2,0.3\n c0.5,0.9,1.1,2.1,2.4,2.1H151c3.1,0,5.6,2.5,5.6,5.6v95.9c0,3.1-2.5,5.6-5.6,5.6H21z" - }, - "children": [] - } - ] - } - ] - }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "Well_Labels" + }, + "children": [ { - "name": "g", + "name": "path", "type": "element", "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M141,191.4H31.1c-1.3,0-2.3,1.1-2.3,2.3v9.2c0,0.2,0.2,0.4,0.4,0.4c0.2,0,0.4-0.2,0.4-0.4v-9.2c0-0.9,0.7-1.6,1.6-1.6H141\n c0.9,0,1.6,0.7,1.6,1.6v9.2c0,0.2,0.2,0.4,0.4,0.4s0.4-0.2,0.4-0.4v-9.2C143.3,192.5,142.3,191.4,141,191.4z" - }, - "children": [] - } - ] - }, + "attributes": { + "class": "cls-1", + "d": "m82.38,87.7c.27-.2.27-.71,0-.9m0,0c-.13-.11-.31-.16-.53-.16m0,0c-.22,0-.39.06-.53.16m0,0c-.28.2-.27.7,0,.9m0,0c.26.23.8.22,1.06,0m8.84.01c.12-.08.21-.19.28-.33m0,0c.07-.14.1-.3.1-.49m0,0c0-.12-.04-.23-.11-.33m0,0c-.07-.1-.17-.18-.29-.24m0,0c-.12-.06-.24-.09-.37-.09m0,0c-.67-.04-.9.7-.65,1.21m0,0c.06.12.15.22.26.29m0,0c.23.14.58.14.8-.02m10.22-.23c.26-.39.27-1.83,0-2.22m0,0c-.13-.23-.32-.34-.58-.34m0,0c-.25,0-.45.11-.59.34m0,0c-.27.38-.27,1.83,0,2.21m0,0c.24.46.92.46,1.16,0m-82.52.68h.33m-.41-.24c.05.06.08.14.08.24m-.34-.38c.12.03.2.08.25.14m-.06-.49h-.69m.69-2.84v2.84m.47-2.84h-.47m-6.54-43.11v-.41m-.23,1.6h-1.61m1.61.4v-.4m-1.61,1.57v-1.16m-.46,1.57h2.25m-2.25-3.57v3.57m2.11-10.97h-1.57m0,1.58v-1.18m1.75,1.18h-1.75m0-3.17h-.47m19.08,52.92v-.4m-1.79.83c-.07-.1-.1-.22-.1-.35m.37.62c-.11-.08-.2-.17-.27-.26m1.66,1.3c-.07-.13-.16-.25-.27-.34m.37.81c0-.18-.04-.34-.1-.47m-.04,1.01c.1-.15.14-.33.14-.53m-2.3.45c.1.17.24.31.43.41m-.13-.97h-.45m1.77.56c-.13.11-.3.17-.52.17m.71-.62c0,.18-.06.33-.19.44m-.96-1.53c.13.08.27.16.4.23m-.77-.5c.11.1.24.19.37.27m-.64-.62c.07.13.16.25.27.35m2.02-1.25h-2.4M10.03,15.72v-1.65m1.93,1.65h-1.93m1.93,1.93h.46m-.46-1.52v1.52m-1.93-1.52h1.93m-2.38,1.52h.46m-.46-3.57v3.57m.46-3.57h-.46m2.82,9h-.35m.35,1.84v-1.84m-1.34,1.85h1.34m-.56-.93c.04.1.06.19.07.28m-.24-.55c.07.08.13.17.17.27m-1.25-.47c.13-.05.26-.08.41-.08m-.75.33c.1-.11.21-.2.34-.25m-.56.69c.05-.18.13-.33.22-.44m-.17,1.9c-.09-.21-.13-.48-.13-.81m1.04,1.43c-.21,0-.39-.05-.54-.15m.95.05c-.12.07-.26.1-.41.1m.71-.37c-.08.11-.18.2-.3.27m.53.16c.12-.11.22-.23.29-.37m-.71.62c.16-.06.3-.15.42-.26m-.93.35c.18,0,.35-.03.51-.1m-1.32-.12c.23.14.5.22.82.22m-1.35-.85c.12.28.3.49.53.63m-.72-1.63c0,.39.06.72.19.99m0-1.98c-.12.27-.18.6-.18.98m1.52-1.82c-.31,0-.59.07-.81.22m2.08,27.64c-.14-.27-.35-.47-.63-.61m.83,1.61c0-.4-.07-.73-.2-.99m-1.9,2.76h.25m-.51,0h.26m-.58-3.57v3.57m.78-3.57h-.78m2.29,9.31c-.11-.11-.24-.2-.41-.26m.79,1.08c-.02-.15-.06-.3-.12-.44m-.37.44h.49m-.64-.38c.07.12.13.25.15.38m-.44-.67c.12.07.22.16.29.28m-.73-.39c.17,0,.31.04.43.11m-.98,2.62c-.15-.1-.26-.26-.34-.47m.88.62c-.22,0-.4-.05-.55-.15m.98.05c-.12.07-.26.1-.43.1m.73-.37c-.07.11-.17.2-.29.27m.44-.65c-.03.14-.08.27-.15.38m.63-.38h-.49m.28.58c.12-.17.19-.37.21-.58m-1.35,1.15c.25,0,.48-.05.67-.16m-1.49-.06c.23.14.5.22.82.22m-1.34-.84c.12.27.29.48.52.62m-.69-1.61c0,.39.06.72.18.99m0-1.98c-.12.28-.18.61-.18.99m2.77,8.45c.02-.09.04-.19.04-.29m-.16.53c.06-.07.1-.16.13-.25m-.36.44c.1-.06.17-.12.23-.2m-.26,1.84c.22-.16.34-.39.34-.69m-1.32.93c.44,0,.77-.08.99-.24m-2.13.24h1.15m-1.15-3.57v3.57m1.19-3.57h-1.19m.46,9.97l-.35-.97m1.82.97h-1.46m1.81-.97l-.35.97m.81-.97h-.47m-.83,3.57l1.29-3.57m-1.81,3.57h.52m-1.81-3.57l1.29,3.57m-.83-3.57h-.47m28.63,8.07c-.07-.13-.17-.24-.29-.33m.39.77c0-.16-.04-.31-.1-.44m0,.85c.06-.12.1-.26.1-.41m-.37.71c.12-.08.21-.18.27-.3m-.68.49c.16-.04.29-.11.41-.19m.11,1.5c.11-.14.16-.3.16-.5m-.6.81c.19-.07.34-.18.44-.31m-1.1.42c.24,0,.46-.04.65-.11m-1.27-.02c.19.08.39.13.62.13m-1.23-1.09c0,.23.06.43.17.59m.29-.59h-.46m.58.4c-.07-.1-.12-.24-.12-.4m.41.63c-.12-.05-.22-.13-.29-.23m.66.31c-.13,0-.25-.02-.37-.07m.79,0c-.11.05-.25.08-.42.08m.68-.28c-.06.08-.15.16-.26.2m.35-.48c0,.1-.03.19-.09.28m0-.59c.07.09.11.19.11.31m-.4-.53c.12.06.22.13.29.23m-1.02-.32h.31m-.31-.39v.39m.32-.4h-.32m.78-.08c-.13.05-.29.08-.46.08m.9-.67c0,.14-.04.26-.12.36m0-.71c.07.1.11.21.11.34m-.41-.57c.13.06.23.13.3.23m-.76-.31c.17,0,.32.02.46.08m-1.01.09c.14-.12.33-.18.55-.18m-.82.69c.04-.22.12-.39.27-.51m-.73.51h.46m-.29-.57c-.11.16-.17.35-.17.57m.61-.95c-.19.09-.34.21-.44.37m1.09-.51c-.25,0-.46.05-.65.13m1.2-.07c-.17-.05-.35-.07-.55-.07m9.86,3.63v-2.26m-.47,2.26h.47m-2.13-2.24l1.67,2.24m9.84-3.05c-.11-.18-.26-.32-.45-.43m-1.04,2.16c.14.05.29.07.46.07m-.85-.31c.12.11.25.19.39.24m-.3.92l-.09-1.15m.23-.21c-.08-.05-.17-.13-.26-.23m.51.32c-.08-.02-.17-.05-.25-.1m-.48-.79c.06-.13.13-.25.22-.36m1.46-.57c-.19-.1-.42-.15-.68-.15m10.1.59c-.1-.18-.24-.33-.43-.43m-1.45,2.44c-.07-.23-.09-.51-.07-.85m.37,1.37c-.14-.12-.24-.29-.31-.52m1.37.97c.17-.07.31-.18.42-.32m-.96.43c.2,0,.38-.04.55-.11m8.36-2.97c-.06-.2-.1-.38-.11-.53m.34,1.19c-.09-.23-.16-.45-.22-.66m1.25,3.04v-.4m-2.51.4h2.51m-2.51-.4v.4m2.01-.4h-2.01m11.3-1.02c-.1-.13-.24-.23-.4-.3m-1.68,1.32c.35.48,1.14.54,1.66.33m-1.66-1.35c-.22.26-.2.76,0,1.02m.41-1.32c-.16.07-.3.17-.4.3m.06-.47c.11.09.23.14.35.17m-.55-1.43c-.19.26-.23.65-.06.94m.54-1.29c-.2.08-.36.2-.48.36m1.19-.48c-.28,0-.51.04-.72.13m10.86.74c-.11-.28-.27-.5-.48-.65m-.71,3.45c.28,0,.52-.07.72-.22m-1.37.06c.18.1.4.16.66.16m.37-2.29c-.13-.05-.26-.08-.42-.08m7.97,2.32v-3.57m-.32,3.57h.32m-.41-.24c.05.06.08.14.08.24m-.15-.73h-.69m.69-2.84v2.84m.47-2.84h-.47m1.67.4c-.4.47-.44,1.77-.18,2.39m1.11-2.85c-.39,0-.7.16-.93.46m1.86,0c-.23-.31-.54-.46-.93-.46m.93,3.21c.46-.55.46-2.19,0-2.74m6.04,2.92c.05.06.08.14.08.24m-.34-.38c.12.03.2.08.25.14m10.37-2.85v-.07m.1.43c-.07-.1-.1-.22-.1-.35m.37.62c-.11-.08-.2-.17-.27-.26m1.66,1.3c-.07-.13-.16-.25-.27-.34m.37.81c0-.18-.04-.34-.1-.47m-.04,1.01c.1-.15.14-.33.14-.53m-.55.89c.18-.08.31-.2.41-.36m-1.03.48c.24,0,.44-.04.62-.13m-1.32-.02c.19.1.42.15.69.15m-1.12-.56c.1.17.24.31.43.41m-.58-.97c0,.21.05.4.15.57m1.1.16c-.24,0-.42-.07-.56-.2m1.08.03c-.13.11-.3.17-.52.17m.71-.62c0,.18-.06.33-.19.44m-.55-1.3c.13.07.26.15.37.23m-.77-.46c.13.08.27.16.4.23m-.77-.5c.11.1.24.19.37.27m-.64-.62c.07.13.16.25.27.35m-.37-1.25v.42m2.39-.42h-2.39m-.92,3.57v-3.57m-.33,3.57h.33m-.41-.24c.05.06.08.14.08.24m-.34-.38c.12.03.2.08.25.14m-.75-.19c.21,0,.38.01.5.05m-.5-.35v.3m.69-.3h-.69m.69-2.84v2.84m.47-2.84h-.47m-6.05,3.57v-3.57m-.32,3.57h.32m-.41-.24c.05.06.08.14.08.24m-.34-.38c.12.03.2.08.25.14m-.75-.49v.3m.69-.3h-.69m.69-2.84v2.84m.47-2.84h-.47m-82.58,3.47c.19.1.42.15.69.15m79.19-.48c.21,0,.38.01.5.05M12.14,70.23c-.1-.13-.27-.24-.52-.33m.66.82c0-.19-.05-.35-.15-.49m44.07,15.54c0-.25-.06-.46-.16-.65M10.48,33.67v-1.59m1.84,27.69c-.06-.14-.15-.27-.26-.38m88.14,28.62c.48.35,1.25.25,1.6-.26M10.44,26.14c-.16-.1-.28-.25-.36-.47m45.9,62.1h-1.73M10.32,59.78c.17-.23.42-.35.74-.35m-1,1.44c0-.5.08-.86.25-1.09m-.14,1.91c-.08-.21-.12-.48-.12-.81m88,26.91c.12.03.2.08.25.14m-.75-.19c.21,0,.38.01.5.05m-.5-.35v.3M10.4,43.08h1.61m-.25,19.46c.19-.11.35-.25.47-.42m96.87,25.62c.21,0,.38.01.5.05m-55.46-2.52c.09-.11.2-.19.32-.25M10.27,59.25c-.23.14-.4.36-.52.63m1.34-.85c-.32,0-.6.07-.82.22m1.38-.13c-.16-.06-.35-.1-.56-.1m81.08,27.41c0-.4-.05-.74-.16-1.02m0,1.98c.11-.26.17-.59.17-.96m-.63,1.57c.2-.14.36-.35.47-.61m-73.91.05v.3m71.64-.11c.1.18.24.33.42.43m.62-2.21c-.23,0-.44.05-.62.14M11.61,50.28c-.28-.14-.63-.2-1.07-.2m80.96,36.08c-.09-.1-.2-.17-.32-.22m27.76-.02c-.13-.07-.26-.14-.37-.22m.76.44c-.13-.08-.26-.15-.4-.22m.76.48c-.11-.1-.23-.18-.36-.26M10.59,53.64c.44,0,.79-.08,1.07-.22m78.61,31.65c.13-.1.29-.15.47-.15M9.86,53.65h.22m79.7,31.33c-.12.14-.18.3-.21.5M9.76,53.65h.11m80.89,30.9c-.2,0-.38.04-.55.11M11.82,23.33c-.1-.09-.21-.16-.35-.22m26.45,63.71c-.11-.14-.29-.25-.52-.34m80.68.61h-.46m.69.53c-.14-.13-.22-.31-.24-.53M12.37,69.04c0-.32-.12-.56-.35-.72m107.46,18.53c.07.1.1.22.1.36m-.37-.63c.11.08.2.17.27.27M11.91,24.59h-.87m.85-.31v.31m-.52-1.07c.11.05.2.12.28.2m106.03,61.3c0,.18.04.34.1.47M10.99,23.44c.15,0,.28.02.39.08m71.11,62.94c.26-.05.49-.26.62-.49M9.95,24.87c0-.25.02-.47.08-.65m72.87,63.56c.2-.26.22-.76,0-1.02M10.48,34.07h1.57m68.55,51.89c.07.13.16.24.27.32M11.85,25.55c-.02.13-.07.25-.15.37m.64-.37h-.49m.37.43c.07-.14.11-.28.12-.43m70.24,59.12c-.2-.08-.44-.13-.72-.13m1.2.48c-.11-.15-.27-.27-.48-.36m-9.83-.07h-.5M10.4,42.67v-1.19m0,0h1.84m-2.08-18.25c-.23.14-.4.35-.52.62m2.55,20.78v-.4m42.68,40.68c.25,0,.46.07.61.22M11.97,14.08v1.65m.46-1.65h-.46m.46,3.57v-3.57m59.83,70.52c.02.16.07.36.14.6M10.03,17.65v-1.52m16.66,68.9c0,.18.04.34.1.47m-.18,1.59c0,.21.05.4.15.57m38.39-1.89c0-.24-.05-.45-.15-.63m-1.04,2.71c-.21,0-.38-.06-.53-.18m-8.53-1.12c-.1,0-.19,0-.27-.02m10.28,1.28c.11-.14.18-.3.2-.5m-37.25.53c-.24,0-.42-.07-.56-.2m80.6.55h.33M12.05,23.08v.54m51.15,64.36c.21.16.46.23.76.23m-37.26-3.62v.42m1.2,3.2c.24,0,.44-.04.62-.13m8.26-1.43c.16,0,.3.04.42.09m62.56.64c.11.28.25.48.44.62m-9.99-3.35c-.17.08-.31.18-.43.32M11.47,23.12c-.14-.06-.3-.08-.49-.08m43.48,61.99c.12-.06.26-.09.42-.09m-1.36.53l.4.17m-35.82,2.11c.21,0,.38.01.5.05m9.93.31c.18-.08.31-.2.41-.36m18.34-2.23h-.59m73.42-.51v-.4m-1.88.4h1.88m-75.55.51v.42M11.65,53.42c.27-.14.47-.34.6-.59m25.54,31.98c-.12-.09-.27-.16-.44-.2M12.05,23.62c-.06-.1-.14-.2-.24-.29m26.27,63.96c0-.18-.06-.34-.17-.48m-10.6.8c-.14-.13-.22-.31-.24-.53m8.69.63c.11.16.26.29.45.37m36.86-1.21c.16.3.34.6.54.9m-36.05-1.82c-.08.1-.19.17-.32.23m17.76.75c.22,0,.41-.04.6-.13m26.87,1.31c.18-.08.32-.19.43-.33M12.05,34.07v-.4m60.62,52.32c.11.29.24.58.4.89m-18.96-.69h-.02m53,1.25v.3m-51.36-1.99c0,.16-.04.3-.11.41m18.51,1.61c-.13-.17-.25-.37-.38-.59m-18.25-2.04c.15.14.23.35.23.6m.27,2.42v-.4m-44.36-17.88c.14-.03.26-.07.35-.13m60.42,15.43c.07.24.16.5.27.79M12.23,41.08h-2.3m43.92,47.09h2.13m34.16-2.18c-.18.09-.32.22-.42.4m-62.53-1.31v-.07m19.47.91h.59m-20.06-.91h1.89m62.61,1.49c-.04-.12-.11-.23-.19-.33m-28.24.45c.09.09.2.16.32.21m1.54.47h-.43M12.26,52.84c.13-.26.19-.58.19-.95m51.47,32.66c-.28,0-.52.07-.72.22m-7.6,2.04c.18-.09.33-.22.44-.39M11.05,24.59v.34m96.72,59.68v2.84m.47-2.84h-.47m-61.55,0v.91m18.36-.81c-.19-.1-.41-.16-.66-.16m19.2,1.42c.17-.29.13-.68-.06-.94m-27.45,1.14c-.07.12-.17.21-.29.28M12.23,35.65v-.4m41.85,50.94l-.38.12m19.68.19c-.11-.24-.21-.48-.3-.71m-19.38.52l.16,1.86m9.73-1.35c.12.05.25.07.4.07m-9.86-.71h-.02m35.46-.71h.44m-25.57,2.22c-.13.1-.28.15-.47.15m1.05-1.47c.1-.17.15-.37.15-.6m-45.91,2.41v-3.57m71.49.32c.21,0,.39.06.54.17m-28.08-.33c-.2.14-.36.35-.47.61m11.01,1.81c-.12-.22-.24-.45-.35-.69M12.19,44.25h-1.79m81.12,40.52c-.21-.15-.47-.22-.77-.22m-34.72,1.86c.11-.17.17-.38.17-.64m6.52,1.56c.11.29.26.5.47.66m28.08-2.9c.15.11.26.28.34.51m-28.89-.23c-.11.27-.17.59-.17.96m-16.34-.82h-1.68m10.37-.97c-.22,0-.43.04-.61.12m1.02,1.78c-.12.07-.26.1-.41.1m-7.65-.63v-.4M10.01,32.08v3.57m43.81,49.34c-.13.14-.23.3-.3.48m36.49.01c.04-.16.13-.29.26-.4m-.54,1.31c-.1.17-.15.37-.15.61m-42.91-1.49v-.91m-34.64-16.28c-.23-.16-.58-.24-1.03-.24m17.7,18.31c-.11-.1-.23-.18-.36-.26m34.73.16c.05.12.11.23.2.32m-.71-.28c0,.38.05.72.16,1m1.26-.43c.24,0,.44-.05.62-.14m-36.76-.42c.13.07.26.15.37.23m80.03,1.6v-3.57m-.47,2.84h-.69m-78.75-1.31c-.13-.08-.26-.15-.4-.22m61.64,1.09c0,.24.05.45.15.63m-25.13-.87c.18-.09.31-.22.41-.39m-36.8.2c.11.08.2.17.27.27m25.81-2.18c-.19.08-.35.19-.48.32m-7.14-.38h-.45M10.01,35.65h2.22m79.39,49.95c.07.23.1.53.08.89m-27,.8c-.05.17-.13.3-.26.4m-35.95-.85c.07.1.1.22.1.36m-.65-1.29c-.13-.07-.26-.14-.37-.22m55.05.23c.18-.25.13-.64-.13-.83m-.17,1.06c.13-.06.23-.14.3-.24m-.13-.82c-.16-.12-.37-.18-.63-.18m0,0c-.59-.05-1.1.48-.76,1.01m0,0c.24.36.85.4,1.22.24M11.05,69.69c.16,0,.3-.02.43-.06m.43-.57c0-.2-.08-.35-.23-.45m0,0c-.16-.1-.38-.15-.68-.15m-.72,0v1.23m0,0h.78m-.05-1.23h-.72m1.52.96c.08-.09.12-.22.12-.36m-.43.57c.13-.04.23-.11.31-.2m-.19,1.7c.16-.1.24-.25.24-.46m0,0c0-.11-.02-.2-.07-.28m-.72-.3h-.78m1.31.12c-.08-.05-.16-.08-.25-.1m-.34,1.16c.25,0,.46-.05.62-.15m-.28-1.01c-.09-.02-.18-.03-.28-.03m-.78,0v1.19m1.5-.89c-.05-.08-.11-.13-.19-.18m-1.31,1.07h.71m-.6,7.2l.61,1.73m0,0l.61-1.73m0,0h-1.22m35.82,7.44h-1.23m1.23,1.66v-1.66m-1.23,0l1.23,1.66m18.37-1.41c.12-.23.12-.62-.01-.85m0,0c-.06-.12-.16-.22-.27-.29m-.8.01c-.12.08-.21.19-.28.33m1.1,1.06c.11-.06.2-.15.26-.27m-.67-1.24c-.16,0-.29.04-.41.12m.8-.02c-.12-.07-.24-.1-.39-.1m-.68.45c-.07.14-.1.3-.1.48m.4.58c.24.13.58.12.79,0m-1.2-.58c0,.25.19.46.41.58M11.8,52.7c.11-.2.17-.47.17-.82m-1.4,1.38c.29,0,.55-.04.75-.13m-.78-2.66h-.31m1.08.14c-.22-.09-.47-.14-.76-.14m1.25.58c-.12-.2-.28-.35-.49-.44m.66,1.27c0-.35-.06-.62-.17-.83m-.47,2.07c.21-.08.37-.23.48-.43m-1.57.56h.34m-.34-2.79v2.79m71.1,33.55c-.28.2-.27.7,0,.9" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "Wells" + }, + "children": [ { - "name": "g", + "name": "path", "type": "element", "value": "", - "attributes": {}, - "children": [ - { - "name": "path", - "type": "element", - "value": "", - "attributes": { - "d": "M139,195.1H33.1c-0.4,0-0.7,0.3-0.7,0.7v7.5c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2v-7.5c0-0.2,0.1-0.3,0.3-0.3H139\n c0.2,0,0.3,0.1,0.3,0.3v7.4c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2v-7.4C139.7,195.4,139.4,195.1,139,195.1z" - }, - "children": [] - } - ] + "attributes": { + "class": "cls-1", + "d": "m122.09,79.84l.1-.09m-1.63,2.61l.04-.13m-104.49,0l.04.13m-1.63-2.61l.1.09m0-64.98l-.1.1m1.63-2.61l-.04.13m104.49,0l-.04-.13m1.63,2.61l-.1-.1m-14.23,5.68v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69c1.64-.38,2.93-1.67,3.31-3.31m-5.31,3.69v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m21.31-3.31v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-77.69-3.31v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69c1.64-.38,2.93-1.67,3.31-3.31m9.38,61h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m0-7c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m7,0v-.38m0-8.62v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m43-18v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m0-.38v.38m16,18v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m0-7h.38m-3.69,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m0-16c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m3.31,3.69v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-12.31v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m21.31,14.69v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m-3.69,3.31v.38m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-23.69-48.31v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m-7,0v.38m3.31-3.69h.38m30.31,12.69v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-3.69,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m12.69,48.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,0h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m0-.38v.38m7-9v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m-3.69,3.31v.38M62.87,20.55v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-3.69,3.31v.38m0-.38c1.64-.38,2.93-1.67,3.31-3.31m5.69,3.31v.38m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m0-7c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m21.31,3.69v-.38m-3.69-3.31h.38m0,7h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m0-.38v.38m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31M23.55,61.85c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m0,0h-.38m3.69-3.31v-.38m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m7-36v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m-3.31-3.69v.38m0-.38c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-.38-9h.38m3.31,3.69c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-7,0v.38m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m21.69,3.69v-.38m-3.69-3.31h.38m-3.69,3.31v.38m0-.38c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m.38-7c.38,1.64,1.67,2.93,3.31,3.31m5.31-3.31h.38m-3.69,3.31v.38m3.69,3.31h-.38m3.69-3.31v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69c-1.64.38-2.93,1.67-3.31,3.31m30.31,32.69v-.38m-3.69-3.31h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m-7,0v.38m27,17.62v.38m3.69,3.31h-.38m.38-7c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m3.31,3.69v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31M50.55,25.87c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-3.69,3.31v.38m-14.69,41.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m-3.31-3.69v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m7,0v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31m0-16c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m-3.31-3.69v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m0-16c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,0h.38m0,7h-.38m-3.31-3.69v.38m7,0v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m7-9v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.69,3.31h-.38m0,0c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-3.69-21.69c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m0,0h-.38m-3.31-3.69v.38m7,0v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-12.69,48.31v.38m3.69,3.31h-.38m.38-7c.38,1.64,1.67,2.93,3.31,3.31m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m7,0v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m18.38-45c.38,1.64,1.67,2.93,3.31,3.31m-7,0v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69v-.38m5.69,14.69c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m-3.31-3.69v.38m7,0v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-3.69-12.69c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m7,0v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m5.31,12.31c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m3.69-3.31v-.38m-3.69-3.31h.38m0,0c.38,1.64,1.67,2.93,3.31,3.31m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m3.69-12.69c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m9,17.62c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m0,0h-.38m0-7h.38m0,0c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69-12.69c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.69,3.31h-.38m0-7h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-7-9c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m-3.31-3.69v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-3.69-3.31h.38m0,0c.38,1.64,1.67,2.93,3.31,3.31m0-8.62v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m0,7h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m12.69,32.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m7,0v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m18,9c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m3.69-3.31v-.38m-7,0v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m0-9c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m-3.31-3.69v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m0-9.38c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m-3.31-3.69v.38m3.31-3.69h.38m3.31,3.69c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-3.31-12.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.69,3.31h-.38m0-7h.38m3.31,3.69v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m0-25c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m-3.31-3.69v.38m7,0v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m3.31,3.69c-1.64.38-2.93,1.67-3.31,3.31m8.62,2h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m-3.31-3.69v.38m7,0v-.38m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m0,.38c-1.64.38-2.93,1.67-3.31,3.31m8.62-16h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m-3.31-3.69v.38m7,0v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-36,38c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m0,0h-.38m-3.31-3.69v.38m3.31-3.69h.38m3.31,3.69v-.38m2,0c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m0-7h.38m3.31,3.69v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m0-.38v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m0-52c.38,1.64,1.67,2.93,3.31,3.31m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-3.69-3.31h.38m17.62,34c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m.38-7c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-7,0c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-3.69-5.69c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m0-7h.38m-3.69,3.31v.38m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-84.31-12.31c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-3.31,3.69h-.38m0-7h.38m26.62,18h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m0-7c.38,1.64,1.67,2.93,3.31,3.31m-7,0v.38m0-.38c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69v-.38m5.69-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m0,0h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m0-.38v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-7,9c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69,3.31h-.38m.38-7c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m3.31,3.69v-.38m-7,0v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m-27-34c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m0,0c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m-3.69,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m38-9c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m3.31,3.69v-.38m-7,0v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m0,0h-.38m-57.31,14.31v.38m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m3.69-3.31v-.38m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m3.31,3.69c-1.64.38-2.93,1.67-3.31,3.31m27,27h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m0,0h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m0,.38c-1.64.38-2.93,1.67-3.31,3.31m3.31-3.31v-.38m-7,0v.38m45-36.38c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.69,3.31h-.38m0-7h.38m3.31,3.69c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-39.31-5.31h-.38m.38-7c.38,1.64,1.67,2.93,3.31,3.31m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m7,0v-.38m-39.31,23.69c.38,1.64,1.67,2.93,3.31,3.31m-7,0v.38m3.69,3.31h-.38m3.69-3.31v-.38m-7,0c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m27,8.62c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m0-7h.38m3.31,3.69v-.38m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m0-.38v.38m30.31-23.69c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.69,3.31h-.38m.38-7c.38,1.64,1.67,2.93,3.31,3.31m-3.69-3.31h.38m3.31,3.69v-.38m-39.31,5.69c.38,1.64,1.67,2.93,3.31,3.31m-7,0c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69v-.38m-3.69-3.31h.38m-3.69,3.31v.38m7,0c-1.64.38-2.93,1.67-3.31,3.31m0,0h-.38m0,0c-.38-1.64-1.67-2.93-3.31-3.31m21.69,30.31h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-3.69-3.31h.38m-.38,7c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m-18-36.38c1.64-.38,2.93-1.67,3.31-3.31m0,7c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m3.31,3.69c-1.64.38-2.93,1.67-3.31,3.31m0-7c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m-3.31-3.69v.38m7,0v-.38m23.69,23.69c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-7,0c1.64-.38,2.93-1.67,3.31-3.31m0,0h.38m0,7h-.38m3.69-3.31c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m0-.38v.38m-27-9.38c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m0-7h.38m3.31,3.69v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m30.69,14.31c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m-3.31-3.69v.38m3.31-3.69h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69c-1.64.38-2.93,1.67-3.31,3.31m-.38,0c-.38-1.64-1.67-2.93-3.31-3.31m7,0v-.38m14.69-39.31c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-3.69-3.31h.38m0,7h-.38m-3.31-3.69c1.64-.38,2.93-1.67,3.31-3.31m-3.31,3.31v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m30.31-3.31v-.38m-3.31-3.31c.38,1.64,1.67,2.93,3.31,3.31m-3.31,3.69h-.38m-3.31-3.69v.38m3.31,3.31c-.38-1.64-1.67-2.93-3.31-3.31m3.31-3.69h.38m-3.69,3.31c1.64-.38,2.93-1.67,3.31-3.31m3.69,3.69c-1.64.38-2.93,1.67-3.31,3.31m-3.69,14.31v.38m3.69-3.69c.38,1.64,1.67,2.93,3.31,3.31m0,.38v-.38m-7,0c1.64-.38,2.93-1.67,3.31-3.31m.38,7h-.38m0,0c-.38-1.64-1.67-2.93-3.31-3.31m7,0c-1.64.38-2.93,1.67-3.31,3.31m-.38-7h.38m3.31-5.31v-.38m-3.69,3.69c-.38-1.64-1.67-2.93-3.31-3.31m0-.38c1.64-.38,2.93-1.67,3.31-3.31m.38,0c.38,1.64,1.67,2.93,3.31,3.31m0,.38c-1.64.38-2.93,1.67-3.31,3.31m-3.69-3.69v.38m3.69,3.31h-.38m0-7h.38m8.65-28.24l.08.06m-2.32-3.72l.02.1M14.52,79.1l-.08-.06m2.32,3.72l-.02-.1m0-70.59l.02-.1m-2.32,3.72l.08-.06m105.46,67.04l-.02.1m2.32-3.72l-.08.06m-78.79-27.24c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm14.75-9c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm7.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm34.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-75.25-9c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm25.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-19.45-9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm34.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-82.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm70.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-28.45,9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-46.45,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm7.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm79.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-21.25,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm25.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-84.25-9c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm43.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-12.25,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0ZM14.61,42.85c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm5.75,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm7.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm59.75,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-1.45-9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0ZM25.71,24.87c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm25.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.45,9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm43.85,9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm25.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0ZM43.71,24.87c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm23.75,9c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm43.55-9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0ZM14.61,15.87c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm7.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm61.55,63c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0ZM50.6,15.87c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm25.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-55.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm7.55,9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-1.15-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-73.45,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,27c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.45,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm34.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-55.15,9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm88.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.45,9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-19.15-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.15,9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-46.15-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm34.55,9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-19.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-19.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-19.15-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm70.85,9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-46.45,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm61.85-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-82.15,9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-3.25,18c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm43.85-18c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm52.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-19.45,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-37.15-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-28.15,27c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm79.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-37.15-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm23.74,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-57.25,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm50.75,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-66.25-18c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm1.9,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.3,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.45,27c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-37.15-9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm43.85,9c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.15-27c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm7.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm16.85,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-57.25,18c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm.33,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm43.55,9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm7.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-82.45-9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm79.55,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-10.15,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-.3,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-64.45,0c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm-.1,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.2,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm.03,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-1.45,9c-.05-3.18,4.94-3.18,4.9,0,.05,3.18-4.94,3.18-4.9,0Zm-1.8,0c-.08-5.52,8.58-5.52,8.5,0,.08,5.51-8.58,5.51-8.5,0Zm2.1,0c-.04-2.79,4.34-2.79,4.3,0,.04,2.79-4.34,2.79-4.3,0Zm-2.2,0c-.08-5.64,8.78-5.64,8.7,0,.08,5.64-8.78,5.64-8.7,0Zm2.23,0c-.04-2.75,4.28-2.75,4.24,0,.04,2.75-4.28,2.75-4.24,0Zm1.09,0c-.02-1.34,2.08-1.34,2.06,0,.02,1.34-2.08,1.34-2.06,0Zm.03,0c-.02-1.3,2.02-1.3,2,0,.02,1.3-2.02,1.3-2,0Zm-9.93-12.99c-3.28,1.48-3.3,6.49,0,7.97m0-34.97c-3.28,1.48-3.3,6.49,0,7.97m0-16.97c-3.28,1.48-3.3,6.49,0,7.97m0-16.97c-3.28,1.48-3.3,6.49,0,7.97m14.92-14.92h1.03m7.97,0h1.03m7.97,0c-1.48-3.28-6.49-3.3-7.97,0m7.97,0h1.03m7.97,0c-1.48-3.28-6.49-3.3-7.97,0m34.97,0h1.03m7.97,0c-1.48-3.28-6.49-3.3-7.97,0m7.97,0h1.03m7.97,0c-1.48-3.28-6.49-3.3-7.97,0m7.97,0h1.03m14.92,5.92v1.02m0,7.97c3.28-1.48,3.3-6.49,0-7.97m0,16.98c3.28-1.48,3.3-6.49,0-7.97m0,16.97c3.28-1.48,3.3-6.49,0-7.97m0,7.97v1.03m0,7.97c3.28-1.48,3.3-6.49,0-7.97m0,7.98v1.02m0,7.97c3.28-1.48,3.3-6.49,0-7.97m0,7.98v1.02m0,7.97c3.28-1.48,3.3-6.49,0-7.97m-14.92,14.92h-1.03m-25.97,0c1.48,3.28,6.49,3.3,7.97,0m-16.97,0c1.48,3.28,6.49,3.3,7.97,0m-7.98,0h-1.02m-7.98,0h-1.02m-7.98,0h-1.03m-16.97,0c1.48,3.28,6.49,3.3,7.97,0m-16.97,0c1.48,3.28,6.49,3.3,7.97,0m-14.92-5.92c-6.95,3.72,2.2,12.87,5.92,5.92m-5.92-32.92v-1.03m96.94,33.94h-1.02m-25.97,0c1.48,3.28,6.49,3.3,7.97,0m24.94-42.94v1.03m0,34.97v1.03M76.84,13.94h1.02m-60.94,51.94v-1.02m0-7.98v-1.02m0-34.98v-1.02m50.92-5.92c-1.48-3.28-6.49-3.3-7.97,0m-19.02,0c-1.48-3.28-6.49-3.3-7.97,0m27,66.86c1.48,3.28,6.49,3.3,7.97,0m46.03,0c3.72,6.95,12.87-2.2,5.92-5.92m-41.92,5.92h-1.02m10.03,0h-1.03m-9-66.86c-1.48-3.28-6.49-3.3-7.97,0m-51.94,24.94v-1.03m33.95,42.94c1.48,3.28,6.49,3.3,7.97,0m60.94-51.94v1.03m-60.94-15.94h1.02m7.98,0h1.02M16.93,47.88c-3.28,1.48-3.3,6.49,0,7.97M112.84,13.94c-1.48-3.28-6.49-3.3-7.97,0M16.93,74.88v-1.03m15.95,6.94h-1.03m-7.98,0h-1.02m0-66.86c-3.72-6.95-12.87,2.2-5.92,5.92m87.95,60.94c1.48,3.28,6.49,3.3,7.97,0M22.85,13.94h1.02m-6.94,42.94c-3.28,1.48-3.3,6.49,0,7.97M112.84,13.94h1.02m-18,66.86c1.48,3.28,6.49,3.3,7.97,0M85.84,13.94c-1.48-3.28-6.49-3.3-7.97,0m-36,66.86h-1.03m1.03,0c1.48,3.28,6.49,3.3,7.97,0M119.78,19.85c6.95-3.72-2.2-12.87-5.92-5.92m-18,66.86h-1.03M16.93,29.88v-1.03m14.92-14.92c-1.48-3.28-6.49-3.3-7.97,0" + }, + "children": [] } ] } diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index ad1ea16df144..f28ccf584885 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -4,6 +4,7 @@ import type { THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, + ABSORBANCE_READER_TYPE, CreateCommand, LabwareDefinition2, ModuleType, @@ -73,6 +74,9 @@ export interface HeaterShakerModuleState { export interface MagneticBlockState { type: typeof MAGNETIC_BLOCK_TYPE } +export interface AbsorbanceReaderState { + type: typeof ABSORBANCE_READER_TYPE +} export interface ModuleTemporalProperties { slot: DeckSlot moduleState: @@ -81,6 +85,7 @@ export interface ModuleTemporalProperties { | ThermocyclerModuleState | HeaterShakerModuleState | MagneticBlockState + | AbsorbanceReaderState } export interface LabwareEntity {