From 1331232e418ebfbf3cc1a82725b95cb11cf8b9bc Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Tue, 24 Jan 2023 17:38:24 +0100 Subject: [PATCH 01/60] feat(ui-common): add doc link on subsections (#1241) --- .../Areas/Hydro/ManagementOptions/index.tsx | 3 ++ .../explore/Modelization/Areas/Load.tsx | 7 ++++ .../explore/Modelization/Areas/MiscGen.tsx | 7 ++++ .../Areas/Renewables/RenewableForm.tsx | 3 ++ .../explore/Modelization/Areas/Reserve.tsx | 3 ++ .../explore/Modelization/Areas/Solar.tsx | 7 ++++ .../explore/Modelization/Areas/Wind.tsx | 11 ++++++ .../Areas/common/ClusterRoot/index.tsx | 13 ++++++- .../Areas/common/ClusterRoot/style.ts | 5 ++- .../BindingConstView/BindingConstForm.tsx | 39 ++++++++++++------- .../BindingConstView/index.tsx | 6 ++- .../BindingConstView/utils.ts | 3 ++ .../Modelization/Links/LinkView/LinkForm.tsx | 7 ++++ .../Modelization/Links/LinkView/index.tsx | 4 ++ webapp/src/components/common/DocLink.tsx | 38 ++++++++++++++++++ 15 files changed, 137 insertions(+), 19 deletions(-) create mode 100644 webapp/src/components/common/DocLink.tsx diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx index 2edda4966a..18411c41e9 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx @@ -2,8 +2,10 @@ import { useOutletContext } from "react-router"; import { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../../redux/selectors"; +import DocLink from "../../../../../../../common/DocLink"; import Form from "../../../../../../../common/Form"; import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import { ACTIVE_WINDOWS_DOC_PATH } from "../../../BindingConstraints/BindingConstView/utils"; import { Root } from "../style"; import Fields from "./Fields"; import { @@ -32,6 +34,7 @@ function ManagementOptions() { return ( +
(); const currentArea = useAppSelector(getCurrentAreaId); const url = `input/load/series/load_${currentArea}`; + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + return ( + ); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx index adb2711b19..f88cbe0c42 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx @@ -4,6 +4,8 @@ import { getCurrentAreaId } from "../../../../../../redux/selectors"; import { MatrixStats, StudyMetadata } from "../../../../../../common/types"; import MatrixInput from "../../../../../common/MatrixInput"; import { Root } from "./style"; +import DocLink from "../../../../../common/DocLink"; +import { ACTIVE_WINDOWS_DOC_PATH } from "../BindingConstraints/BindingConstView/utils"; function MiscGen() { const { study } = useOutletContext<{ study: StudyMetadata }>(); @@ -20,8 +22,13 @@ function MiscGen() { "ROW Balance", ]; + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + return ( + + (); @@ -18,6 +20,7 @@ function Reserve() { return ( + (); const currentArea = useAppSelector(getCurrentAreaId); const url = `input/solar/series/solar_${currentArea}`; + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + return ( + ); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Wind.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Wind.tsx index 8afc9e385c..d8972b3098 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Wind.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Wind.tsx @@ -4,14 +4,25 @@ import { getCurrentAreaId } from "../../../../../../redux/selectors"; import { MatrixStats, StudyMetadata } from "../../../../../../common/types"; import MatrixInput from "../../../../../common/MatrixInput"; import { Root } from "./style"; +import DocLink from "../../../../../common/DocLink"; +import { ACTIVE_WINDOWS_DOC_PATH } from "../BindingConstraints/BindingConstView/utils"; function Wind() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const currentArea = useAppSelector(getCurrentAreaId); const url = `input/wind/series/wind_${currentArea}`; + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + return ( + ); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/ClusterRoot/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/ClusterRoot/index.tsx index 339da9e8c6..160020b096 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/ClusterRoot/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/ClusterRoot/index.tsx @@ -9,7 +9,6 @@ import { Typography, } from "@mui/material"; import { useTranslation } from "react-i18next"; - import * as R from "ramda"; import ExpandLessIcon from "@mui/icons-material/ExpandLess"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; @@ -19,6 +18,7 @@ import { useEffect, useMemo, useState } from "react"; import { AxiosError } from "axios"; import { useSnackbar } from "notistack"; import { FieldValues } from "react-hook-form"; +import { Add } from "@mui/icons-material"; import { Header, ListContainer, @@ -42,6 +42,8 @@ import { CommandEnum } from "../../../../../Commands/Edition/commandTypes"; import ClusterView from "./ClusterView"; import UsePromiseCond from "../../../../../../../common/utils/UsePromiseCond"; import ConfirmationDialog from "../../../../../../../common/dialogs/ConfirmationDialog"; +import DocLink from "../../../../../../../common/DocLink"; +import { ACTIVE_WINDOWS_DOC_PATH } from "../../../BindingConstraints/BindingConstView/utils"; interface ClusterRootProps { children: (elm: { @@ -187,11 +189,18 @@ function ClusterRoot(props: ClusterRootProps) {
+
({ boxSizing: "border-box", display: "flex", flexDirection: "column", - padding: theme.spacing(1), + padding: theme.spacing(2), })); export const Header = styled(Box)(({ theme }) => ({ width: "100%", height: "60px", display: "flex", - justifyContent: "flex-end", + justifyContent: "space-between", alignItems: "center", + my: 12, })); export const ListContainer = styled(Box)(({ theme }) => ({ diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx index 1ba7f67990..43e2156044 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx @@ -7,7 +7,12 @@ import DeleteIcon from "@mui/icons-material/Delete"; import { useSnackbar } from "notistack"; import { useNavigate } from "react-router-dom"; import useEnqueueErrorSnackbar from "../../../../../../../hooks/useEnqueueErrorSnackbar"; -import { BindingConstFields, ConstraintType, dataToId } from "./utils"; +import { + ACTIVE_WINDOWS_DOC_PATH, + BindingConstFields, + ConstraintType, + dataToId, +} from "./utils"; import { AllClustersAndLinks, MatrixStats, @@ -39,6 +44,7 @@ import { CommandEnum } from "../../../../Commands/Edition/commandTypes"; import useAppDispatch from "../../../../../../../redux/hooks/useAppDispatch"; import { setCurrentBindingConst } from "../../../../../../../redux/ducks/studySyntheses"; import OutputFilters from "../../../common/OutputFilters"; +import DocLink from "../../../../../../common/DocLink"; const DEBOUNCE_DELAY = 200; @@ -226,19 +232,24 @@ export default function BindingConstForm(props: Props) { > {t("global.general")} - + + + + + ), fields: [ diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx index 5bbba20801..0d3afa6dc4 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx @@ -27,9 +27,13 @@ function BindingConstView(props: Props) { selector: (state) => getLinksAndClusters(state, study.id), }); + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + return ( - + ( diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts index 8faf4d4980..4cabb4b485 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts @@ -109,3 +109,6 @@ export const isTermExist = ( ): boolean => { return list.findIndex((item) => item.id === termId) >= 0; }; + +export const ACTIVE_WINDOWS_DOC_PATH = + "https://antares-simulator.readthedocs.io/en/latest/reference-guide/04-active_windows/"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx index 54fa096928..c545842882 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx @@ -18,6 +18,8 @@ import MatrixInput from "../../../../../../common/MatrixInput"; import LinkMatrixView from "./LinkMatrixView"; import OutputFilters from "../../../common/OutputFilters"; import { useFormContextPlus } from "../../../../../../common/Form"; +import DocLink from "../../../../../../common/DocLink"; +import { ACTIVE_WINDOWS_DOC_PATH } from "../../BindingConstraints/BindingConstView/utils"; interface Props { link: LinkElement; @@ -195,6 +197,11 @@ function LinkForm(props: Props) { flexDirection: "column", }} > +
diff --git a/webapp/src/components/common/DocLink.tsx b/webapp/src/components/common/DocLink.tsx new file mode 100644 index 0000000000..54148b68a7 --- /dev/null +++ b/webapp/src/components/common/DocLink.tsx @@ -0,0 +1,38 @@ +import { Help } from "@mui/icons-material"; +import { Tooltip, IconButton, SxProps, Theme } from "@mui/material"; +import { mergeSxProp } from "../../utils/muiUtils"; + +interface Props { + to: string; + isAbsolute?: boolean; + sx?: SxProps; +} + +function DocLink({ to, isAbsolute, sx }: Props) { + return ( + + + + + + ); +} + +export default DocLink; From 1590f840dbec5ca4fcd1eba2c125de3e4f40ebef Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Tue, 24 Jan 2023 14:23:12 +0100 Subject: [PATCH 02/60] refactor: simplify the maintenance mode and service. --- antarest/core/maintenance/model.py | 5 ----- antarest/core/maintenance/service.py | 31 +++++++++++----------------- tests/core/test_maintenance.py | 5 ++--- 3 files changed, 14 insertions(+), 27 deletions(-) diff --git a/antarest/core/maintenance/model.py b/antarest/core/maintenance/model.py index 5f519ee010..c9bb71f0a5 100644 --- a/antarest/core/maintenance/model.py +++ b/antarest/core/maintenance/model.py @@ -1,9 +1,4 @@ from enum import Enum -from typing import Optional - -from pydantic import BaseModel -from sqlalchemy import Column, String, Integer, Boolean, DateTime, ForeignKey, Sequence # type: ignore -from sqlalchemy.orm import relationship # type: ignore class MaintenanceMode(str, Enum): diff --git a/antarest/core/maintenance/service.py b/antarest/core/maintenance/service.py index dd257f14ef..0c547d1352 100644 --- a/antarest/core/maintenance/service.py +++ b/antarest/core/maintenance/service.py @@ -2,27 +2,17 @@ import shutil import time from threading import Thread -from typing import Optional, Callable - -from fastapi import HTTPException +from typing import Callable, Optional from antarest.core.config import Config from antarest.core.configdata.model import ConfigDataAppKeys from antarest.core.interfaces.cache import ICache -from antarest.core.interfaces.eventbus import ( - IEventBus, - EventType, - Event, -) -from antarest.core.maintenance.model import ( - MaintenanceMode, -) +from antarest.core.interfaces.eventbus import Event, EventType, IEventBus +from antarest.core.maintenance.model import MaintenanceMode from antarest.core.maintenance.repository import MaintenanceRepository from antarest.core.model import PermissionInfo, PublicMode -from antarest.core.requests import ( - RequestParameters, - UserHasNotPermissionError, -) +from antarest.core.requests import RequestParameters, UserHasNotPermissionError +from fastapi import HTTPException logger = logging.getLogger(__name__) @@ -51,7 +41,8 @@ def check_disk_usage(self) -> None: try: usage = shutil.disk_usage(workspace.path) logger.info( - f"Disk usage for {name}: {(100 * usage.used / usage.total):.2f}% ({(usage.free / 1000000000):.3f}GB free)" + f"Disk usage for {name}: {(100 * usage.used / usage.total):.2f}%" + f" ({(usage.free / 1000000000):.3f}GB free)" ) except Exception as e: logger.error( @@ -115,7 +106,10 @@ def _set_maintenance_data( except Exception as e: cache_save_error = f"Failed to put {cache_id} in cache" logger.error(cache_save_error, exc_info=e) - raise HTTPException(status_code=500, detail=cache_save_error) + raise HTTPException( + status_code=500, + detail=cache_save_error, + ) from e def set_maintenance_status( self, @@ -150,8 +144,7 @@ def set_message_info( data: str, request_params: RequestParameters, ) -> None: - message = "" if data.replace("\t", "").replace(" ", "") == "" else data - message = message.strip() + message = data.strip() self._set_maintenance_data( data=message, cache_id=ConfigDataAppKeys.MESSAGE_INFO.value, diff --git a/tests/core/test_maintenance.py b/tests/core/test_maintenance.py index ebae00b283..887c5e7458 100644 --- a/tests/core/test_maintenance.py +++ b/tests/core/test_maintenance.py @@ -1,9 +1,6 @@ from unittest.mock import Mock import pytest -from fastapi import HTTPException -from sqlalchemy import create_engine - from antarest.core.config import Config from antarest.core.configdata.model import ConfigDataAppKeys from antarest.core.interfaces.eventbus import Event, EventType @@ -15,11 +12,13 @@ from antarest.core.persistence import Base from antarest.core.requests import RequestParameters, UserHasNotPermissionError from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware +from sqlalchemy import create_engine def test_service_without_cache() -> None: engine = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(engine) + # noinspection PyTypeChecker,SpellCheckingInspection DBSessionMiddleware( Mock(), custom_engine=engine, From a5a568984c9562e3eba67ba30c0a076b8f30190e Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Tue, 24 Jan 2023 17:37:48 +0100 Subject: [PATCH 03/60] refactor: change the `MaintenanceMode` class to implement a conversion from/to `bool`. --- antarest/core/maintenance/model.py | 12 +++++++----- antarest/core/maintenance/service.py | 9 +++++---- antarest/core/maintenance/web.py | 3 +-- tests/core/test_maintenance.py | 10 ++++++---- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/antarest/core/maintenance/model.py b/antarest/core/maintenance/model.py index c9bb71f0a5..b8485f12b2 100644 --- a/antarest/core/maintenance/model.py +++ b/antarest/core/maintenance/model.py @@ -5,8 +5,10 @@ class MaintenanceMode(str, Enum): NORMAL_MODE = "NORMAL" MAINTENANCE_MODE = "MAINTENANCE" - @staticmethod - def to_str(element: bool) -> str: - if element: - return MaintenanceMode.MAINTENANCE_MODE.value - return MaintenanceMode.NORMAL_MODE.value + @classmethod + def from_bool(cls, flag: bool) -> "MaintenanceMode": + return {False: cls.NORMAL_MODE, True: cls.MAINTENANCE_MODE}[flag] + + def __bool__(self) -> bool: + cls = self.__class__ + return {cls.NORMAL_MODE: False, cls.MAINTENANCE_MODE: True}[self] diff --git a/antarest/core/maintenance/service.py b/antarest/core/maintenance/service.py index 0c547d1352..3f54bed00e 100644 --- a/antarest/core/maintenance/service.py +++ b/antarest/core/maintenance/service.py @@ -4,6 +4,8 @@ from threading import Thread from typing import Callable, Optional +from fastapi import HTTPException + from antarest.core.config import Config from antarest.core.configdata.model import ConfigDataAppKeys from antarest.core.interfaces.cache import ICache @@ -12,7 +14,6 @@ from antarest.core.maintenance.repository import MaintenanceRepository from antarest.core.model import PermissionInfo, PublicMode from antarest.core.requests import RequestParameters, UserHasNotPermissionError -from fastapi import HTTPException logger = logging.getLogger(__name__) @@ -116,9 +117,9 @@ def set_maintenance_status( data: bool, request_params: RequestParameters, ) -> None: - maintenance_mode = MaintenanceMode.to_str(data) + maintenance_mode = MaintenanceMode.from_bool(data) self._set_maintenance_data( - data=maintenance_mode, + data=maintenance_mode.value, cache_id=ConfigDataAppKeys.MAINTENANCE_MODE.value, db_call=lambda x: self.repo.save_maintenance_mode(x), request_params=request_params, @@ -137,7 +138,7 @@ def get_maintenance_status(self) -> bool: db_call=lambda: self.repo.get_maintenance_mode(), default_value=MaintenanceMode.NORMAL_MODE.value, ) - return data == MaintenanceMode.MAINTENANCE_MODE.value + return bool(MaintenanceMode(data)) def set_message_info( self, diff --git a/antarest/core/maintenance/web.py b/antarest/core/maintenance/web.py index 8912d2a509..9f4a17c2af 100644 --- a/antarest/core/maintenance/web.py +++ b/antarest/core/maintenance/web.py @@ -1,11 +1,10 @@ import logging from typing import Any -from fastapi import APIRouter, Depends, Body +from fastapi import APIRouter, Body, Depends from antarest.core.config import Config from antarest.core.jwt import JWTUser -from antarest.core.maintenance.model import MaintenanceMode from antarest.core.maintenance.service import MaintenanceService from antarest.core.requests import RequestParameters from antarest.login.auth import Auth diff --git a/tests/core/test_maintenance.py b/tests/core/test_maintenance.py index 887c5e7458..7018c3a4e6 100644 --- a/tests/core/test_maintenance.py +++ b/tests/core/test_maintenance.py @@ -1,6 +1,8 @@ from unittest.mock import Mock import pytest +from sqlalchemy import create_engine + from antarest.core.config import Config from antarest.core.configdata.model import ConfigDataAppKeys from antarest.core.interfaces.eventbus import Event, EventType @@ -12,7 +14,6 @@ from antarest.core.persistence import Base from antarest.core.requests import RequestParameters, UserHasNotPermissionError from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware -from sqlalchemy import create_engine def test_service_without_cache() -> None: @@ -77,13 +78,14 @@ def test_service_without_cache() -> None: # Set maintenance mode mode = True - data = MaintenanceMode.to_str(mode) + maintenance_mode = MaintenanceMode.from_bool(mode) service.set_maintenance_status( data=mode, request_params=RequestParameters(user=DEFAULT_ADMIN_USER) ) - repo_mock.save_maintenance_mode.assert_called_with(data) + repo_mock.save_maintenance_mode.assert_called_with(maintenance_mode.value) cache.put.assert_called_with( - ConfigDataAppKeys.MAINTENANCE_MODE.value, {"content": data} + ConfigDataAppKeys.MAINTENANCE_MODE.value, + {"content": maintenance_mode.value}, ) event_bus.push.assert_called_with( Event( From 06fd2bca478fc4f579ba0760e37969038e560f97 Mon Sep 17 00:00:00 2001 From: Paul Bui-Quang Date: Wed, 25 Jan 2023 09:28:52 +0100 Subject: [PATCH 04/60] fix(api-workers): Prevent scanning of the default workspace (#1244) Signed-off-by: Paul Bui-Quang --- antarest/core/exceptions.py | 8 ++++++++ antarest/study/storage/rawstudy/watcher.py | 3 +++ tests/storage/business/test_watcher.py | 17 ++++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/antarest/core/exceptions.py b/antarest/core/exceptions.py index a34da7c29e..5a0476751f 100644 --- a/antarest/core/exceptions.py +++ b/antarest/core/exceptions.py @@ -216,3 +216,11 @@ def __init__(self, *district_ids: str): class BadEditInstructionException(HTTPException): def __init__(self, message: str) -> None: super().__init__(HTTPStatus.BAD_REQUEST, message) + + +class CannotScanInternalWorkspace(HTTPException): + def __init__(self) -> None: + super().__init__( + HTTPStatus.BAD_REQUEST, + "You cannot scan the default internal workspace", + ) diff --git a/antarest/study/storage/rawstudy/watcher.py b/antarest/study/storage/rawstudy/watcher.py index fb7b960d1c..0d6e85045b 100644 --- a/antarest/study/storage/rawstudy/watcher.py +++ b/antarest/study/storage/rawstudy/watcher.py @@ -12,6 +12,7 @@ from filelock import FileLock from antarest.core.config import Config +from antarest.core.exceptions import CannotScanInternalWorkspace from antarest.core.interfaces.service import IService from antarest.core.requests import RequestParameters from antarest.core.tasks.model import TaskResult, TaskType @@ -204,6 +205,8 @@ def scan( studies: List[StudyFolder] = list() directory_path: Optional[Path] = None if workspace_directory_path is not None and workspace_name: + if workspace_name == DEFAULT_WORKSPACE_NAME: + raise CannotScanInternalWorkspace try: workspace = self.config.storage.workspaces[workspace_name] except KeyError: diff --git a/tests/storage/business/test_watcher.py b/tests/storage/business/test_watcher.py index 54b9d98cb6..80f15bfec7 100644 --- a/tests/storage/business/test_watcher.py +++ b/tests/storage/business/test_watcher.py @@ -7,6 +7,7 @@ from sqlalchemy import create_engine from antarest.core.config import Config, StorageConfig, WorkspaceConfig +from antarest.core.exceptions import CannotScanInternalWorkspace from antarest.core.persistence import Base from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware from antarest.login.model import Group @@ -27,6 +28,11 @@ def build_config(root: Path) -> Config: groups=["tata"], filter_out=["to_skip.*"], ), + "test": WorkspaceConfig( + path=root / "test", + groups=["toto"], + filter_out=["to_skip.*"], + ), } ) ) @@ -105,7 +111,7 @@ def test_partial_scan(tmp_path: Path): clean_files() - default = tmp_path / "default" + default = tmp_path / "test" default.mkdir() a = default / "studyA" a.mkdir() @@ -122,11 +128,16 @@ def test_partial_scan(tmp_path: Path): build_config(tmp_path), service, task_service=SimpleSyncTaskService() ) - watcher.scan(workspace_name="default", workspace_directory_path=default) + with pytest.raises(CannotScanInternalWorkspace): + watcher.scan( + workspace_name="default", workspace_directory_path=default + ) + + watcher.scan(workspace_name="test", workspace_directory_path=default) service.sync_studies_on_disk.assert_called_once_with( [ - StudyFolder(a, "default", [Group(id="toto", name="toto")]), + StudyFolder(a, "test", [Group(id="toto", name="toto")]), ], default, ) From 99f25906559f782bcad857650f1b8ebfcfe584c8 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE <43534797+laurent-laporte-pro@users.noreply.github.com> Date: Wed, 25 Jan 2023 09:30:31 +0100 Subject: [PATCH 05/60] feat(api-websocket): Better handle the events in eventbus braodcasting (#1240) Co-authored-by: Paul Bui-Quang --- antarest/core/interfaces/eventbus.py | 28 ++-- antarest/core/model.py | 21 ++- antarest/core/permissions.py | 8 +- antarest/core/tasks/service.py | 34 +++-- antarest/eventbus/business/redis_eventbus.py | 1 - antarest/eventbus/main.py | 8 +- antarest/eventbus/service.py | 13 +- antarest/eventbus/web.py | 38 +++-- .../launcher/adapters/abstractlauncher.py | 9 +- .../adapters/slurm_launcher/slurm_launcher.py | 19 +-- antarest/launcher/service.py | 38 +++-- antarest/study/service.py | 135 ++++++++---------- antarest/study/storage/utils.py | 24 +--- .../variantstudy/variant_study_service.py | 60 ++++---- antarest/worker/worker.py | 25 ++-- tests/core/test_file_transfer.py | 10 +- tests/core/test_tasks.py | 19 ++- tests/eventbus/test_local_eventbus.py | 7 +- tests/eventbus/test_redis_event_bus.py | 11 +- tests/eventbus/test_service.py | 39 +++-- tests/eventbus/test_websocket_manager.py | 40 +++--- tests/worker/test_worker.py | 4 +- 22 files changed, 321 insertions(+), 270 deletions(-) diff --git a/antarest/core/interfaces/eventbus.py b/antarest/core/interfaces/eventbus.py index 1de1daa288..863b9e9af4 100644 --- a/antarest/core/interfaces/eventbus.py +++ b/antarest/core/interfaces/eventbus.py @@ -1,10 +1,9 @@ from abc import ABC, abstractmethod from enum import Enum -from typing import Any, Callable, Optional, List, Awaitable - -from pydantic import BaseModel +from typing import Any, Awaitable, Callable, List, Optional from antarest.core.model import PermissionInfo +from pydantic import BaseModel class EventType(str, Enum): @@ -49,8 +48,8 @@ class EventChannelDirectory: class Event(BaseModel): type: EventType payload: Any - permissions: PermissionInfo = PermissionInfo() - channel: Optional[str] = None + permissions: PermissionInfo + channel: str = "" class IEventBus(ABC): @@ -79,13 +78,22 @@ def add_listener( type_filter: Optional[List[EventType]] = None, ) -> str: """ - Add an event listener listener - @param listener listener callback - @param type_filter list of event types to listen to (or None to catch all) + Add a new event listener in the event bus. + + The listener can listen to several types of events, depending on the filter + list. If not specified, the listener will listen to all event types. - Beware of the fact that in gunicorn, listeners will be called on the same event as many as there is workers + Note: + Be aware that in `gunicorn`, the listeners will be called on the same + event as many times as there are workers. + + Args: + listener: callback of the listener + type_filter: list of event types to listen to (or `None` to catch everything). + + Returns: + Listener registration ID (usually a UUID). """ - pass @abstractmethod def remove_listener(self, listener_id: str) -> None: diff --git a/antarest/core/model.py b/antarest/core/model.py index 6953a30eff..132ceb0b77 100644 --- a/antarest/core/model.py +++ b/antarest/core/model.py @@ -1,7 +1,12 @@ import enum -from typing import Any, Dict, List, Union, Optional +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union + from pydantic import BaseModel +if TYPE_CHECKING: + # These dependencies are only used for type checking with mypy. + from antarest.study.model import Study, StudyMetadataDTO + JSON = Dict[str, Any] ELEMENT = Union[str, int, float, bool, bytes] SUB_JSON = Union[ELEMENT, JSON, List, None] @@ -29,5 +34,17 @@ class StudyPermissionType(str, enum.Enum): class PermissionInfo(BaseModel): owner: Optional[int] = None - groups: List[str] = list() + groups: List[str] = [] public_mode: PublicMode = PublicMode.NONE + + @classmethod + def from_study( + cls, study: Union["Study", "StudyMetadataDTO"] + ) -> "PermissionInfo": + return cls( + owner=None if study.owner is None else study.owner.id, + groups=[g.id for g in study.groups if g.id is not None], + public_mode=PublicMode.NONE + if study.public_mode is None + else PublicMode(study.public_mode), + ) diff --git a/antarest/core/permissions.py b/antarest/core/permissions.py index e3a1a1135c..f7ed6b3020 100644 --- a/antarest/core/permissions.py +++ b/antarest/core/permissions.py @@ -1,7 +1,7 @@ import logging from antarest.core.jwt import JWTUser -from antarest.core.model import PermissionInfo, StudyPermissionType, PublicMode +from antarest.core.model import PermissionInfo, PublicMode, StudyPermissionType from antarest.core.roles import RoleType logger = logging.getLogger(__name__) @@ -70,8 +70,9 @@ def check_permission( ): return True + allowed_roles = permission_matrix[permission]["roles"] group_permission = any( - role in permission_matrix[permission]["roles"] # type: ignore + role in allowed_roles # type: ignore for role in [ group.role for group in (user.groups or []) @@ -81,4 +82,5 @@ def check_permission( if group_permission: return True - return permission_info.public_mode in permission_matrix[permission]["public_modes"] # type: ignore + allowed_public_modes = permission_matrix[permission]["public_modes"] + return permission_info.public_mode in allowed_public_modes # type: ignore diff --git a/antarest/core/tasks/service.py b/antarest/core/tasks/service.py index 21941e01c9..6511e95d86 100644 --- a/antarest/core/tasks/service.py +++ b/antarest/core/tasks/service.py @@ -1,38 +1,36 @@ -import asyncio import datetime import logging import time from abc import ABC, abstractmethod -from concurrent.futures import ThreadPoolExecutor, Future -from enum import Enum +from concurrent.futures import Future, ThreadPoolExecutor from http import HTTPStatus -from typing import Callable, Optional, List, Dict, Awaitable, Union, cast +from typing import Awaitable, Callable, Dict, List, Optional, Union from fastapi import HTTPException from antarest.core.config import Config from antarest.core.interfaces.eventbus import ( - IEventBus, Event, - EventType, EventChannelDirectory, + EventType, + IEventBus, ) from antarest.core.jwt import DEFAULT_ADMIN_USER -from antarest.core.model import PermissionInfo +from antarest.core.model import PermissionInfo, PublicMode from antarest.core.requests import ( - RequestParameters, MustBeAuthenticatedError, + RequestParameters, UserHasNotPermissionError, ) from antarest.core.tasks.model import ( + CustomTaskEventMessages, TaskDTO, - TaskListFilter, + TaskEventPayload, TaskJob, - TaskStatus, TaskJobLog, + TaskListFilter, TaskResult, - CustomTaskEventMessages, - TaskEventPayload, + TaskStatus, TaskType, ) from antarest.core.tasks.repository import TaskJobRepository @@ -152,6 +150,8 @@ def _send_worker_task(logger: TaskUpdateNotifier) -> TaskResult: task_type=task_type, task_args=task_args, ), + # Use `NONE` for internal events + permissions=PermissionInfo(public_mode=PublicMode.NONE), ), task_type, ) @@ -279,7 +279,12 @@ def _cancel_task(self, task_id: str, dispatch: bool = False) -> None: self.repo.save(task) elif dispatch: self.event_bus.push( - Event(type=EventType.TASK_CANCEL_REQUEST, payload=task_id) + Event( + type=EventType.TASK_CANCEL_REQUEST, + payload=task_id, + # Use `NONE` for internal events + permissions=PermissionInfo(public_mode=PublicMode.NONE), + ) ) def status_task( @@ -358,6 +363,7 @@ def _run_task( if custom_event_messages is not None else f"Task {task_id} is running", ).dict(), + permissions=PermissionInfo(public_mode=PublicMode.READ), channel=EventChannelDirectory.TASK + task_id, ) ) @@ -393,6 +399,7 @@ def _run_task( if custom_event_messages is not None else f'Task {task_id} {"completed" if result.success else "failed"}', ).dict(), + permissions=PermissionInfo(public_mode=PublicMode.READ), channel=EventChannelDirectory.TASK + task_id, ) ) @@ -411,6 +418,7 @@ def _run_task( if custom_event_messages is not None else f"Task {task_id} failed", ).dict(), + permissions=PermissionInfo(public_mode=PublicMode.READ), channel=EventChannelDirectory.TASK + task_id, ) ) diff --git a/antarest/eventbus/business/redis_eventbus.py b/antarest/eventbus/business/redis_eventbus.py index 4e27a7793c..3a4f5871bb 100644 --- a/antarest/eventbus/business/redis_eventbus.py +++ b/antarest/eventbus/business/redis_eventbus.py @@ -6,7 +6,6 @@ from redis.client import Redis from antarest.core.interfaces.eventbus import Event -from antarest.core.model import PermissionInfo from antarest.eventbus.business.interfaces import IEventBusBackend logger = logging.getLogger(__name__) diff --git a/antarest/eventbus/main.py b/antarest/eventbus/main.py index 6443754339..3d933f5aae 100644 --- a/antarest/eventbus/main.py +++ b/antarest/eventbus/main.py @@ -1,14 +1,12 @@ from typing import Optional -from fastapi import FastAPI -from redis import Redis - from antarest.core.config import Config -from antarest.core.interfaces.eventbus import IEventBus from antarest.eventbus.business.local_eventbus import LocalEventBus from antarest.eventbus.business.redis_eventbus import RedisEventBus from antarest.eventbus.service import EventBusService from antarest.eventbus.web import configure_websockets +from fastapi import FastAPI +from redis import Redis def build_eventbus( @@ -16,7 +14,7 @@ def build_eventbus( config: Config, autostart: bool = True, redis_client: Optional[Redis] = None, # type: ignore -) -> IEventBus: +) -> EventBusService: eventbus = EventBusService( RedisEventBus(redis_client) diff --git a/antarest/eventbus/service.py b/antarest/eventbus/service.py index a7b8cfd2c7..870859dc8e 100644 --- a/antarest/eventbus/service.py +++ b/antarest/eventbus/service.py @@ -3,11 +3,10 @@ import random import threading import time -from typing import List, Callable, Optional, Dict, Awaitable, Any, cast -from uuid import uuid4 +from typing import Awaitable, Callable, Dict, List, Optional +import uuid -from antarest.core.interfaces.eventbus import Event, IEventBus, EventType -from antarest.core.utils.utils import suppress_exception +from antarest.core.interfaces.eventbus import Event, EventType, IEventBus from antarest.eventbus.business.interfaces import IEventBusBackend logger = logging.getLogger(__name__) @@ -39,7 +38,7 @@ def add_queue_consumer( self, listener: Callable[[Event], Awaitable[None]], queue: str ) -> str: with self.lock: - listener_id = str(uuid4()) + listener_id = str(uuid.uuid4()) if queue not in self.consumers: self.consumers[queue] = {} self.consumers[queue][listener_id] = listener @@ -57,7 +56,7 @@ def add_listener( type_filter: Optional[List[EventType]] = None, ) -> str: with self.lock: - listener_id = str(uuid4()) + listener_id = str(uuid.uuid4()) types = type_filter or [EventType.ANY] for listener_type in types: self.listeners[listener_type][listener_id] = listener @@ -76,7 +75,7 @@ async def _run_loop(self) -> None: await self._on_events() except Exception as e: logger.error( - f"Unexpected error when processing events", exc_info=e + "Unexpected error when processing events", exc_info=e ) async def _on_events(self) -> None: diff --git a/antarest/eventbus/web.py b/antarest/eventbus/web.py index e4a1eae185..5f8297cdb8 100644 --- a/antarest/eventbus/web.py +++ b/antarest/eventbus/web.py @@ -3,19 +3,18 @@ import logging from enum import Enum from http import HTTPStatus -from typing import List, Dict, Optional, Tuple - -from fastapi import FastAPI, Query, HTTPException, Depends -from fastapi_jwt_auth import AuthJWT # type: ignore -from pydantic import BaseModel -from starlette.websockets import WebSocket, WebSocketDisconnect +from typing import List, Optional from antarest.core.config import Config -from antarest.core.interfaces.eventbus import IEventBus, Event -from antarest.core.jwt import JWTUser, DEFAULT_ADMIN_USER -from antarest.core.model import PermissionInfo, StudyPermissionType, PublicMode +from antarest.core.interfaces.eventbus import Event, IEventBus +from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTUser +from antarest.core.model import PermissionInfo, StudyPermissionType from antarest.core.permissions import check_permission from antarest.login.auth import Auth +from fastapi import Depends, FastAPI, HTTPException, Query +from fastapi_jwt_auth import AuthJWT # type: ignore +from pydantic import BaseModel +from starlette.websockets import WebSocket, WebSocketDisconnect logger = logging.getLogger(__name__) @@ -63,9 +62,7 @@ def disconnect(self, websocket: WebSocket) -> None: if connection_to_remove is not None: self.active_connections.remove(connection_to_remove) - def process_message( - self, message: str, websocket: WebSocket, user: JWTUser - ) -> None: + def process_message(self, message: str, websocket: WebSocket) -> None: connection = self._get_connection(websocket) if not connection: return @@ -79,17 +76,16 @@ def process_message( connection.channel_subscriptions.remove(ws_message.payload) async def broadcast( - self, message: str, permissions: PermissionInfo, channel: Optional[str] + self, message: str, permissions: PermissionInfo, channel: str ) -> None: for connection in self.active_connections: - if channel is not None or check_permission( + # if is subscribed to chanel and has permission, send message to websocket + if ( + not channel or channel in connection.channel_subscriptions + ) and check_permission( connection.user, permissions, StudyPermissionType.READ ): - if ( - channel is None - or channel in connection.channel_subscriptions - ): - await connection.websocket.send_text(message) + await connection.websocket.send_text(message) def configure_websockets( @@ -131,9 +127,7 @@ async def connect( while True: message = await websocket.receive_text() try: - manager.process_message( - message, websocket, user or DEFAULT_ADMIN_USER - ) + manager.process_message(message, websocket) except Exception as e: logger.error( f"Failed to process websocket message {message}", diff --git a/antarest/launcher/adapters/abstractlauncher.py b/antarest/launcher/adapters/abstractlauncher.py index d16da3a154..a9731a2358 100644 --- a/antarest/launcher/adapters/abstractlauncher.py +++ b/antarest/launcher/adapters/abstractlauncher.py @@ -1,16 +1,17 @@ import logging from abc import ABC, abstractmethod from pathlib import Path -from typing import Callable, NamedTuple, Optional, Dict, List +from typing import Callable, Dict, List, NamedTuple, Optional from antarest.core.config import Config from antarest.core.interfaces.cache import ICache from antarest.core.interfaces.eventbus import ( Event, - EventType, EventChannelDirectory, + EventType, IEventBus, ) +from antarest.core.model import PermissionInfo, PublicMode from antarest.core.requests import RequestParameters from antarest.launcher.adapters.log_parser import LaunchProgressDTO, LogParser from antarest.launcher.model import JobStatus, LauncherParametersDTO, LogType @@ -74,6 +75,7 @@ def update_log(log_line: str) -> None: "log": log_line, "job_id": job_id, }, + permissions=PermissionInfo(public_mode=PublicMode.READ), channel=EventChannelDirectory.JOB_LOGS + job_id, ) ) @@ -99,6 +101,9 @@ def update_log(log_line: str) -> None: "progress": launch_progress_dto.progress, "message": "", }, + permissions=PermissionInfo( + public_mode=PublicMode.READ + ), channel=EventChannelDirectory.JOB_STATUS + job_id, ) ) diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index 69223d0327..fa25565d81 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -8,7 +8,7 @@ import time from copy import deepcopy from pathlib import Path -from typing import Callable, Optional, Dict, Awaitable, List +from typing import Awaitable, Callable, Dict, List, Optional from filelock import FileLock @@ -21,24 +21,21 @@ from antareslauncher.study_dto import StudyDTO from antarest.core.config import Config, SlurmConfig from antarest.core.interfaces.cache import ICache -from antarest.core.interfaces.eventbus import ( - IEventBus, - Event, - EventType, -) +from antarest.core.interfaces.eventbus import Event, EventType, IEventBus +from antarest.core.model import PermissionInfo, PublicMode from antarest.core.requests import RequestParameters from antarest.core.utils.utils import assert_this, unzip from antarest.launcher.adapters.abstractlauncher import ( AbstractLauncher, - LauncherInitException, LauncherCallbacks, + LauncherInitException, ) from antarest.launcher.adapters.log_manager import LogTailManager from antarest.launcher.model import ( JobStatus, LauncherParametersDTO, - XpansionParametersDTO, LogType, + XpansionParametersDTO, ) from antarest.study.storage.rawstudy.io.reader import IniReader from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter @@ -655,7 +652,11 @@ def kill_job(self, job_id: str, dispatch: bool = True) -> None: return if dispatch: self.event_bus.push( - Event(type=EventType.STUDY_JOB_CANCEL_REQUEST, payload=job_id) + Event( + type=EventType.STUDY_JOB_CANCEL_REQUEST, + payload=job_id, + permissions=PermissionInfo(public_mode=PublicMode.NONE), + ) ) self.callbacks.update_status( job_id, diff --git a/antarest/launcher/service.py b/antarest/launcher/service.py index 27d7a2639c..3f1f1f0f00 100644 --- a/antarest/launcher/service.py +++ b/antarest/launcher/service.py @@ -5,7 +5,7 @@ from functools import reduce from http import HTTPStatus from pathlib import Path -from typing import List, Optional, cast, Dict +from typing import Dict, List, Optional, cast from uuid import UUID, uuid4 from fastapi import HTTPException @@ -16,29 +16,24 @@ from antarest.core.filetransfer.service import FileTransferManager from antarest.core.interfaces.cache import ICache from antarest.core.interfaces.eventbus import ( - IEventBus, Event, - EventType, EventChannelDirectory, + EventType, + IEventBus, ) -from antarest.core.jwt import JWTUser, DEFAULT_ADMIN_USER -from antarest.core.model import ( - StudyPermissionType, -) -from antarest.core.requests import ( - RequestParameters, - UserHasNotPermissionError, -) +from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTUser +from antarest.core.model import PermissionInfo, PublicMode, StudyPermissionType +from antarest.core.requests import RequestParameters, UserHasNotPermissionError from antarest.core.tasks.model import TaskResult, TaskType -from antarest.core.tasks.service import TaskUpdateNotifier, ITaskService +from antarest.core.tasks.service import ITaskService, TaskUpdateNotifier from antarest.core.utils.fastapi_sqlalchemy import db from antarest.core.utils.utils import ( - concat_files, - zip_dir, StopWatch, + concat_files, + concat_files_to_str, is_zip, read_in_zip, - concat_files_to_str, + zip_dir, ) from antarest.launcher.adapters.abstractlauncher import LauncherCallbacks from antarest.launcher.adapters.factory_launcher import FactoryLauncher @@ -47,19 +42,18 @@ ) from antarest.launcher.extensions.interface import ILauncherExtension from antarest.launcher.model import ( - JobResult, - JobStatus, JobLog, JobLogType, + JobResult, + JobStatus, LauncherParametersDTO, - XpansionParametersDTO, LogType, + XpansionParametersDTO, ) from antarest.launcher.repository import JobResultRepository from antarest.study.service import StudyService from antarest.study.storage.utils import ( assert_permission, - create_permission_from_study, extract_output_name, find_single_output_path, ) @@ -200,6 +194,9 @@ def update( if final_status else EventType.STUDY_JOB_STATUS_UPDATE, payload=job_result.to_dto().dict(), + permissions=PermissionInfo( + public_mode=PublicMode.READ + ), channel=EventChannelDirectory.JOB_STATUS + job_result.id, ) @@ -281,7 +278,7 @@ def run_study( Event( type=EventType.STUDY_JOB_STARTED, payload=job_status.to_dto().dict(), - permissions=create_permission_from_study(study_info), + permissions=PermissionInfo.from_study(study_info), ) ) return job_uuid @@ -314,6 +311,7 @@ def kill_job(self, job_id: str, params: RequestParameters) -> JobResult: Event( type=EventType.STUDY_JOB_CANCELLED, payload=job_status.to_dto().dict(), + permissions=PermissionInfo.from_study(study), channel=EventChannelDirectory.JOB_STATUS + job_result.id, ) ) diff --git a/antarest/study/service.py b/antarest/study/service.py index 183f56b5b2..31ec1fae79 100644 --- a/antarest/study/service.py +++ b/antarest/study/service.py @@ -6,7 +6,7 @@ from http import HTTPStatus from pathlib import Path from time import time -from typing import List, IO, Optional, cast, Union, Dict, Callable, Any, Tuple +from typing import IO, Any, Callable, Dict, List, Optional, Tuple, Union, cast from uuid import uuid4 from fastapi import HTTPException, UploadFile @@ -15,37 +15,33 @@ from antarest.core.config import Config from antarest.core.exceptions import ( - StudyNotFoundError, - StudyTypeUnsupported, - UnsupportedOperationOnArchivedStudy, - NotAManagedStudyException, CommandApplicationError, + NotAManagedStudyException, StudyDeletionNotAllowed, + StudyNotFoundError, + StudyTypeUnsupported, TaskAlreadyRunning, + UnsupportedOperationOnArchivedStudy, ) -from antarest.core.filetransfer.model import ( - FileDownloadTaskDTO, -) +from antarest.core.filetransfer.model import FileDownloadTaskDTO from antarest.core.filetransfer.service import FileTransferManager -from antarest.core.interfaces.cache import ICache, CacheConstants -from antarest.core.interfaces.eventbus import IEventBus, Event, EventType -from antarest.core.jwt import JWTUser, DEFAULT_ADMIN_USER +from antarest.core.interfaces.cache import CacheConstants, ICache +from antarest.core.interfaces.eventbus import Event, EventType, IEventBus +from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTUser from antarest.core.model import ( JSON, + SUB_JSON, + PermissionInfo, PublicMode, StudyPermissionType, - SUB_JSON, -) -from antarest.core.requests import ( - RequestParameters, - UserHasNotPermissionError, ) +from antarest.core.requests import RequestParameters, UserHasNotPermissionError from antarest.core.roles import RoleType from antarest.core.tasks.model import ( - TaskResult, - TaskType, TaskListFilter, + TaskResult, TaskStatus, + TaskType, ) from antarest.core.tasks.service import ( ITaskService, @@ -60,11 +56,14 @@ MatrixEditInstructionDTO, ) from antarest.matrixstore.utils import parse_tsv_matrix +from antarest.study.business.advanced_parameters_management import ( + AdvancedParamsManager, +) from antarest.study.business.area_management import ( + AreaCreationDTO, + AreaInfoDTO, AreaManager, AreaType, - AreaInfoDTO, - AreaCreationDTO, AreaUI, ) from antarest.study.business.binding_constraint_management import ( @@ -73,18 +72,11 @@ from antarest.study.business.config_management import ConfigManager from antarest.study.business.district_manager import DistrictManager from antarest.study.business.general_management import GeneralManager -from antarest.study.business.link_management import LinkManager, LinkInfoDTO -from antarest.study.business.hydro_management import ( - HydroManager, -) +from antarest.study.business.hydro_management import HydroManager +from antarest.study.business.link_management import LinkInfoDTO, LinkManager from antarest.study.business.matrix_management import MatrixManager -from antarest.study.business.playlist_management import ( - PlaylistManager, -) from antarest.study.business.optimization_management import OptimizationManager -from antarest.study.business.advanced_parameters_management import ( - AdvancedParamsManager, -) +from antarest.study.business.playlist_management import PlaylistManager from antarest.study.business.scenario_builder_management import ( ScenarioBuilderManager, ) @@ -97,30 +89,30 @@ ) from antarest.study.business.utils import execute_or_add_commands from antarest.study.business.xpansion_management import ( + XpansionCandidateDTO, XpansionManager, XpansionSettingsDTO, - XpansionCandidateDTO, ) from antarest.study.model import ( - Study, - StudyContentStatus, - StudyFolder, DEFAULT_WORKSPACE_NAME, - RawStudy, - StudyMetadataPatchDTO, - StudyMetadataDTO, - StudyDownloadDTO, - StudySimResultDTO, - CommentsDto, - STUDY_REFERENCE_TEMPLATES, NEW_DEFAULT_STUDY_VERSION, - PatchStudy, + STUDY_REFERENCE_TEMPLATES, + CommentsDto, + ExportFormat, MatrixIndex, - PatchCluster, PatchArea, - ExportFormat, + PatchCluster, + PatchStudy, + RawStudy, + Study, StudyAdditionalData, + StudyContentStatus, + StudyDownloadDTO, StudyDownloadLevelDTO, + StudyFolder, + StudyMetadataDTO, + StudyMetadataPatchDTO, + StudySimResultDTO, ) from antarest.study.repository import StudyMetadataRepository from antarest.study.storage.rawstudy.model.filesystem.config.model import ( @@ -142,9 +134,7 @@ from antarest.study.storage.rawstudy.model.filesystem.raw_file_node import ( RawFileNode, ) -from antarest.study.storage.rawstudy.raw_study_service import ( - RawStudyService, -) +from antarest.study.storage.rawstudy.raw_study_service import RawStudyService from antarest.study.storage.storage_service import StudyStorageService from antarest.study.storage.study_download_utils import ( StudyDownloader, @@ -152,12 +142,11 @@ ) from antarest.study.storage.study_version_upgrader import upgrade_study from antarest.study.storage.utils import ( + assert_permission, get_default_workspace_path, + get_start_date, is_managed, remove_from_cache, - assert_permission, - create_permission_from_study, - get_start_date, study_matcher, ) from antarest.study.storage.variantstudy.model.command.icommand import ICommand @@ -595,7 +584,7 @@ def update_study_information( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) return new_metadata @@ -667,7 +656,7 @@ def create_study( Event( type=EventType.STUDY_CREATED, payload=raw.to_json_summary(), - permissions=create_permission_from_study(raw), + permissions=PermissionInfo.from_study(raw), ) ) @@ -783,7 +772,7 @@ def sync_studies_on_disk( Event( type=EventType.STUDY_DELETED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) elif study.missing < clean_up_missing_studies_threshold: @@ -851,7 +840,7 @@ def sync_studies_on_disk( Event( type=EventType.STUDY_CREATED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) except Exception as e: @@ -904,7 +893,7 @@ def copy_task(notifier: TaskUpdateNotifier) -> TaskResult: Event( type=EventType.STUDY_CREATED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -948,7 +937,7 @@ def move_study( Event( type=EventType.STUDY_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1139,7 +1128,7 @@ def delete_study( Event( type=EventType.STUDY_DELETED, payload=study_info, - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1182,7 +1171,7 @@ def delete_output( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1413,7 +1402,7 @@ def import_study( Event( type=EventType.STUDY_CREATED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1587,7 +1576,7 @@ def apply_commands( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) logger.info( @@ -1628,7 +1617,7 @@ def edit_study( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) logger.info( @@ -1664,7 +1653,7 @@ def change_owner( Event( type=EventType.STUDY_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1707,7 +1696,7 @@ def add_group( Event( type=EventType.STUDY_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1743,7 +1732,7 @@ def remove_group( Event( type=EventType.STUDY_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1777,7 +1766,7 @@ def set_public_mode( Event( type=EventType.STUDY_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) logger.info( @@ -1830,7 +1819,7 @@ def create_area( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) return new_area @@ -1849,7 +1838,7 @@ def create_link( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) return new_link @@ -1871,7 +1860,7 @@ def update_area( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) return updated_area @@ -1914,7 +1903,7 @@ def delete_area( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1933,7 +1922,7 @@ def delete_link( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) @@ -1971,7 +1960,7 @@ def archive_task(notifier: TaskUpdateNotifier) -> TaskResult: Event( type=EventType.STUDY_EDITED, payload=study_to_archive.to_json_summary(), - permissions=create_permission_from_study(study_to_archive), + permissions=PermissionInfo.from_study(study_to_archive), ) ) return TaskResult(success=True, message="ok") @@ -2022,7 +2011,7 @@ def unarchive_task(notifier: TaskUpdateNotifier) -> TaskResult: Event( type=EventType.STUDY_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) remove_from_cache(cache=self.cache_service, root_id=uuid) @@ -2477,7 +2466,7 @@ def _upgrade_study(self, study_id: str, target_version: int) -> TaskResult: Event( type=EventType.STUDY_EDITED, payload=study_to_upgrade.to_json_summary(), - permissions=create_permission_from_study( + permissions=PermissionInfo.from_study( study_to_upgrade ), ) diff --git a/antarest/study/storage/utils.py b/antarest/study/storage/utils.py index 6f5c8b5ef5..8fe7223edd 100644 --- a/antarest/study/storage/utils.py +++ b/antarest/study/storage/utils.py @@ -4,11 +4,11 @@ import shutil import tempfile import time -from datetime import timedelta, datetime +from datetime import datetime, timedelta from math import ceil from pathlib import Path from time import strptime -from typing import Optional, Union, cast, Callable, List +from typing import Callable, List, Optional, Union, cast from uuid import uuid4 from zipfile import ZipFile @@ -19,17 +19,17 @@ ) from antarest.core.interfaces.cache import CacheConstants, ICache from antarest.core.jwt import JWTUser -from antarest.core.model import PermissionInfo, StudyPermissionType, PublicMode +from antarest.core.model import PermissionInfo, PublicMode, StudyPermissionType from antarest.core.permissions import check_permission from antarest.core.requests import UserHasNotPermissionError from antarest.core.utils.utils import StopWatch from antarest.study.model import ( DEFAULT_WORKSPACE_NAME, - Study, STUDY_REFERENCE_TEMPLATES, - StudyMetadataDTO, MatrixIndex, + Study, StudyDownloadLevelDTO, + StudyMetadataDTO, ) from antarest.study.storage.rawstudy.io.reader import IniReader from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter @@ -208,18 +208,6 @@ def create_new_empty_study( zip_output.extractall(path=path_study) -def create_permission_from_study( - study: Union[Study, StudyMetadataDTO] -) -> PermissionInfo: - return PermissionInfo( - owner=study.owner.id if study.owner is not None else None, - groups=[g.id for g in study.groups if g.id is not None], - public_mode=PublicMode(study.public_mode) - if study.public_mode is not None - else PublicMode.NONE, - ) - - def study_matcher( name: Optional[str], workspace: Optional[str], folder: Optional[str] ) -> Callable[[StudyMetadataDTO], bool]: @@ -262,7 +250,7 @@ def assert_permission( logger.error("FAIL permission: study not exist") raise ValueError("Metadata is None") - permission_info = create_permission_from_study(study) + permission_info = PermissionInfo.from_study(study) ok = check_permission(user, permission_info, permission_type) if raising and not ok: logger.error( diff --git a/antarest/study/storage/variantstudy/variant_study_service.py b/antarest/study/storage/variantstudy/variant_study_service.py index ca9405dc9b..08f5486d1b 100644 --- a/antarest/study/storage/variantstudy/variant_study_service.py +++ b/antarest/study/storage/variantstudy/variant_study_service.py @@ -6,7 +6,7 @@ from datetime import datetime from functools import reduce from pathlib import Path -from typing import List, Optional, cast, Tuple, Callable +from typing import Callable, List, Optional, Tuple, cast from uuid import uuid4 from fastapi import HTTPException @@ -14,33 +14,35 @@ from antarest.core.config import Config from antarest.core.exceptions import ( + CommandNotFoundError, + CommandNotValid, + CommandUpdateAuthorizationError, + NoParentStudyError, StudyNotFoundError, StudyTypeUnsupported, - NoParentStudyError, - CommandNotFoundError, VariantGenerationError, VariantStudyParentNotValid, - CommandNotValid, - CommandUpdateAuthorizationError, -) -from antarest.core.filetransfer.model import ( - FileDownloadDTO, - FileDownloadTaskDTO, ) +from antarest.core.filetransfer.model import FileDownloadTaskDTO from antarest.core.interfaces.cache import ICache from antarest.core.interfaces.eventbus import ( - IEventBus, Event, - EventType, EventChannelDirectory, + EventType, + IEventBus, ) from antarest.core.jwt import DEFAULT_ADMIN_USER -from antarest.core.model import JSON, StudyPermissionType +from antarest.core.model import ( + JSON, + PermissionInfo, + PublicMode, + StudyPermissionType, +) from antarest.core.requests import RequestParameters, UserHasNotPermissionError from antarest.core.tasks.model import ( - TaskResult, - TaskDTO, CustomTaskEventMessages, + TaskDTO, + TaskResult, TaskType, ) from antarest.core.tasks.service import ( @@ -50,50 +52,47 @@ ) from antarest.core.utils.utils import assert_this, suppress_exception from antarest.matrixstore.service import MatrixService -from antarest.study.storage.variantstudy.business.utils import ( - transform_command_to_dto, -) from antarest.study.model import ( + RawStudy, Study, + StudyAdditionalData, StudyMetadataDTO, StudySimResultDTO, - RawStudy, - StudyAdditionalData, ) from antarest.study.storage.abstract_storage_service import ( AbstractStorageService, ) from antarest.study.storage.patch_service import PatchService from antarest.study.storage.rawstudy.model.filesystem.config.model import ( - FileStudyTreeConfigDTO, FileStudyTreeConfig, + FileStudyTreeConfigDTO, ) from antarest.study.storage.rawstudy.model.filesystem.factory import ( FileStudy, StudyFactory, ) -from antarest.study.storage.rawstudy.raw_study_service import ( - RawStudyService, -) +from antarest.study.storage.rawstudy.raw_study_service import RawStudyService from antarest.study.storage.utils import ( + assert_permission, + export_study_flat, get_default_workspace_path, is_managed, remove_from_cache, - assert_permission, - create_permission_from_study, - export_study_flat, +) +from antarest.study.storage.variantstudy.business.utils import ( + transform_command_to_dto, ) from antarest.study.storage.variantstudy.command_factory import CommandFactory from antarest.study.storage.variantstudy.model.command.icommand import ICommand from antarest.study.storage.variantstudy.model.dbmodel import ( - VariantStudy, CommandBlock, + VariantStudy, VariantStudySnapshot, ) from antarest.study.storage.variantstudy.model.model import ( CommandDTO, - GenerationResultInfoDTO, CommandResultDTO, + GenerationResultInfoDTO, VariantTreeDTO, ) from antarest.study.storage.variantstudy.repository import ( @@ -252,7 +251,7 @@ def append_commands( Event( type=EventType.STUDY_DATA_EDITED, payload=study.to_json_summary(), - permissions=create_permission_from_study(study), + permissions=PermissionInfo.from_study(study), ) ) return [c.id for c in new_commands] @@ -642,7 +641,7 @@ def create_variant_study( Event( type=EventType.STUDY_CREATED, payload=variant_study.to_json_summary(), - permissions=create_permission_from_study(variant_study), + permissions=PermissionInfo.from_study(variant_study), ) ) logger.info( @@ -951,6 +950,7 @@ def notify( Event( type=EventType.STUDY_VARIANT_GENERATION_COMMAND_RESULT, payload=command_result_obj, + permissions=PermissionInfo.from_study(variant_study), channel=EventChannelDirectory.STUDY_GENERATION + variant_study.id, ) diff --git a/antarest/worker/worker.py b/antarest/worker/worker.py index bc6a7f1a2d..701ee39b61 100644 --- a/antarest/worker/worker.py +++ b/antarest/worker/worker.py @@ -1,18 +1,16 @@ -import abc import logging import threading import time from abc import abstractmethod -from concurrent.futures import ThreadPoolExecutor, Future +from concurrent.futures import Future, ThreadPoolExecutor from threading import Thread -from typing import List, Dict, Union +from typing import Dict, List, Union -from pydantic import BaseModel - -from antarest.core.interfaces.eventbus import IEventBus, Event, EventType +from antarest.core.interfaces.eventbus import Event, EventType, IEventBus from antarest.core.interfaces.service import IService +from antarest.core.model import PermissionInfo, PublicMode from antarest.core.tasks.model import TaskResult - +from pydantic import BaseModel logger = logging.getLogger(__name__) @@ -50,7 +48,12 @@ async def listen_for_tasks(self, event: Event) -> None: logger.info(f"Accepting new task {event.json()}") task_info = WorkerTaskCommand.parse_obj(event.payload) self.event_bus.push( - Event(type=EventType.WORKER_TASK_STARTED, payload=task_info) + Event( + type=EventType.WORKER_TASK_STARTED, + payload=task_info, + # Use `NONE` for internal events + permissions=PermissionInfo(public_mode=PublicMode.NONE), + ) ) with self.lock: self.futures[task_info.task_id] = self.threadpool.submit( @@ -62,7 +65,7 @@ def safe_execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: return self.execute_task(task_info) except Exception as e: logger.error( - f"Unexpected error occured when executing task {task_info.json()}", + f"Unexpected error occurred when executing task {task_info.json()}", exc_info=e, ) return TaskResult(success=False, message=repr(e)) @@ -83,6 +86,10 @@ def _loop(self) -> None: task_id=task_id, task_result=future.result(), ), + # Use `NONE` for internal events + permissions=PermissionInfo( + public_mode=PublicMode.NONE + ), ) ) del self.futures[task_id] diff --git a/tests/core/test_file_transfer.py b/tests/core/test_file_transfer.py index 94102d7e13..d7336da118 100644 --- a/tests/core/test_file_transfer.py +++ b/tests/core/test_file_transfer.py @@ -82,7 +82,7 @@ def test_lifecycle(tmp_path: Path): permissions=PermissionInfo( owner=1, groups=[], public_mode=PublicMode.NONE ), - channel=None, + channel="", ) ) filedownload_id = filedownload.id @@ -94,7 +94,7 @@ def test_lifecycle(tmp_path: Path): permissions=PermissionInfo( owner=1, groups=[], public_mode=PublicMode.NONE ), - channel=None, + channel="", ) ) @@ -106,9 +106,9 @@ def test_lifecycle(tmp_path: Path): params=RequestParameters(user=DEFAULT_ADMIN_USER) ) assert len(downloads) == 1 - filedownload.expiration_date = ( - datetime.datetime.utcnow() - datetime.timedelta(seconds=5) - ) + filedownload.expiration_date = datetime.datetime.now( + datetime.timezone.utc + ) - datetime.timedelta(seconds=5) ftm.repository.save(filedownload) downloads = ftm.list_downloads( params=RequestParameters(user=DEFAULT_ADMIN_USER) diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index 7a2d84f8ec..415fd016f9 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -1,23 +1,24 @@ import datetime from pathlib import Path from typing import Callable, List -from unittest.mock import Mock, ANY, call +from unittest.mock import ANY, Mock, call import pytest from sqlalchemy import create_engine -from antarest.core.config import Config, TaskConfig, RemoteWorkerConfig -from antarest.core.interfaces.eventbus import EventType, Event, IEventBus +from antarest.core.config import Config, RemoteWorkerConfig, TaskConfig +from antarest.core.interfaces.eventbus import Event, EventType, IEventBus from antarest.core.jwt import DEFAULT_ADMIN_USER +from antarest.core.model import PermissionInfo, PublicMode from antarest.core.persistence import Base from antarest.core.requests import RequestParameters, UserHasNotPermissionError from antarest.core.tasks.model import ( + TaskDTO, TaskJob, - TaskStatus, - TaskListFilter, TaskJobLog, + TaskListFilter, TaskResult, - TaskDTO, + TaskStatus, TaskType, ) from antarest.core.tasks.repository import TaskJobRepository @@ -468,7 +469,11 @@ def test_cancel(): "b", RequestParameters(user=DEFAULT_ADMIN_USER), dispatch=True ) service.event_bus.push.assert_called_with( - Event(type=EventType.TASK_CANCEL_REQUEST, payload="b") + Event( + type=EventType.TASK_CANCEL_REQUEST, + payload="b", + permissions=PermissionInfo(public_mode=PublicMode.NONE), + ) ) creation_date = datetime.datetime.utcnow() diff --git a/tests/eventbus/test_local_eventbus.py b/tests/eventbus/test_local_eventbus.py index 5667a83ba6..a42b40a990 100644 --- a/tests/eventbus/test_local_eventbus.py +++ b/tests/eventbus/test_local_eventbus.py @@ -1,10 +1,15 @@ from antarest.core.interfaces.eventbus import Event, EventType +from antarest.core.model import PermissionInfo, PublicMode from antarest.eventbus.business.local_eventbus import LocalEventBus def test_lifecycle(): eventbus = LocalEventBus() - event = Event(type=EventType.STUDY_EDITED, payload="foo") + event = Event( + type=EventType.STUDY_EDITED, + payload="foo", + permissions=PermissionInfo(public_mode=PublicMode.READ), + ) eventbus.push_event(event) assert eventbus.get_events() == [event] eventbus.clear_events() diff --git a/tests/eventbus/test_redis_event_bus.py b/tests/eventbus/test_redis_event_bus.py index a7a45829a2..741ed3a309 100644 --- a/tests/eventbus/test_redis_event_bus.py +++ b/tests/eventbus/test_redis_event_bus.py @@ -3,9 +3,8 @@ from unittest.mock import Mock from antarest.core.interfaces.eventbus import Event, EventType -from antarest.eventbus.business.redis_eventbus import ( - RedisEventBus, -) +from antarest.core.model import PermissionInfo, PublicMode +from antarest.eventbus.business.redis_eventbus import RedisEventBus def test_lifecycle(): @@ -15,7 +14,11 @@ def test_lifecycle(): eventbus = RedisEventBus(redis_client) pubsub_mock.subscribe.assert_called_once_with("events") - event = Event(type=EventType.STUDY_EDITED, payload="foo") + event = Event( + type=EventType.STUDY_EDITED, + payload="foo", + permissions=PermissionInfo(public_mode=PublicMode.READ), + ) serialized = event.json() pubsub_mock.get_message.return_value = {"data": serialized} eventbus.push_event(event) diff --git a/tests/eventbus/test_service.py b/tests/eventbus/test_service.py index 9052b14249..39c18a9e47 100644 --- a/tests/eventbus/test_service.py +++ b/tests/eventbus/test_service.py @@ -1,11 +1,9 @@ -import asyncio -import time -from datetime import datetime, timedelta -from typing import Callable, List, Awaitable -from unittest.mock import Mock, MagicMock +from typing import Awaitable, Callable, List +from unittest.mock import MagicMock, Mock from antarest.core.config import Config, EventBusConfig, RedisConfig from antarest.core.interfaces.eventbus import Event, EventType +from antarest.core.model import PermissionInfo, PublicMode from antarest.eventbus.main import build_eventbus from tests.conftest import autoretry_assert @@ -41,14 +39,32 @@ async def _append_to_bucket(event: Event): lid2 = event_bus.add_listener( append_to_bucket(test_bucket), [EventType.STUDY_CREATED] ) - event_bus.push(Event(type=EventType.STUDY_JOB_STARTED, payload="foo")) - event_bus.push(Event(type=EventType.STUDY_CREATED, payload="foo")) + event_bus.push( + Event( + type=EventType.STUDY_JOB_STARTED, + payload="foo", + permissions=PermissionInfo(public_mode=PublicMode.READ), + ) + ) + event_bus.push( + Event( + type=EventType.STUDY_CREATED, + payload="foo", + permissions=PermissionInfo(public_mode=PublicMode.READ), + ) + ) autoretry_assert(lambda: len(test_bucket) == 3, 2) event_bus.remove_listener(lid1) event_bus.remove_listener(lid2) test_bucket.clear() - event_bus.push(Event(type=EventType.STUDY_JOB_STARTED, payload="foo")) + event_bus.push( + Event( + type=EventType.STUDY_JOB_STARTED, + payload="foo", + permissions=PermissionInfo(public_mode=PublicMode.READ), + ) + ) autoretry_assert(lambda: len(test_bucket) == 0, 2) queue_name = "some work job" @@ -57,6 +73,11 @@ async def _append_to_bucket(event: Event): lambda event: test_bucket.append(event), queue_name ) event_bus.queue( - Event(type=EventType.WORKER_TASK, payload="worker task"), queue_name + Event( + type=EventType.WORKER_TASK, + payload="worker task", + permissions=PermissionInfo(public_mode=PublicMode.READ), + ), + queue_name, ) autoretry_assert(lambda: len(test_bucket) == 1, 2) diff --git a/tests/eventbus/test_websocket_manager.py b/tests/eventbus/test_websocket_manager.py index 5ae1044058..cf7151dd52 100644 --- a/tests/eventbus/test_websocket_manager.py +++ b/tests/eventbus/test_websocket_manager.py @@ -1,16 +1,14 @@ -import asyncio from unittest import IsolatedAsyncioTestCase -from unittest.mock import Mock, MagicMock - -from starlette.websockets import WebSocket +from unittest.mock import MagicMock, call from antarest.core.jwt import JWTUser -from antarest.core.model import PermissionInfo, PublicMode +from antarest.core.model import PermissionInfo from antarest.eventbus.web import ( ConnectionManager, WebsocketMessage, WebsocketMessageAction, ) +from starlette.websockets import WebSocket class AsyncMock(MagicMock): @@ -19,35 +17,39 @@ async def __call__(self, *args, **kwargs): class ConnectionManagerTest(IsolatedAsyncioTestCase): + # noinspection PyMethodMayBeStatic async def test_subscriptions(self): ws_manager = ConnectionManager() user = JWTUser(id=1, type="user", impersonator=1, groups=[]) - subscription_message = WebsocketMessage( + subscribe_message = WebsocketMessage( action=WebsocketMessageAction.SUBSCRIBE, payload="foo" ) - unsubscription_message = WebsocketMessage( + unsubscribe_message = WebsocketMessage( action=WebsocketMessageAction.UNSUBSCRIBE, payload="foo" ) mock_connection = AsyncMock(spec=WebSocket) await ws_manager.connect(mock_connection, user) assert len(ws_manager.active_connections) == 1 - ws_manager.process_message( - subscription_message.json(), mock_connection, user - ) - assert len(ws_manager.active_connections[0].channel_subscriptions) == 1 - assert ( - ws_manager.active_connections[0].channel_subscriptions[0] == "foo" - ) + ws_manager.process_message(subscribe_message.json(), mock_connection) + connections = ws_manager.active_connections[0] + assert len(connections.channel_subscriptions) == 1 + assert connections.channel_subscriptions[0] == "foo" - await ws_manager.broadcast("hello", PermissionInfo(), channel="foo") - mock_connection.send_text.assert_called_with("hello") + # the event manager must send events if the channel is empty (i.e.: ""), + await ws_manager.broadcast("msg1", PermissionInfo(), channel="") + # the event manager must send events if the channel is a subscriber channel + await ws_manager.broadcast("msg2", PermissionInfo(), channel="foo") + # the event manager must not send events if the channel does not correspond to any subscriber channel + await ws_manager.broadcast("msg3", PermissionInfo(), channel="bar") - ws_manager.process_message( - unsubscription_message.json(), mock_connection, user + mock_connection.send_text.assert_has_calls( + [call("msg1"), call("msg2")] ) - assert len(ws_manager.active_connections[0].channel_subscriptions) == 0 + + ws_manager.process_message(unsubscribe_message.json(), mock_connection) + assert len(connections.channel_subscriptions) == 0 ws_manager.disconnect(mock_connection) assert len(ws_manager.active_connections) == 0 diff --git a/tests/worker/test_worker.py b/tests/worker/test_worker.py index 131df98014..ef9d468261 100644 --- a/tests/worker/test_worker.py +++ b/tests/worker/test_worker.py @@ -3,7 +3,8 @@ from unittest.mock import MagicMock from antarest.core.config import Config -from antarest.core.interfaces.eventbus import IEventBus, Event, EventType +from antarest.core.interfaces.eventbus import Event, EventType, IEventBus +from antarest.core.model import PermissionInfo, PublicMode from antarest.core.tasks.model import TaskResult from antarest.eventbus.main import build_eventbus from antarest.worker.worker import AbstractWorker, WorkerTaskCommand @@ -34,6 +35,7 @@ def test_simple_task(tmp_path: Path): task_id="some task", task_args={"file": "foo"}, ), + permissions=PermissionInfo(public_mode=PublicMode.READ), ), task_queue, ) From 463e7a789eebd2b28c33bd18e833bbd30dc9268a Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Wed, 25 Jan 2023 11:52:22 +0100 Subject: [PATCH 06/60] fix(ui-study): remove the create command button (#1251) --- .../Commands/Edition/AddCommandDialog.tsx | 86 ------------------- .../Singlestudy/Commands/Edition/index.tsx | 47 +--------- 2 files changed, 2 insertions(+), 131 deletions(-) delete mode 100644 webapp/src/components/App/Singlestudy/Commands/Edition/AddCommandDialog.tsx diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/AddCommandDialog.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/AddCommandDialog.tsx deleted file mode 100644 index 49db2c6a6f..0000000000 --- a/webapp/src/components/App/Singlestudy/Commands/Edition/AddCommandDialog.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { Autocomplete, Box, Button, TextField } from "@mui/material"; -import { useState } from "react"; -import { useTranslation } from "react-i18next"; -import BasicDialog from "../../../../common/dialogs/BasicDialog"; -import { CommandList } from "./utils"; - -interface PropTypes { - open: boolean; - onNewCommand: (action: string) => void; - onClose: () => void; -} - -function AddCommandDialog(props: PropTypes) { - const [t] = useTranslation(); - const { open, onNewCommand, onClose } = props; - const [action, setAction] = useState(CommandList[0]); - - const onSave = async () => { - onNewCommand(action); - onClose(); - }; - - return ( - - - - - } - > - - option} - value={action || null} - onChange={(event, newValue: string | null) => - setAction(newValue !== null ? newValue : CommandList[0]) - } - sx={{ - width: "70%", - }} - renderInput={(params) => ( - - )} - /> - - - ); -} - -export default AddCommandDialog; diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx index a71acb5c37..305963995d 100644 --- a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx +++ b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx @@ -3,7 +3,6 @@ import { useSnackbar } from "notistack"; import { useTranslation } from "react-i18next"; import { DropResult } from "react-beautiful-dnd"; import _ from "lodash"; -import QueueIcon from "@mui/icons-material/Queue"; import CloudDownloadOutlinedIcon from "@mui/icons-material/CloudDownloadOutlined"; import DeleteForeverIcon from "@mui/icons-material/DeleteForever"; import BoltIcon from "@mui/icons-material/Bolt"; @@ -23,7 +22,6 @@ import { updateCommandResults, } from "./utils"; import { - appendCommand, deleteCommand, getCommand, getCommands, @@ -34,9 +32,7 @@ import { getStudyTask, exportCommandsMatrices, } from "../../../../../services/api/variant"; -import AddCommandDialog from "./AddCommandDialog"; import { - CommandDTO, WSEvent, WSMessage, CommandResultDTO, @@ -47,7 +43,6 @@ import CommandImportButton from "./DraggableCommands/CommandImportButton"; import { getTask } from "../../../../../services/api/tasks"; import { Body, EditHeader, Header, headerIconStyle, Root } from "./style"; import SimpleLoader from "../../../../common/loaders/SimpleLoader"; -import SimpleContent from "../../../../common/page/SimpleContent"; import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; import { addWsMessageListener, @@ -56,6 +51,7 @@ import { } from "../../../../../services/webSockets"; import ConfirmationDialog from "../../../../common/dialogs/ConfirmationDialog"; import CheckBoxFE from "../../../../common/fieldEditors/CheckBoxFE"; +import SimpleContent from "../../../../common/page/SimpleContent"; const logError = debug("antares:variantedition:error"); @@ -69,8 +65,6 @@ function EditionView(props: Props) { const { enqueueSnackbar } = useSnackbar(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const { studyId } = props; - const [openAddCommandDialog, setOpenAddCommandDialog] = - useState(false); const [openClearCommandsDialog, setOpenClearCommandsDialog] = useState(false); const [openExportCommandsDialog, setOpenExportCommandsDialog] = @@ -142,19 +136,6 @@ function EditionView(props: Props) { } }; - const onNewCommand = async (action: string) => { - try { - const elmDTO: CommandDTO = { action, args: {} }; - const newId = await appendCommand(studyId, elmDTO); - setCommands(commands.concat([{ ...elmDTO, id: newId, updated: false }])); - enqueueSnackbar(t("variants.success.commandAdded"), { - variant: "success", - }); - } catch (e) { - enqueueErrorSnackbar(t("variants.error.addCommand"), e as AxiosError); - } - }; - const onArgsUpdate = (index: number, args: object) => { let tmpCommand: Array = []; tmpCommand = tmpCommand.concat(commands); @@ -467,12 +448,6 @@ function EditionView(props: Props) { onClick={() => setOpenExportCommandsDialog(true)} /> - - setOpenAddCommandDialog(true)} - /> - - setOpenAddCommandDialog(true)} - > - {t("button.newCommand")} - - } - /> + ) @@ -548,13 +512,6 @@ function EditionView(props: Props) { )} - {openAddCommandDialog && ( - setOpenAddCommandDialog(false)} - onNewCommand={onNewCommand} - /> - )} {openClearCommandsDialog && ( Date: Wed, 25 Jan 2023 16:38:28 +0100 Subject: [PATCH 07/60] feat(ui-commands): add confirm dialog on delete command (#1258) --- webapp/public/locales/en/main.json | 1 + webapp/public/locales/fr/main.json | 1 + .../Singlestudy/Commands/Edition/index.tsx | 51 ++++++++++++------- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json index 2508723f95..5c5a1f5216 100644 --- a/webapp/public/locales/en/main.json +++ b/webapp/public/locales/en/main.json @@ -563,6 +563,7 @@ "variants.commands.export": "Export all commands", "variants.commands.exportMatrices": "Export matrices", "variants.commands.question.deleteAll": "Are you sure you want to delete all commands ?", + "variants.commands.question.delete": "Are you sure you want to delete this command ?", "xpansion.timeSeries": "Time series", "xpansion.link": "Link", "xpansion.annualCost": "Annual cost per mw", diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json index 74c47471bd..0dcf62d572 100644 --- a/webapp/public/locales/fr/main.json +++ b/webapp/public/locales/fr/main.json @@ -561,6 +561,7 @@ "variants.commands.export": "Exporter les commandes", "variants.commands.exportMatrices": "Exporter les matrices", "variants.commands.question.deleteAll": "Êtes-vous sûr de vouloir supprimer toutes les commandes ?", + "variants.commands.question.delete": "Êtes-vous sûr de vouloir supprimer cette commande ?", "xpansion.timeSeries": "Séries temporelles", "xpansion.link": "Lien", "xpansion.annualCost": "Coût annuel par mw", diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx index 305963995d..dbb282c6a4 100644 --- a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx +++ b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx @@ -65,12 +65,12 @@ function EditionView(props: Props) { const { enqueueSnackbar } = useSnackbar(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const { studyId } = props; - const [openClearCommandsDialog, setOpenClearCommandsDialog] = - useState(false); + const [openClearCommandsDialog, setOpenClearCommandsDialog] = useState(false); + const [openDeleteCommandDialog, setOpenDeleteCommandDialog] = useState(-1); const [openExportCommandsDialog, setOpenExportCommandsDialog] = - useState(false); + useState(false); const [exportMatrices, setExportMatrices] = useState(false); - const [generationStatus, setGenerationStatus] = useState(false); + const [generationStatus, setGenerationStatus] = useState(false); const [generationTaskId, setGenerationTaskId] = useState(); const [currentCommandGenerationIndex, setCurrentCommandGenerationIndex] = useState(-1); @@ -120,20 +120,7 @@ function EditionView(props: Props) { }; const onDelete = async (index: number) => { - try { - const elm = commands[index]; - await deleteCommand(studyId, elm.id as string); - setCommands((commandList) => - commandList - .filter((item, idx) => idx !== index) - .map((item) => ({ ...item, results: undefined })) - ); - enqueueSnackbar(t("variants.success.delete"), { - variant: "success", - }); - } catch (e) { - enqueueErrorSnackbar(t("variants.error.commandDeleted"), e as AxiosError); - } + setOpenDeleteCommandDialog(index); }; const onArgsUpdate = (index: number, args: object) => { @@ -426,6 +413,25 @@ function EditionView(props: Props) { } }; + const handleDeleteCommand = async () => { + setOpenDeleteCommandDialog(-1); + try { + const index = openDeleteCommandDialog; + const elm = commands[index]; + await deleteCommand(studyId, elm.id as string); + setCommands((commandList) => + commandList + .filter((item, idx) => idx !== index) + .map((item) => ({ ...item, results: undefined })) + ); + enqueueSnackbar(t("variants.success.delete"), { + variant: "success", + }); + } catch (e) { + enqueueErrorSnackbar(t("variants.error.commandDeleted"), e as AxiosError); + } + }; + //////////////////////////////////////////////////////////////// // JSX //////////////////////////////////////////////////////////////// @@ -521,6 +527,15 @@ function EditionView(props: Props) { {t("variants.commands.question.deleteAll")} )} + {openDeleteCommandDialog > -1 && ( + setOpenDeleteCommandDialog(-1)} + > + {t("variants.commands.question.delete")} + + )} {openExportCommandsDialog && ( Date: Thu, 26 Jan 2023 17:16:19 +0100 Subject: [PATCH 08/60] fix(storage/variant): create filestudy config with correct output path (#1260) Signed-off-by: Paul Co-authored-by: Paul --- antarest/study/storage/variantstudy/variant_study_service.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/antarest/study/storage/variantstudy/variant_study_service.py b/antarest/study/storage/variantstudy/variant_study_service.py index 08f5486d1b..e861a17678 100644 --- a/antarest/study/storage/variantstudy/variant_study_service.py +++ b/antarest/study/storage/variantstudy/variant_study_service.py @@ -884,6 +884,7 @@ def _generate( study = self.study_factory.create_from_fs( self.get_study_path(variant_study), study_id=variant_study.id, + output_path=Path(variant_study.path) / OUTPUT_RELATIVE_PATH, ) variant_study.additional_data = ( self._read_additional_data_from_files(study) @@ -1267,6 +1268,8 @@ def initialize_additional_data(self, variant_study: VariantStudy) -> bool: study = self.study_factory.create_from_fs( self.get_study_path(variant_study), study_id=variant_study.id, + output_path=Path(variant_study.path) + / OUTPUT_RELATIVE_PATH, ) variant_study.additional_data = ( self._read_additional_data_from_files(study) From 1c042af7d4c713bcbd530062cb9e31ead45e1517 Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Thu, 26 Jan 2023 17:56:17 +0100 Subject: [PATCH 09/60] feat(redux): extend left menu by default (#1266) --- webapp/src/redux/ducks/ui.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/src/redux/ducks/ui.ts b/webapp/src/redux/ducks/ui.ts index 458f16fc96..cf052b58ee 100644 --- a/webapp/src/redux/ducks/ui.ts +++ b/webapp/src/redux/ducks/ui.ts @@ -11,7 +11,7 @@ export interface UIState { } const initialState = { - menuExtended: false, + menuExtended: true, currentPage: "/", webSocketConnected: false, maintenanceMode: false, From a44a8964da226931b7a67b95765abc7baf031eb4 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Mon, 30 Jan 2023 11:56:31 +0100 Subject: [PATCH 10/60] build: update version to 2.13.0 --- antarest/__init__.py | 2 +- setup.py | 2 +- sonar-project.properties | 2 +- webapp/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/antarest/__init__.py b/antarest/__init__.py index e16c09f628..0761e13c39 100644 --- a/antarest/__init__.py +++ b/antarest/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.12.0" +__version__ = "2.13.0" from pathlib import Path diff --git a/setup.py b/setup.py index fc48a9f4e4..9f329df65e 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="AntaREST", - version="2.12.0", + version="2.13.0", description="Antares Server", long_description=long_description, long_description_content_type="text/markdown", diff --git a/sonar-project.properties b/sonar-project.properties index 8b5f79fc47..1f6f0c0f83 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,5 +6,5 @@ sonar.exclusions=antarest/gui.py,antarest/main.py sonar.python.coverage.reportPaths=coverage.xml sonar.python.version=3.8 sonar.javascript.lcov.reportPaths=webapp/coverage/lcov.info -sonar.projectVersion=2.12.0 +sonar.projectVersion=2.13.0 sonar.coverage.exclusions=antarest/gui.py,antarest/main.py,antarest/singleton_services.py,antarest/worker/archive_worker_service.py,webapp/**/* \ No newline at end of file diff --git a/webapp/package.json b/webapp/package.json index 80a9878f95..712b1a2c14 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -1,6 +1,6 @@ { "name": "antares-web", - "version": "2.12.0", + "version": "2.13.0", "private": true, "dependencies": { "@emotion/react": "11.10.0", From 86f90764591e7b863db236891e2aba926d4b1ab1 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Mon, 30 Jan 2023 15:07:42 +0100 Subject: [PATCH 11/60] style: fix mypy error: Unused "type: ignore" comment. --- antarest/gui.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/antarest/gui.py b/antarest/gui.py index 6892eb42df..d95ae37b39 100644 --- a/antarest/gui.py +++ b/antarest/gui.py @@ -7,15 +7,12 @@ from pathlib import Path import requests - -from antarest import __version__ - import uvicorn # type: ignore -from PyQt5.QtGui import QIcon -from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu, QAction - +from antarest import __version__ from antarest.core.utils.utils import get_local_path from antarest.main import fastapi_app, get_arguments +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QAction, QApplication, QMenu, QSystemTrayIcon RESOURCE_PATH = get_local_path() / "resources" @@ -83,11 +80,11 @@ def open_app() -> None: menu = QMenu() openapp = QAction("Open application") menu.addAction(openapp) - openapp.triggered.connect(open_app) # type: ignore + openapp.triggered.connect(open_app) # To quit the app quit = QAction("Quit") - quit.triggered.connect(app.quit) # type: ignore + quit.triggered.connect(app.quit) menu.addAction(quit) # Adding options to the System Tray From 96e2b824eb348d1a3fe5bacf89de35e9cb7fc0fa Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Mon, 30 Jan 2023 15:09:10 +0100 Subject: [PATCH 12/60] build: remove redundant call to `mypy` in GitHub actions. --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ba537a6ee3..e98142e8c4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,6 @@ jobs: #continue-on-error: true run: | mypy --install-types --non-interactive - mypy python-test: runs-on: ${{ matrix.os }} From b70b2819eeebab988ba951b2def2314dc61cd32d Mon Sep 17 00:00:00 2001 From: Paul Bui-Quang Date: Thu, 26 Jan 2023 16:42:54 +0100 Subject: [PATCH 13/60] fix(storage/layers): transform area_ui object for single area studies Signed-off-by: Paul Bui-Quang --- antarest/study/business/area_management.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/antarest/study/business/area_management.py b/antarest/study/business/area_management.py index d28d726333..1f6402286f 100644 --- a/antarest/study/business/area_management.py +++ b/antarest/study/business/area_management.py @@ -168,6 +168,12 @@ def get_layers(self, study: RawStudy) -> List[LayerInfoDTO]: if len(file_study.config.areas) else {} ) + + # if there is only 1 area, the area_ui object is not a dict keyed by area_id + area_list = list(file_study.config.areas.keys()) + if len(area_list) == 1: + areas_ui = {area_list[0]: areas_ui} + if len(layers) == 0: layers["0"] = "All" layers_with_items = [ From 7f66c1aa518bea09c2db52ae87ef36e14cd5b9e0 Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Tue, 31 Jan 2023 15:47:20 +0100 Subject: [PATCH 14/60] fix(ui-wording): correct wording of user messages (#1271) Co-authored-by: Laurent LAPORTE --- webapp/public/locales/en/main.json | 132 +++++++++--------- webapp/public/locales/fr/main.json | 26 ++-- .../Areas/Properties/PropertiesForm.tsx | 2 +- .../Modelization/Links/LinkView/LinkForm.tsx | 2 +- .../Links/LinkView/LinkMatrixView.tsx | 2 +- .../Xpansion/Settings/SettingsForm.tsx | 2 +- .../common/MatrixInput/MatrixAssignDialog.tsx | 4 +- 7 files changed, 85 insertions(+), 85 deletions(-) diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json index 5c5a1f5216..f448254041 100644 --- a/webapp/public/locales/en/main.json +++ b/webapp/public/locales/en/main.json @@ -24,16 +24,16 @@ "global.permission": "Permission", "global.permissions": "Permissions", "global.group": "Group", - "global.variants": "Variant management", + "global.variants": "Variants management", "global.password": "Password", "global.create": "Create", "global.open": "Open", "global.name": "Name", "global.import": "Import", - "global.importHint": "Click or drag'n'drop here", + "global.importHint": "Click or drag and drop here", "global.launch": "Launch", "global.jobs": "Jobs", - "global.unknown": "Unkown", + "global.unknown": "Unknown", "global.search": "Search", "global.date": "Date", "global.general": "General", @@ -59,7 +59,7 @@ "global.color": "Color", "global.advancedParams": "Advanced parameters", "global.matrix": "Matrix", - "global.matrixes": "Matrixes", + "global.matrices": "Matrices", "global.chooseFile": "Choose a file", "global.assign": "Assign", "global.time.hourly": "Hourly", @@ -83,7 +83,7 @@ "settings.title": "Settings", "data.title": "Data", "dialog.title.confirmation": "Confirmation", - "dialog.message.logout": "Are you sure you want to logout ?", + "dialog.message.logout": "Are you sure you want to logout?", "button.hide": "Hide", "button.yes": "Yes", "button.no": "No", @@ -108,7 +108,7 @@ "form.field.minLength": "{{0}} character(s) minimum", "form.field.notAllowedValue": "Not allowed value", "matrix.graphSelector": "Columns", - "matrix.message.importHint": "Click or drag'n'drop a matrix here", + "matrix.message.importHint": "Click or drag and drop a matrix here", "matrix.importNewMatrix": "Import a new matrix", "matrix.monotonicView": "Monotonic", "matrix.message.matrixEmpty": "Empty matrix", @@ -150,9 +150,9 @@ "settings.noUser": "No user", "settings.noGroup": "No group", "settings.noToken": "No token", - "settings.question.deleteGroup": "Are you sure you want to delete '{{0}}' group ?", - "settings.question.deleteUser": "Are you sure you want to delete '{{0}}' user ?", - "settings.question.deleteToken": "Are you sure you want to delete '{{0}}' token ?", + "settings.question.deleteGroup": "Are you sure you want to delete '{{0}}' group?", + "settings.question.deleteUser": "Are you sure you want to delete '{{0}}' user?", + "settings.question.deleteToken": "Are you sure you want to delete '{{0}}' token?", "settings.question.updateMaintenance": "Are you sure you want to change the maintenance settings?", "settings.success.groupCreation": "'{{0}}' group successfully created", "settings.success.groupUpdate": "'{{0}}' group successfully updated", @@ -177,7 +177,7 @@ "settings.error.updateMaintenance": "Maintenance mode not updated", "launcher.additionalModes": "Additional modes", "launcher.autoUnzip": "Automatically unzip", - "launcher.xpress": "Use xpress solver (>= 8.3)", + "launcher.xpress": "Use Xpress Solver (>= 8.3)", "launcher.xpansion.sensitivityMode": "Sensitivity mode", "launcher.xpansion.versionCpp": "Version C++", "launcher.xpansion.versionR": "Version R (<= 7.x)", @@ -188,7 +188,7 @@ "study.postProcessing": "Post processing", "study.timeLimit": "Time limit", "study.timeLimitHelper": "Time limit in hours (max: {{max}}h)", - "study.nbCpu": "Number of core", + "study.nbCpu": "Number of cores", "study.clusterLoad": "Cluster load", "study.synthesis": "Synthesis", "study.level": "Level", @@ -231,8 +231,8 @@ "study.modelization": "Modelization", "study.configuration": "Configuration", "study.results": "Results", - "study.copyId": "Copy the study id", - "study.copyJobId": "Copy the job id", + "study.copyId": "Copy the study ID", + "study.copyJobId": "Copy the job ID", "study.modelization.map.newArea": "New Area", "study.modelization.map.areaName": "Area name", "study.modelization.links.hurdleCost": "Hurdle costs", @@ -254,7 +254,7 @@ "study.modelization.links.matrix.columns.transCapaIndirect": "Trans. capacity indirect", "study.modelization.links.matrix.columns.hurdleCostsDirect": "Hurdle costs direct", "study.modelization.links.matrix.columns.hurdleCostsIndirect": "Hurdle costs indirect", - "study.modelization.links.matrix.columns.inpedances": "Inpedances", + "study.modelization.links.matrix.columns.impedances": "Impedances", "study.modelization.links.matrix.columns.loopFlow": "Loop flow", "study.modelization.links.matrix.columns.pShiftMin": "P.Shift Min", "study.modelization.links.matrix.columns.pShiftMax": "P.Shift Max", @@ -264,7 +264,7 @@ "study.modelization.tableMode.template.geographicTrimmingLinks": "Geographic Trimming (links)", "study.modelization.tableMode.dialog.add.title": "Add table", "study.modelization.tableMode.dialog.edit.title": "Edit table", - "study.modelization.tableMode.dialog.delete.text": "Are you sure you want to delete '{{0}}' table ?", + "study.modelization.tableMode.dialog.delete.text": "Are you sure you want to delete '{{0}}' table?", "study.configuration.general.simulation": "Simulation", "study.configuration.general.mode": "Mode", "study.configuration.general.firstDay": "First day", @@ -284,7 +284,7 @@ "study.configuration.general.yearByYear": "Year-by-year", "study.configuration.general.mcScenario": "MC Scenario", "study.configuration.general.mcScenarioBuilder": "MC Scenario builder", - "study.configuration.general.mcScenarioBuilder.activeRuleset": "Active uleset:", + "study.configuration.general.mcScenarioBuilder.activeRuleset": "Active ruleset:", "study.configuration.general.mcScenarioBuilder.year": "Year", "study.configuration.general.mcScenarioBuilder.tab.load": "Load", "study.configuration.general.mcScenarioBuilder.tab.thermal": "Thermal", @@ -316,7 +316,7 @@ "study.configuration.optimization.transmissionCapacities": "Transmission capacities", "study.configuration.optimization.linkType": "Link type", "study.configuration.optimization.thermalClustersMinStablePower": "Thermal clusters min stable power", - "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min ud time", + "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min UD time", "study.configuration.optimization.dayAheadReserve": "Day ahead reserve", "study.configuration.optimization.primaryReserve": "Primary reserve", "study.configuration.optimization.strategicReserve": "Strategic reserve", @@ -357,14 +357,14 @@ "study.modelization.nodeProperties.nodalOptimization": "Nodal Optimization", "study.modelization.nodeProperties.energyCost": "Energy cost", "study.modelization.nodeProperties.unsupplied": "Unsupplied", - "study.modelization.nodeProperties.splilled": "Spilled", + "study.modelization.nodeProperties.spilled": "Spilled", "study.modelization.nodeProperties.lastResortShedding": "Last resort shedding status", "study.modelization.nodeProperties.nonDispatchPower": "Non dispatch. power", "study.modelization.nodeProperties.dispatchHydroPower": "Dispatch. hydropower", "study.modelization.nodeProperties.otherDispatchPower": "Other dispatch. power", "study.modelization.nodeProperties.outputFilter": "Output print status", "study.modelization.nodeProperties.filterByYear": "Output year by year", - "study.modelization.nodeProperties.filterSynthesis": "Sorties synthesis", + "study.modelization.nodeProperties.filterSynthesis": "Synthesis outputs", "study.modelization.map": "Map", "study.modelization.posX": "Position X", "study.modelization.posY": "Position Y", @@ -397,8 +397,8 @@ "study.modelization.clusters.startupCost": "Startup cost", "study.modelization.clusters.marketBidCost": "Market bid", "study.modelization.clusters.spreadCost": "Spread cost", - "study.modelization.clusters.timeSeriesGen": "Timeseries generation", - "study.modelization.clusters.genTs": "Generate timeseries", + "study.modelization.clusters.timeSeriesGen": "Time-Series generation", + "study.modelization.clusters.genTs": "Generate Time-Series", "study.modelization.clusters.volatilityForced": "Volatility forced", "study.modelization.clusters.volatilityPlanned": "Volatility planned", "study.modelization.clusters.lawForced": "Law forced", @@ -407,9 +407,9 @@ "study.modelization.clusters.matrix.tsGen": "TS generator", "study.modelization.clusters.matrix.timeSeries": "Time-Series", "study.modelization.clusters.backClusterList": "Back to cluster list", - "study.modelization.clusters.tsInterpretation": "Timeseries mode", + "study.modelization.clusters.tsInterpretation": "Time-Series mode", "study.modelization.clusters.group": "Group", - "studies.modelization.clusters.question.delete": "Are you sure you want to delete this cluster ?", + "studies.modelization.clusters.question.delete": "Are you sure you want to delete this cluster?", "study.modelization.bindingConst.comments": "Comments", "study.modelization.bindingConst.type": "Type", "study.modelization.bindingConst.constraints": "Constraints", @@ -425,10 +425,10 @@ "study.modelization.bindingConst.addConstraintTerm": "Add constraint term", "study.modelization.bindingConst.weight": "Weight", "study.modelization.bindingConst.offset": "Offset", - "study.modelization.bindingConst.question.deleteConstraintTerm": "Are you sure you want to delete this constraint term ?", - "study.modelization.bindingConst.question.deleteBindingConstraint": "Are you sure you want to delete this binding constraint ?", + "study.modelization.bindingConst.question.deleteConstraintTerm": "Are you sure you want to delete this constraint term?", + "study.modelization.bindingConst.question.deleteBindingConstraint": "Are you sure you want to delete this binding constraint?", "study.results.mc": "Monte-Carlo", - "study.results.mc.year": "year", + "study.results.mc.year": "Year", "study.results.display": "Display", "study.results.temporality": "Temporality", "study.results.noData": "No data available", @@ -449,32 +449,32 @@ "study.success.deleteCluster": "Cluster deleted successfully", "study.message.upgradeInProgress": "Running study upgrade", "study.message.outputExportInProgress": "Downloading study outputs...", - "study.question.deleteLink": "Are you sure you want to delete this link ?", - "study.question.deleteArea": "Are you sure you want to delete this area ?", - "study.question.upgrade": "Are you sure you want to upgrade this study ?", - "study.question.killJob": "Are you sure you want to cancel the simulation job ?", + "study.question.deleteLink": "Are you sure you want to delete this link?", + "study.question.deleteArea": "Are you sure you want to delete this area?", + "study.question.upgrade": "Are you sure you want to upgrade this study?", + "study.question.killJob": "Are you sure you want to cancel the simulation job?", "study.error.exportOutput": "Failed to export the output", "study.error.listOutputs": "Failed to retrieve output list", "study.error.fetchComments": "Failed to fetch comments", "study.error.commentsNotSaved": "Comments not saved", - "study.error.studyIdCopy": "Failed to copy study id", - "study.error.jobIdCopy": "Failed to copy job id", + "study.error.studyIdCopy": "Failed to copy study ID", + "study.error.jobIdCopy": "Failed to copy job ID", "study.error.createArea": "Failed to create the area", "study.error.createLink": "Failed to create the link", "study.error.updateUI": "Failed to update the area", - "study.error.deleteAreaOrLink": "Area or link not deleted", + "study.error.deleteAreaOrLink": "Failed to delete area or link", "study.error.getAreasInfo": "Failed to fetch areas data", - "study.error.modifiedStudy": "Study {{studyname}} not updated", - "study.error.launchLoad": "Failed to retrieve the load of the cluster", + "study.error.modifiedStudy": "Failed to update Study {{studyname}}", + "study.error.launchLoad": "Failed to retrieve cluster load", "study.error.upgrade": "Failed to upgrade your study", "study.error.createDistrict": "Failed to add district", "study.error.createLayer": "Failed to add layer", "study.success.commentsSaved": "Comments saved successfully", - "study.success.studyIdCopy": "Study id copied !", - "study.success.jobIdCopy": "Job id copied !", + "study.success.studyIdCopy": "Study ID copied!", + "study.success.jobIdCopy": "Job ID copied!", "study.success.modifiedStudy": "Study {{studyname}} updated successfully", - "studies.question.delete": "Are you sure you want to delete this study ?", - "studies.deleteSubvariants": "Delete all children variants", + "studies.question.delete": "Are you sure you want to delete this study?", + "studies.deleteSubvariants": "Are you sure you want to delete all children variants?", "studies.error.retrieveData": "Failed to retrieve data", "studies.error.retrieveStudies": "Failed to retrieve studies", "studies.error.deleteStudy": "Failed to delete study", @@ -484,18 +484,18 @@ "studies.error.moveStudy": "Failed to move study {{study}}", "studies.error.saveData": "Failed to save data", "studies.error.copyStudy": "Failed to copy study", - "studies.error.import": "Study import has failed ({{uploadFile}})", + "studies.error.import": "Failed to import Study ({{uploadFile}})", "studies.error.archive": "Failed to archive study {{studyname}}", "studies.error.unarchive": "Failed to unarchive study {{studyname}}", "studies.error.archiveOutput": "Failed to archive study output {{outputname}}", "studies.error.unarchiveOutput": "Failed to unarchive study output {{outputname}}", - "studies.error.createStudy": "Study {{studyname}} not created", + "studies.error.createStudy": "Failed to create Study {{studyname}}", "studies.success.saveData": "Data saved with success", "studies.success.scanFolder": "Folder scan started", "studies.success.moveStudy": "Study {{study}} was successfully moved to {{folder}}", "studies.success.import": "Study import was successful ({{uploadFile}})", "studies.success.createStudy": "Study {{studyname}} created successfully", - "studies.studylaunched": "{{studyname}} launched !", + "studies.studylaunched": "{{studyname}} launched!", "studies.copySuffix": "Copy", "studies.folder": "Folder", "studies.filters.strictfolder": "Show only direct folder children", @@ -504,7 +504,7 @@ "studies.movefolderplaceholder": "Path separated by '/'", "studies.importcopy": "Copy to database", "studies.importNewStudy": "Import a new study", - "studies.importHint": "Click or drag'n'drop a zipped study here", + "studies.importHint": "Click or drag and drop a zipped study here", "studies.studycopying": "Copying study...", "studies.studyarchiving": "Archiving study...", "studies.studyunarchiving": "Unarchiving study...", @@ -533,22 +533,22 @@ "studies.variant": "Variant", "variants.createNewVariant": "Create new variant", "variants.newVariant": "New variant", - "variants.error.variantCreation": "Variant not created", + "variants.error.variantCreation": "Failed to create variant", "variants.newCommand": "Add new command", "variants.commandActionLabel": "Select action", "variants.success.save": "Command updated successfully", "variants.success.delete": "Command deleted successfully", "variants.success.commandAdded": "Command added successfully", "variants.success.commandMoved": "Command moved successfully", - "variants.error.commandUpdated": "Command not updated", - "variants.error.commandDeleted": "Command not deleted", - "variants.error.addCommand": "Command not added", - "variants.error.moveCommand": "Command not moved", - "variants.error.fetchCommand": "Error while retrieving commands", + "variants.error.commandUpdated": "Failed to update command", + "variants.error.commandDeleted": "Failed to delete command", + "variants.error.addCommand": "Failed to add command", + "variants.error.moveCommand": "Failed to move command", + "variants.error.fetchCommand": "Failed to retrieve commands", "variants.success.import": "File imported successfully", - "variants.error.import": "Error during file importation", - "variants.error.jsonParsing": "Error while parsing json command file", - "variants.error.export": "Error during file exportation", + "variants.error.import": "Failed to import file", + "variants.error.jsonParsing": "Failed to parse json command file", + "variants.error.export": "Failed to export file", "variants.success.launchGeneration": "Variant generation launched", "variants.error.launchGeneration": "Variant generation could not launched", "variants.generationInProgress": "Generation in progress...", @@ -562,11 +562,11 @@ "variants.commands.import": "Replace all commands", "variants.commands.export": "Export all commands", "variants.commands.exportMatrices": "Export matrices", - "variants.commands.question.deleteAll": "Are you sure you want to delete all commands ?", - "variants.commands.question.delete": "Are you sure you want to delete this command ?", - "xpansion.timeSeries": "Time series", + "variants.commands.question.deleteAll": "Are you sure you want to delete all commands?", + "variants.commands.question.delete": "Are you sure you want to delete this command?", + "xpansion.timeSeries": "Time-Series", "xpansion.link": "Link", - "xpansion.annualCost": "Annual cost per mw", + "xpansion.annualCost": "Annual cost per MW", "xpansion.unitSize": "Unit size", "xpansion.maxUnits": "Max units", "xpansion.maxInvestments": "Max investment", @@ -582,7 +582,7 @@ "xpansion.epsilon": "Maximum gap with the optimal solution", "xpansion.ucType": "UC Type", "xpansion.master": "Master", - "xpansion.optimalyGap": "Optimality gap", + "xpansion.optimalityGap": "Optimality gap", "xpansion.maxIteration": "Max iteration", "xpansion.yearlyWeight": "Yearly weight", "xpansion.additionalConstraints": "Additional constraints", @@ -605,8 +605,8 @@ "xpansion.newXpansionConfig": "New Xpansion configuration", "xpansion.candidates": "Candidates", "xpansion.newCandidate": "New candidate", - "xpansion.question.deleteFile": "Are you sure you want to delete this file ?", - "xpansion.question.deleteConfiguration": "Are you sure you want to delete the configuration of Xpansion ?", + "xpansion.question.deleteFile": "Are you sure you want to delete this file?", + "xpansion.question.deleteConfiguration": "Are you sure you want to delete the configuration of Xpansion?", "xpansion.question.deleteCandidate": "Are you sure you want to delete this candidate?", "xpansion.error.loadConfiguration": "Failed to load the configuration of Xpansion", "xpansion.error.createConfiguration": "Failed to create the configuration of Xpansion", @@ -623,24 +623,24 @@ "data.newMatrixTitle": "Create new matrix dataset", "data.uploadingmatrix": "Uploading matrices", "data.analyzingmatrix": "Analyzing matrices", - "data.success.matrixIdCopied": "Matrix id copied !", + "data.success.matrixIdCopied": "Matrix ID copied!", "data.jsonFormat": "JSON Format", "data.assignMatrix": "Assign a matrix", "data.error.matrixList": "Unable to retrieve matrix list", "data.error.matrix": "Unable to retrieve matrix data", "data.error.fileNotUploaded": "Please select a file", - "data.error.matrixDelete": "Matrix not deleted", + "data.error.matrixDelete": "Failed to delete matrix", "data.error.copyMatrixId": "Failed to copy the matrix ID", "data.error.matrixAssignation": "Failed to assign the matrix", - "data.succes.matrixAssignation": "Matrix successfully assigned", + "data.success.matrixAssignation": "Matrix successfully assigned", "data.success.matrixUpdate": "Matrix successfully updated", "data.success.matrixCreation": "Matrix successfully created", "data.success.matrixDelete": "Matrix successfully deleted", - "data.question.deleteMatrix": "Are you sure you want to delete this matrix ?", - "data.question.deleteDataset": "Are you sure you want to delete this dataset ?", + "data.question.deleteMatrix": "Are you sure you want to delete this matrix?", + "data.question.deleteDataset": "Are you sure you want to delete this dataset?", "data.message.uploadHelp": "The file must be a single matrix file or a zip containing a list of matrix files", "results.error.jobs": "Failed to retrieve study launch jobs", - "results.error.outputs": "Failed to retrieve study ouptut list", + "results.error.outputs": "Failed to retrieve study output list", "results.noOutputs": "No outputs", - "results.question.deleteOutput": "Are you sure you want to delete the output {{outputname}} ?" + "results.question.deleteOutput": "Are you sure you want to delete the output {{outputname}}?" } diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json index 0dcf62d572..8525910746 100644 --- a/webapp/public/locales/fr/main.json +++ b/webapp/public/locales/fr/main.json @@ -19,7 +19,7 @@ "global.copyId": "Copier l'ID", "global.data": "Données", "global.loading": "Chargement", - "global.metadata": "Metadonnées", + "global.metadata": "Métadonnées", "global.groups": "Groupes", "global.permission": "Permission", "global.permissions": "Permissions", @@ -59,7 +59,7 @@ "global.color": "Couleur", "global.advancedParams": "Paramètres avancés", "global.matrix": "Matrice", - "global.matrixes": "Matrices", + "global.matrices": "Matrices", "global.chooseFile": "Choisir un fichier", "global.assign": "Assigner", "global.time.hourly": "Horaire", @@ -177,7 +177,7 @@ "settings.error.updateMaintenance": "Erreur lors du changement du status de maintenance", "launcher.additionalModes": "Mode additionnels", "launcher.autoUnzip": "Dézippage automatique", - "launcher.xpress": "Utiliser le solver xpress (>= 8.3)", + "launcher.xpress": "Utiliser le solver Xpress (>= 8.3)", "launcher.xpansion.sensitivityMode": "Analyse de sensibilité", "launcher.xpansion.versionCpp": "Version C++", "launcher.xpansion.versionR": "Version R (<= 7.x)", @@ -254,7 +254,7 @@ "study.modelization.links.matrix.columns.transCapaIndirect": "Trans. capacity indirect", "study.modelization.links.matrix.columns.hurdleCostsDirect": "Hurdle costs direct", "study.modelization.links.matrix.columns.hurdleCostsIndirect": "Hurdle costs indirect", - "study.modelization.links.matrix.columns.inpedances": "Inpedances", + "study.modelization.links.matrix.columns.impedances": "Impedances", "study.modelization.links.matrix.columns.loopFlow": "Loop flow", "study.modelization.links.matrix.columns.pShiftMin": "P.Shift Min", "study.modelization.links.matrix.columns.pShiftMax": "P.Shift Max", @@ -297,7 +297,7 @@ "study.configuration.general.mcScenarioBuilder.error.table": "La table '{{0}}' n'a pas été mise à jour", "study.configuration.general.mcScenarioBuilder.error.ruleset.rename": "La ruleset '{{0}}' n'a pas été renommée", "study.configuration.general.mcScenarioBuilder.error.ruleset.add": "La ruleset '{{0}}' n'a pas été ajoutée", - "study.configuration.general.mcScenarioBuilder.error.ruleset.delete": "La ruleset '{{0}}' n'a pas été suprimée", + "study.configuration.general.mcScenarioBuilder.error.ruleset.delete": "La ruleset '{{0}}' n'a pas été supprimée", "study.configuration.general.mcScenarioBuilder.error.ruleset.duplicate": "La ruleset '{{0}}' n'a pas été dupliquée", "study.configuration.general.mcScenarioBuilder.error.ruleset.changeActive": "La ruleset active n'a pas été changée", "study.configuration.general.mcScenarioPlaylist": "MC Scenario playlist", @@ -316,7 +316,7 @@ "study.configuration.optimization.transmissionCapacities": "Transmission capacities", "study.configuration.optimization.linkType": "Link type", "study.configuration.optimization.thermalClustersMinStablePower": "Thermal clusters min stable power", - "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min ud time", + "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min UD time", "study.configuration.optimization.dayAheadReserve": "Day ahead reserve", "study.configuration.optimization.primaryReserve": "Primary reserve", "study.configuration.optimization.strategicReserve": "Strategic reserve", @@ -357,7 +357,7 @@ "study.modelization.nodeProperties.nodalOptimization": "Optimisation nodale", "study.modelization.nodeProperties.energyCost": "Coût de l'énergie", "study.modelization.nodeProperties.unsupplied": "Non distribuée", - "study.modelization.nodeProperties.splilled": "Non évacuée", + "study.modelization.nodeProperties.spilled": "Non évacuée", "study.modelization.nodeProperties.lastResortShedding": "Moyen de dernier recours pour l'écrêtement", "study.modelization.nodeProperties.nonDispatchPower": "Production non pilotable", "study.modelization.nodeProperties.dispatchHydroPower": "Hydraulique pilotable", @@ -397,8 +397,8 @@ "study.modelization.clusters.startupCost": "Coûts de démarrage", "study.modelization.clusters.marketBidCost": "Offre de marché", "study.modelization.clusters.spreadCost": "Coûts de répartition", - "study.modelization.clusters.timeSeriesGen": "Génération des Timeseries", - "study.modelization.clusters.genTs": "Générer des timeseries", + "study.modelization.clusters.timeSeriesGen": "Génération des Time-Series", + "study.modelization.clusters.genTs": "Générer des Time-Series", "study.modelization.clusters.volatilityForced": "Volatilité forcée", "study.modelization.clusters.volatilityPlanned": "Volatilité prévue", "study.modelization.clusters.lawForced": "Loi forcée", @@ -407,7 +407,7 @@ "study.modelization.clusters.matrix.tsGen": "TS generator", "study.modelization.clusters.matrix.timeSeries": "Time-Series", "study.modelization.clusters.backClusterList": "Retour à la liste des clusters", - "study.modelization.clusters.tsInterpretation": "Timeseries mode", + "study.modelization.clusters.tsInterpretation": "Time-Series mode", "study.modelization.clusters.group": "Groupes", "studies.modelization.clusters.question.delete": "Êtes-vous sûr de vouloir supprimer ce cluster ?", "study.modelization.bindingConst.comments": "Commentaires", @@ -562,7 +562,7 @@ "variants.commands.exportMatrices": "Exporter les matrices", "variants.commands.question.deleteAll": "Êtes-vous sûr de vouloir supprimer toutes les commandes ?", "variants.commands.question.delete": "Êtes-vous sûr de vouloir supprimer cette commande ?", - "xpansion.timeSeries": "Séries temporelles", + "xpansion.timeSeries": "Time-Series", "xpansion.link": "Lien", "xpansion.annualCost": "Coût annuel par mw", "xpansion.unitSize": "Taille de l'unité", @@ -580,7 +580,7 @@ "xpansion.epsilon": "Ecart maximum avec la solution optimale", "xpansion.ucType": "Type UC", "xpansion.master": "Maître", - "xpansion.optimalyGap": "Gap d'optimalité absolu", + "xpansion.optimalityGap": "Gap d'optimalité absolu", "xpansion.maxIteration": "Iteration max", "xpansion.yearlyWeight": "Poids annuel", "xpansion.additionalConstraints": "Contraintes additionnelles", @@ -630,7 +630,7 @@ "data.error.matrixDelete": "Matrice non supprimée", "data.error.copyMatrixId": "Erreur lors de la copie de l'ID de la matrice", "data.error.matrixAssignation": "Erreur lors de l'assignation de la matrice", - "data.succes.matrixAssignation": "Matrice assignée avec succès", + "data.success.matrixAssignation": "Matrice assignée avec succès", "data.success.matrixUpdate": "Matrice chargée avec succès", "data.success.matrixCreation": "Matrice créée avec succès", "data.success.matrixDelete": "Matrice supprimée avec succès", diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/PropertiesForm.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/PropertiesForm.tsx index 180c53b7ba..56122ed914 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/PropertiesForm.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/PropertiesForm.tsx @@ -141,7 +141,7 @@ export default function PropertiesForm(props: Props) { ${area1})`, - t("study.modelization.links.matrix.columns.inpedances"), + t("study.modelization.links.matrix.columns.impedances"), t("study.modelization.links.matrix.columns.loopFlow"), t("study.modelization.links.matrix.columns.pShiftMin"), t("study.modelization.links.matrix.columns.pShiftMax"), diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkMatrixView.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkMatrixView.tsx index 51a6c4a4e5..d3f17df895 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkMatrixView.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkMatrixView.tsx @@ -32,7 +32,7 @@ function LinkMatrixView(props: Props) { `${t( "study.modelization.links.matrix.columns.hurdleCostsIndirect" )} (${area2}->${area1})`, - t("study.modelization.links.matrix.columns.inpedances"), + t("study.modelization.links.matrix.columns.impedances"), t("study.modelization.links.matrix.columns.loopFlow"), t("study.modelization.links.matrix.columns.pShiftMin"), t("study.modelization.links.matrix.columns.pShiftMax"), diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx index 3a7ad6b9e3..4afd50488d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx @@ -129,7 +129,7 @@ function SettingsForm(props: PropType) { diff --git a/webapp/src/components/common/MatrixInput/MatrixAssignDialog.tsx b/webapp/src/components/common/MatrixInput/MatrixAssignDialog.tsx index 7e59c20520..0ed1a47f44 100644 --- a/webapp/src/components/common/MatrixInput/MatrixAssignDialog.tsx +++ b/webapp/src/components/common/MatrixInput/MatrixAssignDialog.tsx @@ -55,7 +55,7 @@ function MatrixAssignDialog(props: Props) { const dataSet = resList.data?.find((item) => item.id === selectedItem); const matrices = dataSet?.matrices; - const matrixName = `${t("global.matrixes")} - ${dataSet?.name}`; + const matrixName = `${t("global.matrices")} - ${dataSet?.name}`; //////////////////////////////////////////////////////////////// // Event Handlers @@ -81,7 +81,7 @@ function MatrixAssignDialog(props: Props) { }, }, ]); - enqueueSnackbar(t("data.succes.matrixAssignation"), { + enqueueSnackbar(t("data.success.matrixAssignation"), { variant: "success", }); onClose(); From 69381145ab1e4224e874a59dcec2297dae951b51 Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Tue, 31 Jan 2023 16:40:39 +0100 Subject: [PATCH 15/60] feat(ui-study): add text ellipsis on study name (#1270) --- .../components/App/Singlestudy/NavHeader.tsx | 98 +++++++++++-------- 1 file changed, 56 insertions(+), 42 deletions(-) diff --git a/webapp/src/components/App/Singlestudy/NavHeader.tsx b/webapp/src/components/App/Singlestudy/NavHeader.tsx index 407f95b58b..3024893188 100644 --- a/webapp/src/components/App/Singlestudy/NavHeader.tsx +++ b/webapp/src/components/App/Singlestudy/NavHeader.tsx @@ -80,6 +80,8 @@ const StyledDivider = styled(Divider)(({ theme }) => ({ backgroundColor: theme.palette.divider, })); +const MAX_STUDY_TITLE_LENGTH = 45; + interface Props { study: StudyMetadata | undefined; parent: StudyMetadata | undefined; @@ -101,14 +103,13 @@ function NavHeader(props: Props) { const [t, i18n] = useTranslation(); const navigate = useNavigate(); const [anchorEl, setAnchorEl] = useState(null); - const [openMenu, setOpenMenu] = useState(""); - const [openLauncherDialog, setOpenLauncherDialog] = useState(false); - const [openPropertiesDialog, setOpenPropertiesDialog] = - useState(false); - const [openUpgradeDialog, setOpenUpgradeDialog] = useState(false); + const [openMenu, setOpenMenu] = useState(""); + const [openLauncherDialog, setOpenLauncherDialog] = useState(false); + const [openPropertiesDialog, setOpenPropertiesDialog] = useState(false); + const [openUpgradeDialog, setOpenUpgradeDialog] = useState(false); const [deleteChildren, setDeleteChildren] = useState(false); - const [openDeleteDialog, setOpenDeleteDialog] = useState(false); - const [openExportDialog, setOpenExportDialog] = useState(false); + const [openDeleteDialog, setOpenDeleteDialog] = useState(false); + const [openExportDialog, setOpenExportDialog] = useState(false); const { enqueueSnackbar } = useSnackbar(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const isStudyFavorite = useAppSelector(isCurrentStudyFavorite); @@ -214,15 +215,17 @@ function NavHeader(props: Props) { return ( - - - {study?.name} - - + + {study?.name} + )} - {study?.tags && study.tags.map((elm) => ( ))} - - {isExplorer && ( )} + + + + { - const fileData = data.data.map((row) => row.join("\t")).join("\n"); - const blob = new Blob([fileData], { type: "text/plain" }); - const url = URL.createObjectURL(blob); - const link = document.createElement("a"); - link.download = filename; - link.href = url; - link.click(); - link.remove(); + const handleDownload = (matrixData: MatrixType, fileName: string): void => { + downloadMatrix(matrixData, fileName); }; //////////////////////////////////////////////////////////////// diff --git a/webapp/src/utils/matrixUtils.ts b/webapp/src/utils/matrixUtils.ts new file mode 100644 index 0000000000..c4380f8bcb --- /dev/null +++ b/webapp/src/utils/matrixUtils.ts @@ -0,0 +1,11 @@ +import { MatrixType } from "../common/types"; + +export function downloadMatrix(matrixData: MatrixType, fileName: string): void { + const fileData = matrixData.data.map((row) => row.join("\t")).join("\n"); + const blob = new Blob([fileData], { type: "text/plain" }); + const a = document.createElement("a"); + a.download = fileName; + a.href = URL.createObjectURL(blob); + a.click(); + URL.revokeObjectURL(a.href); +} From 3160f295ffd06312f2a77ec0ea2dd7da0c04fbed Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Wed, 8 Feb 2023 11:57:20 +0100 Subject: [PATCH 24/60] feat(ui-redux): add menu state in local storage (#1297) --- .../components/wrappers/MenuWrapper/index.tsx | 6 ++---- webapp/src/redux/ducks/ui.ts | 12 ++++++------ .../redux/middlewares/localStorageMiddleware.ts | 17 +++++++++++++++++ webapp/src/redux/selectors.ts | 4 ++-- webapp/src/services/utils/localStorage.ts | 4 ++++ 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/webapp/src/components/wrappers/MenuWrapper/index.tsx b/webapp/src/components/wrappers/MenuWrapper/index.tsx index faa4d79107..04b5451f24 100644 --- a/webapp/src/components/wrappers/MenuWrapper/index.tsx +++ b/webapp/src/components/wrappers/MenuWrapper/index.tsx @@ -30,7 +30,7 @@ import { useMount } from "react-use"; import logo from "../../../assets/logo.png"; import NotificationBadge from "../../App/Tasks/NotificationBadge"; import topRightBackground from "../../../assets/top-right-background.png"; -import { setMenuExtensionStatus } from "../../../redux/ducks/ui"; +import { setMenuCollapse } from "../../../redux/ducks/ui"; import { NavDrawer, NavListItem, @@ -288,9 +288,7 @@ function MenuWrapper(props: Props) { title={t(extended ? "" : "button.expand")} placement="right-end" > - dispatch(setMenuExtensionStatus(!extended))} - > + dispatch(setMenuCollapse(extended))}> {extended ? : } diff --git a/webapp/src/redux/ducks/ui.ts b/webapp/src/redux/ducks/ui.ts index cf052b58ee..2f49ffd164 100644 --- a/webapp/src/redux/ducks/ui.ts +++ b/webapp/src/redux/ducks/ui.ts @@ -2,7 +2,7 @@ import { createAction, createReducer } from "@reduxjs/toolkit"; import { makeActionName } from "../utils"; export interface UIState { - menuExtended: boolean; + menuCollapsed: boolean; currentPage: string; webSocketConnected: boolean; maintenanceMode: boolean; @@ -11,7 +11,7 @@ export interface UIState { } const initialState = { - menuExtended: true, + menuCollapsed: false, currentPage: "/", webSocketConnected: false, maintenanceMode: false, @@ -25,8 +25,8 @@ const n = makeActionName("ui"); // Action Creators //////////////////////////////////////////////////////////////// -export const setMenuExtensionStatus = createAction( - n("SET_MENU_EXTENSION_STATUS") +export const setMenuCollapse = createAction( + n("SET_MENU_COLLAPSE") ); export const setCurrentPage = createAction( @@ -59,8 +59,8 @@ export const setMaintenanceMode = createAction( export default createReducer(initialState, (builder) => { builder - .addCase(setMenuExtensionStatus, (draftState, action) => { - draftState.menuExtended = action.payload; + .addCase(setMenuCollapse, (draftState, action) => { + draftState.menuCollapsed = action.payload; }) .addCase(setCurrentPage, (draftState, action) => { draftState.currentPage = action.payload; diff --git a/webapp/src/redux/middlewares/localStorageMiddleware.ts b/webapp/src/redux/middlewares/localStorageMiddleware.ts index 2e4fae8642..38dcd38b46 100644 --- a/webapp/src/redux/middlewares/localStorageMiddleware.ts +++ b/webapp/src/redux/middlewares/localStorageMiddleware.ts @@ -9,6 +9,7 @@ import { updateStudiesSortConf, updateStudyFilters, } from "../ducks/studies"; +import { setMenuCollapse } from "../ducks/ui"; const localStorageMiddleware = createListenerMiddleware(); @@ -36,6 +37,11 @@ localStorageMiddleware.startListening({ sort: storage.getItem(StorageKey.StudiesSort), }) ); + + const menuCollapsed = storage.getItem(StorageKey.UIMenuCollapsed); + if (menuCollapsed !== null) { + dispatch(setMenuCollapse(menuCollapsed)); + } } }, }); @@ -71,4 +77,15 @@ localStorageMiddleware.startListening({ }, }); +//////////////////////////////////////////////////////////////// +// UI +//////////////////////////////////////////////////////////////// + +localStorageMiddleware.startListening({ + actionCreator: setMenuCollapse, + effect: (action) => { + storage.setItem(StorageKey.UIMenuCollapsed, action.payload); + }, +}); + export default localStorageMiddleware; diff --git a/webapp/src/redux/selectors.ts b/webapp/src/redux/selectors.ts index 5fd3d0f34c..268c9f0be6 100644 --- a/webapp/src/redux/selectors.ts +++ b/webapp/src/redux/selectors.ts @@ -501,6 +501,6 @@ export const getMessageInfo = (state: AppState): UIState["messageInfo"] => { return getUIState(state).messageInfo; }; -export const getMenuExtended = (state: AppState): UIState["menuExtended"] => { - return getUIState(state).menuExtended; +export const getMenuExtended = (state: AppState): UIState["menuCollapsed"] => { + return !getUIState(state).menuCollapsed; }; diff --git a/webapp/src/services/utils/localStorage.ts b/webapp/src/services/utils/localStorage.ts index 15f5a92ce1..f29a13df1a 100644 --- a/webapp/src/services/utils/localStorage.ts +++ b/webapp/src/services/utils/localStorage.ts @@ -7,6 +7,7 @@ import { StudiesState, StudyFilters, } from "../../redux/ducks/studies"; +import { UIState } from "../../redux/ducks/ui"; export enum StorageKey { Version = "version", @@ -16,6 +17,8 @@ export enum StorageKey { StudiesFilters = "studies.filters", StudiesSort = "studies.sort", StudiesModelTableModeTemplates = "studies.model.tableMode.templates", + // UI + UIMenuCollapsed = "ui.menuCollapsed", } const APP_NAME = packages.name; @@ -28,6 +31,7 @@ interface TypeFromKey { [StorageKey.StudiesFilters]: Partial; [StorageKey.StudiesSort]: Partial; [StorageKey.StudiesModelTableModeTemplates]: Omit[]; + [StorageKey.UIMenuCollapsed]: UIState["menuCollapsed"]; } function formalizeKey(key: StorageKey): string { From 04f9212e6e837c0d1e7f5f472896053afce6a106 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Wed, 8 Feb 2023 15:03:39 +0100 Subject: [PATCH 25/60] feat(api,tablemode,ui-tablemode): add renewable and binding constraint type (#1293) fix #1215 --- .../business/binding_constraint_management.py | 23 +- .../study/business/table_mode_management.py | 412 ++++++++++++------ tests/integration/test_integration.py | 243 +++++++++++ .../test_integration_table_mode_manager.py | 0 .../explore/Modelization/TableMode/index.tsx | 9 +- .../explore/Modelization/TableMode/utils.ts | 13 +- 6 files changed, 556 insertions(+), 144 deletions(-) delete mode 100644 tests/integration/test_integration_table_mode_manager.py diff --git a/antarest/study/business/binding_constraint_management.py b/antarest/study/business/binding_constraint_management.py index d5add93629..bff6596ec3 100644 --- a/antarest/study/business/binding_constraint_management.py +++ b/antarest/study/business/binding_constraint_management.py @@ -133,6 +133,20 @@ def process_constraint( continue return new_config + @staticmethod + def constraints_to_coeffs( + constraint: BindingConstraintDTO, + ) -> Dict[str, List[float]]: + coeffs: Dict[str, List[float]] = {} + if constraint.constraints is not None: + for term in constraint.constraints: + if term.id is not None and term.weight is not None: + coeffs[term.id] = [term.weight] + if term.offset is not None: + coeffs[term.id].append(term.offset) + + return coeffs + def get_binding_constraint( self, study: Study, constraint_id: Optional[str] ) -> Union[BindingConstraintDTO, List[BindingConstraintDTO], None]: @@ -173,13 +187,6 @@ def update_binding_constraint( if not isinstance(constraint, BindingConstraintDTO): raise NoBindingConstraintError(study.id) - coeffs = {} - if constraint.constraints is not None: - for term in constraint.constraints: - coeffs[term.id] = [term.weight] - if term.offset is not None: - coeffs[term.id].append(term.offset) - command = UpdateBindingConstraint( id=constraint.id, enabled=data.value @@ -191,7 +198,7 @@ def update_binding_constraint( operator=data.value if data.key == "operator" else constraint.operator, - coeffs=coeffs, + coeffs=BindingConstraintManager.constraints_to_coeffs(constraint), values=constraint.values, filter_year_by_year=data.value if data.key == "filterByYear" diff --git a/antarest/study/business/table_mode_management.py b/antarest/study/business/table_mode_management.py index 9cc5ff5c35..48b4fe8534 100644 --- a/antarest/study/business/table_mode_management.py +++ b/antarest/study/business/table_mode_management.py @@ -11,6 +11,9 @@ from pydantic import StrictFloat from pydantic.types import StrictStr, StrictInt, StrictBool +from antarest.study.business.binding_constraint_management import ( + BindingConstraintManager, +) from antarest.study.business.utils import ( FormFieldsBaseModel, execute_or_add_commands, @@ -23,6 +26,10 @@ FilteringOptions, LinkProperties, ) +from antarest.study.storage.variantstudy.model.command.icommand import ICommand +from antarest.study.storage.variantstudy.model.command.update_binding_constraint import ( + UpdateBindingConstraint, +) from antarest.study.storage.variantstudy.model.command.update_config import ( UpdateConfig, ) @@ -32,6 +39,8 @@ class TableTemplateType(str, Enum): AREA = "area" LINK = "link" CLUSTER = "cluster" + RENEWABLE = "renewable" + BINDING_CONSTRAINT = "binding constraint" class AdequacyPatchMode(str, Enum): @@ -65,6 +74,24 @@ class LawOption(str, Enum): GEOMETRIC = "geometric" +class TimeSeriesMode(str, Enum): + POWER_GENERATION = "power-generation" + PRODUCTION_FACTOR = "production-factor" + + +class BindingConstraintType(str, Enum): + HOURLY = "hourly" + DAILY = "daily" + WEEKLY = "weekly" + + +class BindingConstraintOperator(str, Enum): + LESS = "less" + GREATER = "greater" + BOTH = "both" + EQUAL = "equal" + + class AreaColumns(FormFieldsBaseModel): # Optimization - Nodal optimization non_dispatchable_power: Optional[StrictBool] @@ -117,9 +144,22 @@ class ClusterColumns(FormFieldsBaseModel): law_planned: Optional[LawOption] +class RenewableColumns(FormFieldsBaseModel): + group: Optional[StrictStr] + ts_interpretation: Optional[TimeSeriesMode] + enabled: Optional[StrictBool] + unit_count: Optional[StrictInt] + nominal_capacity: Optional[StrictInt] + + +class BindingConstraintColumns(FormFieldsBaseModel): + type: Optional[BindingConstraintType] + operator: Optional[BindingConstraintOperator] + enabled: Optional[StrictBool] + + class ColumnInfo(TypedDict): - glob_path: str - rel_glob_path: str + path: str default_value: Any @@ -129,232 +169,240 @@ class PathVars(TypedDict, total=False): # Link area1: str area2: str - # Cluster + # Cluster, Renewable area: str cluster: str -AREA_FIELD_PATH_PREFIX = "input/areas/{id}/optimization" -ECONOMIC_OPTIONS_PREFIX = "input/thermal/areas" -LINK_FIELD_PATH_PREFIX = "input/links/{area1}/properties/{area2}" -CLUSTER_FIELD_PATH_PREFIX = "input/thermal/clusters/{area}/list/{cluster}" +AREA_FIELD_PATH_BASE = "input/areas/{id}/optimization" +ECONOMIC_OPTIONS_PATH_BASE = "input/thermal/areas" +LINK_FIELD_PATH_BASE = "input/links/{area1}/properties/{area2}" +CLUSTER_FIELD_PATH_BASE = "input/thermal/clusters/{area}/list/{cluster}" +RENEWABLE_FIELD_PATH_BASE = "input/renewables/clusters/{area}/list/{cluster}" +BINDING_CONSTRAINT_FIELD_PATH_BASE = ( + "input/bindingconstraints/bindingconstraints" +) FIELDS_INFO_BY_TYPE: Dict[TableTemplateType, Dict[str, ColumnInfo]] = { TableTemplateType.AREA: { "non_dispatchable_power": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "nodal optimization/non-dispatchable-power", + "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/non-dispatchable-power", "default_value": NodalOptimization.NON_DISPATCHABLE_POWER, }, "dispatchable_hydro_power": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "nodal optimization/dispatchable-hydro-power", + "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/dispatchable-hydro-power", "default_value": NodalOptimization.DISPATCHABLE_HYDRO_POWER, }, "other_dispatchable_power": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "nodal optimization/other-dispatchable-power", + "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/other-dispatchable-power", "default_value": NodalOptimization.OTHER_DISPATCHABLE_POWER, }, "average_unsupplied_energy_cost": { - "glob_path": ECONOMIC_OPTIONS_PREFIX, - "rel_glob_path": "unserverdenergycost", + "path": f"{ECONOMIC_OPTIONS_PATH_BASE}/unserverdenergycost/{{id}}", "default_value": NodalOptimization.SPREAD_UNSUPPLIED_ENERGY_COST, }, "spread_unsupplied_energy_cost": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "nodal optimization/spread-unsupplied-energy-cost", + "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/spread-unsupplied-energy-cost", "default_value": NodalOptimization.SPREAD_UNSUPPLIED_ENERGY_COST, }, "average_spilled_energy_cost": { - "glob_path": ECONOMIC_OPTIONS_PREFIX, - "rel_glob_path": "spilledenergycost", + "path": f"{ECONOMIC_OPTIONS_PATH_BASE}/spilledenergycost/{{id}}", "default_value": NodalOptimization.SPREAD_SPILLED_ENERGY_COST, }, "spread_spilled_energy_cost": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "nodal optimization/spread-spilled-energy-cost", + "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/spread-spilled-energy-cost", "default_value": NodalOptimization.SPREAD_SPILLED_ENERGY_COST, }, "filter_synthesis": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "filtering/filter-synthesis", + "path": f"{AREA_FIELD_PATH_BASE}/filtering/filter-synthesis", "default_value": FilteringOptions.FILTER_SYNTHESIS, }, "filter_year_by_year": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "filtering/filter-year-by-year", + "path": f"{AREA_FIELD_PATH_BASE}/filtering/filter-year-by-year", "default_value": FilteringOptions.FILTER_YEAR_BY_YEAR, }, "adequacy_patch_mode": { - "glob_path": AREA_FIELD_PATH_PREFIX, - "rel_glob_path": "adequacy_patch/adequacy-patch/adequacy-patch-mode", + "path": f"{AREA_FIELD_PATH_BASE}/adequacy_patch/adequacy-patch/adequacy-patch-mode", "default_value": AdequacyPatchMode.OUTSIDE.value, }, }, TableTemplateType.LINK: { "hurdles_cost": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "hurdles-cost", + "path": f"{LINK_FIELD_PATH_BASE}/hurdles-cost", "default_value": LinkProperties.HURDLES_COST, }, "loop_flow": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "loop-flow", + "path": f"{LINK_FIELD_PATH_BASE}/loop-flow", "default_value": LinkProperties.LOOP_FLOW, }, "use_phase_shifter": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "use-phase-shifter", + "path": f"{LINK_FIELD_PATH_BASE}/use-phase-shifter", "default_value": LinkProperties.USE_PHASE_SHIFTER, }, "transmission_capacities": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "transmission-capacities", + "path": f"{LINK_FIELD_PATH_BASE}/transmission-capacities", "default_value": LinkProperties.TRANSMISSION_CAPACITIES, }, "asset_type": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "asset-type", + "path": f"{LINK_FIELD_PATH_BASE}/asset-type", "default_value": LinkProperties.ASSET_TYPE, }, "link_style": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "link-style", + "path": f"{LINK_FIELD_PATH_BASE}/link-style", "default_value": LinkProperties.LINK_STYLE, }, "link_width": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "link-width", + "path": f"{LINK_FIELD_PATH_BASE}/link-width", "default_value": LinkProperties.LINK_WIDTH, }, "display_comments": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "display-comments", + "path": f"{LINK_FIELD_PATH_BASE}/display-comments", "default_value": LinkProperties.DISPLAY_COMMENTS, }, "filter_synthesis": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "filter-synthesis", + "path": f"{LINK_FIELD_PATH_BASE}/filter-synthesis", "default_value": FilteringOptions.FILTER_SYNTHESIS, }, "filter_year_by_year": { - "glob_path": LINK_FIELD_PATH_PREFIX, - "rel_glob_path": "filter-year-by-year", + "path": f"{LINK_FIELD_PATH_BASE}/filter-year-by-year", "default_value": FilteringOptions.FILTER_YEAR_BY_YEAR, }, }, TableTemplateType.CLUSTER: { "group": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "group", + "path": f"{CLUSTER_FIELD_PATH_BASE}/group", "default_value": "", }, "enabled": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "enabled", + "path": f"{CLUSTER_FIELD_PATH_BASE}/enabled", "default_value": True, }, "must_run": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "must-run", + "path": f"{CLUSTER_FIELD_PATH_BASE}/must-run", "default_value": False, }, "unit_count": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "unitcount", + "path": f"{CLUSTER_FIELD_PATH_BASE}/unitcount", "default_value": 0, }, "nominal_capacity": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "nominalcapacity", + "path": f"{CLUSTER_FIELD_PATH_BASE}/nominalcapacity", "default_value": 0, }, "min_stable_power": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "min-stable-power", + "path": f"{CLUSTER_FIELD_PATH_BASE}/min-stable-power", "default_value": 0, }, "spinning": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "spinning", + "path": f"{CLUSTER_FIELD_PATH_BASE}/spinning", "default_value": 0, }, "min_up_time": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "min-up-time", + "path": f"{CLUSTER_FIELD_PATH_BASE}/min-up-time", "default_value": 1, }, "min_down_time": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "min-down-time", + "path": f"{CLUSTER_FIELD_PATH_BASE}/min-down-time", "default_value": 1, }, "co2": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "co2", + "path": f"{CLUSTER_FIELD_PATH_BASE}/co2", "default_value": 0, }, "marginal_cost": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "marginal-cost", + "path": f"{CLUSTER_FIELD_PATH_BASE}/marginal-cost", "default_value": 0, }, "fixed_cost": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "fixed-cost", + "path": f"{CLUSTER_FIELD_PATH_BASE}/fixed-cost", "default_value": 0, }, "startup_cost": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "startup-cost", + "path": f"{CLUSTER_FIELD_PATH_BASE}/startup-cost", "default_value": 0, }, "market_bid_cost": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "market-bid-cost", + "path": f"{CLUSTER_FIELD_PATH_BASE}/market-bid-cost", "default_value": 0, }, "spread_cost": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "spread-cost", + "path": f"{CLUSTER_FIELD_PATH_BASE}/spread-cost", "default_value": 0, }, "ts_gen": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "gen-ts", + "path": f"{CLUSTER_FIELD_PATH_BASE}/gen-ts", "default_value": TimeSeriesGenerationOption.USE_GLOBAL_PARAMETER.value, }, "volatility_forced": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "volatility.forced", + "path": f"{CLUSTER_FIELD_PATH_BASE}/volatility.forced", "default_value": 0, }, "volatility_planned": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "volatility.planned", + "path": f"{CLUSTER_FIELD_PATH_BASE}/volatility.planned", "default_value": 0, }, "law_forced": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "law.forced", + "path": f"{CLUSTER_FIELD_PATH_BASE}/law.forced", "default_value": LawOption.UNIFORM.value, }, "law_planned": { - "glob_path": CLUSTER_FIELD_PATH_PREFIX, - "rel_glob_path": "law.planned", + "path": f"{CLUSTER_FIELD_PATH_BASE}/law.planned", "default_value": LawOption.UNIFORM.value, }, }, + TableTemplateType.RENEWABLE: { + "group": { + "path": f"{RENEWABLE_FIELD_PATH_BASE}/group", + "default_value": "", + }, + "ts_interpretation": { + "path": f"{RENEWABLE_FIELD_PATH_BASE}/ts-interpretation", + "default_value": TimeSeriesMode.POWER_GENERATION.value, + }, + "enabled": { + "path": f"{RENEWABLE_FIELD_PATH_BASE}/enabled", + "default_value": True, + }, + "unit_count": { + "path": f"{RENEWABLE_FIELD_PATH_BASE}/unitcount", + "default_value": 0, + }, + "nominal_capacity": { + "path": f"{RENEWABLE_FIELD_PATH_BASE}/nominalcapacity", + "default_value": 0, + }, + }, + TableTemplateType.BINDING_CONSTRAINT: { + "type": { + "path": f"{BINDING_CONSTRAINT_FIELD_PATH_BASE}/type", + "default_value": BindingConstraintType.HOURLY.value, + }, + "operator": { + "path": f"{BINDING_CONSTRAINT_FIELD_PATH_BASE}/operator", + "default_value": BindingConstraintOperator.LESS.value, + }, + "enabled": { + "path": f"{BINDING_CONSTRAINT_FIELD_PATH_BASE}/enabled", + "default_value": True, + }, + }, } COLUMN_MODELS_BY_TYPE = { TableTemplateType.AREA: AreaColumns, TableTemplateType.LINK: LinkColumns, TableTemplateType.CLUSTER: ClusterColumns, + TableTemplateType.RENEWABLE: RenewableColumns, + TableTemplateType.BINDING_CONSTRAINT: BindingConstraintColumns, } -ColumnModelTypes = Union[AreaColumns, LinkColumns, ClusterColumns] +ColumnModelTypes = Union[ + AreaColumns, + LinkColumns, + ClusterColumns, + RenewableColumns, + BindingConstraintColumns, +] class TableModeManager: @@ -374,34 +422,38 @@ def get_table_data( file_study, table_type ) - if table_type == TableTemplateType.AREA: - - def get_value_from_data(col: str, data: Dict[str, Any]) -> Any: - field_info = fields_info[col] - return TableModeManager.__get_value( - field_info["rel_glob_path"].split("/"), - data, - field_info["default_value"], - ) + def get_column_value(col: str, data: Dict[str, Any]) -> Any: + f_info = fields_info[col] + relative_path = TableModeManager.__get_relative_path( + f_info["path"], table_type + ) + return TableModeManager.__get_value( + relative_path, + data, + f_info["default_value"], + ) + if table_type == TableTemplateType.AREA: return { area_id: column_model.construct( - **{col: get_value_from_data(col, data) for col in columns} + **{col: get_column_value(col, data) for col in columns} ) # type: ignore for area_id, data in glob_object.items() } + if table_type == TableTemplateType.BINDING_CONSTRAINT: + return { + data["id"]: column_model.construct( + **{col: get_column_value(col, data) for col in columns} + ) # type: ignore + for data in glob_object.values() + } + obj: Dict[str, Any] = {} for id_1, value_1 in glob_object.items(): for id_2, value_2 in value_1.items(): obj[f"{id_1} / {id_2}"] = column_model.construct( - **{ - col: value_2.get( - fields_info[col]["rel_glob_path"], - fields_info[col]["default_value"], - ) - for col in columns - } + **{col: get_column_value(col, value_2) for col in columns} ) return obj @@ -412,14 +464,55 @@ def set_table_data( table_type: TableTemplateType, data: Dict[str, ColumnModelTypes], ) -> None: - commands: List[UpdateConfig] = [] + commands: List[ICommand] = [] + bindings_by_id = None - for key, values in data.items(): + for key, columns in data.items(): path_vars = TableModeManager.__get_path_vars_from_key( table_type, key ) - if path_vars is not None: - for col, val in values.__iter__(): + + if table_type == TableTemplateType.BINDING_CONSTRAINT: + file_study = self.storage_service.get_storage(study).get_raw( + study + ) + bindings_by_id = bindings_by_id or { + binding["id"]: binding + for binding in TableModeManager.__get_glob_object( + file_study, table_type + ).values() + } + binding_id = path_vars["id"] + current_binding = bindings_by_id.get(binding_id, None) + + if current_binding: + col_values = columns.dict(exclude_none=True) + current_binding_dto = ( + BindingConstraintManager.process_constraint( + current_binding + ) + ) + + commands.append( + UpdateBindingConstraint( + id=binding_id, + enabled=col_values.get( + "enabled", current_binding_dto.enabled + ), + time_step=col_values.get( + "type", current_binding_dto.time_step + ), + operator=col_values.get( + "operator", current_binding_dto.operator + ), + coeffs=BindingConstraintManager.constraints_to_coeffs( + current_binding_dto + ), + command_context=self.storage_service.variant_study_service.command_factory.command_context, + ) + ) + else: + for col, val in columns.__iter__(): if val is not None: commands.append( UpdateConfig( @@ -447,44 +540,77 @@ def __get_value( ) return data if data != {} else default_value + @staticmethod + def __get_relative_path( + path: str, + table_type: TableTemplateType, + ) -> List[str]: + base_path = "" + path_arr = path.split("/") + + if table_type == TableTemplateType.AREA: + if path.startswith(ECONOMIC_OPTIONS_PATH_BASE): + base_path = ECONOMIC_OPTIONS_PATH_BASE + # Remove {id} + path_arr = path_arr[:-1] + else: + base_path = AREA_FIELD_PATH_BASE + elif table_type == TableTemplateType.LINK: + base_path = LINK_FIELD_PATH_BASE + elif table_type == TableTemplateType.CLUSTER: + base_path = CLUSTER_FIELD_PATH_BASE + elif table_type == TableTemplateType.RENEWABLE: + base_path = RENEWABLE_FIELD_PATH_BASE + elif table_type == TableTemplateType.BINDING_CONSTRAINT: + base_path = BINDING_CONSTRAINT_FIELD_PATH_BASE + + return path_arr[len(base_path.split("/")) :] + @staticmethod def __get_column_path( table_type: TableTemplateType, path_vars: PathVars, column: str, ) -> str: - path = ( - FIELDS_INFO_BY_TYPE[table_type][column]["glob_path"] - + "/" - + FIELDS_INFO_BY_TYPE[table_type][column]["rel_glob_path"] - ) + path = FIELDS_INFO_BY_TYPE[table_type][column]["path"] + + if table_type == TableTemplateType.AREA: + return path.replace("{id}", path_vars["id"]) if table_type == TableTemplateType.LINK: return path.replace("{area1}", path_vars["area1"]).replace( "{area2}", path_vars["area2"] ) - if table_type == TableTemplateType.CLUSTER: + if table_type in [ + TableTemplateType.CLUSTER, + TableTemplateType.RENEWABLE, + ]: return path.replace("{area}", path_vars["area"]).replace( "{cluster}", path_vars["cluster"] ) - # Area - if "{id}" not in path: - path += "/{id}" - return path.replace("{id}", path_vars["id"]) + + return path @staticmethod def __get_path_vars_from_key( table_type: TableTemplateType, key: str, - ) -> Optional[PathVars]: - if table_type == TableTemplateType.AREA: + ) -> PathVars: + if table_type in [ + TableTemplateType.AREA, + TableTemplateType.BINDING_CONSTRAINT, + ]: return PathVars(id=key) - elif table_type == TableTemplateType.LINK: + if table_type == TableTemplateType.LINK: area1, area2 = [v.strip() for v in key.split("/")] return PathVars(area1=area1, area2=area2) - elif table_type == TableTemplateType.CLUSTER: + if table_type in [ + TableTemplateType.CLUSTER, + TableTemplateType.RENEWABLE, + ]: area, cluster = [v.strip() for v in key.split("/")] return PathVars(area=area, cluster=cluster) - return None + + return PathVars() @staticmethod def __get_glob_object( @@ -492,23 +618,43 @@ def __get_glob_object( ) -> Dict[str, Any]: if table_type == TableTemplateType.AREA: data: Dict[str, Any] = file_study.tree.get( - AREA_FIELD_PATH_PREFIX.replace("{id}", "*").split("/") + AREA_FIELD_PATH_BASE.replace("{id}", "*").split("/") + ) + + # Add economic options in data + economic_opts = file_study.tree.get( + ECONOMIC_OPTIONS_PATH_BASE.split("/") ) - ecopts = file_study.tree.get(ECONOMIC_OPTIONS_PREFIX.split("/")) - for opt in ecopts: - for area in ecopts[opt]: - data[area] = {**data.get(area, {}), opt: ecopts[opt][area]} + for opt in economic_opts: + for area in economic_opts[opt]: + if area in data: + data[area] = { + **data[area], + opt: economic_opts[opt][area], + } + return data - elif table_type == TableTemplateType.LINK: + if table_type == TableTemplateType.LINK: return file_study.tree.get( - LINK_FIELD_PATH_PREFIX.replace("{area1}", "*") + LINK_FIELD_PATH_BASE.replace("{area1}", "*") .replace("/{area2}", "") .split("/") ) - elif table_type == TableTemplateType.CLUSTER: + if table_type == TableTemplateType.CLUSTER: + return file_study.tree.get( + CLUSTER_FIELD_PATH_BASE.replace("{area}", "*") + .replace("/{cluster}", "") + .split("/") + ) + if table_type == TableTemplateType.RENEWABLE: return file_study.tree.get( - CLUSTER_FIELD_PATH_PREFIX.replace("{area}", "*") + RENEWABLE_FIELD_PATH_BASE.replace("{area}", "*") .replace("/{cluster}", "") .split("/") ) + if table_type == TableTemplateType.BINDING_CONSTRAINT: + return file_study.tree.get( + BINDING_CONSTRAINT_FIELD_PATH_BASE.split("/") + ) + return {} diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index 452f09b449..b3c5405387 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -15,6 +15,9 @@ TableTemplateType, TimeSeriesGenerationOption, TransmissionCapacity, + TimeSeriesMode, + BindingConstraintType, + BindingConstraintOperator, ) from antarest.study.model import MatrixIndex, StudyDownloadLevelDTO from antarest.study.storage.variantstudy.model.command.common import ( @@ -690,6 +693,78 @@ def test_area_management(app: FastAPI): ], ) + client.post( + f"/v1/studies/{study_id}/commands", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + json=[ + { + "action": CommandName.CREATE_RENEWABLES_CLUSTER.value, + "args": { + "area_id": "area 1", + "cluster_name": "cluster renewable 1", + "parameters": {}, + }, + } + ], + ) + + client.post( + f"/v1/studies/{study_id}/commands", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + json=[ + { + "action": CommandName.CREATE_RENEWABLES_CLUSTER.value, + "args": { + "area_id": "area 2", + "cluster_name": "cluster renewable 2", + "parameters": {}, + }, + } + ], + ) + + client.post( + f"/v1/studies/{study_id}/commands", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + json=[ + { + "action": CommandName.CREATE_BINDING_CONSTRAINT.value, + "args": { + "name": "binding constraint 1", + "enabled": True, + "time_step": BindingConstraintType.HOURLY.value, + "operator": BindingConstraintOperator.LESS.value, + "coeffs": {"area 1.cluster 1": [2.0, 4]}, + }, + } + ], + ) + + client.post( + f"/v1/studies/{study_id}/commands", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + json=[ + { + "action": CommandName.CREATE_BINDING_CONSTRAINT.value, + "args": { + "name": "binding constraint 2", + "enabled": True, + "time_step": BindingConstraintType.HOURLY.value, + "operator": BindingConstraintOperator.LESS.value, + "coeffs": {}, + }, + } + ], + ) + res_areas = client.get( f"/v1/studies/{study_id}/areas", headers={ @@ -1730,6 +1805,174 @@ def test_area_management(app: FastAPI): }, } + # Table Mode - Renewable + + res_table_data = client.get( + table_mode_url, + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + params={ + "table_type": TableTemplateType.RENEWABLE, + "columns": ",".join( + FIELDS_INFO_BY_TYPE[TableTemplateType.RENEWABLE] + ), + }, + ) + res_table_data_json = res_table_data.json() + assert res_table_data_json == { + "area 1 / cluster renewable 1": { + "group": "", + "tsInterpretation": TimeSeriesMode.POWER_GENERATION.value, + "enabled": True, + "unitCount": 0, + "nominalCapacity": 0, + }, + "area 2 / cluster renewable 2": { + "group": "", + "tsInterpretation": TimeSeriesMode.POWER_GENERATION.value, + "enabled": True, + "unitCount": 0, + "nominalCapacity": 0, + }, + } + + client.put( + table_mode_url, + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + params={ + "table_type": TableTemplateType.RENEWABLE, + }, + json={ + "area 1 / cluster renewable 1": { + "tsInterpretation": TimeSeriesMode.PRODUCTION_FACTOR.value, + "enabled": False, + }, + "area 2 / cluster renewable 2": { + "unitCount": 2, + "nominalCapacity": 13, + }, + }, + ) + res_table_data = client.get( + table_mode_url, + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + params={ + "table_type": TableTemplateType.RENEWABLE, + "columns": ",".join( + FIELDS_INFO_BY_TYPE[TableTemplateType.RENEWABLE] + ), + }, + ) + res_table_data_json = res_table_data.json() + assert res_table_data_json == { + "area 1 / cluster renewable 1": { + "group": "", + "tsInterpretation": TimeSeriesMode.PRODUCTION_FACTOR.value, + "enabled": False, + "unitCount": 0, + "nominalCapacity": 0, + }, + "area 2 / cluster renewable 2": { + "group": "", + "tsInterpretation": TimeSeriesMode.POWER_GENERATION.value, + "enabled": True, + "unitCount": 2, + "nominalCapacity": 13, + }, + } + + # Table Mode - Binding Constraint + + res_table_data = client.get( + table_mode_url, + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + params={ + "table_type": TableTemplateType.BINDING_CONSTRAINT, + "columns": ",".join( + FIELDS_INFO_BY_TYPE[TableTemplateType.BINDING_CONSTRAINT] + ), + }, + ) + res_table_data_json = res_table_data.json() + assert res_table_data_json == { + "binding constraint 1": { + "enabled": True, + "type": BindingConstraintType.HOURLY.value, + "operator": BindingConstraintOperator.LESS.value, + }, + "binding constraint 2": { + "enabled": True, + "type": BindingConstraintType.HOURLY.value, + "operator": BindingConstraintOperator.LESS.value, + }, + } + + client.put( + table_mode_url, + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + params={ + "table_type": TableTemplateType.BINDING_CONSTRAINT, + }, + json={ + "binding constraint 1": { + "enabled": False, + "operator": BindingConstraintOperator.BOTH.value, + }, + "binding constraint 2": { + "type": BindingConstraintType.WEEKLY.value, + "operator": BindingConstraintOperator.EQUAL.value, + }, + }, + ) + res_table_data = client.get( + table_mode_url, + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + params={ + "table_type": TableTemplateType.BINDING_CONSTRAINT, + "columns": ",".join( + FIELDS_INFO_BY_TYPE[TableTemplateType.BINDING_CONSTRAINT] + ), + }, + ) + res_table_data_json = res_table_data.json() + assert res_table_data_json == { + "binding constraint 1": { + "enabled": False, + "type": BindingConstraintType.HOURLY.value, + "operator": BindingConstraintOperator.BOTH.value, + }, + "binding constraint 2": { + "enabled": True, + "type": BindingConstraintType.WEEKLY.value, + "operator": BindingConstraintOperator.EQUAL.value, + }, + } + + res = client.get( + f"/v1/studies/{study_id}/bindingconstraints/binding constraint 1", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + ) + binding_constraint_1 = res.json() + assert res.status_code == 200 + + constraint = binding_constraint_1["constraints"][0] + assert constraint["id"] == "area 1.cluster 1" + assert constraint["weight"] == 2.0 + assert constraint["offset"] == 4.0 + # --- TableMode END --- client.delete( diff --git a/tests/integration/test_integration_table_mode_manager.py b/tests/integration/test_integration_table_mode_manager.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/index.tsx index 0518197895..7da88bd1b2 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/index.tsx @@ -29,6 +29,7 @@ import * as api from "../../../../../../services/api/forms/tableMode"; function TableMode() { const { t } = useTranslation(); + const [templates, setTemplates] = useState(() => [ ...DEFAULT_TABLE_TEMPLATES.map((tp) => ({ ...tp, @@ -38,15 +39,19 @@ function TableMode() { (tp) => ({ ...tp, id: uuidv4() }) ), ]); + const [selectedTemplateId, setSelectedTemplateId] = useState(templates[0].id); - const selectedTemplate = - templates.find((tp) => tp.id === selectedTemplateId) || templates[0]; + const [dialog, setDialog] = useState<{ type: "add" | "edit" | "delete"; templateId: TableTemplate["id"]; } | null>(null); + const { study } = useOutletContext<{ study: StudyMetadata }>(); + const selectedTemplate = + templates.find((tp) => tp.id === selectedTemplateId) || templates[0]; + const res = usePromise(async () => { const { type, columns } = selectedTemplate; return api.getTableData(study.id, type, columns); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts index e54763df64..89d4a9d816 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts @@ -4,6 +4,8 @@ export enum TableTemplateType { Area = "area", Link = "link", Cluster = "cluster", + Renewable = "renewable", + BindingConstraint = "binding constraint", } export const TABLE_TEMPLATE_TYPE_OPTIONS = Object.values(TableTemplateType); @@ -58,6 +60,14 @@ const TABLE_TEMPLATE_COLUMNS_BY_TYPE = { "lawForced", "lawPlanned", ], + [TableTemplateType.Renewable]: [ + "group", + "tsInterpretation", + "enabled", + "unitCount", + "nominalCapacity", + ], + [TableTemplateType.BindingConstraint]: ["type", "operator", "enabled"], } as const; export type TableTemplateColumnsForType = Array< @@ -71,6 +81,7 @@ export interface TableTemplate< name: string; type: T; columns: TableTemplateColumnsForType; + frozen: true; } /** @@ -81,7 +92,7 @@ export function createTableTemplate( type: T, columns: TableTemplateColumnsForType ): TableTemplate { - return { id: uuidv4(), name, type, columns }; + return { id: uuidv4(), name, type, columns, frozen: true }; } export const DEFAULT_TABLE_TEMPLATES: TableTemplate[] = [ From 4e81fa646552a58d56984171c644104d4dd79ab7 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Wed, 8 Feb 2023 17:13:50 +0100 Subject: [PATCH 26/60] ci: remove Create Issue Branch app file (#1299) --- .github/issue-branch.yml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 .github/issue-branch.yml diff --git a/.github/issue-branch.yml b/.github/issue-branch.yml deleted file mode 100644 index b31c2af433..0000000000 --- a/.github/issue-branch.yml +++ /dev/null @@ -1,9 +0,0 @@ -autoCloseIssue: true - -branches: - - label: '*' - name: dev - prefix: feature/ - - label: bug - prefix: bugfix/ - From 429d288ce5aa96c0c65724647b211639b4153417 Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Wed, 8 Feb 2023 19:07:56 +0100 Subject: [PATCH 27/60] feat(ui-study): add path tooltip on study title (#1300) --- .../components/App/Singlestudy/NavHeader.tsx | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/webapp/src/components/App/Singlestudy/NavHeader.tsx b/webapp/src/components/App/Singlestudy/NavHeader.tsx index 3024893188..e48aa5188c 100644 --- a/webapp/src/components/App/Singlestudy/NavHeader.tsx +++ b/webapp/src/components/App/Singlestudy/NavHeader.tsx @@ -265,15 +265,17 @@ function NavHeader(props: Props) { alignItems="center" boxSizing="border-box" > - - {study?.name} - + + + {study?.name} + + Date: Thu, 9 Feb 2023 10:21:25 +0100 Subject: [PATCH 28/60] feat(ui-map): add layers and districts french translations (#1292) --- webapp/public/locales/en/main.json | 14 ++++++++++++-- webapp/public/locales/fr/main.json | 14 ++++++++++++-- .../MapConfig/Districts/CreateDistrictDialog.tsx | 6 +++--- .../MapConfig/Districts/UpdateDistrictDialog.tsx | 16 ++++++++++------ .../Map/MapConfig/Districts/index.tsx | 6 ++++-- .../Map/MapConfig/Layers/CreateLayerDialog.tsx | 2 +- .../Map/MapConfig/Layers/UpdateLayerDialog.tsx | 10 +++++++--- .../Modelization/Map/MapConfig/Layers/index.tsx | 6 ++++-- 8 files changed, 53 insertions(+), 21 deletions(-) diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json index 0a7dd1c987..e6d19187d9 100644 --- a/webapp/public/locales/en/main.json +++ b/webapp/public/locales/en/main.json @@ -234,8 +234,6 @@ "study.results": "Results", "study.copyId": "Copy the study ID", "study.copyJobId": "Copy the job ID", - "study.modelization.map.newArea": "New Area", - "study.modelization.map.areaName": "Area name", "study.modelization.links.hurdleCost": "Hurdle costs", "study.modelization.links.loopFlows": "Loop flows", "study.modelization.links.pst": "PST", @@ -367,6 +365,18 @@ "study.modelization.nodeProperties.filterByYear": "Output year by year", "study.modelization.nodeProperties.filterSynthesis": "Synthesis outputs", "study.modelization.map": "Map", + "study.modelization.map.newArea": "New Area", + "study.modelization.map.areaName": "Area name", + "study.modelization.map.layers": "Layers", + "study.modelization.map.layers.add": "Add layer", + "study.modelization.map.layers.edit": "Edit layers", + "study.modelization.map.layers.delete.confirm": "Are you sure you want to delete '{{0}}' layer?", + "study.modelization.map.districts": "Districts", + "study.modelization.map.districts.field.comments": "Comments", + "study.modelization.map.districts.field.outputs": "Outputs", + "study.modelization.map.districts.add": "Add district", + "study.modelization.map.districts.edit": "Edit districts", + "study.modelization.map.districts.delete.confirm": "Are you sure you want to delete '{{0}}' district?", "study.modelization.posX": "Position X", "study.modelization.posY": "Position Y", "study.modelization.properties": "Properties", diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json index 7f08ffdbe7..aa31e78699 100644 --- a/webapp/public/locales/fr/main.json +++ b/webapp/public/locales/fr/main.json @@ -234,8 +234,6 @@ "study.results": "Résultats", "study.copyId": "Copier l'identifiant de l'étude", "study.copyJobId": "Copier l'identifiant de la tâche", - "study.modelization.map.newArea": "Nouvelle zone", - "study.modelization.map.areaName": "Nom de la zone", "study.modelization.links.hurdleCost": "Hurdle costs", "study.modelization.links.loopFlows": "Loop flows", "study.modelization.links.pst": "PST", @@ -367,6 +365,18 @@ "study.modelization.nodeProperties.filterByYear": "Sorties année par année", "study.modelization.nodeProperties.filterSynthesis": "Sorties de la synthèse", "study.modelization.map": "Carte", + "study.modelization.map.newArea": "Nouvelle zone", + "study.modelization.map.areaName": "Nom de la zone", + "study.modelization.map.layers": "Layers", + "study.modelization.map.layers.add": "Ajouter un layer", + "study.modelization.map.layers.edit": "Modifier un layer", + "study.modelization.map.layers.delete.confirm": "Êtes-vous sûr de vouloir supprimer le layer '{{0}}' ?", + "study.modelization.map.districts.field.comments": "Commentaires", + "study.modelization.map.districts.field.outputs": "Sorties", + "study.modelization.map.districts": "Districts", + "study.modelization.map.districts.add": "Ajouter un district", + "study.modelization.map.districts.edit": "Modifier un district", + "study.modelization.map.districts.delete.confirm": "Êtes-vous sûr de vouloir supprimer le district '{{0}}' ?", "study.modelization.posX": "Position X", "study.modelization.posY": "Position Y", "study.modelization.properties": "Propriétés", diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx index 159014e9d5..f48f39be5b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx @@ -64,7 +64,7 @@ function CreateDistrictDialog(props: Props) { return ( setOpenConfirmationModal(true)} sx={{ mr: 1 }} > - Delete District + {t("global.delete")} {openConfirmationModal && ( - Delete district ? + + {t("study.modelization.map.districts.delete.confirm", [ + districtsById[getValues("districtId")].name, + ])} + )}
diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx index e8b87276e2..40139784e0 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx @@ -3,6 +3,7 @@ import AutoSizer from "react-virtualized-auto-sizer"; import { useMemo, useState } from "react"; import { useOutletContext } from "react-router"; import { Add, Edit } from "@mui/icons-material"; +import { useTranslation } from "react-i18next"; import { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { @@ -19,6 +20,7 @@ import UpdateDistrictDialog from "./UpdateDistrictDialog"; function Districts() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const dispatch = useAppDispatch(); + const [t] = useTranslation(); const areas = useAppSelector((state) => getAreas(state, study.id)); const districtsById = useAppSelector(getStudyMapDistrictsById); const [createDistrictDialogOpen, setCreateDistrictDialogOpen] = @@ -105,7 +107,7 @@ function Districts() { onClick={() => setCreateDistrictDialogOpen(true)} sx={{ mr: 1 }} > - Add District + {t("study.modelization.map.districts.add")}
diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx index f58124fdea..fa07a5f44d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx @@ -57,7 +57,7 @@ function CreateLayerDialog(props: Props) { return ( setOpenConfirmationModal(true)} sx={{ mr: 1 }} > - Delete Layer + {t("global.delete")} {openConfirmationModal && ( - Delete layer ? + + {t("study.modelization.map.layers.delete.confirm", [ + layersById[getValues("layerId")].name, + ])} + )} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx index 903d1b46fd..0f04dfeee0 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx @@ -3,6 +3,7 @@ import AutoSizer from "react-virtualized-auto-sizer"; import { useMemo, useState } from "react"; import { useOutletContext } from "react-router"; import { Add, Edit } from "@mui/icons-material"; +import { useTranslation } from "react-i18next"; import { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { @@ -19,6 +20,7 @@ import UpdateLayerDialog from "./UpdateLayerDialog"; function Layers() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const dispatch = useAppDispatch(); + const [t] = useTranslation(); const areas = useAppSelector((state) => getAreas(state, study.id)); const layersById = useAppSelector(getStudyMapLayersById); const [createLayerDialogOpen, setCreateLayerDialogOpen] = useState(false); @@ -106,7 +108,7 @@ function Layers() { onClick={() => setCreateLayerDialogOpen(true)} sx={{ mr: 1 }} > - Add Layer + {t("study.modelization.map.layers.add")} From b9cea1ebd644869a459cbf002661c4a833389cb2 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE <43534797+laurent-laporte-pro@users.noreply.github.com> Date: Thu, 9 Feb 2023 21:31:28 +0100 Subject: [PATCH 29/60] fix(api): correct the way the task completion is notified to the event bus (#1301) --- antarest/core/cache/business/local_chache.py | 6 +- antarest/core/config.py | 9 +- antarest/core/interfaces/service.py | 6 +- antarest/core/maintenance/service.py | 6 +- antarest/eventbus/service.py | 7 +- .../adapters/local_launcher/local_launcher.py | 21 ++-- antarest/launcher/adapters/log_manager.py | 1 + .../adapters/slurm_launcher/slurm_launcher.py | 7 +- .../model/filesystem/root/filestudytree.py | 5 +- .../storage/rawstudy/raw_study_service.py | 1 + antarest/worker/archive_worker.py | 1 + antarest/worker/simulator_worker.py | 5 +- antarest/worker/worker.py | 101 +++++++++++------- tests/conftest.py | 17 +-- tests/core/test_tasks.py | 3 + tests/eventbus/test_service.py | 8 +- tests/worker/test_worker.py | 27 ++++- 17 files changed, 152 insertions(+), 79 deletions(-) diff --git a/antarest/core/cache/business/local_chache.py b/antarest/core/cache/business/local_chache.py index a3275b5d7f..f6b544260a 100644 --- a/antarest/core/cache/business/local_chache.py +++ b/antarest/core/cache/business/local_chache.py @@ -20,11 +20,13 @@ class LocalCacheElement(BaseModel): class LocalCache(ICache): def __init__(self, config: CacheConfig = CacheConfig()): - self.cache: Dict[str, LocalCacheElement] = dict() + self.cache: Dict[str, LocalCacheElement] = {} self.lock = threading.Lock() self.checker_delay = config.checker_delay self.checker_thread = threading.Thread( - target=self.checker, daemon=True + target=self.checker, + name=self.__class__.__name__, + daemon=True, ) def start(self) -> None: diff --git a/antarest/core/config.py b/antarest/core/config.py index 7bf772ef19..86acdd8bfd 100644 --- a/antarest/core/config.py +++ b/antarest/core/config.py @@ -73,9 +73,9 @@ class WorkspaceConfig: def from_dict(data: JSON) -> "WorkspaceConfig": return WorkspaceConfig( path=Path(data["path"]), - groups=data.get("groups", list()), + groups=data.get("groups", []), filter_in=data.get("filter_in", [".*"]), - filter_out=data.get("filter_out", list()), + filter_out=data.get("filter_out", []), ) @@ -254,7 +254,7 @@ class LoggingConfig: @staticmethod def from_dict(data: JSON) -> "LoggingConfig": logging_config: Dict[str, Any] = data or {} - logfile: Optional[str] = logging_config.get("logfile", None) + logfile: Optional[str] = logging_config.get("logfile") return LoggingConfig( logfile=Path(logfile) if logfile is not None else None, json=logging_config.get("json", False), @@ -287,6 +287,7 @@ class EventBusConfig: Sub config object dedicated to eventbus module """ + # noinspection PyUnusedLocal @staticmethod def from_dict(data: JSON) -> "EventBusConfig": return EventBusConfig() @@ -298,7 +299,7 @@ class CacheConfig: Sub config object dedicated to cache module """ - checker_delay: float = 0.2 # in ms + checker_delay: float = 0.2 # in seconds @staticmethod def from_dict(data: JSON) -> "CacheConfig": diff --git a/antarest/core/interfaces/service.py b/antarest/core/interfaces/service.py index 3696e71e5f..7adacc6182 100644 --- a/antarest/core/interfaces/service.py +++ b/antarest/core/interfaces/service.py @@ -4,7 +4,11 @@ class IService(ABC): def __init__(self) -> None: - self.thread = threading.Thread(target=self._loop, daemon=True) + self.thread = threading.Thread( + target=self._loop, + name=self.__class__.__name__, + daemon=True, + ) def start(self, threaded: bool = True) -> None: if threaded: diff --git a/antarest/core/maintenance/service.py b/antarest/core/maintenance/service.py index ca1ad5a704..f252591013 100644 --- a/antarest/core/maintenance/service.py +++ b/antarest/core/maintenance/service.py @@ -33,7 +33,11 @@ def __init__( self._init() def _init(self) -> None: - self.thread = Thread(target=self.check_disk_usage, daemon=True) + self.thread = Thread( + target=self.check_disk_usage, + name=self.__class__.__name__, + daemon=True, + ) self.thread.start() def check_disk_usage(self) -> None: diff --git a/antarest/eventbus/service.py b/antarest/eventbus/service.py index 870859dc8e..8411547f8d 100644 --- a/antarest/eventbus/service.py +++ b/antarest/eventbus/service.py @@ -124,8 +124,11 @@ def _async_loop(self, new_loop: bool = True) -> None: def start(self, threaded: bool = True) -> None: if threaded: - t = threading.Thread(target=self._async_loop) - t.setDaemon(True) + t = threading.Thread( + target=self._async_loop, + name=self.__class__.__name__, + daemon=True, + ) logger.info("Starting event bus") t.start() else: diff --git a/antarest/launcher/adapters/local_launcher/local_launcher.py b/antarest/launcher/adapters/local_launcher/local_launcher.py index 4b1aa6349c..84a9b6fff3 100644 --- a/antarest/launcher/adapters/local_launcher/local_launcher.py +++ b/antarest/launcher/adapters/local_launcher/local_launcher.py @@ -84,6 +84,7 @@ def run_study( job_id, launcher_parameters, ), + name=f"{self.__class__.__name__}-JobRunner", ) job.start() @@ -144,23 +145,21 @@ def stop_reading_output() -> bool: stop_reading_output, None, ), + name=f"{self.__class__.__name__}-LogsWatcher", daemon=True, ) thread.start() - while True: - if process.poll() is not None: - break + while process.poll() is None: time.sleep(1) - if launcher_parameters is not None: - if ( - launcher_parameters.post_processing - or launcher_parameters.adequacy_patch is not None - ): - subprocess.run( - ["Rscript", "post-processing.R"], cwd=export_path - ) + if launcher_parameters is not None and ( + launcher_parameters.post_processing + or launcher_parameters.adequacy_patch is not None + ): + subprocess.run( + ["Rscript", "post-processing.R"], cwd=export_path + ) output_id: Optional[str] = None try: diff --git a/antarest/launcher/adapters/log_manager.py b/antarest/launcher/adapters/log_manager.py index a7d53b16f8..afac2a2da1 100644 --- a/antarest/launcher/adapters/log_manager.py +++ b/antarest/launcher/adapters/log_manager.py @@ -32,6 +32,7 @@ def track( target=lambda: self._follow( log_path, handler, self._stop_tracking(str(log_path)) ), + name=f"{self.__class__.__name__}-LogsWatcher", daemon=True, ) self.tracked_logs[str(log_path)] = thread diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index 0b2233e62a..8cc2dc80bd 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -155,7 +155,11 @@ def _loop(self) -> None: def start(self) -> None: logger.info("Starting slurm_launcher loop") self.check_state = True - self.thread = threading.Thread(target=self._loop, daemon=True) + self.thread = threading.Thread( + target=self._loop, + name=self.__class__.__name__, + daemon=True, + ) self.thread.start() def stop(self) -> None: @@ -610,6 +614,7 @@ def run_study( thread = threading.Thread( target=self._run_study, args=(study_uuid, job_id, launcher_parameters, version), + name=f"{self.__class__.__name__}-JobRunner", ) thread.start() diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py index 39b38c0ea7..2c1ed018ce 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py @@ -66,7 +66,10 @@ def async_denormalize(self) -> Thread: logger.info( f"Denormalizing (async) study data for study {self.config.study_id}" ) - thread = Thread(target=self._threaded_denormalize) + thread = Thread( + target=self._threaded_denormalize, + name=f"{self.__class__.__name__}-Denormalizer", + ) thread.start() return thread diff --git a/antarest/study/storage/rawstudy/raw_study_service.py b/antarest/study/storage/rawstudy/raw_study_service.py index a5cbd0394a..c56ace5dc5 100644 --- a/antarest/study/storage/rawstudy/raw_study_service.py +++ b/antarest/study/storage/rawstudy/raw_study_service.py @@ -73,6 +73,7 @@ def __init__( self.path_resources: Path = path_resources self.cleanup_thread = Thread( target=RawStudyService.cleanup_lazynode_zipfilelist_cache, + name=f"{self.__class__.__name__}-Cleaner", daemon=True, ) self.cleanup_thread.start() diff --git a/antarest/worker/archive_worker.py b/antarest/worker/archive_worker.py index 9a09e15821..83d56d9c7d 100644 --- a/antarest/worker/archive_worker.py +++ b/antarest/worker/archive_worker.py @@ -41,6 +41,7 @@ def __init__( def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: logger.info(f"Executing task {task_info.json()}") try: + # sourcery skip: extract-method archive_args = ArchiveTaskArgs.parse_obj(task_info.task_args) dest = self.translate_path(Path(archive_args.dest)) src = self.translate_path(Path(archive_args.src)) diff --git a/antarest/worker/simulator_worker.py b/antarest/worker/simulator_worker.py index 5dc9a6ee2d..e419a54178 100644 --- a/antarest/worker/simulator_worker.py +++ b/antarest/worker/simulator_worker.py @@ -118,13 +118,12 @@ def stop_reading() -> bool: stop_reading, None, ), + name=f"{self.__class__.__name__}-TS-Generator", daemon=True, ) thread.start() - while True: - if process.poll() is not None: - break + while process.poll() is None: time.sleep(1) result.success = process.returncode == 0 diff --git a/antarest/worker/worker.py b/antarest/worker/worker.py index 701ee39b61..ced8b7d834 100644 --- a/antarest/worker/worker.py +++ b/antarest/worker/worker.py @@ -1,10 +1,8 @@ import logging import threading import time -from abc import abstractmethod -from concurrent.futures import Future, ThreadPoolExecutor -from threading import Thread -from typing import Dict, List, Union +from concurrent.futures import ThreadPoolExecutor, Future +from typing import Dict, List, Union, Any from antarest.core.interfaces.eventbus import Event, EventType, IEventBus from antarest.core.interfaces.service import IService @@ -28,23 +26,70 @@ class WorkerTaskCommand(BaseModel): task_args: Dict[str, Union[int, float, bool, str]] +class _WorkerTaskEndedCallback: + """ + Callback function which uses the event bus to notify + that the worker task is completed (or cancelled). + """ + + def __init__( + self, + event_bus: IEventBus, + task_id: str, + ) -> None: + self._event_bus = event_bus + self._task_id = task_id + + # NOTE: it seems that mypy has an issue with `concurrent.futures.Future`, + # for this reason we have annotated the `future` parameter with a string. + def __call__(self, future: "Future[Any]") -> None: + result = future.result() + event = Event( + type=EventType.WORKER_TASK_ENDED, + payload=WorkerTaskResult( + task_id=self._task_id, task_result=result + ), + # Use `NONE` for internal events + permissions=PermissionInfo(public_mode=PublicMode.NONE), + ) + self._event_bus.push(event) + + +# fixme: `AbstractWorker` should not inherit from `IService` class AbstractWorker(IService): def __init__( - self, name: str, event_bus: IEventBus, accept: List[str] + self, + name: str, + event_bus: IEventBus, + accept: List[str], ) -> None: - super(AbstractWorker, self).__init__() + super().__init__() + # fixme: `AbstractWorker` should not have any `thread` attribute + del self.thread self.name = name self.event_bus = event_bus - for task_type in accept: - self.event_bus.add_queue_consumer(self.listen_for_tasks, task_type) + self.accept = accept self.threadpool = ThreadPoolExecutor( - max_workers=MAX_WORKERS, thread_name_prefix="workertask_" + max_workers=MAX_WORKERS, + thread_name_prefix="worker_task_", ) - self.task_watcher = Thread(target=self._loop, daemon=True) self.lock = threading.Lock() - self.futures: Dict[str, Future[TaskResult]] = {} - async def listen_for_tasks(self, event: Event) -> None: + # fixme: `AbstractWorker.start` should not have any `threaded` parameter + def start(self, threaded: bool = True) -> None: + for task_type in self.accept: + self.event_bus.add_queue_consumer( + self._listen_for_tasks, task_type + ) + # Wait a short time to allow the event bus to have the opportunity + # to process the tasks as soon as possible + time.sleep(0.01) + + # fixme: `AbstractWorker` should not have any `_loop` function + def _loop(self) -> None: + pass + + async def _listen_for_tasks(self, event: Event) -> None: logger.info(f"Accepting new task {event.json()}") task_info = WorkerTaskCommand.parse_obj(event.payload) self.event_bus.push( @@ -56,11 +101,13 @@ async def listen_for_tasks(self, event: Event) -> None: ) ) with self.lock: - self.futures[task_info.task_id] = self.threadpool.submit( - self.safe_execute_task, task_info - ) + # fmt: off + future = self.threadpool.submit(self._safe_execute_task, task_info) + callback = _WorkerTaskEndedCallback(self.event_bus, task_info.task_id) + future.add_done_callback(callback) + # fmt: on - def safe_execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: + def _safe_execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: try: return self.execute_task(task_info) except Exception as e: @@ -70,27 +117,5 @@ def safe_execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: ) return TaskResult(success=False, message=repr(e)) - @abstractmethod def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: raise NotImplementedError() - - def _loop(self) -> None: - while True: - with self.lock: - for task_id, future in list(self.futures.items()): - if future.done(): - self.event_bus.push( - Event( - type=EventType.WORKER_TASK_ENDED, - payload=WorkerTaskResult( - task_id=task_id, - task_result=future.result(), - ), - # Use `NONE` for internal events - permissions=PermissionInfo( - public_mode=PublicMode.NONE - ), - ) - ) - del self.futures[task_id] - time.sleep(2) diff --git a/tests/conftest.py b/tests/conftest.py index f8384538de..7eff60d0a1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,6 @@ import sys import time -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from functools import wraps from pathlib import Path from typing import Any, Callable @@ -24,16 +24,17 @@ def project_path() -> Path: def with_db_context(f): @wraps(f) - def wrapper(*args, **kwds): + def wrapper(*args, **kwargs): engine = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(engine) + # noinspection PyTypeChecker DBSessionMiddleware( Mock(), custom_engine=engine, session_args={"autocommit": False, "autoflush": False}, ) with db(): - return f(*args, **kwds) + return f(*args, **kwargs) return wrapper @@ -80,10 +81,12 @@ def assert_study(a: SUB_JSON, b: SUB_JSON) -> None: _assert_others(a, b) -def autoretry_assert(func: Callable[..., bool], timeout: int) -> None: - threshold = datetime.utcnow() + timedelta(seconds=timeout) - while datetime.utcnow() < threshold: - if func(): +def auto_retry_assert( + predicate: Callable[..., bool], timeout: int = 2 +) -> None: + threshold = datetime.now(timezone.utc) + timedelta(seconds=timeout) + while datetime.now(timezone.utc) < threshold: + if predicate(): return time.sleep(0.2) raise AssertionError() diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index 415fd016f9..31ef310a1c 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -1,5 +1,6 @@ import datetime from pathlib import Path +import time from typing import Callable, List from unittest.mock import ANY, Mock, call @@ -271,6 +272,8 @@ def __init__( self.tmp_path = tmp_path def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: + # simulate a "long" task ;-) + time.sleep(0.01) relative_path = task_info.task_args["file"] (self.tmp_path / relative_path).touch() return TaskResult(success=True, message="") diff --git a/tests/eventbus/test_service.py b/tests/eventbus/test_service.py index 39c18a9e47..542daa5bd3 100644 --- a/tests/eventbus/test_service.py +++ b/tests/eventbus/test_service.py @@ -5,7 +5,7 @@ from antarest.core.interfaces.eventbus import Event, EventType from antarest.core.model import PermissionInfo, PublicMode from antarest.eventbus.main import build_eventbus -from tests.conftest import autoretry_assert +from tests.conftest import auto_retry_assert def test_service_factory(): @@ -53,7 +53,7 @@ async def _append_to_bucket(event: Event): permissions=PermissionInfo(public_mode=PublicMode.READ), ) ) - autoretry_assert(lambda: len(test_bucket) == 3, 2) + auto_retry_assert(lambda: len(test_bucket) == 3, timeout=2) event_bus.remove_listener(lid1) event_bus.remove_listener(lid2) @@ -65,7 +65,7 @@ async def _append_to_bucket(event: Event): permissions=PermissionInfo(public_mode=PublicMode.READ), ) ) - autoretry_assert(lambda: len(test_bucket) == 0, 2) + auto_retry_assert(lambda: len(test_bucket) == 0, timeout=2) queue_name = "some work job" event_bus.add_queue_consumer(append_to_bucket(test_bucket), queue_name) @@ -80,4 +80,4 @@ async def _append_to_bucket(event: Event): ), queue_name, ) - autoretry_assert(lambda: len(test_bucket) == 1, 2) + auto_retry_assert(lambda: len(test_bucket) == 1, timeout=2) diff --git a/tests/worker/test_worker.py b/tests/worker/test_worker.py index ef9d468261..12053b225a 100644 --- a/tests/worker/test_worker.py +++ b/tests/worker/test_worker.py @@ -1,3 +1,4 @@ +import time from pathlib import Path from typing import List from unittest.mock import MagicMock @@ -8,7 +9,7 @@ from antarest.core.tasks.model import TaskResult from antarest.eventbus.main import build_eventbus from antarest.worker.worker import AbstractWorker, WorkerTaskCommand -from tests.conftest import autoretry_assert +from tests.conftest import auto_retry_assert class DummyWorker(AbstractWorker): @@ -19,6 +20,8 @@ def __init__( self.tmp_path = tmp_path def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult: + # simulate a "long" task ;-) + time.sleep(0.01) relative_path = task_info.task_args["file"] (self.tmp_path / relative_path).touch() return TaskResult(success=True, message="") @@ -40,9 +43,25 @@ def test_simple_task(tmp_path: Path): task_queue, ) - assert not (tmp_path / "foo").exists() + # Add some listeners to debug the event bus notifications + msg = [] + async def notify(event: Event): + msg.append(event.type.value) + + event_bus.add_listener(notify, [EventType.WORKER_TASK_STARTED]) + event_bus.add_listener(notify, [EventType.WORKER_TASK_ENDED]) + + # Initialize and start a worker worker = DummyWorker(event_bus, [task_queue], tmp_path) - worker.start(threaded=True) + worker.start() + + # Wait for the end of the processing + # Set a big value to `timeout` if you want to debug the worker + auto_retry_assert(lambda: (tmp_path / "foo").exists(), timeout=60) + + # Wait a short time to allow the event bus to have the opportunity + # to process the notification of the end event. + time.sleep(0.01) - autoretry_assert(lambda: (tmp_path / "foo").exists(), 2) + assert msg == ["WORKER_TASK_STARTED", "WORKER_TASK_ENDED"] From 032b58134a4e2e9da50848d6de438d23a0f00086 Mon Sep 17 00:00:00 2001 From: MartinBelthle <102529366+MartinBelthle@users.noreply.github.com> Date: Thu, 9 Feb 2023 23:26:25 +0100 Subject: [PATCH 30/60] fix(storage): ignore zipped output if an unzipped version exists (#1269) Co-authored-by: Laurent LAPORTE --- .../study/storage/abstract_storage_service.py | 12 +- .../storage/rawstudy/io/reader/ini_reader.py | 81 +- .../model/filesystem/config/exceptions.py | 42 ++ .../rawstudy/model/filesystem/config/files.py | 711 +++++++++--------- .../rawstudy/model/filesystem/config/model.py | 2 +- .../rawstudy/model/filesystem/factory.py | 6 +- .../study/storage/rawstudy/model/helpers.py | 4 +- .../business/command_extractor.py | 5 +- tests/storage/business/assets/__init__.py | 3 + .../assets/test_output_zip_not_zipped.zip | Bin 0 -> 99595 bytes .../storage/business/test_arealink_manager.py | 7 +- .../test_timeseries_config_manager.py | 10 +- .../storage/business/test_xpansion_manager.py | 7 +- tests/storage/rawstudies/test_factory.py | 8 +- .../antares_io/reader/test_ini_reader.py | 91 ++- .../filesystem/config/test_config_files.py | 100 ++- tests/storage/test_model.py | 1 + tests/storage/test_service.py | 1 + .../model/command/test_manage_district.py | 8 +- .../model/command/test_remove_link.py | 6 +- 20 files changed, 613 insertions(+), 492 deletions(-) create mode 100644 antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py create mode 100644 tests/storage/business/assets/__init__.py create mode 100644 tests/storage/business/assets/test_output_zip_not_zipped.zip diff --git a/antarest/study/storage/abstract_storage_service.py b/antarest/study/storage/abstract_storage_service.py index e4e81ed139..404019a289 100644 --- a/antarest/study/storage/abstract_storage_service.py +++ b/antarest/study/storage/abstract_storage_service.py @@ -1,5 +1,4 @@ import logging -import os import shutil import tempfile from abc import ABC @@ -10,7 +9,7 @@ from antarest.core.config import Config from antarest.core.exceptions import BadOutputError, StudyOutputNotFoundError from antarest.core.interfaces.cache import CacheConstants, ICache -from antarest.core.model import JSON, PublicMode +from antarest.core.model import JSON from antarest.core.utils.utils import ( extract_zip, StopWatch, @@ -18,7 +17,6 @@ zip_dir, unzip, ) -from antarest.login.model import GroupDTO from antarest.study.common.studystorage import IStudyStorageService, T from antarest.study.common.utils import get_study_information from antarest.study.model import ( @@ -26,16 +24,13 @@ StudySimResultDTO, StudySimSettingsDTO, PatchOutputs, - OwnerInfo, - DEFAULT_WORKSPACE_NAME, PatchStudy, StudyMetadataPatchDTO, - Patch, StudyAdditionalData, ) from antarest.study.storage.patch_service import PatchService from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, + get_playlist, ) from antarest.study.storage.rawstudy.model.filesystem.config.model import ( Simulation, @@ -171,8 +166,7 @@ def get_study_sim_result( playlist=[ year for year in ( - ConfigPathBuilder.get_playlist(file_metadata) - or {} + get_playlist(file_metadata) or {} ).keys() ], ) diff --git a/antarest/study/storage/rawstudy/io/reader/ini_reader.py b/antarest/study/storage/rawstudy/io/reader/ini_reader.py index 8e019e2273..dfcd6ee9b7 100644 --- a/antarest/study/storage/rawstudy/io/reader/ini_reader.py +++ b/antarest/study/storage/rawstudy/io/reader/ini_reader.py @@ -1,10 +1,11 @@ import configparser +import contextlib import re from abc import ABC, abstractmethod from pathlib import Path from typing import List, Optional, Union -from antarest.core.model import ELEMENT, JSON, SUB_JSON +from antarest.core.model import JSON, SUB_JSON class IReader(ABC): @@ -32,8 +33,7 @@ class IniReader(IReader): @staticmethod def _parse_bool(value: str) -> Optional[bool]: - value = value.lower() - return bool(value == "true") if value in ["true", "false"] else None + return {"true": True, "false": False}.get(value.lower()) @staticmethod def _parse_int(value: str) -> Optional[int]: @@ -50,15 +50,14 @@ def _parse_float(value: str) -> Optional[float]: return None @staticmethod - def parse_value(value: str) -> SUB_JSON: - parsed: Union[str, int, float, bool, None] = IniReader._parse_bool( - value - ) - parsed = parsed if parsed is not None else IniReader._parse_int(value) - parsed = ( - parsed if parsed is not None else IniReader._parse_float(value) - ) - return parsed if parsed is not None else value + def parse_value(value: str) -> Union[bool, int, float, str]: + def strict_bool(v: str) -> bool: + return {"true": True, "false": False}[v.lower()] + + for parser in [strict_bool, int, float]: + with contextlib.suppress(KeyError, ValueError): + return parser(value) # type: ignore + return value @staticmethod def _parse_json(json: configparser.SectionProxy) -> JSON: @@ -89,6 +88,7 @@ def _parse_inf(value: str) -> Optional[str]: except ValueError: return None + # noinspection PyProtectedMember @staticmethod def parse_value(value: str) -> SUB_JSON: parsed: Union[ @@ -109,9 +109,9 @@ def _parse_json(json: JSON) -> JSON: } def read(self, path: Path) -> JSON: - with open(path, "r") as f: - json = {} - for line in f.readlines(): + json = {} + with open(path, "r") as fd: + for line in fd: line = line.strip() if line and not line.startswith("#"): key, value = line.split("=") @@ -121,6 +121,7 @@ def read(self, path: Path) -> JSON: class IniConfigParser(configparser.RawConfigParser): + # noinspection SpellCheckingInspection def optionxform(self, optionstr: str) -> str: return optionstr @@ -129,7 +130,7 @@ class MultipleSameKeysIniReader(IReader): """ Custom .ini reader for inputs/sets.ini file. This file has format : - ``` python + ```python [chap] + = areaA + = areaB @@ -142,35 +143,27 @@ def __init__(self, special_keys: Optional[List[str]] = None) -> None: self.special_keys = special_keys or [] super().__init__() - @staticmethod - def fetch_cleaned_lines(path: Path) -> List[str]: - return [l for l in path.read_text().split("\n") if l.strip() != ""] - def read(self, path: Path) -> JSON: - data: JSON = dict() - curr_part = "" - lines = MultipleSameKeysIniReader.fetch_cleaned_lines(path) - - for l in lines: - line = l.strip() - regex = re.search("^\[(.*)\]$", line) - if regex: - curr_part = regex.group(1) - data[curr_part] = dict() - else: - elements = re.split("\s+=\s*", line) - key = elements[0] - value = None - if len(elements) == 2: - value = IniReader.parse_value(elements[1].strip()) - if key not in data[curr_part]: - if key in self.special_keys: - data[curr_part][key] = [value] + data: JSON = {} + section = "" + with path.open(encoding="utf-8") as lines: + for line in lines: + line = line.strip() + if match := re.fullmatch(r"\[(.*)]", line): + section = match[1] + data[section] = {} + elif "=" in line: + key, arg = map(str.strip, line.split("=", 1)) + value = IniReader.parse_value(arg) + group = data[section] + if key in group: + if isinstance(group[key], list): + group[key].append(value) + else: + group[key] = [group[key], value] + elif key in self.special_keys: + group[key] = [value] else: - data[curr_part][key] = value - else: - if not isinstance(data[curr_part][key], list): - data[curr_part][key] = [data[curr_part][key]] - data[curr_part][key].append(value) + group[key] = value return data diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py b/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py new file mode 100644 index 0000000000..7cdf5b2a50 --- /dev/null +++ b/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py @@ -0,0 +1,42 @@ +from pathlib import Path +from typing import cast + + +class BaseConfigError(Exception): + """Base class of the configuration errors.""" + + +class SimulationParsingError(BaseConfigError): + def __init__(self, output_path: Path, reason: str): + super().__init__(output_path, reason) + + @property + def output_path(self) -> Path: + return cast(Path, self.args[0]) + + @property + def reason(self) -> str: + return cast(str, self.args[1]) + + def __str__(self) -> str: + output_path = self.output_path + reason = self.reason + return f"Fail to parse the simulation file '{output_path}': {reason}" + + +class XpansionParsingError(BaseConfigError): + def __init__(self, xpansion_json: Path, reason: str): + super().__init__(xpansion_json, reason) + + @property + def xpansion_json(self) -> Path: + return cast(Path, self.args[0]) + + @property + def reason(self) -> str: + return cast(str, self.args[1]) + + def __str__(self) -> str: + xpansion_json = self.xpansion_json + reason = self.reason + return f"Fail to parse the Xpansion file '{xpansion_json}': {reason}" diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/files.py b/antarest/study/storage/rawstudy/model/filesystem/config/files.py index f266c27078..83c31183ee 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/files.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/files.py @@ -1,10 +1,11 @@ +import json import logging import re import tempfile +import zipfile from enum import Enum from pathlib import Path -from typing import List, Dict, Any, Tuple, Optional, cast -from zipfile import ZipFile +from typing import Any, Dict, List, Optional, Tuple, cast from antarest.core.model import JSON from antarest.core.utils.utils import extract_file_to_tmp_dir @@ -12,15 +13,19 @@ IniReader, MultipleSameKeysIniReader, ) +from antarest.study.storage.rawstudy.model.filesystem.config.exceptions import ( + SimulationParsingError, + XpansionParsingError, +) from antarest.study.storage.rawstudy.model.filesystem.config.model import ( - FileStudyTreeConfig, Area, - Simulation, - Link, + BindingConstraintDTO, + Cluster, DistrictSet, + FileStudyTreeConfig, + Link, + Simulation, transform_name_to_id, - Cluster, - BindingConstraintDTO, ) from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( DUPLICATE_KEYS, @@ -39,382 +44,374 @@ class FileTypeNotSupportedException(Exception): pass -class ConfigPathBuilder: - """ - Fetch information need by StudyConfig from filesystem data +def build( + study_path: Path, study_id: str, output_path: Optional[Path] = None +) -> "FileStudyTreeConfig": """ + Extract data from filesystem to build config study. + Args: + study_path: study_path with files inside. + study_id: uuid of the study + output_path: output_path if not in study_path/output - @staticmethod - def build( - study_path: Path, study_id: str, output_path: Optional[Path] = None - ) -> "FileStudyTreeConfig": - """ - Extract data from filesystem to build config study. - Args: - study_path: study_path with files inside. - study_id: uuid of the study - output_path: output_path if not in study_path/output - - Returns: study config fill with data - - """ - (sns, asi, enr_modelling) = ConfigPathBuilder._parse_parameters( - study_path - ) - - study_path_without_zip_extension = study_path.parent / ( - study_path.stem if study_path.suffix == ".zip" else study_path.name - ) - - return FileStudyTreeConfig( - study_path=study_path, - output_path=output_path or study_path / "output", - path=study_path_without_zip_extension, - study_id=study_id, - version=ConfigPathBuilder._parse_version(study_path), - areas=ConfigPathBuilder._parse_areas(study_path), - sets=ConfigPathBuilder._parse_sets(study_path), - outputs=ConfigPathBuilder._parse_outputs( - output_path or study_path / "output" - ), - bindings=ConfigPathBuilder._parse_bindings(study_path), - store_new_set=sns, - archive_input_series=asi, - enr_modelling=enr_modelling, - zip_path=study_path if study_path.suffix == ".zip" else None, - ) + Returns: study config fill with data - @staticmethod - def _extract_data_from_file( - root: Path, - inside_root_path: Path, - file_type: FileType, - multi_ini_keys: Optional[List[str]] = None, - ) -> Any: - tmp_dir = None - try: - if root.suffix == ".zip": - output_data_path, tmp_dir = extract_file_to_tmp_dir( - root, inside_root_path - ) - else: - output_data_path = root / inside_root_path - - if file_type == FileType.TXT: - output_data: Any = output_data_path.read_text().split("\n") - elif file_type == FileType.MULTI_INI: - output_data = MultipleSameKeysIniReader(multi_ini_keys).read( - output_data_path - ) - elif file_type == FileType.SIMPLE_INI: - output_data = IniReader().read(output_data_path) - else: - raise FileTypeNotSupportedException() - finally: - if tmp_dir: - tmp_dir.cleanup() - - return output_data - - @staticmethod - def _parse_version(path: Path) -> int: - study_info = ConfigPathBuilder._extract_data_from_file( - root=path, - inside_root_path=Path("study.antares"), - file_type=FileType.SIMPLE_INI, - ) - version: int = study_info.get("antares", {}).get("version", -1) - return version - - @staticmethod - def _parse_parameters(path: Path) -> Tuple[bool, List[str], str]: - general = ConfigPathBuilder._extract_data_from_file( - root=path, - inside_root_path=Path("settings/generaldata.ini"), - file_type=FileType.MULTI_INI, - ) + """ + (sns, asi, enr_modelling) = _parse_parameters(study_path) + + study_path_without_zip_extension = study_path.parent / ( + study_path.stem if study_path.suffix == ".zip" else study_path.name + ) + + return FileStudyTreeConfig( + study_path=study_path, + output_path=output_path or study_path / "output", + path=study_path_without_zip_extension, + study_id=study_id, + version=_parse_version(study_path), + areas=_parse_areas(study_path), + sets=_parse_sets(study_path), + outputs=_parse_outputs(output_path or study_path / "output"), + bindings=_parse_bindings(study_path), + store_new_set=sns, + archive_input_series=asi, + enr_modelling=enr_modelling, + zip_path=study_path if study_path.suffix == ".zip" else None, + ) + + +def _extract_data_from_file( + root: Path, + inside_root_path: Path, + file_type: FileType, + multi_ini_keys: Optional[List[str]] = None, +) -> Any: + tmp_dir = None + try: + if root.suffix == ".zip": + output_data_path, tmp_dir = extract_file_to_tmp_dir( + root, inside_root_path + ) + else: + output_data_path = root / inside_root_path + + if file_type == FileType.TXT: + output_data: Any = output_data_path.read_text().split("\n") + elif file_type == FileType.MULTI_INI: + output_data = MultipleSameKeysIniReader(multi_ini_keys).read( + output_data_path + ) + elif file_type == FileType.SIMPLE_INI: + output_data = IniReader().read(output_data_path) + else: + raise FileTypeNotSupportedException() + finally: + if tmp_dir: + tmp_dir.cleanup() - store_new_set: bool = general.get("output", {}).get( - "storenewset", False - ) - archive_input_series: List[str] = [ - e.strip() - for e in general.get("output", {}) - .get("archives", "") - .strip() - .split(",") - if e.strip() - ] - enr_modelling: str = general.get("other preferences", {}).get( - "renewable-generation-modelling", "aggregated" + return output_data + + +def _parse_version(path: Path) -> int: + study_info = _extract_data_from_file( + root=path, + inside_root_path=Path("study.antares"), + file_type=FileType.SIMPLE_INI, + ) + version: int = study_info.get("antares", {}).get("version", -1) + return version + + +def _parse_parameters(path: Path) -> Tuple[bool, List[str], str]: + general = _extract_data_from_file( + root=path, + inside_root_path=Path("settings/generaldata.ini"), + file_type=FileType.MULTI_INI, + ) + + store_new_set: bool = general.get("output", {}).get("storenewset", False) + archive_input_series: List[str] = [ + e.strip() + for e in general.get("output", {}) + .get("archives", "") + .strip() + .split(",") + if e.strip() + ] + enr_modelling: str = general.get("other preferences", {}).get( + "renewable-generation-modelling", "aggregated" + ) + return store_new_set, archive_input_series, enr_modelling + + +def _parse_bindings(root: Path) -> List[BindingConstraintDTO]: + bindings = _extract_data_from_file( + root=root, + inside_root_path=Path( + "input/bindingconstraints/bindingconstraints.ini" + ), + file_type=FileType.SIMPLE_INI, + ) + output_list = [] + for bind in bindings.values(): + area_set = set() + # contains a set of strings in the following format: "area.cluster" + cluster_set = set() + for key in bind: + if "%" in key: + areas = key.split("%", 1) + area_set.add(areas[0]) + area_set.add(areas[1]) + elif "." in key: + cluster_set.add(key) + area_set.add(key.split(".", 1)[0]) + + output_list.append( + BindingConstraintDTO( + id=bind["id"], areas=area_set, clusters=cluster_set + ) ) - return store_new_set, archive_input_series, enr_modelling - @staticmethod - def _parse_bindings(root: Path) -> List[BindingConstraintDTO]: - bindings = ConfigPathBuilder._extract_data_from_file( - root=root, - inside_root_path=Path( - "input/bindingconstraints/bindingconstraints.ini" + return output_list + + +def _parse_sets(root: Path) -> Dict[str, DistrictSet]: + obj = _extract_data_from_file( + root=root, + inside_root_path=Path("input/areas/sets.ini"), + file_type=FileType.MULTI_INI, + multi_ini_keys=["+", "-"], + ) + return { + transform_name_to_id(name): DistrictSet( + areas=item.get( + "-" + if item.get("apply-filter", "remove-all") == "add-all" + else "+" ), - file_type=FileType.SIMPLE_INI, + name=item.get("caption"), + inverted_set=item.get("apply-filter", "remove-all") == "add-all", + output=item.get("output", True), ) - output_list = [] - for id, bind in bindings.items(): - area_set = set() - cluster_set = ( - set() - ) # contains a list of strings in the following format: "area.cluster" - for key in bind.keys(): - if "%" in key: - areas = key.split("%") - area_set.add(areas[0]) - area_set.add(areas[1]) - elif "." in key: - cluster_set.add(key) - area_set.add(key.split(".")[0]) - - output_list.append( - BindingConstraintDTO( - id=bind["id"], areas=area_set, clusters=cluster_set - ) - ) - - return output_list - - @staticmethod - def _parse_sets(root: Path) -> Dict[str, DistrictSet]: - json = ConfigPathBuilder._extract_data_from_file( - root=root, - inside_root_path=Path("input/areas/sets.ini"), - file_type=FileType.MULTI_INI, - multi_ini_keys=["+", "-"], + for name, item in obj.items() + } + + +def _parse_areas(root: Path) -> Dict[str, Area]: + areas = _extract_data_from_file( + root=root, + inside_root_path=Path("input/areas/list.txt"), + file_type=FileType.TXT, + ) + areas = [a for a in areas if a != ""] + return {transform_name_to_id(a): parse_area(root, a) for a in areas} + + +def _parse_outputs(output_path: Path) -> Dict[str, Simulation]: + if not output_path.is_dir(): + return {} + sims = {} + # Paths are sorted to have the folders _before_ the ZIP files with the same name. + for path in sorted(output_path.iterdir()): + suffix = path.suffix.lower() + path_name = path.name + try: + if suffix == ".tmp" or path_name.startswith("~"): + continue + elif suffix == ".zip": + if path.stem not in sims: + if simulation := parse_simulation_zip(path): + sims[path.stem] = simulation + elif (path / "about-the-study/parameters.ini").exists(): + if simulation := parse_simulation( + path, canonical_name=path_name + ): + sims[path_name] = simulation + except SimulationParsingError as exc: + logger.warning(str(exc), exc_info=True) + return sims + + +def parse_simulation_zip(path: Path) -> Simulation: + with tempfile.TemporaryDirectory( + dir=path.parent, prefix=f"~{path.stem}-", suffix=".tmp" + ) as output_dir: + try: + with zipfile.ZipFile(path) as zf: + zf.extractall(output_dir) + except zipfile.BadZipFile as exc: + raise SimulationParsingError(path, f"Bad ZIP file: {exc}") from exc + simulation = parse_simulation( + Path(output_dir), canonical_name=path.stem ) - return { - transform_name_to_id(name): DistrictSet( - areas=item.get( - "-" - if item.get("apply-filter", "remove-all") == "add-all" - else "+" - ), - name=item.get("caption"), - inverted_set=item.get("apply-filter", "remove-all") - == "add-all", - output=item.get("output", True), - ) - for name, item in json.items() - } - - @staticmethod - def _parse_areas(root: Path) -> Dict[str, Area]: - areas = ConfigPathBuilder._extract_data_from_file( - root=root, - inside_root_path=Path("input/areas/list.txt"), - file_type=FileType.TXT, + simulation.archived = True + return simulation + + +def _parse_xpansion_version(path: Path) -> str: + xpansion_json = path / "expansion" / "out.json" + try: + content = xpansion_json.read_text(encoding="utf-8") + obj = json.loads(content) + return str(obj["antares_xpansion"]["version"]) + except FileNotFoundError: + return "" + except json.JSONDecodeError as exc: + raise XpansionParsingError( + xpansion_json, f"invalid JSON format: {exc}" + ) from exc + except KeyError as exc: + raise XpansionParsingError( + xpansion_json, f"key '{exc}' not found in JSON object" + ) from exc + + +_regex_eco_adq = re.compile("^([0-9]{8}-[0-9]{4})(eco|adq)-?(.*)") +match_eco_adq = _regex_eco_adq.match + + +def parse_simulation(path: Path, canonical_name: str) -> Simulation: + modes = {"eco": "economy", "adq": "adequacy"} + match = match_eco_adq(canonical_name) + if match is None: + raise SimulationParsingError( + path, + reason=f"Filename '{canonical_name}' doesn't match {_regex_eco_adq.pattern}", ) - areas = [a for a in areas if a != ""] - return { - transform_name_to_id(a): ConfigPathBuilder.parse_area(root, a) - for a in areas - } - @staticmethod - def _parse_outputs(output_path: Path) -> Dict[str, Simulation]: - if not output_path.exists(): - return {} - - files = sorted(output_path.iterdir()) - sims = { - f.stem - if f.suffix == ".zip" - else f.name: ConfigPathBuilder.parse_simulation(f) - for i, f in enumerate(files) - if (f / "about-the-study").exists() or f.suffix == ".zip" - } - return {k: v for k, v in sims.items() if v} - - @staticmethod - def parse_simulation(path: Path) -> Optional["Simulation"]: - modes = {"eco": "economy", "adq": "adequacy"} - regex: Any = re.search( - "^([0-9]{8}-[0-9]{4})(eco|adq)-?(.*)", - path.stem if path.suffix == ".zip" else path.name, - ) - try: - if path.suffix == ".zip": - zf = ZipFile(path, "r") - error = str("checkIntegrity.txt") not in zf.namelist() - xpansion = str("lp/lp_namer.log") in zf.namelist() - else: - error = not (path / "checkIntegrity.txt").exists() - xpansion = (path / "lp" / "lp_namer.log").exists() - ( - nbyears, - by_year, - synthesis, - playlist, - ) = ConfigPathBuilder._parse_outputs_parameters(path) - return Simulation( - date=regex.group(1), - mode=modes[regex.group(2)], - name=regex.group(3), - nbyears=nbyears, - by_year=by_year, - synthesis=synthesis, - error=error, - playlist=playlist, - archived=path.suffix == ".zip", - xpansion=xpansion, - ) - except Exception as e: - logger.warning( - f"Failed to parse simulation found at {path}", exc_info=e - ) + try: + xpansion = _parse_xpansion_version(path) + except XpansionParsingError as exc: + # There is something wrong with Xpansion, let's assume it is not used! + logger.warning(str(exc), exc_info=True) + xpansion = "" + + ini_path = path / "about-the-study" / "parameters.ini" + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + try: + obj: JSON = reader.read(ini_path) + except FileNotFoundError: + raise SimulationParsingError( + path, + f"Parameters file '{ini_path.relative_to(path)}' not found", + ) from None + + error = not (path / "checkIntegrity.txt").exists() + return Simulation( + date=match.group(1), + mode=modes[match.group(2)], + name=match.group(3), + nbyears=obj["general"]["nbyears"], + by_year=obj["general"]["year-by-year"], + synthesis=obj["output"]["synthesis"], + error=error, + playlist=list(get_playlist(obj) or {}), + archived=False, + xpansion=xpansion, + ) + + +def get_playlist(config: JSON) -> Optional[Dict[int, float]]: + general_config = config.get("general", {}) + nb_years = cast(int, general_config.get("nbyears")) + playlist_activated = cast(bool, general_config.get("user-playlist", False)) + if not playlist_activated: return None - - @staticmethod - def get_playlist(config: JSON) -> Optional[Dict[int, float]]: - general_config = config.get("general", {}) - nb_years = cast(int, general_config.get("nbyears")) - playlist_activated = cast( - bool, general_config.get("user-playlist", False) - ) - if not playlist_activated: - return None - playlist_config = config.get("playlist", {}) - playlist_reset = playlist_config.get("playlist_reset", True) - added = playlist_config.get("playlist_year +", []) - removed = playlist_config.get("playlist_year -", []) - weights = {} - for year_weight in playlist_config.get("playlist_year_weight", []): - year_weight_elements = year_weight.split(",") - weights[int(year_weight_elements[0])] = float( - year_weight_elements[1] - ) - if playlist_reset: - return { - year + 1: weights.get(year, 1) - for year in range(0, nb_years) - if year not in removed - } + playlist_config = config.get("playlist", {}) + playlist_reset = playlist_config.get("playlist_reset", True) + added = playlist_config.get("playlist_year +", []) + removed = playlist_config.get("playlist_year -", []) + weights = {} + for year_weight in playlist_config.get("playlist_year_weight", []): + year_weight_elements = year_weight.split(",") + weights[int(year_weight_elements[0])] = float(year_weight_elements[1]) + if playlist_reset: return { year + 1: weights.get(year, 1) - for year in added + for year in range(nb_years) if year not in removed } - - @staticmethod - def _parse_outputs_parameters( - path: Path, - ) -> Tuple[int, bool, bool, Optional[List[int]]]: - parameters_path_inside_output = "about-the-study/parameters.ini" - full_path_parameters = path / parameters_path_inside_output - tmp_dir = None - - if path.suffix == ".zip": - tmp_dir = tempfile.TemporaryDirectory() - with ZipFile(path, "r") as zip_obj: - zip_obj.extract(parameters_path_inside_output, tmp_dir.name) - full_path_parameters = ( - Path(tmp_dir.name) / parameters_path_inside_output - ) - - par: JSON = MultipleSameKeysIniReader(DUPLICATE_KEYS).read( - full_path_parameters - ) - - if tmp_dir: - tmp_dir.cleanup() - - return ( - par["general"]["nbyears"], - par["general"]["year-by-year"], - par["output"]["synthesis"], - [ - year - for year in (ConfigPathBuilder.get_playlist(par) or {}).keys() - ], + return { + year + 1: weights.get(year, 1) for year in added if year not in removed + } + + +def parse_area(root: Path, area: str) -> "Area": + area_id = transform_name_to_id(area) + return Area( + name=area, + links=_parse_links(root, area_id), + thermals=_parse_thermal(root, area_id), + renewables=_parse_renewables(root, area_id), + filters_synthesis=_parse_filters_synthesis(root, area_id), + filters_year=_parse_filters_year(root, area_id), + ) + + +def _parse_thermal(root: Path, area: str) -> List[Cluster]: + list_ini = _extract_data_from_file( + root=root, + inside_root_path=Path(f"input/thermal/clusters/{area}/list.ini"), + file_type=FileType.SIMPLE_INI, + ) + return [ + Cluster( + id=transform_name_to_id(key), + enabled=list_ini.get(key, {}).get("enabled", True), + name=list_ini.get(key, {}).get("name", key), ) + for key in list(list_ini.keys()) + ] - @staticmethod - def parse_area(root: Path, area: str) -> "Area": - area_id = transform_name_to_id(area) - return Area( - name=area, - links=ConfigPathBuilder._parse_links(root, area_id), - thermals=ConfigPathBuilder._parse_thermal(root, area_id), - renewables=ConfigPathBuilder._parse_renewables(root, area_id), - filters_synthesis=ConfigPathBuilder._parse_filters_synthesis( - root, area_id - ), - filters_year=ConfigPathBuilder._parse_filters_year(root, area_id), - ) - @staticmethod - def _parse_thermal(root: Path, area: str) -> List[Cluster]: - list_ini = ConfigPathBuilder._extract_data_from_file( +def _parse_renewables(root: Path, area: str) -> List[Cluster]: + try: + list_ini = _extract_data_from_file( root=root, - inside_root_path=Path(f"input/thermal/clusters/{area}/list.ini"), + inside_root_path=Path( + f"input/renewables/clusters/{area}/list.ini" + ), file_type=FileType.SIMPLE_INI, ) return [ Cluster( id=transform_name_to_id(key), enabled=list_ini.get(key, {}).get("enabled", True), - name=list_ini.get(key, {}).get("name", key), + name=list_ini.get(key, {}).get("name", None), ) for key in list(list_ini.keys()) ] - - @staticmethod - def _parse_renewables(root: Path, area: str) -> List[Cluster]: - try: - list_ini = ConfigPathBuilder._extract_data_from_file( - root=root, - inside_root_path=Path( - f"input/renewables/clusters/{area}/list.ini" - ), - file_type=FileType.SIMPLE_INI, - ) - return [ - Cluster( - id=transform_name_to_id(key), - enabled=list_ini.get(key, {}).get("enabled", True), - name=list_ini.get(key, {}).get("name", None), - ) - for key in list(list_ini.keys()) - ] - except: - return [] - - @staticmethod - def _parse_links(root: Path, area: str) -> Dict[str, Link]: - properties_ini = ConfigPathBuilder._extract_data_from_file( - root=root, - inside_root_path=Path(f"input/links/{area}/properties.ini"), - file_type=FileType.SIMPLE_INI, - ) - return { - link: Link.from_json(properties_ini[link]) - for link in list(properties_ini.keys()) - } - - @staticmethod - def _parse_filters_synthesis(root: Path, area: str) -> List[str]: - optimization = ConfigPathBuilder._extract_data_from_file( - root=root, - inside_root_path=Path(f"input/areas/{area}/optimization.ini"), - file_type=FileType.SIMPLE_INI, - ) - filters: str = optimization["filtering"]["filter-synthesis"] - return Link.split(filters) - - @staticmethod - def _parse_filters_year(root: Path, area: str) -> List[str]: - optimization = ConfigPathBuilder._extract_data_from_file( - root=root, - inside_root_path=Path(f"input/areas/{area}/optimization.ini"), - file_type=FileType.SIMPLE_INI, - ) - filters: str = optimization["filtering"]["filter-year-by-year"] - return Link.split(filters) + except Exception: + return [] + + +def _parse_links(root: Path, area: str) -> Dict[str, Link]: + properties_ini = _extract_data_from_file( + root=root, + inside_root_path=Path(f"input/links/{area}/properties.ini"), + file_type=FileType.SIMPLE_INI, + ) + return { + link: Link.from_json(properties_ini[link]) + for link in list(properties_ini.keys()) + } + + +def _parse_filters_synthesis(root: Path, area: str) -> List[str]: + optimization = _extract_data_from_file( + root=root, + inside_root_path=Path(f"input/areas/{area}/optimization.ini"), + file_type=FileType.SIMPLE_INI, + ) + filters: str = optimization["filtering"]["filter-synthesis"] + return Link.split(filters) + + +def _parse_filters_year(root: Path, area: str) -> List[str]: + optimization = _extract_data_from_file( + root=root, + inside_root_path=Path(f"input/areas/{area}/optimization.ini"), + file_type=FileType.SIMPLE_INI, + ) + filters: str = optimization["filtering"]["filter-year-by-year"] + return Link.split(filters) diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/model.py b/antarest/study/storage/rawstudy/model/filesystem/config/model.py index 6ff8e4ae38..ca602fca0d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/model.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/model.py @@ -91,7 +91,7 @@ class Simulation(BaseModel): error: bool playlist: Optional[List[int]] archived: bool = False - xpansion: bool = False + xpansion: str def get_file(self) -> str: modes = {"economy": "eco", "adequacy": "adq", "draft": "dft"} diff --git a/antarest/study/storage/rawstudy/model/filesystem/factory.py b/antarest/study/storage/rawstudy/model/filesystem/factory.py index 66d532f26e..0030f31cdb 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/factory.py +++ b/antarest/study/storage/rawstudy/model/filesystem/factory.py @@ -9,9 +9,7 @@ from antarest.matrixstore.uri_resolver_service import ( UriResolverService, ) -from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, -) +from antarest.study.storage.rawstudy.model.filesystem.config.files import build from antarest.study.storage.rawstudy.model.filesystem.config.model import ( FileStudyTreeConfig, FileStudyTreeConfigDTO, @@ -63,7 +61,7 @@ def create_from_fs( ).to_build_config() return FileStudy(config, FileStudyTree(self.context, config)) start_time = time.time() - config = ConfigPathBuilder.build(path, study_id, output_path) + config = build(path, study_id, output_path) duration = "{:.3f}".format(time.time() - start_time) logger.info(f"Study {study_id} config built in {duration}s") result = FileStudy(config, FileStudyTree(self.context, config)) diff --git a/antarest/study/storage/rawstudy/model/helpers.py b/antarest/study/storage/rawstudy/model/helpers.py index 72a6caef0b..d7c302493c 100644 --- a/antarest/study/storage/rawstudy/model/helpers.py +++ b/antarest/study/storage/rawstudy/model/helpers.py @@ -3,7 +3,7 @@ from antarest.core.model import JSON from antarest.core.utils.utils import assert_this from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, + get_playlist, ) from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy @@ -32,7 +32,7 @@ def get_playlist( study: FileStudy, output_id: Optional[str] = None ) -> Optional[Dict[int, float]]: config = FileStudyHelpers.get_config(study, output_id) - return ConfigPathBuilder.get_playlist(config) + return get_playlist(config) @staticmethod def set_playlist( diff --git a/antarest/study/storage/variantstudy/business/command_extractor.py b/antarest/study/storage/variantstudy/business/command_extractor.py index 33f9d8d4a1..53a41b4a42 100644 --- a/antarest/study/storage/variantstudy/business/command_extractor.py +++ b/antarest/study/storage/variantstudy/business/command_extractor.py @@ -8,13 +8,12 @@ from antarest.matrixstore.service import ISimpleMatrixService from antarest.study.storage.patch_service import PatchService from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, + get_playlist, ) from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy from antarest.study.storage.rawstudy.model.filesystem.root.filestudytree import ( FileStudyTree, ) -from antarest.study.storage.rawstudy.model.helpers import FileStudyHelpers from antarest.study.storage.variantstudy.business.matrix_constants_generator import ( GeneratorMatrixConstants, ) @@ -569,7 +568,7 @@ def generate_update_playlist( study_tree: FileStudyTree, ) -> ICommand: config = study_tree.get(["settings", "generaldata"]) - playlist = ConfigPathBuilder.get_playlist(config) + playlist = get_playlist(config) return UpdatePlaylist( items=playlist.keys() if playlist else None, weights={year for year, weight in playlist.items() if weight != 1} diff --git a/tests/storage/business/assets/__init__.py b/tests/storage/business/assets/__init__.py new file mode 100644 index 0000000000..773f16ec60 --- /dev/null +++ b/tests/storage/business/assets/__init__.py @@ -0,0 +1,3 @@ +from pathlib import Path + +ASSETS_DIR = Path(__file__).parent.resolve() diff --git a/tests/storage/business/assets/test_output_zip_not_zipped.zip b/tests/storage/business/assets/test_output_zip_not_zipped.zip new file mode 100644 index 0000000000000000000000000000000000000000..62da946957a52f7454de7b993a874256f484ee46 GIT binary patch literal 99595 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 FileStudy: os.mkdir(study_path) with ZipFile(cur_dir / "assets" / "empty_study_810.zip") as zip_output: zip_output.extractall(path=study_path) - config = ConfigPathBuilder.build(study_path, "1") + config = build(study_path, "1") return FileStudy(config, FileStudyTree(Mock(), config)) diff --git a/tests/storage/business/test_timeseries_config_manager.py b/tests/storage/business/test_timeseries_config_manager.py index 11e070cc97..692e5d8206 100644 --- a/tests/storage/business/test_timeseries_config_manager.py +++ b/tests/storage/business/test_timeseries_config_manager.py @@ -6,19 +6,13 @@ import pytest -from antarest.study.business.config_management import ConfigManager from antarest.study.business.timeseries_config_management import ( TimeSeriesConfigManager, TSFormFields, TSFormFieldsForType, SeasonCorrelation, ) -from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, -) -from antarest.study.storage.rawstudy.model.filesystem.config.model import ( - FileStudyTreeConfig, -) +from antarest.study.storage.rawstudy.model.filesystem.config.files import build from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy from antarest.study.storage.rawstudy.model.filesystem.root.filestudytree import ( FileStudyTree, @@ -42,7 +36,7 @@ def get_file_study(version: int, tmpdir: Path) -> FileStudy: cur_dir / "assets" / f"empty_study_{version}.zip" ) as zip_output: zip_output.extractall(path=study_path) - config = ConfigPathBuilder.build(study_path, "1") + config = build(study_path, "1") return FileStudy(config, FileStudyTree(Mock(), config)) diff --git a/tests/storage/business/test_xpansion_manager.py b/tests/storage/business/test_xpansion_manager.py index 0c8683dfb6..57881ed091 100644 --- a/tests/storage/business/test_xpansion_manager.py +++ b/tests/storage/business/test_xpansion_manager.py @@ -15,15 +15,12 @@ XpansionSettingsDTO, XpansionCandidateDTO, LinkNotFound, - ConstraintsNotFoundError, XpansionFileNotFoundError, XpansionResourceFileType, FileCurrentlyUsedInSettings, ) from antarest.study.model import RawStudy -from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, -) +from antarest.study.storage.rawstudy.model.filesystem.config.files import build from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy from antarest.study.storage.rawstudy.model.filesystem.folder_node import ( ChildNotFoundError, @@ -55,7 +52,7 @@ def make_empty_study(tmpdir: Path, version: int) -> FileStudy: cur_dir / "assets" / f"empty_study_{version}.zip" ) as zip_output: zip_output.extractall(path=study_path) - config = ConfigPathBuilder.build(study_path, "1") + config = build(study_path, "1") return FileStudy(config, FileStudyTree(Mock(), config)) diff --git a/tests/storage/rawstudies/test_factory.py b/tests/storage/rawstudies/test_factory.py index dccf1209e0..9fa4051c2c 100644 --- a/tests/storage/rawstudies/test_factory.py +++ b/tests/storage/rawstudies/test_factory.py @@ -2,9 +2,7 @@ from unittest.mock import Mock from antarest.core.interfaces.cache import CacheConstants -from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, -) +from antarest.study.storage.rawstudy.model.filesystem.config.files import build from antarest.study.storage.rawstudy.model.filesystem.config.model import ( FileStudyTreeConfigDTO, ) @@ -22,7 +20,7 @@ def test_renewable_subtree(): path = Path(__file__).parent / "samples/v810/sample1" context: ContextServer = Mock(specs=ContextServer) - config = ConfigPathBuilder.build(path, "") + config = build(path, "") assert config.get_renewable_names("area") == ["la_rochelle", "oleron"] tree = FileStudyTree(context, config) @@ -60,7 +58,7 @@ def test_factory_cache(): factory = StudyFactory(matrix=Mock(), resolver=Mock(), cache=cache) study_id = "study-id" cache_id = f"{CacheConstants.STUDY_FACTORY}/{study_id}" - config = ConfigPathBuilder.build(path, study_id) + config = build(path, study_id) cache.get.return_value = None study = factory.create_from_fs(path, study_id) diff --git a/tests/storage/repository/antares_io/reader/test_ini_reader.py b/tests/storage/repository/antares_io/reader/test_ini_reader.py index a14b73eb9f..c9bdfed186 100644 --- a/tests/storage/repository/antares_io/reader/test_ini_reader.py +++ b/tests/storage/repository/antares_io/reader/test_ini_reader.py @@ -1,5 +1,5 @@ +import textwrap from pathlib import Path -from typing import Callable import pytest @@ -10,49 +10,78 @@ @pytest.mark.unit_test -def test_read(tmp_path: str, clean_ini_writer: Callable) -> None: +def test_read(tmp_path: Path) -> None: path = Path(tmp_path) / "test.ini" + path.write_text( + textwrap.dedent( + """ + [part1] + key_int = 1 + key_float = 2.1 + key_str = value1 + + [part2] + key_bool = True + key_bool2 = False + """ + ) + ) - ini_content = """ - [part1] - key_int = 1 - key_float = 2.1 - key_str = value1 - - [part2] - key_bool = True - key_bool2 = False - """ - - clean_ini_writer(path, ini_content) + reader = IniReader() + actual = reader.read(path) - expected_json = { + expected = { "part1": {"key_int": 1, "key_str": "value1", "key_float": 2.1}, "part2": {"key_bool": True, "key_bool2": False}, } - reader = IniReader() - assert reader.read(path) == expected_json + assert actual == expected -def test_read_sets_init(tmp_path: str, clean_ini_writer) -> None: +def test_read_sets_init(tmp_path: Path) -> None: path = Path(tmp_path) / "test.ini" + path.write_text( + textwrap.dedent( + """ + [part1] + key_int = 1 + key_float = 2.1 + key_str = value1 - ini_content = """ - [part1] - key_int = 1 - key_float = 2.1 - key_str = value1 - - [part2] - key_bool = true - key_bool = false - """ + [part2] + key_bool = true + key_bool = false + """ + ) + ) - clean_ini_writer(path, ini_content) + reader = MultipleSameKeysIniReader() + actual = reader.read(path) - exp_data = { + expected = { "part1": {"key_int": 1, "key_str": "value1", "key_float": 2.1}, "part2": {"key_bool": [True, False]}, } - assert MultipleSameKeysIniReader().read(path) == exp_data + assert actual == expected + + +def test_read__with_special_keys(tmp_path: Path) -> None: + path = Path(tmp_path) / "test.ini" + path.write_text( + textwrap.dedent( + """ + [chap] + + = areaA + + = areaB + """ + ) + ) + + reader = MultipleSameKeysIniReader(special_keys=["+"]) + actual = reader.read(path) + + expected = { + "chap": {"+": ["areaA", "areaB"]}, + } + + assert actual == expected diff --git a/tests/storage/repository/filesystem/config/test_config_files.py b/tests/storage/repository/filesystem/config/test_config_files.py index a9c6c2a017..9ccf4c34ac 100644 --- a/tests/storage/repository/filesystem/config/test_config_files.py +++ b/tests/storage/repository/filesystem/config/test_config_files.py @@ -1,8 +1,16 @@ from pathlib import Path +from zipfile import ZipFile + +import pytest from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, + build, + _parse_outputs, + _parse_thermal, + _parse_sets, + _parse_links, ) + from antarest.study.storage.rawstudy.model.filesystem.config.model import ( FileStudyTreeConfig, Area, @@ -12,6 +20,7 @@ Cluster, BindingConstraintDTO, ) +from tests.storage.business.assets import ASSETS_DIR def build_empty_files(tmp: Path) -> Path: @@ -50,7 +59,7 @@ def test_parse_output_parmeters(tmp_path) -> None: study_id="id", output_path=study / "output", ) - assert ConfigPathBuilder.build(study, "id") == config + assert build(study, "id") == config def test_parse_bindings(tmp_path: Path) -> None: @@ -79,7 +88,7 @@ def test_parse_bindings(tmp_path: Path) -> None: output_path=study_path / "output", ) - assert ConfigPathBuilder.build(study_path, "id") == config + assert build(study_path, "id") == config def test_parse_outputs(tmp_path: Path) -> None: @@ -121,10 +130,85 @@ def test_parse_outputs(tmp_path: Path) -> None: by_year=True, error=False, playlist=[1], + xpansion="", ) }, ) - assert ConfigPathBuilder.build(study_path, "id") == config + assert build(study_path, "id") == config + + +@pytest.mark.parametrize( + "assets_name, expected", + [ + ( + "test_output_zip_not_zipped.zip", + { + "20230127-1550eco": Simulation( + name="", + date="20230127-1550", + mode="economy", + nbyears=1, + synthesis=True, + by_year=False, + error=False, + playlist=[], + archived=False, + xpansion="", + ), + "20230203-1530eco": Simulation( + name="", + date="20230203-1530", + mode="economy", + nbyears=1, + synthesis=False, + by_year=False, + error=False, + playlist=[], + archived=False, + xpansion="1.0.2", + ), + "20230203-1531eco": Simulation( + name="", + date="20230203-1531", + mode="economy", + nbyears=1, + synthesis=False, + by_year=False, + error=False, + playlist=[], + archived=True, + xpansion="", + ), + "20230203-1600eco": Simulation( + name="", + date="20230203-1600", + mode="economy", + nbyears=1, + synthesis=True, + by_year=False, + error=True, + playlist=[], + archived=False, + xpansion="", + ), + }, + ), + ], +) +def test_parse_outputs__nominal( + tmp_path: Path, assets_name: str, expected: dict +) -> None: + """ + This test decompresses a zipped study (stored in the `assets` directory) + into a temporary directory and executes the parsing of the outputs. + The result of the analysis is checked to match the expected output data. + """ + pkg_dir = ASSETS_DIR.joinpath(assets_name) + with ZipFile(pkg_dir) as zf: + zf.extractall(tmp_path) + output_path = tmp_path.joinpath("output") + actual = _parse_outputs(output_path) + assert actual == expected def test_parse_sets(tmp_path: Path) -> None: @@ -137,7 +221,7 @@ def test_parse_sets(tmp_path: Path) -> None: """ (study_path / "input/areas/sets.ini").write_text(content) - assert ConfigPathBuilder._parse_sets(study_path) == { + assert _parse_sets(study_path) == { "hello": DistrictSet(areas=["a", "b"], output=True, inverted_set=False) } @@ -170,7 +254,7 @@ def test_parse_area(tmp_path: Path) -> None: ) }, ) - assert ConfigPathBuilder.build(study_path, "id") == config + assert build(study_path, "id") == config def test_parse_thermal(tmp_path: Path) -> None: @@ -190,7 +274,7 @@ def test_parse_thermal(tmp_path: Path) -> None: """ (study_path / "input/thermal/clusters/fr/list.ini").write_text(content) - assert ConfigPathBuilder._parse_thermal(study_path, "fr") == [ + assert _parse_thermal(study_path, "fr") == [ Cluster(id="t1", name="t1", enabled=True), Cluster(id="t2", name="t2", enabled=False), Cluster(id="t3", name="t3", enabled=True), @@ -208,4 +292,4 @@ def test_parse_links(tmp_path: Path) -> None: (study_path / "input/links/fr/properties.ini").write_text(content) link = Link(filters_synthesis=["annual"], filters_year=["hourly"]) - assert ConfigPathBuilder._parse_links(study_path, "fr") == {"l1": link} + assert _parse_links(study_path, "fr") == {"l1": link} diff --git a/tests/storage/test_model.py b/tests/storage/test_model.py index ced31303b4..08f2e182ce 100644 --- a/tests/storage/test_model.py +++ b/tests/storage/test_model.py @@ -38,6 +38,7 @@ def test_file_study_tree_config_dto(): by_year=True, error=True, playlist=[0], + xpansion="", ) }, bindings=[BindingConstraintDTO(id="b1", areas=[], clusters=[])], diff --git a/tests/storage/test_service.py b/tests/storage/test_service.py index 42205819ab..8461b760ea 100644 --- a/tests/storage/test_service.py +++ b/tests/storage/test_service.py @@ -579,6 +579,7 @@ def test_download_output() -> None: by_year=True, error=False, playlist=[0], + xpansion="", ) file_config = FileStudyTreeConfig( study_path=input_study.path, diff --git a/tests/variantstudy/model/command/test_manage_district.py b/tests/variantstudy/model/command/test_manage_district.py index c0dc564f8e..7890e65b12 100644 --- a/tests/variantstudy/model/command/test_manage_district.py +++ b/tests/variantstudy/model/command/test_manage_district.py @@ -1,9 +1,5 @@ -from unittest.mock import patch - from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader -from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, -) +from antarest.study.storage.rawstudy.model.filesystem.config.files import build from antarest.study.storage.rawstudy.model.filesystem.config.model import ( transform_name_to_id, ) @@ -145,7 +141,7 @@ def test_manage_district( ) assert not output_d3.status - read_config = ConfigPathBuilder.build(empty_study.config.study_path, "") + read_config = build(empty_study.config.study_path, "") assert len(read_config.sets.keys()) == 4 remove_district3_command: ICommand = RemoveDistrict( diff --git a/tests/variantstudy/model/command/test_remove_link.py b/tests/variantstudy/model/command/test_remove_link.py index 75a27e870b..324dc4c94b 100644 --- a/tests/variantstudy/model/command/test_remove_link.py +++ b/tests/variantstudy/model/command/test_remove_link.py @@ -7,9 +7,7 @@ import pytest from checksumdir import dirhash -from antarest.study.storage.rawstudy.model.filesystem.config.files import ( - ConfigPathBuilder, -) +from antarest.study.storage.rawstudy.model.filesystem.config.files import build from antarest.study.storage.rawstudy.model.filesystem.config.model import ( transform_name_to_id, ) @@ -51,7 +49,7 @@ def make_study(tmpdir: Path, version: int) -> FileStudy: os.mkdir(study_path) with ZipFile(study_dir) as zip_output: zip_output.extractall(path=study_path) - config = ConfigPathBuilder.build(study_path, "1") + config = build(study_path, "1") return FileStudy(config, FileStudyTree(Mock(), config)) @pytest.mark.parametrize("version", [(810), (820)]) From e9fae4204d6da2a4f710bcbc0361e0380d2f9b15 Mon Sep 17 00:00:00 2001 From: MartinBelthle <102529366+MartinBelthle@users.noreply.github.com> Date: Mon, 13 Feb 2023 11:27:49 +0100 Subject: [PATCH 31/60] fix(study-upgrader): add a fail-safe rollback to the upgrade process (#1263) Co-authored-by: Laurent LAPORTE --- antarest/core/tasks/service.py | 48 ++- antarest/study/model.py | 6 +- antarest/study/service.py | 41 +- .../study/storage/study_version_upgrader.py | 386 +++++++++++------- antarest/study/web/studies_blueprint.py | 35 +- antarest/tools/cli.py | 31 +- tests/core/test_tasks.py | 52 ++- tests/integration/test_studies_upgrade.py | 134 ++++++ .../business/assets/broken_study_720.zip | Bin 0 -> 290736 bytes .../business/test_study_version_upgrader.py | 196 +++++---- tests/storage/test_service.py | 103 ++--- tests/study/storage/__init__.py | 0 .../storage/test_study_version_upgrader.py | 117 ++++++ tests/worker/test_worker.py | 2 +- 14 files changed, 793 insertions(+), 358 deletions(-) create mode 100644 tests/integration/test_studies_upgrade.py create mode 100644 tests/storage/business/assets/broken_study_720.zip create mode 100644 tests/study/storage/__init__.py create mode 100644 tests/study/storage/test_study_version_upgrader.py diff --git a/antarest/core/tasks/service.py b/antarest/core/tasks/service.py index 34041a4d98..147823af69 100644 --- a/antarest/core/tasks/service.py +++ b/antarest/core/tasks/service.py @@ -91,6 +91,7 @@ def await_task( raise NotImplementedError() +# noinspection PyUnusedLocal def noop_notifier(message: str) -> None: pass @@ -137,7 +138,8 @@ async def _await_task_end(event: Event) -> None: return _await_task_end - def _send_worker_task(logger: TaskUpdateNotifier) -> TaskResult: + # todo: Is `logger_` parameter required? (consider refactoring) + def _send_worker_task(logger_: TaskUpdateNotifier) -> TaskResult: listener_id = self.event_bus.add_listener( _create_awaiter(task_result_wrapper), [EventType.WORKER_TASK_ENDED], @@ -163,10 +165,7 @@ def _send_worker_task(logger: TaskUpdateNotifier) -> TaskResult: return _send_worker_task def check_remote_worker_for_queue(self, task_queue: str) -> bool: - for rw in self.remote_workers: - if task_queue in rw.queues: - return True - return False + return any(task_queue in rw.queues for rw in self.remote_workers) def add_worker_task( self, @@ -295,14 +294,13 @@ def status_task( ) -> TaskDTO: if not request_params.user: raise MustBeAuthenticatedError() - - task = self.repo.get(task_id) - if not task: + if task := self.repo.get(task_id): + return task.to_dto(with_logs) + else: raise HTTPException( status_code=HTTPStatus.NOT_FOUND, detail=f"Failed to retrieve task {task_id} in db", ) - return task.to_dto(with_logs) def list_tasks( self, task_filter: TaskListFilter, request_params: RequestParameters @@ -317,12 +315,12 @@ def list_db_tasks( ) -> List[TaskJob]: if not request_params.user: raise MustBeAuthenticatedError() - return self.repo.list( - task_filter, - request_params.user.impersonator - if not request_params.user.is_site_admin() - else None, + user = ( + None + if request_params.user.is_site_admin() + else request_params.user.impersonator ) + return self.repo.list(task_filter, user) def await_task( self, task_id: str, timeout_sec: Optional[int] = None @@ -402,20 +400,26 @@ def _run_task( channel=EventChannelDirectory.TASK + task_id, ) ) - except Exception as e: - logger.error(f"Exception when running task {task_id}", exc_info=e) + except Exception as exc: + err_msg = f"Task {task_id} failed: Unhandled exception {exc}" + logger.error(err_msg, exc_info=exc) with db(): self._update_task_status( - task_id, TaskStatus.FAILED, False, repr(e) + task_id, + TaskStatus.FAILED, + False, + f"{err_msg}\nSee the logs for detailed information and the error traceback.", ) + message = ( + err_msg + if custom_event_messages is None + else custom_event_messages.end + ) self.event_bus.push( Event( type=EventType.TASK_FAILED, payload=TaskEventPayload( - id=task_id, - message=custom_event_messages.end - if custom_event_messages is not None - else f"Task {task_id} failed", + id=task_id, message=message ).dict(), permissions=PermissionInfo(public_mode=PublicMode.READ), channel=EventChannelDirectory.TASK + task_id, @@ -461,5 +465,5 @@ def _update_task_status( task.result_status = result task.result = command_result if status.is_final(): - task.completion_date = datetime.datetime.utcnow() + task.completion_date = datetime.datetime.now(datetime.timezone.utc) self.repo.save(task) diff --git a/antarest/study/model.py b/antarest/study/model.py index 16d3029939..51472feea3 100644 --- a/antarest/study/model.py +++ b/antarest/study/model.py @@ -226,7 +226,7 @@ class PatchCluster(BaseModel): class Config: @classmethod def alias_generator(cls, string: str) -> str: - return "-".join(word for word in string.split("_")) + return "-".join(string.split("_")) class PatchOutputs(BaseModel): @@ -369,13 +369,13 @@ class MatrixIndex(BaseModel): class TimeSerie(BaseModel): name: str unit: str - data: List[Optional[float]] = list() + data: List[Optional[float]] = [] class TimeSeriesData(BaseModel): type: StudyDownloadType name: str - data: Dict[str, List[TimeSerie]] = dict() + data: Dict[str, List[TimeSerie]] = {} class MatrixAggregationResultDTO(BaseModel): diff --git a/antarest/study/service.py b/antarest/study/service.py index 686420496a..e05e037584 100644 --- a/antarest/study/service.py +++ b/antarest/study/service.py @@ -22,6 +22,7 @@ StudyTypeUnsupported, TaskAlreadyRunning, UnsupportedOperationOnArchivedStudy, + UnsupportedStudyVersion, ) from antarest.core.filetransfer.model import FileDownloadTaskDTO from antarest.core.filetransfer.service import FileTransferManager @@ -140,7 +141,10 @@ StudyDownloader, get_output_variables_information, ) -from antarest.study.storage.study_version_upgrader import upgrade_study +from antarest.study.storage.study_version_upgrader import ( + find_next_version, + upgrade_study, +) from antarest.study.storage.utils import ( assert_permission, get_default_workspace_path, @@ -2443,7 +2447,7 @@ def generate_timeseries( request_params=params, ) - def _upgrade_study(self, study_id: str, target_version: int) -> TaskResult: + def _upgrade_study(self, study_id: str, target_version: str) -> TaskResult: with db(): # TODO We want to verify that a study doesn't have children and if it does do we upgrade all of them ? study_to_upgrade = self.get_study(study_id) @@ -2454,14 +2458,16 @@ def _upgrade_study(self, study_id: str, target_version: int) -> TaskResult: ).get_raw(study_to_upgrade) file_study.tree.denormalize() try: + # sourcery skip: extract-method if is_variant: self.storage_service.variant_study_service.clear_snapshot( study_to_upgrade ) else: - upgrade_study(study_to_upgrade.path, target_version) + study_path = Path(study_to_upgrade.path) + upgrade_study(study_path, target_version) remove_from_cache(self.cache_service, study_to_upgrade.id) - study_to_upgrade.version = str(target_version) + study_to_upgrade.version = target_version self.repository.save(study_to_upgrade) self.event_bus.push( Event( @@ -2474,12 +2480,10 @@ def _upgrade_study(self, study_id: str, target_version: int) -> TaskResult: ) return TaskResult( success=True, - message=f"Sucessfuly upgraded study {study_to_upgrade.name} ({study_to_upgrade.id}) to {target_version}", - ) - except Exception as e: - return TaskResult( - success=False, - message=f"Failed to upgrad study {study_to_upgrade.name} ({study_to_upgrade.id}) to {target_version} : {repr(e)}", + message=( + f"Successfully upgraded study {study_to_upgrade.name}" + f" ({study_to_upgrade.id}) to {target_version}" + ), ) finally: if is_managed(study_to_upgrade) and not is_variant: @@ -2488,16 +2492,19 @@ def _upgrade_study(self, study_id: str, target_version: int) -> TaskResult: ).get_raw(study_to_upgrade) file_study.tree.normalize() - def upgrade_study(self, study_id: str, params: RequestParameters) -> str: + def upgrade_study( + self, + study_id: str, + target_version: str, + params: RequestParameters, + ) -> str: study = self.get_study(study_id) assert_permission(params.user, study, StudyPermissionType.WRITE) self._assert_study_unarchived(study) - list_versions = list(STUDY_REFERENCE_TEMPLATES.keys()) - target_version = study.version - for k, elt in enumerate(list_versions): - if elt == study.version and k < len(list_versions) - 1: - target_version = int(list_versions[k + 1]) - break + + target_version = target_version or find_next_version(study.version) + if not target_version: + raise UnsupportedStudyVersion(study.version) task_name = f"Upgrade study {study.name} ({study.id}) to version {target_version}" study_tasks = self.task_service.list_tasks( diff --git a/antarest/study/storage/study_version_upgrader.py b/antarest/study/storage/study_version_upgrader.py index 41446e0374..ddd575a3e3 100644 --- a/antarest/study/storage/study_version_upgrader.py +++ b/antarest/study/storage/study_version_upgrader.py @@ -1,81 +1,76 @@ import glob -import json -import os -import typing -from datetime import datetime +import logging +import re +import shutil +import tempfile +import time from http import HTTPStatus from http.client import HTTPException from pathlib import Path -from typing import Optional +from typing import Any, Callable, NamedTuple, Optional import numpy import pandas # type: ignore -from antarest.core.exceptions import StudyValidationError +from antarest.core.exceptions import ( + StudyValidationError, + UnsupportedStudyVersion, +) from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( DUPLICATE_KEYS, ) +LOGGER = logging.getLogger(__name__) +OTHER_PREFERENCES = "other preferences" +GENERAL_DATA_PATH = Path("settings") / "generaldata.ini" +ADEQUACY_PATCH = "adequacy patch" +MAPPING_TRANSMISSION_CAPACITIES = { + True: "local-values", + False: "null-for-all-links", + "infinite": "infinite-for-all-links", +} + def modify_file( - study_path: str, - file_path: str, + study_path: Path, + file_path: Path, key: str, parameter_to_add: Optional[str], - value: typing.Any, + value: Any, parameter_to_delete: Optional[str], ) -> None: reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) - file = glob.glob(os.path.join(study_path, file_path))[0] - path = Path(file) - data = reader.read(path) + file = study_path / file_path + data = reader.read(file) if key in data: if parameter_to_add is not None: data[key][parameter_to_add] = value if parameter_to_delete is not None: del data[key][parameter_to_delete] - else: - if parameter_to_add is not None: - data[key] = {parameter_to_add: value} + elif parameter_to_add is not None: + data[key] = {parameter_to_add: value} writer = IniWriter(special_keys=DUPLICATE_KEYS) - writer.write(data, path) + writer.write(data, file) def find_value_in_file( - study_path: str, file_path: str, key: str, parameter_to_check: str -) -> typing.Any: + study_path: Path, file_path: Path, key: str, parameter_to_check: str +) -> Any: reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) - file = glob.glob(os.path.join(study_path, file_path))[0] - path = Path(file) - data = reader.read(path) + file = study_path / file_path + data = reader.read(file) return data[key][parameter_to_check] -sep = os.sep -other_preferencies = "other preferences" -general_data_path = f"settings{sep}generaldata.ini" -adequacy_patch = "adequacy patch" -mapping_transmission_capacities = { - True: "local-values", - False: "null-for-all-links", - "infinite": "infinite-for-all-links", -} - - -def upgrade_700(study_path: str) -> None: - # It's the basecase study so we pass - pass - - -def upgrade_710(study_path: str) -> None: +def upgrade_710(study_path: Path) -> None: geographical_trimming = find_value_in_file( - study_path, general_data_path, "general", "filtering" + study_path, GENERAL_DATA_PATH, "general", "filtering" ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "optimization", "link-type", "local", @@ -83,7 +78,7 @@ def upgrade_710(study_path: str) -> None: ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "general", "geographic-trimming", geographical_trimming, @@ -91,7 +86,7 @@ def upgrade_710(study_path: str) -> None: ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "general", "thematic-trimming", False, @@ -99,34 +94,34 @@ def upgrade_710(study_path: str) -> None: ) modify_file( study_path, - general_data_path, - other_preferencies, + GENERAL_DATA_PATH, + OTHER_PREFERENCES, "hydro-pricing-mode", "fast", None, ) -def upgrade_720(study_path: str) -> None: +def upgrade_720(study_path: Path) -> None: # There is no input modification between the 7.1.0 and the 7.2.0 version pass -def upgrade_800(study_path: str) -> None: +def upgrade_800(study_path: Path) -> None: custom_ts_numbers_value = find_value_in_file( - study_path, general_data_path, "general", "custom-ts-numbers" + study_path, GENERAL_DATA_PATH, "general", "custom-ts-numbers" ) modify_file( study_path, - general_data_path, - other_preferencies, + GENERAL_DATA_PATH, + OTHER_PREFERENCES, "hydro-heuristic-policy", "accommodate rule curves", None, ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "optimization", "include-exportstructure", False, @@ -134,7 +129,7 @@ def upgrade_800(study_path: str) -> None: ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "optimization", "include-unfeasible-problem-behavior", "error-verbose", @@ -142,7 +137,7 @@ def upgrade_800(study_path: str) -> None: ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "general", "custom-scenario", custom_ts_numbers_value, @@ -150,65 +145,60 @@ def upgrade_800(study_path: str) -> None: ) -def upgrade_810(study_path: str) -> None: +def upgrade_810(study_path: Path) -> None: modify_file( study_path, - general_data_path, - other_preferencies, + GENERAL_DATA_PATH, + OTHER_PREFERENCES, "renewable-generation-modelling", "aggregated", None, ) - os.mkdir(os.path.join(study_path + f"{sep}input", "renewables")) - os.mkdir( - os.path.join(study_path + f"{sep}input{sep}renewables", "clusters") - ) - os.mkdir(os.path.join(study_path + f"{sep}input{sep}renewables", "series")) + study_path.joinpath("input", "renewables", "clusters").mkdir(parents=True) + study_path.joinpath("input", "renewables", "series").mkdir(parents=True) + # TODO Cannot update study with renewables clusters for the moment -def upgrade_820(study_path: str) -> None: - links = glob.glob(os.path.join(study_path, f"input{sep}links{sep}*")) +def upgrade_820(study_path: Path) -> None: + links = glob.glob(str(study_path / "input" / "links" / "*")) if len(links) > 0: for folder in links: - all_txt = glob.glob(os.path.join(folder, "*.txt")) + folder_path = Path(folder) + all_txt = glob.glob(str(folder_path / "*.txt")) if len(all_txt) > 0: - os.mkdir(os.path.join(folder, "capacities")) + (folder_path / "capacities").mkdir() for txt in all_txt: df = pandas.read_csv(txt, sep="\t", header=None) df_parameters = df.iloc[:, 2:8] df_direct = df.iloc[:, 0] df_indirect = df.iloc[:, 1] - reversed_txt = txt[::-1] - k = 0 - while reversed_txt[k] != sep: - k += 1 - name = reversed_txt[4:k][::-1] + name = Path(txt).stem numpy.savetxt( - folder + f"{sep}{name}_parameters.txt", + folder_path / f"{name}_parameters.txt", df_parameters.values, delimiter="\t", fmt="%.6f", ) numpy.savetxt( - folder + f"{sep}capacities{sep}{name}_direct.txt", + folder_path / "capacities" / f"{name}_direct.txt", df_direct.values, delimiter="\t", fmt="%.6f", ) numpy.savetxt( - folder + f"{sep}capacities{sep}{name}_indirect.txt", + folder_path / "capacities" / f"{name}_indirect.txt", df_indirect.values, delimiter="\t", fmt="%.6f", ) - os.remove(folder + f"{sep}{name}.txt") + (folder_path / f"{name}.txt").unlink() -def upgrade_830(study_path: str) -> None: +def upgrade_830(study_path: Path) -> None: modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "optimization", "include-split-exported-mps", False, @@ -216,49 +206,50 @@ def upgrade_830(study_path: str) -> None: ) modify_file( study_path, - general_data_path, - adequacy_patch, + GENERAL_DATA_PATH, + ADEQUACY_PATCH, "include-adq-patch", False, None, ) modify_file( study_path, - general_data_path, - adequacy_patch, + GENERAL_DATA_PATH, + ADEQUACY_PATCH, "set-to-null-ntc-between-physical-out-for-first-step", True, None, ) modify_file( study_path, - general_data_path, - adequacy_patch, + GENERAL_DATA_PATH, + ADEQUACY_PATCH, "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step", True, None, ) - areas = glob.glob(os.path.join(study_path, f"input{sep}areas{sep}*")) + areas = glob.glob(str(study_path / "input" / "areas" / "*")) if len(areas) > 0: for folder in areas: - if Path(folder).is_dir(): + folder_path = Path(folder) + if folder_path.is_dir(): writer = IniWriter() writer.write( {"adequacy-patch": {"adequacy-patch-mode": "outside"}}, - Path(folder) / "adequacy_patch.ini", + folder_path / "adequacy_patch.ini", ) -def upgrade_840(study_path: str) -> None: +def upgrade_840(study_path: Path) -> None: old_value = find_value_in_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "optimization", "transmission-capacities", ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "optimization", None, None, @@ -266,24 +257,48 @@ def upgrade_840(study_path: str) -> None: ) modify_file( study_path, - general_data_path, + GENERAL_DATA_PATH, "optimization", "transmission-capacities", - mapping_transmission_capacities[old_value], + MAPPING_TRANSMISSION_CAPACITIES[old_value], None, ) -upgrade_methods = { - 700: upgrade_700, - 710: upgrade_710, - 720: upgrade_720, - 800: upgrade_800, - 810: upgrade_810, - 820: upgrade_820, - 830: upgrade_830, - 840: upgrade_840, -} +class UpgradeMethod(NamedTuple): + """Raw study upgrade method (old version, new version, upgrade function).""" + + old: str + new: str + method: Callable[[Path], None] + + +UPGRADE_METHODS = [ + UpgradeMethod("700", "710", upgrade_710), + UpgradeMethod("710", "720", upgrade_720), + UpgradeMethod("720", "800", upgrade_800), + UpgradeMethod("800", "810", upgrade_810), + UpgradeMethod("810", "820", upgrade_820), + UpgradeMethod("820", "830", upgrade_830), + UpgradeMethod("830", "840", upgrade_840), +] + + +def find_next_version(from_version: str) -> str: + """ + Find the next study version from the given version. + + Args: + from_version: The current version as a string. + + Returns: + The next version as a string. + If no next version was found, returns an empty string. + """ + return next( + (meth.new for meth in UPGRADE_METHODS if from_version == meth.old), + "", + ) class InvalidUpgrade(HTTPException): @@ -291,68 +306,135 @@ def __init__(self, message: str) -> None: super().__init__(HTTPStatus.UNPROCESSABLE_ENTITY, message) -def upgrade_study(study_path: str, new_version: int) -> None: - old_version = get_current_version(study_path) - check_upgrade_is_possible(old_version, new_version) - return do_upgrade(study_path, old_version, new_version) +def upgrade_study(study_path: Path, target_version: str) -> None: + tmp_dir = Path( + tempfile.mkdtemp( + suffix=".upgrade.tmp", prefix="~", dir=study_path.parent + ) + ) + shutil.copytree(study_path, tmp_dir, dirs_exist_ok=True) + try: + src_version = get_current_version(tmp_dir) + can_upgrade_version(src_version, target_version) + do_upgrade(tmp_dir, src_version, target_version) + except (StudyValidationError, InvalidUpgrade) as e: + shutil.rmtree(tmp_dir) + LOGGER.warning(str(e)) + raise + except UnsupportedStudyVersion as e: + shutil.rmtree(tmp_dir) + LOGGER.warning(str(e.detail)) + raise + except Exception as e: + shutil.rmtree(tmp_dir) + LOGGER.error(f"Unhandled exception : {e}", exc_info=True) + raise + else: + backup_dir = Path( + tempfile.mkdtemp( + suffix=".backup.tmp", prefix="~", dir=study_path.parent + ) + ) + backup_dir.rmdir() + study_path.rename(backup_dir) + tmp_dir.rename(study_path) + shutil.rmtree(backup_dir, ignore_errors=True) + + +def get_current_version(study_path: Path) -> str: + """ + Get the current version of a study. + Args: + study_path: Path to the study. -def get_current_version(study_path: str) -> int: - file = glob.glob(os.path.join(study_path, "study.antares")) - if len(file) != 1: - raise StudyValidationError("The path of your study is not valid") - f = open(file[0]) - for line in f: - if "version" in line: - return int(line[10:]) + Returns: + The current version of the study. + + Raises: + StudyValidationError: If the version number is not found in the + `study.antares` file or does not match the expected format. + """ + + antares_path = study_path / "study.antares" + pattern = r"version\s*=\s*([\w.-]+)\s*" + with antares_path.open(encoding="utf-8") as lines: + for line in lines: + if match := re.fullmatch(pattern, line): + return match[1].rstrip() raise StudyValidationError( - "Your study.antares file is not in the good format" + f"File parsing error: the version number is not found in '{antares_path}'" + f" or does not match the expected '{pattern}' format." ) -def check_upgrade_is_possible(old_version: int, new_version: int) -> None: - if new_version not in upgrade_methods.keys(): - raise InvalidUpgrade(f"The version {new_version} is not supported") - if old_version < 700 or new_version < 700: +def can_upgrade_version(from_version: str, to_version: str) -> None: + """ + Checks if upgrading from one version to another is possible. + + Args: + from_version: The current version of the study. + to_version: The target version of the study. + + Raises: + InvalidUpgrade: If the upgrade is not possible. + """ + if from_version == to_version: + raise InvalidUpgrade( + f"Your study is already in version '{to_version}'" + ) + + sources = [u.old for u in UPGRADE_METHODS] + if from_version not in sources: raise InvalidUpgrade( - "Sorry the first version we deal with is the 7.0.0" + f"Version '{from_version}' unknown: possible versions are {', '.join(sources)}" ) - elif old_version > new_version: - raise InvalidUpgrade("Cannot downgrade your study version") - elif old_version == new_version: + + targets = [u.new for u in UPGRADE_METHODS] + if to_version not in targets: raise InvalidUpgrade( - "The version you asked for is the one you currently have" + f"Version '{to_version}' unknown: possible versions are {', '.join(targets)}" ) + curr_version = from_version + for src, dst in zip(sources, targets): + if curr_version == src: + curr_version = dst + if curr_version == to_version: + return + + # This code must be unreachable! + raise InvalidUpgrade( + f"Impossible to upgrade from version '{from_version}'" + f" to version '{to_version}':" + f" missing value in `UPGRADE_METHODS`." + ) + + +def update_study_antares_file(target_version: str, study_path: Path) -> None: + file = study_path / "study.antares" + content = file.read_text(encoding="utf-8") + content = re.sub( + r"^version\s*=.*$", + f"version = {target_version}", + content, + flags=re.MULTILINE, + ) + content = re.sub( + r"^lastsave\s*=.*$", + f"lastsave = {int(time.time())}", + content, + flags=re.MULTILINE, + ) + file.write_text(content, encoding="utf-8") + -def update_study_antares_file(new_version: int, study_path: str) -> None: - epoch_time = datetime(1970, 1, 1) - delta = int((datetime.now() - epoch_time).total_seconds()) - file = glob.glob(os.path.join(study_path, "study.antares"))[0] - with open(file, "r") as f: - lines = f.readlines() - lines[1] = f"version = {new_version}\n" - lines[4] = f"lastsave = {delta}\n" - with open(file, "w") as f: - for item in lines: - f.write(item) - f.close() - - -def do_upgrade(study_path: str, old_version: int, new_version: int) -> None: - update_study_antares_file(new_version, study_path) - possibilities = list(upgrade_methods.keys()) - start = 0 - end = len(possibilities) - 1 - while possibilities[start] != old_version: - start += 1 - while possibilities[end] != new_version: - end -= 1 - return recursive_changes(possibilities[start + 1 : end + 1], study_path) - - -def recursive_changes(update_list: typing.List[int], study_path: str) -> None: - if len(update_list) > 0: - elt = update_list[0] - upgrade_methods[elt](study_path) - recursive_changes(update_list[1:], study_path) +def do_upgrade( + study_path: Path, src_version: str, target_version: str +) -> None: + update_study_antares_file(target_version, study_path) + curr_version = src_version + for old, new, method in UPGRADE_METHODS: + if curr_version == old and curr_version != target_version: + method(study_path) + curr_version = new diff --git a/antarest/study/web/studies_blueprint.py b/antarest/study/web/studies_blueprint.py index ee64eab7a5..d1fad04d04 100644 --- a/antarest/study/web/studies_blueprint.py +++ b/antarest/study/web/studies_blueprint.py @@ -139,17 +139,36 @@ def import_study( "/studies/{uuid}/upgrade", status_code=HTTPStatus.OK, tags=[APITag.study_management], - summary="Upgrade study to a new version", + summary="Upgrade study to the target version (or next version if not specified)", ) def upgrade_study( - uuid: str, current_user: JWTUser = Depends(auth.get_current_user) - ) -> Any: - logger.info( - f"Upgrade study {uuid} to a new version", - extra={"user": current_user.id}, - ) + uuid: str, + target_version: str = "", + current_user: JWTUser = Depends(auth.get_current_user), + ) -> str: + """ + This entry point allows you to upgrade a study to the target version + or the next version if the target version is not specified. + + This method starts an upgrade task in the task manager. + + Args: + uuid: UUID of the study to upgrade. + target_version: target study version, or "" to upgrade to the next version. + current_user: Current authenticated user. + + Returns: + Upgrade task ID. + """ + msg = ( + f"Upgrade study {uuid} to the version {target_version}" + if target_version + else f"Upgrade study {uuid} to the next version" + ) + logger.info(msg, extra={"user": current_user.id}) params = RequestParameters(user=current_user) - return study_service.upgrade_study(uuid, params) + # returns the task ID + return study_service.upgrade_study(uuid, target_version, params) @bp.post( "/studies/{uuid}/copy", diff --git a/antarest/tools/cli.py b/antarest/tools/cli.py index cc36fd9367..9a5d1e96ef 100644 --- a/antarest/tools/cli.py +++ b/antarest/tools/cli.py @@ -145,21 +145,26 @@ def generate_script_diff( @commands.command() -@click.option( - "-study_path", - required=True, - type=click.Path(), - help="The path of the study you want to update", +@click.argument( + "study-path", + nargs=1, + type=click.Path(exists=True, dir_okay=True, readable=True, writable=True), ) -@click.option( - "-target_version", - required=True, - type=int, - help="The version you want your study to be at (example : 6.0.0 -> you should type 600)", +@click.argument( + "target-version", + nargs=1, + type=click.STRING, ) -def update_study(study_path: str, target_version: int) -> None: - """Upgrades study's version""" - study_version_upgrader.upgrade_study(study_path, target_version) +def update_study(study_path: Path, target_version: str) -> None: + """Upgrades study version + + STUDY_PATH is the path of the study you want to update + + TARGET_VERSION is the version you want your study to be at (example 8.4.0 or 840) + """ + study_version_upgrader.upgrade_study( + Path(study_path), target_version.replace(".", "") + ) if __name__ == "__main__": diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index 31ef310a1c..5632f8c75f 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -1,6 +1,6 @@ import datetime -from pathlib import Path import time +from pathlib import Path from typing import Callable, List from unittest.mock import ANY, Mock, call @@ -32,8 +32,10 @@ def test_service() -> None: + # sourcery skip: aware-datetime-for-utc engine = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(engine) + # noinspection PyTypeChecker DBSessionMiddleware( Mock(), custom_engine=engine, @@ -41,7 +43,7 @@ def test_service() -> None: ) repo_mock = Mock(spec=TaskJobRepository) - creation_date = datetime.datetime.utcnow() + creation_date = datetime.datetime.now(datetime.timezone.utc) task = TaskJob(id="a", name="b", status=2, creation_date=creation_date) repo_mock.list.return_value = [task] repo_mock.get_or_raise.return_value = task @@ -68,8 +70,8 @@ def test_service() -> None: assert tasks[0].status == TaskStatus.FAILED assert tasks[0].creation_date_utc == str(creation_date) - start = datetime.datetime.utcnow() - end = datetime.datetime.utcnow() + datetime.timedelta(seconds=1) + start = datetime.datetime.now(datetime.timezone.utc) + end = start + datetime.timedelta(seconds=1) repo_mock.reset_mock() repo_mock.get.return_value = TaskJob( id="a", @@ -93,6 +95,7 @@ def test_service() -> None: status=TaskStatus.COMPLETED, ) + # noinspection PyUnusedLocal def action_fail(update_msg: Callable[[str], None]) -> TaskResult: raise NotImplementedError() @@ -125,40 +128,41 @@ def action_ok(update_msg: Callable[[str], None]) -> TaskResult: [ call( TaskJob( - name="failed action", + id=None, + logs=[], owner_id=1, + creation_date=None, + completion_date=None, + name="failed action", + status=None, + result_msg=None, + result_status=None, ) ), - # this is not called with that because the object is mutated, and mock seems to suck.. - # TaskJob( - # id="a", - # name="failed action", - # owner_id=1, - # status=TaskStatus.RUNNING.value, - # creation_date=now, - # ), call( TaskJob( id="a", + logs=[], + owner_id=1, + creation_date=now, completion_date=ANY, name="failed action", - owner_id=1, - status=TaskStatus.FAILED.value, + status=4, + result_msg=ANY, # "Task a failed: Unhandled exception [...]" result_status=False, - result_msg="NotImplementedError()", - creation_date=now, ) ), call( TaskJob( id="a", + logs=[], + owner_id=1, + creation_date=now, completion_date=ANY, name="failed action", - owner_id=1, - status=TaskStatus.FAILED.value, + status=4, + result_msg=ANY, # "Task a failed: Unhandled exception [...]" result_status=False, - result_msg="NotImplementedError()", - creation_date=now, ) ), ] @@ -349,8 +353,10 @@ def test_worker_tasks(tmp_path: Path): def test_repository(): + # sourcery skip: aware-datetime-for-utc engine = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(engine) + # noinspection PyTypeChecker DBSessionMiddleware( Mock(), custom_engine=engine, @@ -358,6 +364,7 @@ def test_repository(): ) with db(): + # sourcery skip: extract-method task_repository = TaskJobRepository() new_task = TaskJob(name="foo", owner_id=0, type=TaskType.COPY) @@ -451,8 +458,10 @@ def test_repository(): def test_cancel(): + # sourcery skip: aware-datetime-for-utc engine = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(engine) + # noinspection PyTypeChecker DBSessionMiddleware( Mock(), custom_engine=engine, @@ -471,6 +480,7 @@ def test_cancel(): service.cancel_task( "b", RequestParameters(user=DEFAULT_ADMIN_USER), dispatch=True ) + # noinspection PyUnresolvedReferences service.event_bus.push.assert_called_with( Event( type=EventType.TASK_CANCEL_REQUEST, diff --git a/tests/integration/test_studies_upgrade.py b/tests/integration/test_studies_upgrade.py new file mode 100644 index 0000000000..644efbc6e2 --- /dev/null +++ b/tests/integration/test_studies_upgrade.py @@ -0,0 +1,134 @@ +import time + +import pytest +from antarest.core.tasks.model import TaskDTO, TaskStatus +from fastapi import FastAPI +from starlette.testclient import TestClient + + +def wait_task_completion( + client: TestClient, + access_token: str, + task_id: str, + *, + timeout: float = 10, +) -> TaskDTO: + end_time = time.time() + timeout + while time.time() < end_time: + time.sleep(0.1) + res = client.get( + f"/v1/tasks/{task_id}", + headers={"Authorization": f"Bearer {access_token}"}, + json={"wait_for_completion": True}, + ) + assert res.status_code == 200 + task = TaskDTO(**res.json()) + if task.status not in {TaskStatus.PENDING, TaskStatus.RUNNING}: + return task + raise TimeoutError(f"{timeout} seconds") + + +class TestStudyUpgrade: + @pytest.fixture(name="client") + def fixture_client(self, app: FastAPI) -> TestClient: + """Get the webservice client used for unit testing""" + return TestClient(app, raise_server_exceptions=False) + + @pytest.fixture(name="admin_access_token") + def fixture_admin_access_token(self, client: TestClient) -> str: + """Get the admin user access token used for authentication""" + res = client.post( + "/v1/login", + json={"username": "admin", "password": "admin"}, + ) + assert res.status_code == 200 + credentials = res.json() + return credentials["access_token"] + + @pytest.fixture(name="user_access_token") + def fixture_user_access_token( + self, + client: TestClient, + admin_access_token: str, + ) -> str: + """Get a classic user access token used for authentication""" + res = client.post( + "/v1/users", + headers={"Authorization": f"Bearer {admin_access_token}"}, + json={"name": "George", "password": "mypass"}, + ) + assert res.status_code == 200 + res = client.post( + "/v1/login", + json={"username": "George", "password": "mypass"}, + ) + assert res.status_code == 200 + credentials = res.json() + return credentials["access_token"] + + @pytest.fixture(name="study_id") + def fixture_study_id( + self, + client: TestClient, + user_access_token: str, + ) -> str: + """Get the ID of the study to upgrade""" + res = client.get( + "/v1/studies", + headers={"Authorization": f"Bearer {user_access_token}"}, + ) + assert res.status_code == 200 + study_ids = res.json() + return next(iter(study_ids)) + + def test_upgrade_study__next_version( + self, client: TestClient, user_access_token: str, study_id: str + ): + res = client.put( + f"/v1/studies/{study_id}/upgrade", + headers={"Authorization": f"Bearer {user_access_token}"}, + ) + assert res.status_code == 200 + task_id = res.json() + assert task_id + task = wait_task_completion(client, user_access_token, task_id) + assert task.status == TaskStatus.COMPLETED + assert ( + "710" in task.result.message + ), f"Version not in {task.result.message=}" + + def test_upgrade_study__target_version( + self, client: TestClient, user_access_token: str, study_id: str + ): + target_version = "720" + res = client.put( + f"/v1/studies/{study_id}/upgrade", + headers={"Authorization": f"Bearer {user_access_token}"}, + params={"target_version": target_version}, + ) + assert res.status_code == 200 + task_id = res.json() + assert task_id + task = wait_task_completion(client, user_access_token, task_id) + assert task.status == TaskStatus.COMPLETED + assert ( + target_version in task.result.message + ), f"Version not in {task.result.message=}" + + def test_upgrade_study__bad_target_version( + self, client: TestClient, user_access_token: str, study_id: str + ): + target_version = "999" + res = client.put( + f"/v1/studies/{study_id}/upgrade", + headers={"Authorization": f"Bearer {user_access_token}"}, + params={"target_version": target_version}, + ) + assert res.status_code == 200 + task_id = res.json() + assert task_id + task = wait_task_completion(client, user_access_token, task_id) + assert task.status == TaskStatus.FAILED + assert ( + target_version in task.result.message + ), f"Version not in {task.result.message=}" diff --git a/tests/storage/business/assets/broken_study_720.zip b/tests/storage/business/assets/broken_study_720.zip new file mode 100644 index 0000000000000000000000000000000000000000..f65c226e205805fac540551f095ca3c8776b3dad GIT binary patch literal 290736 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

Hw%ER$oYET5U@xd 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%0Duk^zQq`)V` zDD+iq@}lX}V)bHc@iziCp+V-Qh<%JLl5=++((%&R{EP)y7Jr(Enmr=XGdPk_6ONZO ze`->&+c+5s2L&OE%nlXZcKon676flUTHG_H)eyWaUJ}VZUbd5EJ~RZ!7KL{vIr#iL z1xfhj`6w^|PIF6lQRN15BGD&-j+jla*$so*p^`0|>)9R_bj?GSx`l zc?tN7tYzU_st93#uXz5FY%F=l^Fkf36*Dp{<^p9bJlRGpt%|N4%)A_PzbrUWM>v4zk4{U(M*X*Yy0cmfv`XboSHB9B3?q#6aX z&4A-*pa9b13}SQL$Qh^qEk?3|y7*RaC%kZ0@Y0|I@wK36Lps5=C{QMs#)k68&e_U$6sufTr2s+37Ul~*H*O-%R+<^twnh0TZl^pE(4)uqtD+P1KF&X* zTkgFnSRfpaUQh4;GZy8fQ~gVn{z3>Gt;qjF|LIj|GjVPoE;?%TTX)rJ$w`wH6>UDro(wKMHq zRoD{kFljoo>f_k(|8bHQag`E)H+P*B4i^i(vD7|H0h&78*QyNXk)w;T&7C0@4LDz64)Esc+jQ6? zisD(|_8|H-y{LA#5MmH>j)#NP7Am~6c!mD((_7$Ul`w|>43V9# z1PzL&20u$>^^R;j8AG<7=%pd*QX4+gYx^u`2IAo&)BZYh7`Hx=S~JcsV}RH%_*W1m z#`XFDtYeIVzzxM`Q!qV8Xow>Z4<_?VB?VbTMoYqXj8|RZSrehrY^5#;Yk0HTR zzKua8E5h6A$+p7zPsDM*Yl|F_XuV6)<-O%vLGV0(O0{BKXRm-8qgLjSX-1F0Gozm| znQ5v6wjulGiyU`+IWnxOe1Jl}_FNyXL%LDgb&uM+!uo`=r}kbtora>ILl8)DH6CA& zdN>&g^CwtA+=a$Hw+(^?L`cH2e2wlbusuIgU_tePMH6GyJOM}7V;tbakX9wdfMd0qOnHN+D|pB|^VjOoGFJ?)R_Fp?Hf>&fHUm38?ngeb@g#{UK*9>@E( z94MK`Fp#m&M?|0k| z_Vl?TAY6nq4%4D^4qt#Lpw9rp{|(eQ zSjIL4f8!N-Lij;oI#P>?4JiA_{K0G`w&T4>5_RM_LD)YE!f8K|a~0wC($W};5t7sj z?{$-ve3^-O-dX$NuQ|HoDUmI0lzN7?z-^!?7r0`L9K2>eMzw(KG8`?80g*3bD4+C- zrHTQ5rszxFKlmc}oQYI&LfC8wJCGi6Rp=x(*cal;G}ADaUX?qx!*@tI`V70jvWiL* z$PYpYQ5Fhjz9Az>@P1$TRt0iPL>~8Luy8Ucl6XIsvw!jX3r*~!-_{Tt5o#{d0+*w%GACd>zQBwHCF{@OMmO^OH@{uY^ z5&7r%@wr;SInd9db};kt<6-eJUhFz)&{3A9(o+H{3N0N}E{5>K14(l^XyiM-5qPo8 zgq;Odh&L&LElHy3A?^d}or;pq7OEPq$ls7OooDh1FqdSt6@qb~h#!CwRx~vovCcjo z*zO=FN)K0k#M7n=DOTJM`du&^%DSO$P$0~Np0xsy`0zvsr`nEclC6^OVZny!he7;- zJ-`VhI!BU|u5v-}-fR+yD}?&XpeIK(Kf)i}a{}wtV1wipF*1khErX5tg(z+%)*q6F zI9w#H{SG6cY|! zTs#D7$|R8R2YS6P@9y}#q5j3{t? z1Ks7E1#v1T3^^)~ux0s04nhWNUPM+H-_d4{w6?Jj*Rc&Ik(jUmNm|f=y-ax){|L8% zDR$iwEc8FLv$n|S5;dbE(6WRUKi}^S!C6F+EymMHBip8IK**QIgJAnk?@1*9_O=_0 z=(Reh2gf4k9h1-^^($bAs_o9p7$jl5C|$G;EQqv^fpsH5*2G_nDP@N?a4u@GUrlfGI9gU9TlA6U8h_HWYakQMTy$#l}Q1*a*V^kxkMirMnS{)nbrmWLa+!uKK8uC;D$9wznk$o$Uh2&XZJpGL{i`8<-&O z4=c1R-oy$J1XaLDssC9<+te%(Mvs+OWj_fShDvNC>3z&0WCWq&DL8Gpu;%Z8*?O3^~1-zNh`DfCN@Bos5!M z#9nYBt^x1*yH=fiCs!>{^-2)qotq6hMHsr0_i)D?*w+BcS&4=_glpX8an{h{#J&x$ zN5=88YA;AMLs}xq&fi#&7UTd@K&`)o7uoMdsS0M}UD6VB85}#H^j+ry_=FOdNjyS31H2^6 z1=K>zV-QXaN%joviL?$p9SGf!x6f4pTKMRimV6;(XHTFM;6Tjs-MkscIrFTzPCz5Q zR;TQ6;6;ypI7{l3C^Rc=wAw9MQEf3!0of3!3Cl$%2?dGUj@<#53xB=~g0h)B!SeAF zor66DHhwc}1u{?)^;pixL+}r8y0an3w1F5o9}X9G8mlb>K$t4U2TzYMldFH{c%N%~ zMeIm6CyY-5Q9MWt%c(K=0&2zVVg@jR14!x#b3yWr3^I`2d5e@xpeT+VlS#CLSB8t& zy7*Fb&OL39F#%Z;rv%}BgF3Bp3`ZSXNr>vso63yPzJO9iG7mGAkM-ew?@n>Yp*tmd z(-}x;02yKRg#UQ*@n)tTB9i*PxGB!R*{yM~O6U_ig4KWh(qsIx#lb{j!cg69t zL%HGZBg_QS2IPpqomY;Sh(N+0PsX80r;MA>-|x%vF$72EB}BtCmMtJxpZ)Bw+0ODa+8Gp#TsLLSg}HV_6u!ESp36Ga!`1lpicr z(geiG6E$BXf<0}}F#x~I3xxFc8T#!~Q}G&JJx2>= z1stIKD*R-pT(y}5%Bw8F@Dn_!n+&!TT>ve|MZizRhcH0kzo=X)^dhm3k5PaC9{{Gu z!m?jtm@5@zpZc{$O>I)8Q|*gv=dDn=!%QJ({w-cE5eN)KA`D34xLJgekMHOHM-G1* z1Kx8VAtCUDB7xr@DEYO`)kO5wmc1fo+KClhCka7ymImHW01fd4># zoL5Iudt7o0_-IWHvFdBL44{QAUOqvi3ooqsWrwx&6z(=X7Q7e`mqM=Aq-%hX3oQZ( z=!LO1_vIdt{FGn6TGwH+)zH5~-Y@;lf#j_WB7L=rE;ws^dvY|+itQr7br4O2-j#JV zwZ9Z2@iN1%9eSSH;0xH0Nvv>a6T~!pVO)%KH)odjNN{II`GwHG{-rQ?Eek=FdV!2R z)&~#bKHl4TBTHEiq6wVJk1(Lw3>r#l}Vv`@(myvLvK-M6ZN z&Hx{<3#ilf(j_@U;Tl==bJ=9Yf@SirZ8Mz|S*iL*)l>p@7`vq!XDEg7g6tYx3u` z3K*WqGS1qNG<(4483Xa)%~JjWGLMto9&}9jxUaE?dU=m^qITQO3nr%L75~Nq+R2-Q z1T<$-xIpz8i7|xZkZc730^Y;90feMXQ3X&VWdg&Pvf^AgSye5CxoL-2YMmVhv&0u7 zvmEBAaea?Z!qBz-$s&>ixcRPhETFX|q6fGC+XIrCcWDQX?|dKo`XC*{5JgP(O0xrh z+8_;}pIDNx0?q&eaf-42KV_qEL&vhX^xRn!Apg>r?Tkg_i(m+F9+!rK5J&nFLJAfi zdLVBLZ)xSJtOsJPS!)9U3EHE8%qhvwHCB{c=_t=dzW$f29Q*`=p~w&pBj9V(?V#95 za&HT0=!8S`@&6HbFG-FA$+B(Rh0z56%=u63olapd3bbzb^+GZu=!C=FK5A-e{qA|$ zjt5)+9XofM>}$akflm-2IJ0n4&ogBUHaBFIE@j9_)b@ zmd9AOY~FD%3q(|Abav$2ZGWcfgg-u)Rmr4x3y82<1}qHXdb#g1wXgemP+1^0ru7c8 z0v)x_^;|zKP?)S7OC%-*BsyHs)+nqKqw;0@SLzr*7TERPEuq?XY>~WEac7D)6d5Q> z!6Tr~aXu}%$~wL_(vS#FRX2{W(~z9m*2|?fNY#LnCO9*4ZHypPR2j#3m7toc3`E|A8Qf{ewj7*do)%S9 zW7M>Ol5g7papggO7Do!My%qZQ_jJY*XjRz#&Kt#Z;}CKa3jk9d9~l?hQ&$MevgAq5 zZ5hPgpD3NM^z?Z$O&2tSsvq?jjOD67k+Z3=K#LjoVO5VQWMftB2F48JWKb-EPsGeh zJT<#LDPk0Ss1#>{!EedhR0S+(oM1Vn143Z%CYU=6VZ*lp)^MWEgA5{y(NVz^qmVUs zmqBHF_gD?~Ggc=yKC{erQ;MSM-M`vb*{fw=*7XtG7{ni^=X5DQk_xZDxB(1Zq>L26 zd#lk)R!Ey4NDL-u^_9Tk(Z;vMog!z}LB8%&`(AcD(0c%K->s)pgRu?clnKMxb_r>0 zO}|vhkBZ>m2v!b8?-Z8fals^@WYJZLNJsHGT_c1C;HspG#7$h896im~NG%xNjuh6! zwn+D|ru?~nZy7Ae;3#f!A7Al4oAN`asdvdH-Mrtn2IQ9B8>Q)p_NgAGam7Ty^S_-O zu^Jg{)OCUwsSkFXdP1ublD@{%-W+L6YE9a@nyA$);eb|pBGIyFHvtOifqey41t7|k zGx5cMq^|b{ac}dW_qxMa5j>PVH@JeDoJq3R7jXPmb`se($6v9@Wbq?4IZ!0vEk4Iu z6fscMd?{_jx5Z+OX!E#_ll&vVut+X0+e@5L!b7#t5M9c#y#dZNF*FbmnA`Z;R-*3f z#nQ=w--X6CO$Z?{vt%cFht$ez*^2x1zkh;?{d6j+O z%XndOY$wDJGAKH#rAmw*0*9~y5-~Y_6(@}vshm9V0V@cmD-cEkR{_lf zaE&=hVvW-|OjZ7do44i!Rm0Bx?l@>j5h&?N9?wa-ygcI49^65IbVRYqD}{QmWi2*P zj%L|K$Yc868~aax2zUHy@D7ld$5JKrVR7|ni(t^m7);u)FHyoZwF(aMYvx*A+^_v# zU;zUrx;fNkG8tDjh29BjM_*2qtfTw&v+O;k_yoSa+Icn!_v>(J!Z3cfmr(ZrN_zmJ zt>t8+RU!CNA#md6dRius7l=73o3oLp$T7cIbz#o7338$;50fp5TbyTWcs;O6&r{K> z`ch-fpCT?vUEdjcMay@ZsF1c4Ao9FA*%2UKS~CGy30T?lg=fQ77?o6YOGI6<&kKx3 zULW-gGU*P5r@BHZj4?!|aW)X}IKU)VRHKWo&remzgRVsG%0$3am|gqwfon(gGkc)| zEloFbT`Zyf<&ef(fj||~$@jXL^X#P-5kG)ZBVmW)5aPN^r5F&|B#beHT9?HUrA*}T zK&E)YT%+HQjC%ZdD3C7NM2TXN9JoT13(?T|(I#1Kb2deH35ZLHHqd=3&a#!ko;MzX z0}b}Yl_p9#7lW!NvlF&dIqGxX2ue9M+G1WXN>J7m@Nb`C7SmMkd^#w+gOzbm^t2{{ zoEZQa=`pfBj^P>zoTFr<3Q=2cZxAf8I1TZi^t4O&93k8Tgt<8hP-5=S74bgcALOza z)j-8b#Eu|Mrc5u`8MhD(7h8fPT!3^Rei2wW$7qN?U9B?$1cuNm zM+-}4K_1uuJPe9FW(2q&n2ugH5K-7~ym>lB{?@|6^?e7sH^~?~hYs2TOJ2nk8l{~_ zp%iif1&l4SFlHit#`*P$Rpg?3gXAmoLT4E$75ODF0VVcOKy)%RoR9}4WOq>M&OkV& zH%u((Y@MjO(yu5%OuPtM1r~cjFgJz4QvU#XaioKWyXP; zlv{>~4=-S)tgq)XWEhd>rpV$PR^yrLVjrD<3ewZ91{j8vVVKqPvdjN>7Cz1)nmhtTz-#AHT! zuImVHN(kq=Pnmw%RDv^M^8&d&fdFs3BHtQ@4ss(3%r^h<=*6X6TE7^$d_W5T_7YKA8Mi%@Y&P~-MXiPi<=^2++&J}4eOcENK z=JWntpX^7~ua;P+7K5v)JP1BS(sm!;1}?xJhWuq+?j$#r`YnkxAuf?V2d{PeSPm4*Dki-60@oby>9yq31~rAqq{Kw zF_-$b)qd4{+wSkWz0}90xSf&u2azz2E|yVh=U8eL?@DIg6fl!0_;gJ_5^6wft9=a? zkcVNMyU%O*?E{?pgODA?+H5J5$oustQfaa>=${1^A5@b->gk!{ShPGD?V=fzO?>Sy zJgo!;LzFn)cJ>sMR}}hOzY46u&JU%s4A%cGn)k1w`9afxe28#J*$B{GEJEJ~Cs^Z% z0}JKF4phq$7ngtbdXd%t)8F03x@bqel$eIg45rKNWqVig{A*3;(Za;hSpI%jnYe%B zfoBH-rJ`9iJ2HzW;dVzR-XcoN_PD|n2+Y}>vh4|+b(ot^jwnAzU!LJe> zU0<8JI^7npRu$id*a=b-#eV4?h{g3G*vHy|>nmEtfx{gE17`Uu5h&zTqYgN@@yYCH z0s6s9@fGaC>XddZ1FGHxZp0cibSPB^d5WvFILnfsFqGLWGIZXm{m6tfP;RkgGlGAt zy^DSSfs%_v0{OGvniEn5j!Gx2=5txqv(5|rR^fHQs&wQ03_u+XVnjh8Ev6gYUjQ0x zCSmvNlLE=6+EnnAUjP&jiaQ8s=%;^8mFOQSE`lEd#Efzu%ezZA?d`-W@J2v>&gvwV zQM|T%x=Jfg9(ZCG^sA{k`8OjAo#Mo)=)B}yS*n=zQ@}-HYBG4N2Dlu!D~74Ogwio3 zC>*RvSSRl`{_$r>4rD$qYG#s@6@j$Bxp}M8jJTZSP{}A-=yD4bYmq>aN@?Q|HLf-n ze+B7*UW7q!_`jPpP*I21P=%%zg8L=7!J6^7Af+c<^pTOUATQ@B4Nc6SN!7e`S}(v) znAIm3OF+`|AmIQjXOMyv-Dl{Y{2&@0I?eOjIv+zW6a}Mk%dj?Ic(B1m_==~(`pf>? z8ef_M-;FzMW{QvBW;e~=1b=`!KNou>sgxXi2Vn&+t1R#2ulov@xdd-17Xp^5QYA=vlQH4nxgamyb&0lZq?!A zSsKC=FeMg%3dHXgu|f@FfIZzZgt7fMr;Ffc5>QZzxffapk@aEu5!$L@;8A_z-r{tD zCfI}1T#$4_oUyOEtJEeVJlBD6=uufP{H0J=KOYv{zu|izv#|rf($K{CM=+3T=GG11 z1JTWJ{sj9O;G>M&?p(;~<8&WVlkEnAVAU2;;9C`QAiMtGncM+I0K6`%vd_2^YGb$c z&K}6b7|TMmDcnIWS|Y~z6R4LXJqaX9iy@X#xXTmxMk&%kXzCdjC~OeKk5rH$M8HTy ze3cOZiovyRhsuBiCrDiftcxpj?z8PQ6wDzLP-q0e8l;XN(N-WEhaaA&*{LXKh?_X~ zyr7Hk>u3E)FBZ81|ImJ?rUHh5n*87dOAt|fg989-i#tu1Fux0Kt>{fp_8y-_?*B8j zv31qcJdM@Q*mY9e_w{*gg>#|>*$U6V$5QJ#&((zCY>vRPf_2jWw$9xTXNP-+*UjGM z1)xwblt|~|AP}(Kd8*btdWm{YIBUBzD)=0A&ah@MR|!J$f2~EwBQVoqk)s!6mo8zH zT(p7K9dK-v@FSjYldFYJ!9#SAG<#OVK@s|Y&<)P-u(k}Zws(LDLo}r>7)0TfF*OGY7;d=ek3ZT z1d#iKKL-*0JC=Q|OCe8{9F=!V%WnasVwA9#M@XfJzvZy-GCBzPGSuPnLHILxW0_n~ z?b395MmW=GzJTZw)V;5(`c>^w@6LgGvc-UOlpF{eK;~fLk1f{FON5d55ZhRHmHk4jGV=c((x&1>_KDA3=&1gMl5SkPcI=zasRP8&YmS#z|q2 zvK?hG9O|OFLQt|Jl%N)^ie8#m2dfuAKT{!~mwXU*!fh^O#hBY(2ckHbV~&#(dI99< z!Kr;96RyrqZ`X;_=QXC0auNS|jZb%rP3CFI9H=%w$Fey&`nD+*;fIxC;Vj=;whL)< z8IkJMdN|>WE)>U^aPy#7Ri(fmbSU2r4nLPAU0H1q_FT-i(&|>u0;VU*D6LJVxI!dA zHZiFxf6MvNxlCJ+I3*XiT_)ObVhP!5-e?5+rWdZ~Zg1euZ=P+J3LwasaNr0b*Gpe0h-&1pXGV4nObyQzexUH`E-rZ!Ji$R`cCy;8 z71YG{VHBbD5Cs*i+T083Sv=e=ra%AzaJ8gaQgS+T!72^RO!eaMk^!Fo#y9{N$p8tf zhypSEOJPLy5_lHpSD{3*jwwuCIv=oeJZtyVf)EiWd@)Q~ zN#dfc&0=V&MhvaR&P!n0Zjibtn18b8EYEAL0PII1#>?R{o{#&_L2RS(9S4N{=OodX zIopFs`MxdMZh}9MYOX>F)FdjV!_VkE8f5*?@ph{QsRr=mW{r!)tHMH6rv3+z0`F#O zG%sEP4NCyuyi=0g%p%b^;ts)SxY6B1+4Cb;t(^O7JnPpIYaujUB7YqGNv%M9m|Ms_ zW{)$+_)#1Jo}S!-PNWfK6RR<+z3|TaeLX9pP7O5sNcrv;XivpT5Q3dQp_tIFz;ju&_Tz((!8UcaKv(hPv-Cwa zy=bI7>lcfLPMa`i&kAbX4rVd>{xtkkrNFrtQ6okwV$ric$F>6tO?_PWcW63)XdUE` z(}4vYAVUm{%ip(t7uL#N@0DtqFP zU{lbq(6i0~X(mhqj>T<;UbV0`|lP4 z%K-~J*MypG97B`&C^yP^$b%4+Z1tg{#MQ8n=@0|= z`5#!ckZ7|EB=!#09*7FVdZ5KkXkR(1(bcQY8^|o%+oxh!X{gBDLDz|90Sll2n8tkq zxHUEdQ6l6R8FAU7IdBp0{oXE!%8N2T=i1O9v{n_KUcf% zPeWSn8c3>jZMLEEdd95>Eq*_Zv*e<%H~C@^dH`p#hBOQTN&l?`@@e&#w2@{!5LFy^ zze|n9unN~g4*3~-_H-H_-9Nya{VUWsN)L2+z!hfBEa&A##D#(6;fXUTP~qY;kq%Y_ z&_10II2bU_!%nhH0Nq9{M!N*V`3yKlbJc+oDDc!1BV{3!^N$r{N3vLdV>QmVn20@W zR{AnTs~?^FKz)Q(YOf5Poo8JHTP!#?oU-- zIGLFa{(r^g)^sTFt3NSnCRz^eeW#h7<-*i6g_H%V)E`pF)rmpz+jm!(PA4H{=2GYv zE`TDWU@!4;0hsOp_u4Mg1j8nQ#^eIXWTtL9my<@GoAlmZ6V9y-WnJ!DMgtO~qUFjQ zU^NH^MHX~z8##z3j$lEG#=!yH`rms%cP>b>$0*Cq7^P65vV zmOl4cA_1b@fYnf2l}H(hhYhByELFYZko5@2j->Txy-2&Q!54PVB0KOUM2z5~_I zZZdWY@wWl0k`0+NH%qaB0}j`$G-1Zsc~mf18z?EESfNk?z! zACm>_(PJ)*9l;qxp==+(Zfx@WjHh^5pCgT1MKP5e=b3ym$pj`99iK!hHE zTlVGV8yY;ADvt-HWL%9^Na!>0Jizk6lPt}3^A-o}HQUNx>VoD_Wf;;hIhuH+`1~6o z@F!4oW{!%@l-b62mI&#!3=sYPJrR&l%|LBS;fIRkC zE43i-`5+cx%e-o~obwD~+`6xIFx_Veml6#6Fbaf9JBJ?^Fc(JeIVv^_15WX=pn?P| zn00!2DLod>LN3JGyjG6#RyGklonL?gK!N@I|B!vja}d;3k%e}-VmbmYg+^(r?_5!^ z!8_VHQ)~>R4bK>O9K#uy0ZDnOWr znh7VDYuZ;VULi(_et}VWs=PBQ?@#r+NvGEB{}|+e^6+w3#}Au8=B(&o7lU7=z-xC< zcAT6a{T6WH-Z}OMV69#HIKQ1;Se2MaaK~F_8;}yEc|rl|58WI{vZzo~@>b?)A%(9A zgcC5qevt@3EM-j1QoX5)dS({s#SaJPnBoc^;P*U-4QC z8ypSxWy7Z=6e)^L9!MJuDYu#~JP)Bu6(pdKkU~497x3g%1Uw8V_w42rEB@nFo+sK_ zS9J0*FqPe<_}dwzdlszVwhqIG^vD_M1cUTJu+iibRMp0SEoWE-%bbS$KW1nTEMO5O~^ zX>qu=pLsH$wL%{N(Vsx@Ii40c{)1>2>tQ=Bb>YQmmrHQZe33^2YbV; zM){W9uu}6u)tKm%;c=EEDn;MN)4r6PS`_?Hr{iam9r1Br9Dp74vrUBOY!_Z`=0RY8 z`dwx2IjZ2$tCdAP=!u*;P?78;Nc6j$rZilHgx+LA=l_dIVKCZp^?h@@U}d;5I0F!c z2WgpN08l%C1YRz=N{1MZ;Kwr8mPl4Cvg1YC4=<#`0#v`ZC{*hLEkQHlczwsWP&vko zn7y|IEKjgfV&b~MD6kc%JMy`}Xe8I2YyH$P!H4}J!h*yQv@CGi&wqr9K*$cdN)S^- zrJx<$WqMFhokVj2DnO4E=-YT+C)fia zGmkUkBAFcJ6GR~%X865dfXVMzmn%hsOw*?fG@hi5GVFSEDz1<_7xY9!KK?L%>~T}D z8?peEddeq|%lk)eJrO>E6=7oM86bs+_$<5ec#d=Rqf*L45?BF)cCIKgAkwSAYZsg? z{~NpXu$sLb`Nw=C6C zAS|x@R_lN&5;9#m>wu6ioq7SW@>0kREYCtzC=_Kj$d{0g2VS|nP2rYg;NC4DTq+5+ z^Vuz;D2Es1;6e}4CKGICY*1eyW+yH{dUm0~o>HDzMQ(XN7?X|`)NCTSGcY{R)^vbv z84+NgJ*kjUoE1UhK#M~6nrU@ps|;=91yC>oeYRXfyTR}Q>QCjT4vw6&M*qlIIH`c5 zf8&Wc>mNITsI0Tqi>`impg3tlS>Ssd7^~9s-2fRUe0(VALEV$x5e;7vyVEDouTuJW zK(mMA;EIM&gfKrvOw9iL_JO`$IGsWcfmhOR7CBo30x^+7yn{>$-@5_u|89jHAZ*Yx zfzjD&)DH3gJ{!C>K9|~MaV78A2{p^NNr_cDXfX?chZGzF!J>?T@;A{F285myA|k#o zq)2%xgJpW~B?;gVa5P*b?V?VNa0mWRU0!xQ??m$HuyW$q0s^P|5{CX;3-f2xj1zRD zMo%(zGprs2<{uydj$0r0#s0z{tG3V7EXJ*XZ=tgOqOsEwbzA*jCR6p+0v`v4Y9A=+ zb-0#%q;h&UiH`U2yNu%!|NM+!_-Si!?sHE}GY|flx-qr4+#+>HYindPN=^QeC_gdk^=%SG|BC`S<}uwEC8>>HeD=IQ8c0nk-jq^1OJ|ah(7~2u6(y+a=ri( z9XHNda$@7E2iVyJA@V#`Dr*9zgT+H_<^J}m&t=cw6EdjiOp7d4ZR+9xT(Fy|r!gDK zstwo7njsHYajqYevPrX+p)h*9NO-~pMzN>D)5Q2&v= zN~rrveOiS>5`E_nhFg45Eg;)mulVEmjV_O5Y%ne|wNZ`xzjYti?M00BFyPO^zt-h= z%_c*>*oTyx#zD#~X$M-;A?N_};i9n5u)1*gZJxct6tvGH%~f)q6!mEKxf4Cj$%g?0 zwt|sB2H!E_%OMKO(7v3mhO^)pFRq^ht_bf?>FK3NPFsl}3@m2{OnX2vo;VuH8V&3; zv;d9^%9As;W2Dg*QF%Z3UnmXyE-4G&7v~12nFI-t0Snnab(6l+a#-zwQ3#zMe2y|c z@Y$dwqBV4r*a4RZ8_f$QvH&aS(J`Ps4;z+jt_Qj!2HE#-T^aC9DV}zFQMF~m!lU2o z(xKgC#zZhj*9wpecaA)jHUjD^lorpg%Qx^D2=gH%Eqa`~Lj$iqMC!lmY4Z?N5Rl(+ z(lHB^J78;ixvyo2pTzw|%#=|WMNVbhIYx^g7E^}Oh~!r4tayFcdqfD_Z6H0cpPe7c^H(cyA9 zSF$^dd=g;TcRb9~gGLMuld(-cj}+zxWUik+c8OrsN$e&i!I59Q=r z^6shn5}y;kU_zpTL2dZ`0A~cBlrtaOfMK@d?ryiVArM%20pHZYk77vFAy+ z45_c1Mr&fJ0unV)ssQtN!)WbNh>2IA?tsEfY#tlkhk;^%JvsFq0Ed@?!6HnBT}ecH z8>>+`0;jT{kobg3V+j!>;B7vFB7&-7K*yALwW0++hS7vA3N1taREG>`;=ZygI0@KF z@iFQeX(Pz&lSB`u$Uz3CrR??@-D5}?;Pl<>!#b3;&UV-d@kcUGA-~vxJAQs~c;C5dj z;?K>6#SVM6SFDyyFB4Wj^HE@3^P}a$t_=~%6!>b_cld!>9;!ja%FqpbkN1 z&=SbM(6l3U6!T31O4|z9*SmnLGTZeZGP_FYD<4r_f(HeVWz!>6XK-prc=z$_FCf6` z`!sR^9N$-H4!HS7UIIc1uV+`L+5BUo3FvauH z!oV!rIto7#oYG47`MmrpU@%2ia7dsHUixk22>?A$pw8SOCxKQk{uL9Tu3CXE7o6O1 z{pyFuU3_A&Z#6uyiHvlhixWtk7HsTBxiI$yIaGo#nr-Q@K~WG>%*_C4q(s1Ls#{um+z+aK6&pW2)8vlx#9e;K^JZxW~@8 zeqNuE<`w3##G5(}a#HDG~p>FcvFq z1ZngGqP9tM0YoCZT%p9S7SWdzRR95FniCa4Tj85SUmiY}J`(wLv{eE;la1fqX(&My zPH5=sY!SNIH`#eXgw@8GRabZ!T66&l(y$jFR8AoFIpQd%O6=i0<jR(b zM{sQDqmcc=XdOp_r2(L`o=qQ0u~+%JeB>^%$|9%rc-T|jcO()3=~h80gsB@y*%oJ1 zAfO_}Du{g1O#t*(ngRH_cP)zr3TN;7Eb=M{1zG-!rj?z6P!h5JtxK~v2?$J$({%g{ zCx=b2ngksqXcf0J*q7y=WVt(57T;dWw9_Aj`lqK6HuUxU$TcYgI+RWYA+|>Q8ed!n zCCBpoBUqI{R#DA~8R5aAr0o2mIX_nZdCSr>(RC{G2K{}Dhm#Az#HCmd`f~jOmMVD| zhca@rK&B|bQ~PS!FUjM$y43urI!3Ltf7IE?WMCb2Knokw``G@CV7vRlva}_uivS$f zc7B(`1$XbOI5L`Rd7fnX)DX6bxnNm4XQ5p@7h~fgIpixpsHo!VARf$UUIPj}*%MbE(5*}QYc;?q|7ad+Ylc0B9*Ylh3P;BILJZa40ADKD?8b;;vN8z&whWMjrUhL5f{Xq)n z+@C?0{TUNEcsl^qwlH*(nV=yu|6PlcJyU)@7k!UK={-RzFOmpp9s%6e0HC}|P<~qv zy}|XY5*;gy)a9#yP`s|IVm0k_;G|Q;s5nLDPCJKS_r#ycJ7{SFwU~K#qVdN^9t?eW z*=}S^ZkV2)p>K=1L5mq>ECxCOHQJj1`kR^PA?PQ!7TTEw$8#3HF8(a?`JIbsXd*-$ueE+1mg^xNyKyuo&p>5soP;CxEs% z(A9wPK$!{p#NWzHBv+E=NB*%=KpMl{0S&R+0qPq5VP;Z}J3gQIGc^`$HYe4Bh_a@Q z2}_ZZW72D{eJiR;vkA5lw?gWPxfry3J1B9Tsr?J>7eRdxDiy5&jt5$f6bYXPz-6!z z9P-C0)JNgOsG%zd7uLJ_1puH5E)S7?VibZ6@<4(wkbNpw7S{+0OAl&Qw@kpZGfDe4 zTppW;8~drU;)O^yi8eq9NKBy`bWs$aARq4+R4mT0V^!%XR*Y?d%nxabg>C3m!P1@8 zQ{sh0o_xg)pn>*^qNF0-@Q8rQSa_x=s3B3z#kG@UAU0s%B%bx(cw#)d8b>uHzW*(w zMNiMqnWZakbr|2ZLMx1reZ@~e-h z_!(3^JMSsC$~Z@59K36dBQuM=J6NfAjC%#8BK73Z@)Yz4Q|{|bIyv{``vLS9&@uG7YR z$Md}v2FTU}u_w3xHxh5f&J+y=aHr*GfF%d$z0#Vw0OEKVQJBGkCo&{8jjf99sDTtm(V0pGA*je1nwo4jT%6@==3@24oE=ai*vr^iI&2&%%sYnqLG5t0ECOW!BdPAj zn@7ofabxL^`I$kGDasi?-qT3Jnr`=KqQf{tSaulJef-rO4k0KFiXaZZgw1z81b8BT zvcIA~9r!alaXg$J4*Ceamc%=taUzG*pY@!7y~IS4&RRBB3xA$;IF_zmxLsTjf)UC??kh7rnU!%;to1}K22};hSwdYmXMp5s{$+;8ufKfFy3UKi^mT+oLC8l z-1y!XE>Wx8sxu!I}O-#Z#*x7QZE%S4+;lC1`alF|5Q1Y zTra1ysKh#cMD7$a0gvg)y1j74d|q|uIv~`isf@7Cv+mtBIKPY|GjD3wP`B*mkiLNT zP!jI1Y|sVRZJXOh(xyW3FUzi;2vT-=(T`==Zagm46vE(mTa<|aAXbmi7gvVz3pohJ zN>E_g$O07*SZ0P8Y}1Mb>BSAkFoC4$O;lKHXl$K4j;K|f5n^RE08Vlyif;WIgX$+ z^xkFB&;)g|FM2<2AHa*sh0$Z3zQ~UYtTAqY_JsMv(U0uVT%OM%0eEYmunvcF*@W%G7dOV9ZTvb)R{ur`z$&S zAt<9l4^N$DW7|sq#-CBeYvur@dh1OyZny6r{zUH<(gcJOkoj7Rs21^RXl$oF+#zqk zEi`r!hjwNNtIsp_Hk3MlQVy8P;7lhG@k2I)fPpeYoFX-&we#hdln ze2W9CXEiP3@v(|O4Al$vhK+?}At1Yb1v+|GB>-*>90}S{{p4Yk0l$!yY*f1K4*1D8De#nNcOOn#M9^rlg z4pz!(P{RJLV*_J`*KeYq&qAe&yc0@OvN*K-N+q@lhu9Vy3QdVHW5r@>*PdqSz*Q-x zLwetvv}Xd4BU9llNvs+7=zL&JFV9N}h_nyny?@0Z%OoVZp`du$jhbv7lyO(@eihhc zJaK_>vlCN$pvFU^TN?sFi)4=o$2uimgQmED5hY@waQ(#5}9^ql?jK5*~o-z>tf_KRpS1N7bW$La|J^R z0Tb(dG@n-Fwf5hIAY=y|?fp`{gIX&UxO1gi()ql!ks6+5?P)?5KF7v&JN%VOxjiE(6 z#*az?;VD&J!MleBg62g9K0kFr`{1;GL>q zwD3BsVoHm5mDlC5RfFW0LF8|u|!acwzs{2LVy~|Plivo-y&}u%>E6~XUGJ|eOnCO7}Q4Bv` zTch*6p4frDvljK!jk)?OP?)muz^0dMC1h-hcapX!OJg7x=|6P+P%=w*+nHwkjAGZ+ zR#`YZqH-1PhlaXUsYjstC+F%Hq^d7I8E*P*y&JY!@gm~%acYF=lS8)~r5xV_Uj-6Hk+5-i?mqmvrK&#yx1(pb);f;uR zfDxSQ&PKs(6D&})#<#ug#$gj6f_ zF3Mf-L*boLQCm<26DCQvB&uhpyP}*|O8(S@Nf2C0hssNgUM+1XCqJ{;7FlkQWT@q_kdL^C`&rc|QQ;s%;I0Kz#DIRij^ z9p0~EF1ZQ&OcP@Xn5^IxnmQg>q?xXi&svu>v^%e3ZC!+xW#Iv85mZ-*b(&v0j;Y4T zEjp*IoIJXe>~S)WmpthnCmZJ!AwUso9hp0pjnQ#ix0hwtG!+2{^;PCD+OB{0=}WRv zI*R>4Ov{0=83O**RK6DiwoD1Uk1eEp2~xByZ4Y=^3K=a+Y~EVb`-{xU2{Gpb^Z60v zWkdj}bums?h3+49U8`IXL3Z3|p!uu~pg&iV+qr08nlTJ=RQlIG2y)=)U;Uwy$TjQA z5{Cj21YR+zou^t>!}eCy5rHgQ7TP2!PT{)a0>W; zE{rK6VVku42n3yRqS-1(gql+EQDNqm&|LeEIQx5jT8BhuS8v4WIFGr>b^vswC_+FB z7?z4uje)E838%c3pk!IDPk+WHlh2?3_81rKkSGV*Nu3NiekcCn8iW{3kY|!2-<+jD9ep)D@(Vvj z+xD5~CI8|8KoR6Dt=6%(DNkPk3raC-1Yn0f8_0t}95&G*;Ut-+@Z6p6|A9pdYS?{- z7N|B(A3IbI3bph@-Nr?JsPr17KyCpBMLRQ13IMD4dfX}@5CQg}gdGpbBIGmxuNWTa z#JL124d5aaFbD%X&oG*84TL|os>X_30Fl$IxuSXK)nEWO#kE$P0bvhFNHIo0XAUOt zXm$f~i~wmsmcL|3P7v$%yx3I2GJ?6jcWG#Pun(J<`m(SVIig$$0B~5dFmZ@hZ`Y^! zaru}wAod#IvjI(CY*QK&s=p1%qtbTJG%@V5EpWOfL0+hDa!O5PiDpm z{s^EX)Irlk?-$Bc?-yX7b19Mmx<$1NdKDpCf5!L1Quls23iwH(!GUgx;L|MG!-w=o}X+H zMy+E%F;diX!o@lOa6x;)yc35;gRS3JkV%H&$Z>EJ-V~i3rGa!D$jt^_?qe|#3VlJ^ zfF{ua;0UcIGKV)&^M#2+_3yPp4||sIgP5D*4JYhElLn>X6M*q4OLEitGa3bMYhB0V zzQPnHQCvdpLMcT+JXt7 z5I(i_Ow5QIj+?>n$`MGu%~x3$_lXD))$YIR{~tf%yO{#IEXXHF?}0FkZAh^C)z@0r zfkCTh$<{7}Hz=YzzH9J%NN(=0wa;t_(GTIo4+(J?dsQXq>(!gE&x@3&4uZwp{*@F? z0nbhd+~XB*+#GWOrrfK34!5m(x+BHc`*qaPnU&E_49xM~6R%Ot;&DO1DPw0v$7?z$ zq?7v~zb{qHwmL2p_7dvx`K$1=J5=VNSc=I27H#iPK}Eq6K$2^>P8TS-#9nZ?rtnu* zJ)MHVTQRWn-S)K$acFC~tB3|r$qj*%)Up)pd(E&1NpUz+zNPF0j4<2}?Fb0P;`|jm zZCwuKd4;U6EHXNS?Cv(kEQ|k==h@ALK+>{-Y#a!fFI29He_)Y;{t+>X-J_l`Vdaw!~z#^X-Fa~7maG^;h-AmtgG+@4Zv3`_6RMQZjQmpab3_N z$Ch?tY#}5-SX4ntt}qFjazMog42rOmq9MCX(*-Qr;)Cb%6_Aa98*xSpp5vfOyy3wy zugaK@f-n>1Q4Zt5VVas4WiDvKrKeBYMEljOCK?;gKPPOW97EQFd1p7l^zAXfU;oS- zR3PdO0TiwL=SRN{UJ&$Ucn;Y{@QMHaq|Oup=LCnR^3q#+=3vAeP;$;6c5Q*LPkS5j zJCsilIwImuaX0x~l$WvqU?pNyVEBwhtwEd+29>LGb13;>1fZ_0J7&n)`GJkPoI9nT z>=}^`DK)@8PB_=^Oz*bjgb*-S1cS8&J;!rAW{`1L9W_2i_BKWlK?0KF)W27?l9W)k z7UR?Kz{HRL#;O){d#QL7(s?o&DEPfpeix%u`I;oYuiBAQ7YXx%0bCF(`m=OJ#RU9O zc0KrT6tWB`3>0c6QC;2|5k^JWc2ng8=vaWph() z!fJDzCo8hg3X2k+AE)W*R3h-y-m9f^Sh4*pC5(2ME<1V^&-H;EC>paWk)1gwFnw>U zx+ZMXa&4d^vMHEtAiupp$f(cjhep{w?vkp{MZ0W-ddf{^`39HK*ajPtGl!6XGy>GC zj1;B%SrLct!xbfqV0&}>uj?l?WpJkVg3!#JQ7XQ}OjD4-k)P88Hmie3(xu>u6;Mpz*d* z1%L^2NJQM1&GchfAYHVbSiVjeT1^-eW|2K+kjAX=;X4kJu+MtMO0QCVc&t?=vgLaS zbh@rgc^(8y-YdY~M<@UYm;RJC8-_T~I)D>UeFFNaeq+V}!yI8D;#f>SWyX#>aLYQb zYEtm5kh$*H9R%od4heL&9#)wW_-g;gs$h_GzThYS#0CF|kf}5PhIF6}{UMu;dL6>IxWezaeB#r}zp?|ZYLSn7 zG!8T%(RbZg4*?E%Dqx6C_hx$*C<(8XLf(M6xacDz`JE>Q|GF4}xNN;6xHt34+-3r^@|AS&9=-7#u7gI~V$VN_qd*{&jJYE6DP7$hGM)K*Xd21mQdgC=%_hcTxsl5m~`^Cn0DA!7lz z_4%itwTBIRN|y{lWKoZJd2v*hqAcLk5I=a*t{%lciiNage2Kuus`ScI*_Ybh{t)3U zZanu?N>6TfT~nKStQ+>$`&Gz6C~9U1&FRMRC*9CEQon2Y_xK}YSs=YGcU=2QF|V zzvC;UOL25XDP}tog4YGO*U_VL#|MC^a$C=vQ;>;`TY9n98rZlwof~-<3;TiLbQ|Ey zan)1_`&T+WAx*&)Rl%GZ#Cf8e9zAzxrZd)PdO`qd0yip>urNUddaka&^NtprPjC({ z&Px^|4{w54OXx&F;kK52jeyB{Ioc`;3h|6cH3$w@w#4DaShB~@^#x)3J~4~Kt$QB0 z>QIYDqY}a6zh$B6;a%;<>IG9#1Wbn>(oT;?4<*L}o8*bGCs}2>&ekPfMSl#MDrV>A z!tUTJ$LJUZd5|_d;sD%{st6T;;e&a}@xgc;&j?I93dNR@&zL)l3ju?w#Ct4Q^vW>_ zKn3k+!Sj|7Z$TrWCIly~FO;qBwv*G<$t;yVCq% zjZOX|J`bl@37P1RfQnKa-F0v|fg$>`^z863gY%BP4O4XVvBGJ4B)h-`?8y#6^(|S96!7QAO*soyg%6C z`QsFlQM`ro73CYq0ud%7+vR~N+kn&pr9f`EI^%=*4yqvd2=N=1`Z-J&`IS?QBfP{k zv{XS$DmP(NkQn+bo{yhj$Ei$FL23%waBg8s^e$%28jlJR)0-&JwT+4ff|X7}Ah4(gHjj@j6lE-ZRyZ-op&q@{t$z_3M)~0Xc0Uh)US$AwO*fGrs zHx|V|u7B*S03eO(LPNWt@=TG=ITQ;v3l}c^*ly)fS2+XD6qJx-rPqLM0 zjScAU$u-S+QnEr7fyjglgQo_;1^MCWHXp7ibgtZ2@J^$Y(k$h00HZ;7;r8yjOO$8C%bNLn-2oM4S z$N>q_XdLPahJiT8PjlzMl7B?*7O50rj8W;+?lLjLzO3&ErPaxVqmQwJ`_faNE(X6% zD+RR}V5sQ=*-LPDl1RMaXRNAFIACUP0Fa3Q5g!8NH5}8ORxzp4)bBV#gPZcBld|Xp z_Je>D2Usb;)B;oq?kjpnCF8MqWfsgKhz+@hyyki71BUVEc70$0>&d{P-5<8Sd17n-IWghz@=0u zm}J5+>qOZwNZUO@{P|IYDr5s>Kew?exfqkE)DgrPl-;0nFe~*=f5p#&91df5_~Mt{ z10*C~0ZQWJmE@8Df|7N6Xe)rD;lPaZIK9UAzfGYn)uMn^pl1=Bk@)70F+iY~pl<7S zzm;dB`de=tIpNAb;Rks#W}(VL8nz^5n$)j7J2?R+ZG0Z|RU zV(*rqx7K&+&-Tk^T><^Mx9q)@CGIURx1&lsI2jfYBo~wCap3HGF3dhdnk5YH4iQK# z6qF6Qy;j_4VCew2uCc=!^Yf-!6KuheBMsQsacm!?#cKL65bByRE9jQsNHGsGTE6h1Q^_QLaiTE+gYr^yvV;-XuxM^xOnfRzlN77d&mHi3%tYrO?}eqK=79l~&~ z>*SRpH{KmALYQESexlHm^ZiH*&QzX^PLDMRIGRw3>ZokwXc;+Aj6x%3p_?M}eF2K* ztDQod^S5pgbJ6W$qeH3PqHi3h-*d@HSrme|GeF442L0p*3IZVN9CoG^YruUHVbF0f z_~(cE<=tD(2Hvqv#<@`ug+NmUn6x@8g>~GcP;cW|C^KlIIvO}3ixY7pI#6`1VO(Jw z^VmVM{i8y~$(7lImR)p2q$QqA zO5=s`v><JaZKcV|EG&44P4Ly9+qpaOcR z^XDY<1jW-Fh*rfW7yAQVKqSUU!7=U45|i9U_$0G%1(*ch_8~)Nq)Vp$Z6y(idCsRM z9Oq!%#0&R;GTX+>;uZB`rMC_8z->vZh=ffdz!%T>HZzN}C&b;iH7pMUF(ca>r$ ztN#zv06+~)*U^TsI@$w!t=Aimn`BQ94@LnMzAr&1r9?GDc(QRXZ;aKYXh(3S@cDgw zv4_l$6(b8m{kv|>VU@{NzQO@2uYllovXG6ft^!}lX{c1`QUZdYZ?Vmuk|h^RBmZ}x z-N!?_%@J+gRecrhrm#n?OujSpjS4d4D&q72o&f!X|5So*V?%bRkcoUbQW_IiTtc-A zD(kzSrmYZ*{z0`5xfg1XeUY{=BgLh~aT$7p z9TCpf=vhXe;ac=n7PUIglYVvtFbidJmCWM%!jJuoU_ykD8Ov9PTm~QS;#N2E4xHoO;}AF z?Shl{Sd}LPE1v}u8`sZ20wcjYbg?5XVu$mo;HI!IU_^i;U7q8oy$Mvbn%x#lGq!NDqHC3&rO0O_UgICpM1DDqqsM})j%64ujl&vBmvEfApIKk<78aBIF(o6I zq-`LM1Lq53@PRX-|6Z@-4}`h+LWgn(3_l?P;Ijx;#kuE@#2CaceNgbSB_UaBsSDU6N2Y$(5E{i)E1rB)c445)1ljNxc~hN(Zi z@z3k3yZ~fWks!e`^8e7WNG|Ha7_c#lq|1m?>?S<2>xXC-((ajWa5HI+>4q#20sPO9 zsn^SkqAC)H+kvw18#}38b}A`>G|Mo7m$ZDRw*8kJ1k`Gda@ANmy zk`EdgPeSqAPxSi^}~&Xo6|`ms9r5oq|`!u0OhcCyMG;DP5_BTXF_G zP``s_-eFij!tz;R24^L#N1`pMF(f`puj>2^zci;2Jl7;()oOs1EQSCG;MzOw(^f+= z90e}bfY}$8;=4MzkHW|G0Q_|Qj{@v*7eX79E|h`5dGOrR8$ML99(+Yd8oZVs@YACE zXDmwtM5cp)!_r^fN@(#v6_?2jh$}9~9Qz*NC<7t)1#TarbIdz3FDg*Hg zgciKL#gXQO+g}22ll?evF6{HSwebw5N{%G9yoXLZnc?jB2_;7U=;bu*@>!5Sg?m;x zgBdDtWBv_ieE`?Jl(Wt&;mmAe#RT`f*)QANfguYQv9R`1t#8i#w+nnxYT)%k#Hh~V zGzFNP2;G7Z*d{>w)#DQL@mC$7^X|ToJE2L$sXcuevUq}8$~!Ilw>(M?L2-&X5Q@3e z_G^=0KxS(@Z!?%a-|fqRP#JV6i_l82rk`aqn0fhFIYKbd)1g}nN_*>ofsRKZ5;uGprDe=B#9gW7i?@O!O?ePX=+yDAZe zZ8#V|(EZsUNN9zm_dK~UE=flmzb!9XiOj26%awH{h7E2LpVAV&QysH`dzUpE!ug1=Lb=z&JjKEh46q*tG_~{=VODBt z#Bd7-w+3xVemCZU$Cr@mOMdDNYt73Tv z7=hBP?$F{cG+GouOjlqQM+*gR*(rJRnOd%%ko zH@?|9sA0~(Ar-{k0n0e&l7A6Xj4sHTd(CdOxUi3j^&O3m1LokU6ysbR|tQYTq zGtigCFk?vYaPc1DZPQ?WmnWs}VnDbBV4o)RPh-VJvW#uq`x*kqz$)x#j$ zbo>`Z#I}{5fW`&!(`Zoiq&jMTJr-~t=L}(3nw9NTU(5FYC@`Xm1seRf!Up3COc=EZ zif1irJ%R}H{38P!$e++f9^=7sPdiT z`8R_=+?)3#(+(}zK_cC`kdy%){@05YXu$PmB)2R4tT6rUgHK z_%kdY_-Eg+l&{JYxQ{J-j=Uk@EDWW$kgD-=+XWu)Cgl)28B^m?-eWgWJwk?Bmq!KQ z{G)m~Uvy^_CsUPn!15|8gYdE{7oj&>CP1_U8$_VAa}HEXE!Uem&ZY`-y;y4o-?1uz zlXMUKd-e%ah#zg$F3(DN$x`k1%6ZRPHH+d`Ae&~Matm}dEDi|`t8Yi~3^Fc;PR*0B z&33|R?j7I`jY;D|>t5V2j7W=Cp5}lpo~hFzv;Jg%YXk}LDYqsK4(bb#4v6ci)`c1> zlmx-xTnSIiI|;D12RPeJ)r7zZ@+pTJ^roBAna&(DAosPhB)AfU5+oClR>^{h8bV<@ z3So;j9wRxniiSiLZ#5=?=+0Fk0^=Q>228NT3UdehSRD?#)x!c>am7QdNgtgA(7r8m zK}DC~bbJQ4AvPA-{J1 zVYUf@%XrPQm_-8rT@zUV)cFBw=PxYB`YlmM@mr={OU z^7O(pXa+%O)JD;Q?pz%oYsq|3U_HkqY$(G*62`E0*D)55V4Miptz}tUFf`{u%mV8p z%?#i}p3pH~_q8fC41muyvHme&Jt~ohvqrEm;G)24c*dY z5*vVQj?n4#SOHm;DF+`uiGiqKjvq9k}3g~OYGA=f1I)xFw6aY zc7GZt+f2rrf*@7ZaF17(^iS+?u0$M49GzqBp`}dKxujG@M;RY|8;>vhANJ|hG7{y% zICgi(D}6}MZy`u$xYEw)^*P^(!`-GPCBC$eVFFk)T=@!*;z)!(~ z!fF^iU(saH$M5s_OKF2BF#IlIS}NtDd}@l!4-X%KGhEVm6?>0{5TBg6;y9>3Ucq1#+*Bw-D(tuqZh*1J!5Y zrgZp8H`oEr(+D1wG3^lIb_l(#XAGl2i__1vAON;54{&FPG`CJZMD3PLoz#P1hAkXn zA@7yrRyB}OBC4;xufO>t6^TRwii(^ja3)Se0k}`N;$AAF{Ad>!T;R1V*e}9t9C+v< z{i^L&FfInwJZeYOFka&yeX(_B5mteJWmC92=)Le> zr`7;JI$kKscAv$(D^|rkQ6E?hJGOEzmKP&Lh(TKbjD?6_L3L;-BU4iFnEGlovgblr zAtj(1MIlce?G<3E9LgDu^aCTM`$kBWlSESwSzu^cJrvY&0^ka;j3EQ4X@4+Hc=>*n z9*FDv`?Yr&2}doS`#T*Z7nhWchw7z3Dx&~JY4G25Q*Fs5{U-S9P4rFs-;ikf@Oq;i zMA_+W4yJ;nXZe_69mu1o;Pe_mZ}FSpP6YnrE#8*1#aY*_!`36>ypl@+X_x`TFugeZ z@A;1%Sk%xY9)h@tL5Zo1u=uc+jcs@#GlL*k_}&0&Bd|LZ zd*`|AW(xHk!Ol=Mus@;W*a$_Kq1-a{6I9-x4LQ2^%M(K8CZL2KBm7_erz5~0p#gt545BwY>u;8Lyg zK%P?@0WsT%&S(ze&n1|z8sJhlqkJuag?dVk4rS3k;Hl61yKW@x?cT#X{EVbp?~9DY z^K-M&Pi9gJ0ZN;AX(aaz^f3zIHDnF+l{P*1LIgFzTDo8_dXB3G5MVLq)G#a6h& zX$pN66&&T%-y?iS{^e{yg6I2nJ723V{(z-#^Q$4TU;yzys_KKg z?Su;$zKHrsVrq|Q{g+YHYs$5d4uL9>fYMZviQ?6PjFL^7@C>+-2#fA#z0l}uIDVwI zDaDmI%Z~!<$65>;o~2>b+MrOW57N4{4j>gnSG2i_@U*d#!b0-l$5qwB2PG-)8%88+#{q z3ymO8NrTwTjP|5LiK$SwpKu2MiW?XXmSxShmb1tEyyQK!;X)>>zQzZrpVAiP?01{= zLOU&rS=J*CgIyd@gIDfM$pXPypC2VXm$KnHQml%QHdg^oHgy=7Q$&yLD>jRWv1@~y zg8JAQIM1;qA@0n2u{O|%S{1`URhl?Nk&PArg1`z%F`xQ!>MO(w@c+1py;)o_!cas2 zoV;}#f-q;1r1|Hs>nTMI4#-w;SpKMSQ6G8&yS&KEKVwx^s`LP!r-lQ%-(RU;3UvG(&r7Wh&j>M$ z4npE3ECM9D#oc>M`-M`eYCkxGbCCfP)TeFI5my zkq)c3M9NAa3Pv%#1%%ZkBgq%v(>$7jky~aO?3>N_bU0KXFLnf60^lPoaN62!e6gpB zv)M-u3cxfx(8Uq@A&O7K?l8txR(Q`tm53DryEmCFFgbxS$r1{_h?QG`_!bsMr%Ij! zRL{k!dav-+lAvn$i+q6~&K5G|RArJJNI5_@%%fkMzEXx-cT}}4kMW~|JV9_Y4fd>d z;S8|` zH+6Zcr=S`g2K*)^j4U#FdE1I(E~v3bqN^j4+#fAiK1AX$g#rkH@Hq%hDpE^49`_A} z@nks;TSQ^k5CIYeuQ*z=8LtR4Kg&Qg4T5}v>QFW&yoa_+5Zl-KH#Y8_E+*y;2MrW} z`{N0Tt@~7>@b7p6Y9st3HWB(2VJo=itWnP#jgn8TW5?10CoFiW7e)*XrUdnAb%FS0 zvJ`kUvIFM_fuUkFfS(}+E=mFk^sDr?tIqXsmL^^d2M)>t)12&~WdSzA!a6526eYuY z*fmOWvHXSeJo&5$%~lSv@(aU%*v5{3$0_4pshnk5f;#8OIkP+rQYVEFm07c>6Txvu z69nTZ5dAlPRCN$ufTDop!tD);6I}R822z-LI}61}0qo5-zLtICxHGo0Mjr0KQ}CfM z80{6N4pdEnNOpg&=o!(*ef!o6eXdND3g zNo!i3v&5)v;EzNvCcuautIe8tT>!#$QXR~N%mejo+3DO(I#Eaj_=FB3JNfyp-9gsT zCMKR3@TkKzrT^it(1h|-kF)atNQjjqm?!K>4b~^-9#gjGqT?Y|bL-*BPX!wLg>-|Y z?-KT6cU1o2G4Y#(e8ArexO&<#N0Q9K^b1h>$Dv^2!ARQ&XTc5Tld5%ghQMpYRNzIF zB<0T_G!d>2^2Y&C3*bpL4+MbWW<*q&OdkGc_|K&CN=sp3OngTJbtwm%K=!(iJrgH6 zf8k(DZZc>W5{j4^3gK^Pz1%GGLT*6bi5lw^m4*$enlA&!Ah9^8lJfwMqR{6yFAlT3 zkQ-T4HU`DL9p96?&>&J;08%0-9#wS)OfkCSt%zUGiwT36Tz?R_=1qb1(L(kKLwzYO zNF>sW03=v7%;RSQ<^oaxmz7YS5sjfp zfG?s(Ow`o7w#W>$3n0wGeRZl%oT10^>ST6L%qDe0o;dBFHyl)N9rv2{AN=fXJaHp8bw$bWd=~>d&GXWS&{Obp~rKI*GO3*-k_#t;G6w|!bI>wS>}bY z{H`a4@~Msr7oNm|bon_Ro`oH7z_<$Boi-HrOk%O(BZ%jFhS}385>Np;eUK3-F3K8Q zna9uc^OdLPt&WFtTTtytr>w9M85PAaj56i`LxdW6?%cIJylw78m z0Ee`|exTx7XUT#`Q<_{R$g!+S{*nS?J%h69G*Zj7Q1d0+0~-~TvxV^iya1XsV1A&@ zJe3lE76!M$9|P>Humeu^N1T+Tso%xTP&tK~ff-b{uhay@1Hw9*%8|^io2Yw(^Wk-a z?k!tlq@bohudu_#=i+8SF3E5qx@%zw0Xy~#d4{7!2nAFKR>kt4(d{%f%c~)IH24a!n zlIzfG#cP2cB1ATzx8vcaX5})Zw^jZ89e3N+`>YT1zC{FZyacs4+m2vB0BC>}tlG4K zMfBVt&ZM?W{usBY`uT)nm02YW#maTga*Iz}|FAG^DjjC3nk@uGTd>3Md4Cu}cOilfb-^T-gZD5>SKLRNM@HlXwR&O~Gl^OWy==7!AS_qEM2$ z)h*yegg?USf)%EV6&+B)Fs;E=wvU9oY`-nE1wI7LAc??8BrRmbFl&i$mW!742PF-n z*?kRAS zk4&j$aSoX@Vr0Tv`XERcoekF)pauayxt9xZ8?Q#4I_iZ<tGU#SLB^h zHJR>T>dMgc&L3g^4x?_vkd6E{`LG8O#BSqK8ChlJ2(j3DCX`Byqak=;-m2r?#c)ci z;vV;0jy73v@qMxp0uXF6Qxgjt(3eHb93C+MgSgLYJPqo7>gYR$fGlzx6r8i{0CQ#1 z8D7bmhT4jv(o)uEC1MoY-Dgy~?9AZ=o{0j7Q7?$(3uzVwhrSJ`nRb1L2*ebtjRFYO zC(jnb2BNDfLqifk(Dxd*p%Z-2&ad=_N~q^rsvq#QtKva8>)f}$^|Ty>?hAGd;w7X2 zN-{*aT?TfbmJvwE#sQ?;-ApzfY6PTr-eXw-{;bEo%~5x6mW3C|bqy5uMAC zgVsS!3a-H-dBHLPY9%^nYlxBoV8srwmwiXro=%D?goB2Zu>zGfz**Eh3F$pAK!V-5 z8Pq{gbjpE^i(rW~tB56L%?fs$5f6;r+oeb5JAPGi_r?j9Jm;H3MPNi)lZoUc5hp8z z)ZN5PulCsYcYPK`%F1w(z)9`9=g2GavCj75xiC5q8awJ8<;}ieQX9k(=sKwPQp#QR zB;?&94>*2Bh!wU;%M#R@3zsYaG}FQZ#9nlR&L4NFm~2vul(SQ%a*;1dorqgApx}cq zZhO%Yl}=Pt=qBPeVyy=RbmR`m{V)+vUfn{I6!*hd_f-mQDsmEdSX%0;{o|bGA((d! zPq7D}=i_?+m6x)B1hNKFL@gBJ@A?0qu_(3<tkK%Y_ULesF(dG5EJ($+2 z0%kW3q7deRIKg>eJvU99Z0z+$suGG}rfEt2NXi7O4DeZj3^u+l7)sk{Kq%VYQgq^K z!xv(oaiAX|g=pY%@_d3=_R7A~Fy9OrjX)slSOLPuZbnDM_6&f46-7gCLFum7HjsVi zlh|*_qFm?YD>R<(>o<8_uh*9D% zRo3n*{kY(Fbhz2rPg*jZ_G>kw|GPZ#;Q(j~F$+(okBEvS9C}D9M3a}VVY90Ppx#6aG<7th`F=5fcE5h1e;5VW;OC0yCG}H@D}}Wj9LWr< zur@1;Aep4yfT_@C<)8nJCDHil7YF~qt%H)v5C@%0 zcH95WSNXX)mPJrIoe?Ga(6x>KEVVZR}IEkmJ zea(sITzraf*(%#=X=@meFpa%1f(UYfdG90C_|eN7uGnS@B#I~6BcUE&LJW0&QnnTY zjjX`mxav^%Z&^N^Du66d;-dE$IWmL6-s$rnIdjq6Ev+q@0tg4D8SJhI&cu6BCo_=0;NKrjV?b+CcedC*&_IzMZ$r(wLsL$g? z`>vAeq4g{a5z&f_jAtcdQSss5T9rQ{`D#__FYPcUj&2R*{W?vQWdgqEv*OS&Y^_QH zUQF;ar|SGD3%ztS_Fh4?TNO8nJtXq(zT0u#CFYW4j}~QqO*E-!ejv60e(+G!vztS{ z@fwSI0^fAqh3Z!}ffKVUou!U$sZUvYv064!Gx9 zRL4zi{(Lb&#e;ATTlTB?wIr(n1tR9 zH-6kg#8n_t-=$5#jOg;8f8QJPZ01UPvx{Wp>_mrU0Iamqvbfyg{=9{-VUgu#tBc|N zN;Jh2$;DomMeWdWQYV!cqMPNW)S~=e7ll`gg;+!oDV9AnhKD#7%m-@?-7*u^fd#v0 zQJ4Wp+MqbjEz87{q5Q3#8n3L-J8(l142uRO+ zZ3kr@rKa}qMSn}6{<|V!GM5h@2C4uN;%e&{$$I_UGGb(RKGW0W zAMESTh78uflLD}2=eYs-ad_e5`qi~{nJN3A7})^gr{T~ zl@L3N&)14(sI^lrZRgJ4BXjT9XmL8vs+Bg}MFknE$y7nED-N0)#{lUsDxy@jsHOuE zV$m)uqT`N@yz=o)A6{1K!9P1%1lZRT)0cGq&Gi=#HHCn2dKvJ()JPteobVe+b433K zz{N{x>DP6~2oMQKVDw}}io>AToqG#8gSQE|$zLgS+*=q3hS7@Tv-4_xsD%^i61lX| za23`~07DDn8Uf7lrIa%jvRhLb_#OoJ-XjnEgl>or?!miK%mSW#{dm$bylQb4k;@tT zd>~y@+m}vCBi8xET$@pCR9(lO*z>-8sSM32QqH3qP^4m9R5J;}xLW7-e&Hl@;r>>f z_gJR`)R9&|NMn>4Pb2?zKH}fnA_{<=59-AkXMEns?I@@*?vi8^EzSe{*rfofbFvA0?n~ZUNUF z-7~_7>x=u0ZHFr_zb5yB$Q4XHaxiL{1kAZXaGvwu=xWCNQ#tI3IAXb{HJSZpuhi8p z5UmobprBXFgY3K$5OYb5a$D-mu2j|s4$eGk{&j&rJ66JGOm&8Go#)-$Y;VxwiF z5vvnjNm*~hvwra4&tLo&`B|o3Brf_#X>J+BWWGG0CH@F175_>!FsM+f@MD@lkNYI3 zEG-{dn%fW7#Mp6XyssO4AMai{Tng=B2-fNU#-qY)r28Ct^D6X_+HkY%b?c>KN&S3s z^4ogs@O=*LoZlT;jp&{0<-T(L4c18w6 zGgY}LjgY-16;#?JsHnVzk;K3nQiLmd6aAr?DEsR(F(oV`4yIQEHsBy89JZXUAtVG{ z(S1Gxbx^&BND`13l{1O-i?@i&802H9!*We<@j$e+2W8E^V^idDk*U&JLmoknzBnET z1|WU)UGe3ESbXrioo<6f`@BjNnQRDIc@jxS2bIPh4k9??ZMa2!S`Xo#6Xt+~$MimDyt!Fwl`Id7`-hoEDvs=i8=_!f0NAnB1rUE`)h z?K2V&)tsRDEjGSWbZqh*m+Sn^gRAeG<#ly1rIVtqxa%HOr@R35hfkrUUd>n(CA?bd@*17;Q@ zO=Y)smSa$%7K~W$%IU^A@x5WHWet5zU1qGwd4FJ1-IYuN=p}U{z6GLO{aIk%gh-Jj zIlvBX&Fwm}g~wf_a@-Rpoz$lU;D4ylK;!HjwzKqH(Dw!}9m>!(zNbYWf^x0nRPN)ez-*zq5#-)ov<0>#Z_x{1>e~H{oxII|ZTidt8ITtT z8qMmxCUuoLD8grOHe-xKsqZTdr2eNV6m}_?8WAbCnv#CRhrx<`Gp3J#Q&Dv=Thgj3 zHrO(%VNR#^mz!zv#PQRaX5!gV3;}Qy@CwG z22|AZ$__j3lcPcpFC~f&3orY%tfUz|W)_c57TXal9_GJk-&;6>gJ|F>+X69h_;3Ui zI#ybR8Uk^GLMimcYn}k&vwt~4N0JY+uuZ*q1#Xn`Ne}`MT*%r2$+9z)Jzz4C+c_Bp z@EpT-#pG4f(C?E1t(5bHSg)1Wm1sVekF}MeEbzls0CBpn;6fQJ6+wCrkcWC)0-*;P zJ}ihyP2kBGNk9hdh`;ucQ$>CX$Pc#h9qUr&2R?C@8O1#N5_1JK`*%h^2MH$`D7Thn10p-Qssw4~X4qBCp@EZZ@tC8!ji!*C;sr8x~F-B#Lih z+xSEhgL73NSjBwUW2%xQv><6@)Pve7c1{e(o5{Zsuy>A0qgjepJ*K~Naj&g>2Zc&z zBbr-7K4evh5xk?3yf~cYboJa>jD?;D=hwDUK;;+{f&c>JSCm(jdV9UG?q^jQ{`+ z5jKf1mCBj}LLN*G?4D9i-hDZDi#c_IY_w33aJOFL6wXdmk=|n=OO8^U3 zrGkW)v87dl+#6y(6+5gRCyF{8J|G~CKr5WT3@Eeh)a6b;kRm8M`Sh zh(44|Dn~*24+wIk5;!jGOp8fQ?|JXnFz07D2qhx|20jY}Q_{<0`~t`ytRQ@!47SCd z0HI<>zYw5FMR2*nVNSB|`Z_R!5*VkAoIe0!jX1&0I11>BXxmo?N65)^ud#FDS=nVq zxR`cbv+bWjvqZyemf2?klnvx?LHft@>fTm}`Qqa3#!ly)Q=uA^G$fSYWYw?n1kWY& zag()LDn=hfPL9Imuok`{nAIF(0to_78T$a0gDUS_k5au3p3&~gcy4wcea8*~w;M!X z@4rYg-5qK;e%4am2YPEPSDwpX@BTp;bCdB#?!#-x=9KM&91e2ED776PP%@)l8aWPc zl3FB)`Ec8Vjqw8-AcVB^`!G>_Q(OFC>7BoMHK7OB+u?asr`B6E#DiVIkJmMkMP5Uf zeznrCHWd;#;b}%*?Pf8kEN#=km=j~?Gi(HRn4~m7b=C+xUDM^{xzzAMJ`Y z-48JwGFMx3SG0u#Db@nvrtIF|(9zhx^_=uMeU_DjSarL8CiLE=kgcv}bTV84oPbh! zpn$8baKhJ>Px~LK50xi*gYDsWoj}9Q0sr1sd6m=-h{?{w@AcU*uhu^L_I;1>nBDUa zRak|2s@Y)(0Fd&vobp`cZI1)VNW{J?#d|#7osg=%wkZOOEL<}74 z%|rwmDM0<8Y>$)c;URUfNpX-epG354B*f3X9#HAz-#o1fjiSs0{6e-IsZocf{msmd zJ$EL1e*+~%Rk`8@xV_`gHLg9}`4i2w6vyFsELLL%mkpr_V5A*LQ`i^?ORgoexZH8j z30xV(wrdsN8Bw;?+^&1`fW2we0X`5_yukuQ_MA9-)w+nzqsksO6LE&&PEfA9ZZGg9 zCg?HjT3TR-T}7|8JmS@T5$|10cHvKz*FWec}cqp?a`^PkwuPI7--jQ_r#mn`w{R44)gV6AK!H5;w6 z-acuB#~ya|x&}l`@5|Dqa7=NPu#rKtAu?&4f!$SgdU}@P(f-J5oo47pLk%M&NNp9YDDWew0CX2GoXaN#Q zD^@#O_dRUvcAR0j3Cpmsk7+ACMyF~U0dRc4DtyZ99Mo7UQd6s`RYsZvgmQte$Nz>Z zq6iAiqY}snQ(v16LjBVEki~<#`z`Zz#M(h5bkGVVnzI3-s#MCI}Q#G!lG9aNrka~89@wxN@x8iP+w=RaUup^(;dEKg(INZ6}+`h3f(29A+bt^pG(8 zTk2^xM10tD2y`7<%oX6iJq;ua&j!Xi&e?W5}sOV zQ5F!&eS=g)S|zlNW$sf!$-Zyd0W+kMFqYj8g%3p!pRu93Qwyt5m#|hrbU@O$fh1-; zu2ZGn?jn9ZZP;_aOyqWwG$14`)NmrH&4@rj(sS5h`5t59!u<>d1HT=2lD5l(Kl!h8 zMJHbkE(1W)4w23n>LaS8a0WX2ze1)bCV`>3lx~o6e)v|a1arEqnVSzta@$lHhw^QTM5#IiIKEBs6Py9~Ed_}je0nh)zp{I>D zv7qnOSeK2)+CtoaT$bcU&iUW?>w~3DmOm+w*~FZ$?{&rK$Y7{tCI~uF1Oh?W0XOO@ z*e5F<3~?9i&2Il|`ET%;l<=KwJFkyKr`xHF0bp37L|!IOcwXmlih0|sYhYYLgF2jY zqqf5fHTW@J$Es0)x!hNYHVce>&)WAEwdN)u%`7K`*$^ygKV?9VAR}_{(Z~0BZ$GHv zMM9!FI*M2)oY?5!_`=f-TCUwz|78c-cW}0TvTC~R44_95foP%m0^J2#XnPmJ4S|HH zeVs2c6WeSjJw)}(QlG!q^$2-1!O@i09-3ZTTO-RM7Hy&w)U=-yJp#TO-Xw(_zC%6| z6BqYv14**g5?xNRc3(o9{2@ZfMHo#v7%}2g3fhF%@KA9tmb+aWEPH!et}R`FY(taY zuXcjnm$}BEI$%BUe7wBfb6n&oIswO{AhhO~ zqc2f?Tn7O)ZUIX_@bgn92J6De@;vup;qU$Rv)!KmBR7lHkP zDM`cryf16Y4(0T^A(#dUh-58hJII$14BiNS)6v+wE8r}|V=**LR=AK|R=P0le)C3e z2Q80?g9&5BmpzE_|8y2~YA3!Gu zD)iBdlL5NW#vU`xr^|54LWN(z>1ao@YROC{IgHza)k@{=#et@nfB*(&wdudf3|lO7 z^IB#C+?eBJZ_L9?^=V2zQH2(Iw|%3JyGsBKWCB(CyL2rr2q^k*4mFw#sfE2f7|S?W zR-xn$LHaNo1zRvF4)|K2U7`yI443aQmX1g+g)g4sEbGD{A#p0h5kWu}HxV)M(tRcI zb8!;ya2e=?ljTg*f6*{s_B@1k1)$U0;wd;ROh4jfbQk=n}>5HY+Yv6XVzpH|E#5<)N!#(8I- zJto{K1qow$(5-KFiJbYzZ*#^w{n-Aq@VUjfWwJ%jru06pK2Q;SF~D4!F#aujM+5M6 z)wDP28ylkRsa6lf<;BH95E8A0{B~to-n2&2cs8T$wPD9`$)U;M8h)0=T_eh;c_str zLCTTuf?bPZ65O-b1o^WK%iU--m=^}w&v-+El>`aD>u#0U&L)wqMg&Ul0zE$RPpsB9 zJBL&vOva45Xu)#CP=Vi0Ow7MUYch6DzJqZDeuBm8h+pE-vZENXxVbj4#zr4GAHLynrryYG zxo$Z4uQ_aMAg^cmpeW!_6dT6Pieb>5-dNQ%QzAIdNo)-%{jy;Er;V36|CsH3VW}Ye z4cOg;)#0Yj0Fz1naJS+XqVr){O+1BIRkoZZk*+7s)&sB-L`NZRFSuHIZpk~gCRkPe z9#*F;KHOx{-B9Hqb>%^TiXkzVA7=tYSzr%4N&<^?{6RI?d(u&t zwmFr@#Nuwcn5`saLLJ0@A(#q)fswb8o-7?hZx5Qcl4}WE3|jKJF4#XGgZ_8|XeKD} zA%fX0NJ@&tvIw80V(6Dic!{c4xcsCVQ(M-;@t6$@afaDR^9yrXusONAA!NA!)-+j! zq^F_zcE@CPJbn1cZA3kL;41(gVzo|&aB?g8ta}jaX||PvatW#KaqVvYqWoFi~Jfv{vsY)u|y-OWJZw^ zGP99cC^htMUUy2MYQoP6(HXvJVedACp1$pUjDUM_ zH*FgFAu0$R1+R8Qm2PB%8P+0LZz*Mv?&g-|20mzkPw>>-Z3{0FZy}Nhujn(r05cRZ zGfVP3p{bj$2$6L`IP9t&@ia}~+JFb~-3({@dt>$jFc2ny{)eo>--WqDE?u9}#te`g z1IyIDme&rFZCkh5wDo1XSRtGX_J`>ESrZ0c#bAejj3(l35fWrvBv24TlG}(yEZ-K* z3#dv${;DY?v&#}v=C9)bPE!QyfPf9WgN_^R&*5X?Wtr28`I};DZGqyifvD37q%#tZ zjI|xu9Gu`34`>%L(*OP|aIFOm|SQk@jz%1bTt~+gGUBhZ#3> z%mCeh|eqpkyErUp(d~rM03_}qtc0duv5wWeY`W62KRr_0S zJE@J{9kBE(uLo!11A$tRhhphbRC%*Rd4dofldZid$JDsRbhNS|qk?XbHqhn4MQ&aL zSN?ahh$p}r4B@UXF$nZZ=NMZgJb{fRRVrh~!W4L~fJ`d^;f^WtGgeE&2`dnN8tNW1 zBs-9o;bAOMVgp82qGH6`k&4M)&&VYDn5PaT2x z>|cP-YiIG5h5#5o(?&5Mtw8&-gi=zT_>CO;Rv8cv!X%&+nl!;k@dT4XClLKR1f$jK zxL!n%xQdv@Alc+6axLgrLu#R_(@ukQfE3c0{{qJ}uQPS2IydD=1z<;~aYo_pD(Rg@2 zOG23##!x5;LWozfcWUdtA{J3MY^KBI0=iJhL;pU$31%~XZk0?jz8MrrBKAdc6GFHZ zUU$s=nn9L76-)3ouyKoPW^GMa3Ek(HNPy^r&3vkL^Tg|gJRy-TB# z3r5`XXG}G8{521NUifpli>@#$G(+V?b4r3TXNxVuHb%!@Er6kD2%5N z0*@tTg4s7-OTWq1;QjxzhK1^aEdkX9R2j1mod7g6+_gLHQ|?QDYdHgpe1-|5^=}Bi zVX^Ha40X>jw?t~!0N6d~Dv*Xyu3=SJpbUwE365~XuIoeo#G_AvqE|{X!@^ql$wP); zM`T=cYv57?3Jn!!hIR;x?Sp-TF$}2Rbzan7P&>LgVO1{l94P}`lK|)O7aVLUB6{e=(S?OCAq->?*Kc7LMcIuYFE;@?EKVTbt5(S<@-2BfJ=a3h~v7dI{v zr?pL>Lzu)shEQ#fH}nLXgE8K)M2BIGLepK@4Pmf1)RSR91QoovPSOG%43&un0sS7T z4(b^0HL+a;z}N$9D7%L={(w7gLgPcZ>owrVzOHX4u#2GX`UeN&f>Ez}2uIBO_ppCC z*DowYeAwf@&SvU>1O#WAI;Wr^1JX$JBBpfQ)xRa=EN(MqsZ{Ac4Hl8DyXt?WG8pu9 zoNr#Okou`Eh3LG5s0q0Smqz7@#Y5{cD%TFZtY?Na{)}0(D|sS<`*V)e8k1 zIFL;eSBE1jC^paK=Y0{t2#i6Iy8$DDbqv!>%#?#Z1mcTI%&61DlbP)UjFXI=gOkE- z2g_QF<#@fET6=;Ve?aTMo(12-`fz`1$WE=i4KDokp_ni9e_R}JKrYf~i@ZUiC&Y9d z5Rjy14yCRSIp%{U_Jqn~mKnZR>v8-W%XTD~7%9{;>r@bPV;Y?wP|WhJW%joYbd;EO-);B zVlMlAOqNO!g{mbv8R<sLZ3E#wl6QGYF#ajumQV>Mz1?v1UAtI={RVl`nw!tL@=Q0 zz)b(gO(me4$po}yiW;I~#PWq|QFD~Y1UbM_>8{EiMDQXP7bk|$A?Xe{4s(st7|MR} zV#rTOE>2WZ0-w`5+0*%ba*h{MT*jw8WEW{0$^oH zDyxx{k%$}o!i)!wykD1<%0a02VxpNAY-; zLtCP!t&t~@&T7;xdau_=%d<4~F~e5j5UvA^Hc+LEg~U5HhkH>ecB@Wu`oaz_!vXk z$Q`;gLG&FJVKhKA#li`=^A`2o6vIpjoDf` z3q8)CAR>rw5_b?zBLL?vqFxac$T<{AO2?#Cusjwynbk30kP}P*tUozNML7&`W@-{Z zM{QwMvplW~u3snOmt)lFwoDM7$MF|J2Lo49VsRuqU5H22DEJ$OceXk{ zXoDgO?TXaKA|4)NOcVeXVtHic*LVOjDP(6watDA1H{&hd7gHRcsv?j)&60TJNns*0mV9ZU3x% ze*ux-VL=dTGd_rg4@5ch!XY%l&sdtqdOmboLRS(9O$4wn6wm=~Y1S*^;k79TML4eU znHBPKd9EEHAU^6Dnf2YaVlUIA2o9}f=-b!Fb*{hbwpgu`RPa03rN2N6kmAFFpuyX@FiSO^@&5evR??~w~0 z6>Rj8M)4e;G0>ylVA)JyP^5TS00j_dP+15kketB3n=~9LJivNx#lYN z(Yj_}fbXVE6idl{{RTW^EM0KAEXHBXu&+R?R{J2R4tj!WL}3C+9uK1*ahHuC2{sOv zQv?Eb3rI|I6Y$Y%tR_(Q3J=(Rp)5d|$5dOhE)aI+;s-*QATeX)Yq>F1LW+@ft1&bF~f#(QL3R=qj!6isn#}+~k37 zYx|ELg%d`I9?^ANAbkx^Ww#acD&*ai#QTzn#siol4nQKA=pdOj@PHsdHZ0+2OgtPy zfIW!c_$VC*c5|cw-9)e5d8|>a#js0=ad_EnGVTUn4db$(0FpY>noNikn;ls57ZMnF zaVvcE*g*|hQ%JW3kCFjGej=ba+m*wCVx$qJ4GBjG$f63+1pAOfg2(f2RP0dFVQ_8$ zrCURo?TKgT*W-+oestr&nVqjHXyFL}Sbwl^9G+D2g$aO4cb*86;%nRQ^l_amHAkl6 z2lK7i6_u%N^+w_Z#Z6%=fT7G}EMA*-Of53qg>Bh6NgHnq?X`5B!~P-=iQU{HzwF0^ z>ydGw!_Ra(D493E%YH(_e9C(_(^zYiU>o+q@o8aGItfA0!uRcb*D~n#lD*E))_OwF zWffx7!wOVlG zu?qV?wjw+*M2a~>q`Th7I@&vWrUKEQK(MoO4UL4b)^V75*=1~|wvJ@qo^{ZP8 zzydQ$fPs!t?bgD1BBX$ve2f*i&!lMbY9BVuImYEgQW4OdX|}TqmxYS)Zx-{F@GMqr ziSZmh8+w_l`M55f@GjmwGUWKb*;_@upO02kXr>udPONUVbS8D#?v6TTX$c8 zX$oHlnVx4#QxfbdIzj=~Ke;Dh?3^g5p9DWwwwsi1LZ-yMaqc_+2+4`mXiRZ0m%dcB zQY^_dq=}PTtd*!*^Od4BV)Hf(WL)5PD3JH%#Mrl!xC8T@EVSoP$;biZl)-cc16?OSrX7vU|M_RkfE&L(WiKc$#zD5 z74P^8nBqxK6c;iLGt`dqE%i)-qG2iUuhn4 zTgmpt1+|uG<3a^whlyiBe;a8K@2T@oX~MXTM4#YnfpXzScS3UY7Om7e!1$d6)qv#S z!odbYlM>U(?Ih5Km593wb2G3f+jaH^`q0q2U25+EJ&^A>VrBte!R}KoG!PL*Hmw1Q zbJalwtXXI)OE?PwOK1Epy@c2C7^7N*jQmo{m|$w4X+X)i!2@!%07LgP8=b2Ct?u1=w}&u zmHK>`op~SQD#@VaFuhLM6>muu^!SgAMBBKg8U?4IFpzQtq|~TS+xAY7HTZ zG9TkU=ee>z)WSrGaWt{dYiag}tlN$=*aU&5-!bem#LSz6YAWf9^ijw|aOZo0gaG-e zB%WbA;D+IS1M;;n35?k=fH3Swln>mwCFBjUwwr=AJz^uQSh+{piuT;5&i7&to9%%} zr`wBjBr)Tdtrg{wR1H87GJ#=fo)t7mis+6L0)eA8c-8`zG8!PcarmM^yvL}-RkSt+ zn_vmc)z<`9+p7xW%;x1|zP1A77PJD2P6!EYbK6eEn6I z`b2Y>8)|8{=$z2i;XWjzW?)KIA`!%v9*0|OKkS~<13=ZaHLDWD6e8CoG677kl4m#K zir5sQVQ^qpAVGT)UBVsX>SH`wkReAhKjH(5!z{(#a0wy`Oh<$EIu`nD$rFkMrezTu zSYE^kToJ260^s*7U@w6{?jDMRg~ndab)ObaL^1nGesQdN0GNvzC`3O9H|N`-9f`s< zuKmSG3rJq$NaE432%P;P30UUmba07Ge5e7?}mzqeUaSA=Z2{dw&U9 z!o46?%fVlaQb135(ZG|?PwYtpYit=`_#AJV5fc@HsfZIcOn{TL0w6)FX^sOqtocIw z4Mq@R1>FK|rJs)33M~_mLuw7_ZNtIL3@F{S(&kv&BxW%Hj4QSJnDM|!bljvv2!R^R zfTsT1mF59E%!Oalj9%$GyO)Ryo)u(3!;P#6rF9tC*k$U73l3aPofq4E@?4-opnwh} z+;Cut+&`khFb<2Se5hEC|4--{C!u9P6EB+X3Hc=U40b&;XhFQK#0iLVJk^qoi@pVj zT8r6#E!f3HAg7Kf4&_{yH>cbr|>4rgab-e7i0r7 z5AJJRpwNL6xwnK)jsJgf6S~u@kpKJs|Jhq&LwUQ;S)Gcd|9pn5IVIsV?gxwy>#w^& z=m2G8E-+S0tixLYLF{VsKei}Uta zGzl<6xHoV!*%Q3(W89avD7*qNqb8|vhLsJT-|Z#*Ja{Fy_l7kI>iN1WHt>=WnJ&R1 z$20H#ns@UalYGL{Z=EHvX9aPdu@4C99oP4Rb%wtW&?wmiv9b8epU<$^tudTO_Q9g+ zS#Jx~EVII95bfkA*+&qc;A_Ul2Uyg24=WC#8{~CC!oO_^5kZ+^rA2+wp`DN4Wnjo9 z;Tp-9=@mK@LS~29V6ZpkXe{mscArU&VTxiz%3a3-%DWkk&zXJC_VZNg1lP#0{UoAv z?twLq%X>OXz$rsbySqrRC+^hGb+$sUF?z9)Ut~y5kW<$R{~}`-LKavaC{VcvWJ;4< z^t)#Bke8nvAR?bfNLKM6=-fyGvT_!M7Ht}fPuV8mul-zCgP;s`8rcr}{j3NwAu-@< zMqORTND!lyuH{7VH!jbJ9suh1UwA)&h3gI!yS; z4QgQy6v4n&TD10iCimyoat7;L3+ zff$q$Emo>(e5!h^&U@4f!K%0qiOirV9i#$LcwBG7Lj*+$xc^=MPZ8ro!@?|lTTp$8 zcCBgHNeybw!GC{|^77kEmt9Zubpp&!DQFGf1IRDE5&{4#-Bk1}s178(r;O*`s{IvP zJ=PaG<}v8xzsdX|8P|NswvS!G!94~Y5nM}L8W~$e8|+_8bHN3|4_P0!tCWRO&Ju|M z4}4xnRb4-a%mrPqWe?gMMPVwTNrOYw$d`rJz_W(_IqmCx87%NEU!w#2iTp#zvm4G9 z9cq;{FquN^a2PDssJ2lcyuWS-@X;>ezH+OCSg-s(SNl#H zAz&=jBtll~ClM)pODx4>R0uP$2pW|>UW6Xu^#cr(k@8u~f~EQ2U-*?2;l~?Ae4E$` zls~Z^(1yGqBC^*TdE;`v(P~5>SU^wdWS7RH_*@soD!l|wFcmB|^t!(6DPt3aa^f}6 zo*R~^I3|qgCCjxkx08Yy#~)n`{J{bPCYx~N;W>FjtD~WOi-@J zIyMrjpkZ}gIikm?hgWgC8~8w`vywfZ!z4}$t~B0C(G`6Zb8B+e3}D=+#IfSm^$e3A zpFKggHOd&vgbC_xp&piL^IqqwwneC2a7r7m^Df(szh9>%C}vTAC>}ivT#kLiOXofy z(?>`|zN#4qi}FCDLMzb_bB9C%=m2xIU$HZ|WF06>Wta!;%mS%j;v?MM_Jc?s_43QY z!PLWTI9Yw@y|pq>CZtA*fq<078zKoc)%`b>C_(f4^0H1f&S2*fvOr!i;ekTlryuwH zn-&&uUhXUQ4@K_)5#hJ(_iD9c*P=|b+G*4;vnunbG3kYNqE8L#Shn%*|M z1QK4RhPH?;4H{Qg{UA%g9Rmv|L)QEY1qzg7LJBchiw)zh@hkI2kUcEOwC%7yL3%3} z@XP(`fbdx4BRwuGGC*SB;(N_{%{R6WtJs=~$#q~0HuY~=2Nsz|B_9T)bwzQd5tNLD zTp%53(F}Zp=QwP))braEv*mDEfs4CiW5wgeB(jg|eIp~10an|Z6W|A+xSUSQMj&&` z>_#h?B-LZhR$YomukL>&DKKtWO@aUijMi&YDiKPzKF(6w780SOUVbr^{rDA3IkOsP z#M+9EgNsL{59un4c#LUfzu2Yi9u_26)TTIwlyo$CXUCY6bkp_q;t8DtP9KU$P7shp zkaNGEMW;+0$Q_aIz^{%Ig-yB&Y2)}|Rv{P6r6$ZZ*4>)E0Ob&o*tnKGZvwGlM>Ob7 zZRVhMT5y(z5IU6T2fTl5`Q^_rEQ}ItX6TC?of)8*v`dpuIvnBQ7rrQ)%lpDF!dI&FKw=!<5 zS#uMXS!&O56!wy5CxN*%b{(*9+*Yfm(9h|0{gu3a>~#Fj2`SO}M^nXU#|Q>0JYgg} zmK^=v8{KRXQ=}adjlk1b_Z8H`f+q{h0vLm;L2rcn>Ox>2bgXf(nnZH1LVgr6c(m36 zy97o4#{aFz{vMtMBDFT{PmoQ^opte7G7MT#TnSBbeAV35xD`k_%4d*IFpikQ#CkvY zHOHjkIdz6nYWB4xiiIv;>2~JiqIHMDPv(k7M00v$bsOWkJ?AA+ejegfW zIPV4jJVYJ%*|>V9Y)p)0HUy+Ulm!tH{n%c-$1xl*${ zxlA#E%IjpsOGp!jqus_J_aV@-2a;cYt~0b#QK<_wvtG&>8j;x^@>~`wNa+=VgMrF` zf@rfwC3{*svgc!eSY+;yiv)aNvK;^ZjxUN#5CQ?yevL`f^NLJ}V^?J|PeMPTyIEZs z9@VMR;dOmu=iJcyP`DxEqRef@-L5s1sVUHp5>AJyh>vT5N#I9hX4Wicg;qQ1__Q&f zrP$xow4zxTl7|JP8Uk~r8u(aY+ReSDexVtsMgLgrSUJG)L0;_(@sE0YSlJDmx3AJS zVw!;;;eI443)^I~otBgQm|Pu2HVH*Wb5?W>A$1t1crFWke<4MkO8Z85@H31E6TAiy<0bntsr3;eU@Y6c7tG-oN5oR)!=PA)xZ0^jSX*oeF-VwxNPJc_QxcesME zdXJ^PQRsbbsfh_@{chj(Z_T;W2Ow_?L`cVw*Dw|um9XQy*?C)ao$;qFw(lK_Ep3&#MPp-5S9mDC5dAkHtNKfxSZ6( z+k6a<{(m?cZ6O)}@ZaV?ktTgm;Frpb*Yc9hj1CYQlla6hU2S`eu-0D5}9jb!f z=tRE$u8%w&dl_lF?d)%!^ehgWWcrOyBE*z(0aLnI6 zTy3(f^PMg7<-UM+cDV;M#9<;9uK_S_n`bf6K){%XW>f&Dw_RxOe!iIflwzR78L3c< zHbWd=Es3;Rx{u`g)*h7dJ)jCrW_I~{J?;Md9Yb1_x9oCY9czztTASyv;wa_{yr*kG z=3{b5k_|_5y#I3;12oyAcLrS_+>sH!|IS^+br^3%GPI2|P=$jig9!>t4p(#B1=9+- zfC;&j0N5`Eegk2O4D;l%WP&L<06@zn&ONmZ=^~u=bZ!!nxq;vkP=LKd^dc*j_86S1 zV-~~95}o9tOqLqFTI%r)B%YE1ztF zD1rgijc(1fZXt&^VIfL`V4RG$9@5RC3%{tN|8reaMA%~-%u^egMna?F&-VXpKHJ+I z|3W)opZ3}DN1#fo2SKv-iSHE<|U98`Ke}HhDWCPSHdi~D;@_Nvsp$Zm)OUF$` zePoPJR;sQ-FZX+WQl(yQrdC~r14IOZ2t*et>^%g|KjH_68iP*M8vb3!0ba0S?6AFF zkD>5LOR?GHRTv=xbx#(qx=Y6jYlP?FaqqxLZt^ptW4QrtDdV)~AkdXakp+LJyRjVjN_Cp5A(UvQ@jAH!Qq^Z$kAzLi*t_`A^w|)GOq?>tJwE@h!#9w z0A_Z4*0a6O_F?Emv*K{lvPzl^g*+Euf!l3oxD};|f`-f8^|H*#GO($j3;mjMeYDaT zEP)%CGL{ss@Q^d!O?3LKO=$6!prYA(odKw49oW*EFEX{rLdmVDP?rc=s+DdmiqJ<73Oa< zw7)ylHB2cp(}C+Jqrfr*&=MyzmcqzHq=$H;dz<`q)G2AyMVPG3iQ~H% zxuk>uGB1X{4Ft`OJeK&QSGE}TG@i-%Yrr>ZZwRSpiN`~MWFpH%9wLa-vPOC`^f-cXi=9eu zFE`O7GOUi{%Kk}V#~4^~19=C@LIal5^99W!jA$oj4szFrm%-A*cSa%Mbzymt_QE=Y zpA%aHH$Fa8(PKT`ugiEs+Mu7OYX1yhx0P1MYMl{1jX+OUZn3$-!y~;>LHm>vKR}yP zzBn>>1r#2Z4Z$)ClC{R^qT5@10qpX3{EF;!tGZZC>k!Mo5(-9s%|Dig!vW`0ln~ho zy_kt=Au-T*W=_C&d}y&5lo*oP2oaAhLL>;gUQznUef&wPxMjK)nJ7^5_LeJx;Wr4j zr>r_2OA-x!&$2vm@7|LFZSM0j%nYZ)pF(VDyNC-Fq=s!pHnPJz49BLl{> z;_j@Zi9FzRLrk#T5{XR1C9vYINfgMbs~dW9Sglr?Qv$F~)IY1?w^6_2_ug=33k8fz zl>jHG%cUGT^ItQ0h^{lu7+>r)hK0^T>3szF>ZN#-vZ`bP6>S?yoI-(j3@8NadU5ZM zWj4zf0p7!80S4g);@KP`5rcsajk6SplX9GqVuTEm1&+4?Y|>fSRBZI`obQV7OE49g z%IYGj3T00?5DndoxjO8sy~Hr|ktv-qdb(I-n}P9#;P}m`ct*{4>I2BJTwk`>WM8a^ zPL{N>#e$sWo=B*nu^I3%902=e780O3JuK}8zyfFq(gC&-T2K|o)%q&b%47F`$6Pg; z(RkoW7(|$^SXVKp@XtXfS9DSn5|$sabt09IDK*GQ1~%Xlal#3!tYj7;2ux<|)#oy) zuq>$7fn5otX!)$%H_Pillv~m$8^RE@`EJBXo6f3sVM`8bb;e%82F2Pw?tM*duO&m$!>FYPOqp)r5B?sTAb+_=%$UfBkMz=ASe7l$|;3R;FkiLGdFL;xxVx;u!>S?b%aXXel! zv$Yj&*AxN=Gbk{EbHUxiVgzZ5)Y3(=eewuFjEg3yT0d20ZKr{PTsa-IpCqW!Aw~wItZFqa4;`EcWAdO+;wu`%6N^ z_0s=y^$>610756nT)G_KF;G^ICobCf=-wt@?z5H$<6)s0go~DO!HDn?uZ$Jt2f^_7 z^^4CXb2aQPbCB7z0vi3I$=G6dEGd{2jMo3gGe6=zmIs56=Wsy=HG)mPG5~JUQ3(`Z z$0qw90D?Xt!6Gf%F>u##qDB~Bm{bX>MYBpg$rA0aZsN~6``irdqLEDSH`LooL;-(= zF!`AE6>O@LPGgos5n?9|()djY&l+QEL+#5H86vj<^^Fe?wcNWeJ*(YocI4xN=J|hK4d*&EqKb z%VyrM%OSYDq8DcPQ#hytbo{d@${G<9nUe;~7|2j)=vcX|>Fcfh%a}~Gs!AsM0Kx>W zwG3FYqmH*|Ck-XFmRB()Ok)+_maz4QJ9@dary{~DV)dN+C zh)7Sq^prSHwMD!*5iRUW$>p{K66(1^bZoDH__IZ7D0r%5`yEvVQn$TS(-7&StDF%i z8IzL5$H1Hw!_ym%DkO>b40+=VIo0nMc{+hjgMh$$d^&uI#EEj{#Dg6sViF&*3S2JS zzdUHBhT(3Vb>PP@9yAxk&g6%P9T7DaWTja0uJ6HjeS-ION|ifQ`n;W0 zB>DOyIX1(iIJM4~W{^GisZk!m)=w=D)*nhxgGB>l?wt#~3tMa^xI^l$G{PZt+nd5n zn@~u|orXHr&)cw|KKX{`;UrW=xgAQ_}9mAMYB|%_&i|o@cGAqJ2ENjo6_-zhSfes$@SNJ2-pTYaX?>vPJ_g7Gq&i zWpOam800QGU^twi@(qA1LkWtn$xct^qDKk!oESZ1HaHUBG8wGV>_IW3&7q@uIKDsp zB5uK5^A3va<43O&1H{|lzyqY)W1UpONW*1-J4QH2-I3=uyb-dfr<4qb8`&SjHBciy zT+A5kf34zW>{Hl*;6^S&66lI16ai7st>$ik5h+!EIOJUYHF-!$tz86AHNFCVjXD$X zQI$9+1t0*L8!-m(M(3g*Nt#Rg$6k=rz{BZtKKQg;cV2(a($nq4OkqgVJj_p z%^2wyCr8l^Cs;;(V&wbUisO1(orWSK>S3t7Vg?Ebab>^}!?SDWoIW^Wzr1dL8qf>`mpJdi4{YZ`%jl}YAA2XH~Bdnz%U%nl@3^~JVHB^f@J&sa2Zg`}J4D7)F8>gdy? zrm+vd^l&3FB0_>f1ZZZ%W4Kx^r=-Iw_cP!HoQZOXe0FMF^NjuCuY%CLp+6tia4 zf#ww2>2&t-1A1En>~e~nNa}Hm)Jla=g-}!5K&Bx@M@MA%*K5s%@>~H!Jc>er77J~3 zfI;^08qpcS#of3vi`pD7wV+@-wM;OQJ~4ex#$D>vEbhFg$E0kr8-dvRi4NSV-CmzlLMgIo<1heFirX7gBhG)UK~)(<9y<06YWH{| z4cp-LN%KD#l)L~~73AAF%>(*)U*)Ad5uewc+<#^+r zn21kX#Ul2&8J}C!@uozpW_=+-m2P82672WdP_;_FVHy4sk9vnZgFOi|M9p$}&DxY;k!IrtPOP1r+B#S_Sn7Z}B=ax)xeu(^v_+ z&@mGhj0Ty6+p|4Aq|)ybGvu`!w4=o!k3R%6O3Smo@pLJbzQ?Yg=IL^85rAvL`Qa&E zg=crvW3?U$_OS2jP@i9kR62yI$iwWus)SX=GSAk$j5o#Bw1Pw zrYGD$O+19Iy{@785pTja2-%5}5EhO=0W+0A$#hG!GS;*+OERKz`>4~-ox%|9v)D0R z-U`ma1yoEN^B!ye+7CiUMsvaOuI5YobMBztuH3TYCkuGYXIA%-vEIfxDaed!Jzql^ zuE_vTmKJ15iai$Uk;E&00;ic3h8w8fyfr@4=jy*!V=Zz1uD*=11&gu%{3xbD{A7wh ztZt0IxpD~sF0<;`ffU7)mwurMOM5ANuVpMKyMOE@QpgsMdu5$a8_`*qtfquzLxOZ~ zR{g8feo?pRE6;&BrMMMvd%Hsft%4P&|JQaNMO@aKpo6$(q@Sl3CRZ|Wadm~M{MxoD1%ATNiql*U~ zH0`EVq^W6x=#`6wDTtsR(P`YZCM^N2q?gKd0oF_n&1po z9hYt5TtcW#eSW7Wj0l_QIac+XJ0Agx3W1NG)G|k}B%=3VkOs7A0RWZl%TMtJ6Y%uC z46SsaeMc3D-e;-yW;E#&y8n3vQ zu$P1$7mSr;pwBc=eJRZoiJXV*Ddr;*J-Al{WuTNaHn=;cA+Ke{2yNiORda`}?LCU$ z8xz%GSvgHlF>_?*?2MZ=#ZDdMoSId(1Srt7-i@?T+_BHwA>qt;5cll)q4)tvA{#G@ zcImB<<={!i_zTN~xZUt^Otxu(K7O0bk4fcrjeKW^^zGur>r_r@l@3I}M3FV#^9)tA zY&Zz;^E9ti&xbo}0FW}%T|VD%Y_ecp)isuI#5^E6eX3xP;7j@PHomm3?B!|vr=<)4 zt;)=#ePjW#tlJpV2<^`B+`T#L#g->}yz_+p{i}_gc;{y;?Jr3+-}RPGf0(V))f^&M z1c{~uvK$RyQQc4g;3xBf(WciP%i^JRxl-_F?6DqJ%8BM>7CNupIuKS=pAY4E7t~~@ zmLnb;m~~iX_xW?jaznj7nc$@}B5S@FT!i9nMM}c%JYVAf^nkT!wg41sJ2jf%bvi~A zzgje$*9Z-+t^C5OIbAG!o_bhwZ?Ak;c^K(E?UVQRIwQGz%+PqgJ_};pngp_0ftsK# zX9Pd>mm7{RpR$j*5eBJ7MBo~{8<4MA@DJPz?I`OLK;p`L0I+b}U+$}FXy18SD$p~g z4wsMwt~N)!tHMBzAnuSV$`lqOfwYANs6s;|nB_()q-JUhDPWs$zO#}$qf<3W(NE=O zCX*jeXjx2|2eA}(U$>GGBx0C+v8vk2jh?m*rpq3C!XJAvz{r>1v!|KkgHZVKUBbX) zpZt>sg3(Q>I{#yl8QycdX{r*V4(~Jzr><~S^8`#y+$`yN2w-_{PZ2ca@0)?|FVaXZGvSr1MmC5KCeS^=;)h!pPyn z>>`m<;JF-qulTfE=?P_BoB0!jW~*o#=-mz9d`*+5Z)_^|@`&BqQbxai(AYr7UOI)N zF`KId%=kbMc#XKQLpR0p(eLoc0s<&3T#t5_fm=_y75q{r+P;W2+j~A&nCfmeVxFU!LW$c%kSIud0_iPMc}8pp}V1bUK!IYtl`+?J{1ubB2&!c-oAc-z1O zM4#Dw+uU-vn9FwYti}|pvMJZI=#|CgWq&P|R^1GRU|JE+!^A07ARc19fNx9^dDAEL z4kv%k)-3Sm0Dq!#MT+dh1=@obTxO@sR4o_6?>fD~xS7cKK#AizMP56S_n+y>q$OPu z<@;;M0X2YWQ!BHtzTt9FybtMyE;BywTCXo_nFYj{)70cH1qcw#h}$(@op6`^z$}#HCSyqER-)JVgr zicch3jx~L1Q*iGU+}$+8@EqUfX{;}=C8w(LbLOJ0D`nb3nJ-Yc9^6ptg|AneI_jVZ zrgo=3HMX{G;thB|^Xo;m@CB^I7vxr9u;K>u8@Z=EyBIF?Oqar32<|+uA`uS$!6W`5_i_5ob?HO!}U3Dy@AEF zb8xi(iWC{Ia_`l`e zQ8!Ou6x4_os6dOn{fb4`p3R(z*`~;#nXlnp{^1l{;yq3%=i8*RViDF`29+d+<7N!s zpzeXQARoNIIdUbNB6Rk-rBGD>BHRT404M;cYNi%?cjiO|?6-4HH~<-d5@74-?C!>H z?__Gh4zYB#wS@fi-q^~O&FzVsmL>)OS@G2yb6{Y#IZ{xyx%(3|033plb(if=-}ZXI z7%*U9IR)6_W|CD5QO1iqjT7hp(O0|*b^ETs4&`6~IM9J& z>6mz)x1X5Y1K>Y!K3yH$bWrd9v`>l|*7?zy@5hfHA^5?99|Pe>F8GlSe^i7Y)$sp9 zH9UIE_N%J-CXv2V)%->}e-ljqNIL&eH9zY0k9z&1UjL}qKkD_5di{T)UjIlX-;+xI zRaNtwNw6QP=7)0mpAHGj687aen`D z*0+hDzz4Gl?|=Zn$|wQ=|ChC~U%-B|jP+;IXrKc1+cH-B98r(W?I-w>JPhT@Ahxtx zx#$nqMc^V0?QiFQ|4AD7&UxP-Y2Zhy`w@ZvIT84;rh)IADEW~F z{^wBOhdBEYf#0M70ATWW8|Kh|X$l}t_NK0XX)o^m^WAa)z{2m4@P3En>}u)k>hu>t z4j7=&pKrhWWAj7s_W@1ae(iz&2__0)?ypY5|8f>dxEfwrf^*gjyKLvBKpKc7FZwew!+~xij4FT=+o4DFuR=4~Ly8`9E~Q!qm<5dyI2VZ~}nJ z5};0i1VT`I2qX6^J555`hTqwQnFIVBSdxEe)9!B!e*2&Ai0E&jY5yU#o2#iK#NO2H z_aXhKM!uVDziqhxDcOD=5kJS|ACL`(`3JIn8zBGGYm}e1yM71RU>5$n$p&-bKTbB7 z&3_l!V9@`5vRVB#{eH^||CDU=-18w z;m3a|8s9mm^S>k--`U#!PmRVObv@=UBgM_e($&G#{=1bu%1_FEHRQ=ECoFrI!4ASd zV41pFn*OSkzloQBls4FgnUz_YV3|YiTl#pbIKs{ru_4c*R<6Y{#e<)xMuR|E5v?Y0Q7d{SMDzxPRmMcWIzM4y#|+(0=|@f7|AMtDpbG>F%ku?7;aIsR|vvFUwT+4Z=|Kl@dMYetxg%dc`URNp?Awz#A z^txx9Uj_qq+QdZz5^~>b{$}p)_X~@N-&}CA{%a%p9cS^!&IlC-@pIk#wTbzzVC2_0 zkYK?906VbbThs9ijJcD8gQcU}ulGgylYm&pi#Y~yU`w5)cf52Yp;UiOhfmiiZ&=Ik z4-BfX5b9IBb9~Glm!DrvIOTV9#7%A;mQ%5c=40I_H`Bw2;)eL5#}>7Bw00O1(=*Xi zVxKytg(P77!0HB-;nD34($-otg5k(cW1ZZ6ydc56HYudz?Qo+s`<=G{)N zxlt`Vr4Yp72D(pF}HLyb+vUebGNm(uykdEmGz%G`acPDq=%f60?RO?8Vb{}9IG;G#Kv!? zmH)zS>Cj2IGgzO`jtl^RerpbPHx^4*Q~RI9!*|SM`)D?L%yXbGUf^HCZPE#Gg-rF4zOIL6vR=Txsi4n8! zHlvSBpf>YUws4-g_1)`Atp}#5PGHrOZAhs?$cRo3^>2pzPLDPGly+_2$#Vr^-w_!-H!P3-!_!k@e!7OxB>U+;-2uCU zl*d7$$WFa^;b!LEEEh^3LW!fhVdDL)Nzy!MbQ-&ZnySwF5n3WNLflxg7*-;-Z8Fra z%^svtFTWDZ>&B8>xtc55VQ;^Gv92hu7=Py;!*hC!d6KE~$Em$K7d#B*ECrQPdFvOl z-YL5R34}Hb`K+(vrc@s$ICSDwRf9U=KG_Ab=uL$h%L&vrv(F-%~b;h6? zbO-Xo9`@FLols^931J|6vRz@+S-KR;sxNOZ`Z)l9+zz~A1Q!cH-GuC^)$jR~f+Ev+q_arL zIhrMHWu91I`0AS2VDtJTu0YvpFC_b1)9hX7?Uc`4tZQm+5rlYtc8+`Ns+&aPq0GSr zX*y}ODEro!A4`9wqU0gr&tvzGN%q?s%`e#zwlUnv-PIh{CjByG|H*vTUq+|xoC6iy zH~^4z4EMLm;8#G1o4bW4o2|LiFUYXO@%Od@Kz)#PG_{Xz;1xcTspW^~`U~@z-HpbN zCc{RQ!ckL0KvYwG7WmBHtvrVzTYV1$Z3f?KdM27!A*y2f$&K~MVxxV1qt|2I=bx`` zA7pMJ%t9BdAY09x5UVB5uuip)#gM2dzVli#Yux0{!&PTK508mulEYo(1H1kGiREE0 zS3bO9{`8B(iRI=fO+JNY{&nP=2MHY?4bas;a`pO=v~L|4B_HG6a25?iAEY;eTb;)` za7f=xBnP>|^Vv+^#ee6~K+Kd`5+HA7m-npxsf|Jt)m*$y;3*4O<|Go2 z-dN#WM(^&hj}Tzjnfg|^eBut-z@zY(4ek~a!SEo0_G;gW>Wg+Jn^{TjyS%a(!xRHj zsGZ!Zp{+b~q}EZdg5OG2zlQc#+rm$ed@2f*7KEs-U@OOPmU`J4Q#$t zn`X;q1M znl+)4hJsp%mdM2shK-OMMtM+9bR|6cSP#FI4T(XT@#DQ}b?bM;#*J)=k-5SX2ag|0 zy#P;Cr>!Zf4pFjxN&V1hn>}rn^Phdyf1Mp2 zk92O7mThZTZ}SP{^CjcC49SWo*+G+%nx(x2i-fti1G5|K#@en9wuzWY8IgrI#i7WA z!}~>YZ-mnqQ6??svimdYx4$+NZhyJl+N`HW1_ zXX~pi-FBC&z8mpqW8XZ$A!RXpe{OH0TIJNeYnpiF$}Gy=T(RY-29aR>X$q%ZAb2im z425jiE--L$V*C^L@VJln9`#bS%Gu+4)BAe%p{E5px%e7Us{4}Eu6qIRdd`;%bio;s#@HLBu`=&^~T;N#&PAdw-P=&I_)2=&$ZdUGi?}RIGm{6)Dc?S#+tINi($<75oUx-2VK<9IfG7yI`xjGLe zJhz;3qRiTmw(7mHHDR)@H)|MmH5e_YY`1gK6V;Dv-brJv%rW&(uZ~OSnwngENVhg$ zu$&>fq+hj;5v<`&%e{nP&!k^SFf>+K&>$C>UB!cwDn$l^+G3o?c5Gi21LhOlO?SEo z98wCT?C-2#Lhq~~+YiHcL*|3*_NtyFij{AxM^+!RvLuAYXwM2gV zz~hCPDYAZBgqrtc^PhHXupaFrqC&!dmxq>_kW!9#+`W@z|$ zXP~qXIv{UTU~dWWM@&+@G7lC6317x-C3`xOJle;v>6!}4%Gpvr&G{OgUr*>&l0zh{ z8PSYQmNS!O5i?D7BYV2wVX^<=HCefFaT$y4} zrkR#c8jzxhp=L$reY$OffV{B}EnvU5`#Y&cuC^w**pjOQdW`kEiT zqB?y$$KV)V(^cP25cn3@2=nn=@n(T)6~cZxCAu-*&=s3dUm;>ZkS}vXaqj9ms=-*# zEBP{~oBCudexadWC1MDp<)QQbi|4zWM(ZU^ZduyO>?bLsd1-e zUy^){-(Ha7t&vmjq*Ze_&C8*f z?sl%gS1$^pJ;X`nLVePt#z(aL5Z{m9&U@5hy#IxV%~oz`v2!6}YT8YcpmZ_NfaWJ7UmrB!4=f^5`5c5^9S^dcT3UV5D<%(IFPlpT~hbdX>eEnw!yP#|9#RU@TYBk5~q_OM4tXI8frj)!x zWM7^OMD&_Cw&@wg;dp+|f%b?)j2RwDn{~cE&%~=|M%Z$UB!}A5bMbbi4F(op;X?~U z={!_vkHi)l==;+bAaVN6j%}V=t`e@pb3~ilESV%`?;}|@Lv=Kq9S=;UJ|+sor9Hgs zD7qPTUgcZ}_7qNAI0~Ium`S2AR$hdJV{|TXcW<#h7vk+QNyPf_u^Z#k25pLW2=(;t zKL54%xVdFH*v~OM&rW;pxejqT(yiZ>I7vUmi7=C7b)+FhDvN@Bm_$|>=sZg0sIy(t zndP@H>M-~CXzM}bHA3 z(RiIfJAxtcu=L^c@$hZ0?zUirD}3+ z<|U91yFxb$xrYg&r8WFZFWEo5{6v7eMR&P0X|y9uNQ%2<6+XFg5qQDd&7Hg1Q)6JW zPxfV4>8(b{W)cp22BS^SS=Pit8Ga@SQj9JS>Im!Is#1d3Z5aA|`(Id@Ax%o(ug0~qe6e4)S`&uYud$e?kRItexE8{~l z1k;ref~?9PTqmZ9No@*xp`ZhmDtrB0M(qM!=dq|VaMe#|S%MUE*FHRqsuy4f*XPpq z6!3-A&Ls+^9<%Z$B!$rc&mnxQqXMlOlPx1p!kfQqa7Ba42sx`Ib!(Y26yf#`m}SN* z+?=Wfa20m_wf>bwq^f&ZG}X`pakK-5NHL=5A(!p|6-`_#3fR1Mx4y1 z2wK&O=Vxj*ucmBhW`gA?(kwm7ASS=kX{8wayLGm zon-d$k;U5t8o{1M^jRu4;Or>QEb_C#mhhxSnFeUweEyL)u4NYETWDxh<@AMzr$sGJ zk`LmG`8GT3l1lpV%GigJ9&EH%=o@{QyK zk}m_qany<@c{^C%}YNq2vAz5tmjd)2}XR{p%+~D z%2w{C@giou;`6Aqj@6cUE>Mvy_^y%ol>dD8V4~}RG}^A1hU{6J0=Bov1dvjDQ18_8 zy`@O+pgV1hNs@3-lCWqER8=E)R{%HbGleEhFuEro6Y6z}kpbo#nkWr#ysGH855cW$ zLnwYS4uQaPztpu8DGR4QJ&(S|^o;W88I8Fmf9PG>_)^h$!Bs(3Rn#OsUS4%`ZDOo{Sta(Ulu(qJw%m^A6PI}feYX?<(Yk9Y{UxpG zNs^d{Ohl!`zQ&R_{zN(L1#es9y^B|0>U+dJe0#+qIZYucQ1}X=iH|wT40Kn-vy~FU z3QGotr3hZUe#K9lUEPnjXkw>cFf|?sgo=HBP20b(Nq;3R@6mTV@cgwtIAW0DYAEy3 z$%ytLc>Q%RL*qH|n+KJGc(XZ4j4CZm4Xt(i?Qb<|lmoo+RZjOJ+%IEy-iAz9Ck0+G z+3sq~pL%y&ge|lRT`=8Ftu~B;ic0*U?w)9IWIG3eS*Ry!D|vyjKum-QCR5QeF7tG% z5?y$w=haY>6w5HZ`}0lR>c%cmmCuC_KYQalNAFfW0K^;&lvthfS4f3?Oq!w4!F5E5 z_i1*U&DrndvBsN~S=ic8no#F6)*`YS*urG?3O*U5NvE`}Twa~jp51&c=|kRCP2)sW z1f9nlI(VsHv#>Isnt9gAUt^jCZV@D-n&WH#SLb(_5w_Uf3h z3X{4wUEVK>p>0yYk-qo^x?;+SgoA_G0nBtvms#%aFNx*7L2|x*8i}La#eWFuzgwt;pwj0Sv6Ua0&l$Tng-viOs+~MI}fb1VDG(gxS%neuYUB3 z{A29Yr-z8f?CDiF$1WwlPfL%qxR9})Bo}>Z3aPYMreYC1c$VL<+*`#=w~Nw`RT&g* z3@u}I!{U)t_nPAAo^pYGhGHY34sY1TtM*&=l`G?0dw2|%Vlw90>O>$}j+-4PM`1zy~tsTt#d9*UyN7~$LTdd(w{a{N!$|5Mo`bN@*64#0du#rGN+;y<; z0pq10p;XFq?-$!X{^`S;7v)8L{LzEe+V8;hb~5tXVWHTy-{}R zy3H(a4YIv{%JD(j<~BVaTvbFcF3jC^ln=KzdC=@qU_toIZsurex07}LuAP{@AT;vs zkhT(mPOpMqqeKkBmqf`k$DMqqfYPgWE=)^77!MOgHoNtLyFF^#dtda^h09D>ele6IvHfkJk7juo`lVx= zfK?~7;hbA=EEsGJkyBq1mv7mT_GE5adZn+AKUDrE8TRM>tkl8^u%{-*x+}k3`}lZ7 z5^tcFk;+)ge$lZz>+yJwy(3Xy=8kn=au)fRalX;TE3$+s=VybML24ef&V!O!8sU~N z;@_$lLOJdxWFXcma!_CaPaiRBpI-JWVSTD(9${sUDPLU%9ynnSq7A;$X^~H@?8M&C zmP<5*b0iY_{I$9f*VTO>i3};}I$d*ix1IHh{DR4HAO^XQd_da6_JV1npDpw4WlUu! zN;f!z46jvw$@>M3?~B|@g~3?{mpGqzol`D4$5hE#UDv@DnHKp7>gc805KG>U%4IE{ zT1E2Njs95%(}ivc8+L}IW{jlkg8TKBfkGsf>pO{DMh{+$A!80MA@zQF{Gyu`Z+McC z+PDCrSz#|A>>ET;1?;R^pY4z5mU?UXWIk3KQn+e|xl!YuqjL&*HZamvTkO;#KjMNJ zJ60qlIC^~a;&SqueW&)L@J_82#tF$&P+RPs>$JV=tL4$wBRrYw)!o;jmt`KYmt}Ih zsZ)Z-5h<}@ubv%0z(L7*>ch?{9OF)iJi?Gg!N*)w4;hg>+Y-v!ZNEUeMl`{?2dxTg ze&W*99Dd|^^&a=hRTaUPQ%2U!z3G7Kx^j{Dg4!>0Guyb#_P@L&FuxtK-8>Q(P=wbrxBW}=>jkv@BKnzhnIY+ z?4^-ag|CxBS7SL$L~%%qU%T)*IPeKy3%E{=?hJe4p!wj7ekPx2v5NqK2FQUHSvxkU zAkeLfnWzRBedtAC0ADv))b-*CREbAsQh{|W9v#h%Ve!k_+-xCo@7Z*QiB<8V1C^ER z7u-cMW3lPi;A_TanUmMM{Qi4@NxPt0tTYo7j%xPg*np1-;JBgrEamwCu2z9-31iF< zXxl`CaLiqqhXA1WwT8ED2pC)HP#I-Z5deH~v{Q%Trj$AH$>t5CVHIw-XzpEf8np`t z^}#&5)F-5hwUYD@lI*ewf?6Q*juLoGOY4@Lk7If*<^0`NX$qP^uQ|`#W$8o|q)oX_ zz)S$n9W#^k`yAPH7RVN6l;XrlZozw^TvcS)-ECIV=%B#>I0zUWn_T7@Z9kA)u~xh& zNjEP+=g8bp|B<^o9i{<^^8#$D)p4lvGBlI=J%{MoOWck&jtg*HAq{$|RV6SAG!{nz zRAb@5W*)?3zyii$(ekSa#aQu*_Cm@;h7P#U)wIe)Fr7(P$QF~22#ztYLupL?PZ4p! zZM(xA1V9UR5vRA*^G^V$JqPA+^-zBy(3n*$TxyH|`&LDCmLwq1*4+yS%Zf|1NSjMi z_rq{y)G4VP#e;TGcmSDyQNBCqe$lYzOKQ%D{jnA>*-RGNes3Gn2a2L%<%g ztP_^y3>*&#yBtXJDbt$8C%_w=!y;(XvyFE8g`=FkAO=|OS5jbse&7tK4myG@6bViU z>4%tlGNK|!NAr(BE}d^y=L1^Yg$Zdd0-wO4(;Qq*VWa!AADG3$6>`HJH=a9!P^<&s ze1(ds<4CaI0iUAR!@;2sy6lyD#wlb=S9rD{cs+{~yqHnWf(Ki=#TbM%i5@D(zq1Ofvus9>X_ zn;gi$OajC;7ccx8MC29vZ8sq z%_Fm;{S_nexmWR8ois+sZK?EAHl%kNV&?iKl*WXZ#FOGr+Kf0wv|sT8kFA1k(#Omn z%*vpZrRPRg1iMtUVeb-*7;anuz?e9ZPyA_-Bq70fX5k(nLA$_l#Z>jYT1Mtar>8C0gCbY7@?>;afy`kWwJQ&rJR2{N&gCae#MRkz06? z?o^P?V8cBSC9{m)%H{W&?5o0TD0Cmm-@QZ^vu|6bGOTClCNxu!C^gr(zcWmQdw`e= z;wxrBFU9Tkr^HMgrie!dmhwwV-kP9I9L`B%AU2j@`vm!lstimtz7re$w9!Z9i}dt} zFoeYH`enSDF=jl&WB(UqE8Rg*@Jd@R0J@mtlC6muPuk>KLz;W?F_GP$(+xIb{ZZuX zHgUheG_VFo?fP)eB8jTza5GqgjRg3mD|nzw6psoWW!1k&G!Pzyy@5UMAxcD=+d*VN zdgkJ?Aa>znxsw%xY~v^13$$3VUi=V0+dAeFN+Z;TG1XyrN262&EijD9lV39RiUu@rjD=(=(AL_JmKBB22*#>Z^GFj?td1Z>0~n&WeQ#Q0-g^2 zE{d7|jtp%$(9+c3Ih>B6kD@)#1_>VzwlF(jyxafUuP$^-cpU>bv{N@~u9)kN8|DR- z&pYlV|F3Ct+V?W40}Vvg>K=$p1G3OAqqhrUuA3RjH5E}R0O%{vUkrhzKixdFfi3*F zl9`y*0gvBmO4)TrRVb4jn88Vb+wPICT)`th^zdJrR$3F)1yNe}A~J;rtfoFX_c7o) zk-=|yt0j3GhZe|LPpOSk9mwkP)COWtmX(6xXK{AVJQ1%rvI(&T*_-D$U@6&*u7@g6 z$Jy@{;uN#x*AzH5AHibYPIQ?;Mkoyu~P3!@As!o|G09ftj#D)k3ERKfuz>(px zslg*X?CYckqOUyRfTR=id&y_&#Knw%yihsTlp(RQ#k&sL$KS*qDSCwH^<1ehHH3@K zl&w!KNty^Jt1U_9VTNPK$*lh|rV1!W;%gVQMGpZe<4QcR9v{&IT&;#D0x`rz!);H? zuK9mPOKhhy8)U@HS#3x6mT-*x>2|gj{`9?h}yS>jsZ$f`C%) zpgJ1=p#0ArR0$)@$mr_`#qki2jR@p+Bm{TO_QP^?04}HA^QjUi$3=*A_y^5b~AlV_5BU_a9VdwcP0UEWyqX@g|E|@smS2{-2 zq<-5u7ZUE}nY*ii2$0UrHHWh<0Qu`R?a4}PsYL`_F&=)fbN}oYdvo!&JEh$TJ`<>q zgJ%HsUSqOb&&4x}@ArVB?Oxv-f6#uW!`q3nTjxu9FC0VpjZM`39+F%|A>}vrLw$@% z5pbb;0g~u<@0$aj`j7J!za@heO<-8~2+r_Mx32?=4(#D|PPuf;NDQ#$(8;J;R*v=u zGB3uZ$9;3T1`u}VDwl-rm!nnd+z!$a<(*Uw9ke>&A0eJ}0gjvUU9w4y>g_SdFHzX^ zwo3-)Fx#$HnwGdfyxR$Y(-o=|xIyXik8G-z^QOEsT&WH>BBoI(kEKQG+L6)?{EBmc z#iO$vttJMVcvDs};xKD!QeDg*7YK)A?3@}F!0g7}7VXYQ*&<&?P7iH}!)jLtvHe*v6MhRwa2eVvkCvkWJVVWJ;cY&0YY7mx&-z z%IHK-2S;S0^M!-EpAu}vGmcPQ`hwyJ@Def);6eUI<6M~Q-TqG$`=a1h5;l=v=T($h z_J;c7_2EQZ!uODKm0sZvgu(UU!N;PEJUqVJE@l};G^@{4hBbb+em4vM1o3NC(|QDQ z7Z_l@GRC)JF52%C&Ldq}g@}zO`Udn!Dvz8xt86X>N1uZmTSM5S1>78iLn#$Zkg`Fj0|O#MVszfd(9m~TAdmbX z0L?%$zps-A11)4=z(oiHaE=I#1LgK5)Ib|B29^h@3-S9T*@A_h>V!X1uU=HFFd%u4 zQB8&=%AaP)YE2`!cSh1aInnpizK`Dj0y%2<4fvSeO#>zQ7@*QCX#SPY$Y74%{pfN>o0o*$5lNNem8Rx^fY4&LO6jL;Jpe~x-PX{d>V~h@@ z+hLtH7pNCWu>)c;p(`T>;5;Q72g>eExp9^z3hByRw-dAlz$XMAsoed@=1azatUg54 zIo#$Hr!>_9`+Fl4)nAJ|n{4+*^7pp!`~c|DvkCQYdcbQVc&~Xm3fmBAeh03h{G}@Y zGhrU!wE4QIqLQcv=tfx!>2{!$X9votGjWOj1vIC9qGi->TZ+#LIgt}{x=N&$S#tE61VJ$`b5z*HHOTI2DIOep+ zI&LA;4zR%hoT*3SKz0wI532L`#LH{T;Teq^tV7m>z#loasxgl7ZE<{OhvPdt9N*dF_|6{3`1bsD!C5>Y z9z2p`i+xlhR6NUqoOK=kvlfXvX&b_ZpEul|gReEl`gG=>lggMM62(9TGX~(CIT{DD zdr?W~OE^=!KWSN%7K$AtIX0l3hkt z3v_>kiWm!m18F?66C!-l(|CP&W{m?nzqSdE@f^`*91EVq|E|ff#p_N>e9v@|e{0#? z3~Ha0Hqklgp9urkS=s@>fG7@F_a&6to09556xv;~JfMfEKdSO`LyGdqB=sp4v;$!O z_b;_TITQ5BJ!aaw3VMatVb9|1ewyU@^pX%Sf=s|8gWQlr9+?~*BFGECy5K5a7hGB2 z41b0Lnm{>qzY~`IdD}Vz@93px8k--34uqH%H zD(47Zhi9&EhA!D-SRWplBn&_t0DJ-95Ha0T`uSfxQV)NIB|4T%)rg^9a5Rs~6|b0L zEEMCwHL1P^Sf94?^U7Irh-m)M?0(ur-%PQ|g!XE9j;2`8F3jtK3Mm-aB7%W!)cLbQ zIFNt=dCs+jo^;ECG+EUa!6s~5V8DVyBqs*aAr>^G?7K*eLSh4$+d~V_1$85+4OxqE z2Y^?;H@N}vCA1xZ&kFCQN!19%>P50Jz>Y%%eQFSsm?7 zwZnRKWwrxi7-%Kg4iF5qCFgF_IFQtfO5SrVE9PpW41W!odlKkaaaFJm*0CXDZ%X;= z#%3fQTsg&nuX9nq3VjJyO*JBWkI5cGDSe2bUI_kyj&sPq_jao2Kw2Y;PpV|@z(oP> zz_pU*gi~A*(-5Wmo1oM&#(0g<0AJ^%bPU`V!a-es()yfZ1stN}Q5vi{h|{{Nk^Td; z{w4Ct+3-gI1HlGjYj3(YMflH}__L_maSe+ewXhyo=%pv*R{&dOb1g}&=zH=;_z?oELAK`%P!J)yWApmIZN z!wgA|MHB-tN8$(_!YKnEAkW@{HPcOn)(+sGGsYQ`{D7hu;QIo(cw|!61q^v&=@@7u zgnBeXT(T%H1#}hKolAOClDvQ%XPfR#F(-dd>nfbL zqVxY*0s4eD!uJDmaEM@S2(h4Gj6kh*RMEcFMtJ>aFO@@dMjj54oIEm_zCZ*6_XIJp zgNK2g6b63V)xHh~ieg}n@Y$xDWC6Cz=Bf@x#ASORuuev`0RpEGjw5H6Ulvul*J=c00W|SKo$lb z3gAF742W}zpASERPT~NQdNyrD8zo93t^};8vwzeyEjDj!+B(+XXSu zo{xctyML&|0n793WSwujC0-w;jMijaFOb^O01eWMtSs7qtic5DFZ>%`E1zpbupkWs z(1T#tVskX9v+y2um?O+xop6ew|4e=R5W)Ho_8Cp;#1-nB2C>M&%*G@i^xubpc0w3< zB!B}&&N^p0%M5UkHD28A(>j_zR1@pf2oGble6pTcFJyQRaKiut(6d+)hY0vXDZaWw zYdX*mDSnPL4}GxsG_pcfU?3!!%GDe4=-%&|TlmB1&JpGS661_ti3@C7sm9_!OFxD2p4=fn2iS=qs)&zSNo8VYNODyjTe?!k=*n13dfG7r_ehi#q zh&cu4f$OpY4A8M$>w5Cag>ytuGlo5=-XeAfa=*YEJS#5-idpbS*kC{`9$>HoEHLo6 zsskSff^}ozGYz%mI@1v91%)$p(HK|p`T~uEJp>2TUgMp3%sZI?P*ZK-^Yg3 zklFO2l7DZ3IFC%YUZem9cJnZ>rw#*xIAA{4Qa%h+k~)DteqA30{vh6u7M|AxzyWVf z0Au%Jss{=5Iu(50=yhL)zaEJP_wvp(1Y59kp*iVGDCm3Oy=%iv__;#1=UPhYO)1)o z>Ox@?lrhdoXx#ug|Fp42q-LxP3`pdW$%BFIOc)T32}LpR``(UqI1oGQT>PACHoYgH zP5`}1L%WObZH8w)eu$>n+Hh~ODJqUIL}OYBbKFPq`r_sU>Ju9PoYI4tRwysXK**QC zJYhXFh~8P9Z!6(kOG*3@$PWQu1UTkk186%3-)&+CE`GlQ*0+59M`YOnF$`2n<_^>s z1A;gZJKwe*=UVPeG(>Sj#Mh4WdI4}C#390Cf2tW?Gm6&+=zi#cg~QoaBrh1=OGB*B z>B?XuQae`kY*U%NDe;;BY{J}uIzku(`>-a|oN&t7*#QN3WZxMBPxcAmfc07DvUz0C zt2!${N6a3;-?RFt3!Pme$RUDQ0Q4=ohM>7%kQ>bK*B5&xCv{RIdyk=ZAdek5CIJH{ zMKQp`0qiL#o7+GL-=tRdlLo07fbL~sKs+XNVT=dZaEQb)(2f-beiy;OlYO1|I8cTi zpt*$5w|xC9eZuJ#)F&0oak1VhKCvi|jOLF(uWC`Apde3N6eF;f-#EvNaEa>QpHwo3 z=v)ECA0c^W0W5%hD4u17b=h1_3`p<=%EACcOvr?Rr~3tPpp5fvd39sDRs=O=(L53K zJA$5M(1(bLS5EIMfW9#siXT1@iIArPmCFeZfN>2Kehj5e!iJ?@07d4;lxGU_cs&2-b!RJ+;JYKal4s zpKDC=g^cIfEur=n9L%spOUH=knIsKQ!rjy&IH2{fYz&;`aY|3GcEoE)bs@h8aRS(c zn-wisU_e&QP>LOpfdNrF@OV!LnHUhof!ycYGGKt_kAUr87iPf74F=BGK3<(r_`LhN z-jvXP2;#z}etN7pEp(59?Fm+-KWV*s(8%aZc&*e4%U~h2hJ^1p1!Lp%=Z6ICfCvWmGGjmx2lDiyl6A&0)QxE#A@~N-JY2fJE{O>xVSw&O24@ujhm7rB z6Zq_+a8v%i0%i9hqWL2b1Hiu_J`}PE4ji<6iaFs9eIE>n#{Zc=ASESaCniLLXoNEd7LdX@!(|2{lY;)%QB}&2o%^?DQ`G(mIglqz-Z?sm$v8W@~ zuk(Kn1|;|bCLAbo*14=cL=X!?uFzkg4gmfhxa3eP6g^YZw&NZA}GJmL+Q13Aq8)q9+J&L8AX$bjY$O}yUkt?)LlNKY4X{k#1 zgV3M!49z8#gaL{DNoDazC>-1%vt#Yk^Lp?xC8BlYKByfP<{*u;y_kUI>mZX znep?4^M}>dm%)!u@5ZHcpDGyxbiD}jLl7@Qj)3WG3@?T~i}aa_uy=IV;)YnC3rBrAkI61{f1cq6klDG$3X8}@Ntumg-aLdh8TT}c=a#DP-c0frtlg6G)*r*K20iIB}s9<4|9 zC{35nA%fnN(3emU2M`zJPctDs2`av1he-HLLklWL2)SbHAL!@RAKQc-i57%cDvdt^{b!28&4iw{5kh;+>T*PCdz$*^H*aB>yfpK%lRLxj2ci;rJ z2T)HG+!qJe#t+pc{fJI7@JG(^`p-Z-uw;}W*~1RcCY!z3fEn0lymOH)I<>kf={*Ab zOd)3sIU>jh@bxc{AA%SFp7X^%Mnw05pG)kYuQ6IXqXG6`4bZ-&O~^C#Kh;9LU>;h@l4!+jA{pU%~DqOR^_`juqg1OXyK7i92v&Sz~;CLo~i!9q*Cw(cCro z95PA#kqaaaY>EzM*`n+TCU{r%$*9A414j5z2iT>|w zX^C~%3Xj(O@o*Q|{#Gb@fSy=?9l!$gw}3(6*Z^aw71ncmxj972!hj$S61K6E&P1Or;Z)!pKBuu?$V4dkB1s^njmh{jR=vPAb zL!|pE0oMZZsIqVd^6XD*ik=ZN!}a(!n(kQ&ylJ}U`f#2N zV9ST0al)qWGCg4ad>k+QQPWW(hv<9w0wx@McMS0R4v6n9fZRagOf$0Hf_o0@0_aOA z${~Ur!On%&{CiEW&*7|OdY>WN^Xw=N8I>1UH`5YD_18r+dT60V-iG-5LLba#Xj?*K zlrzzc#0KC8U{1PUkteTDE{zYiI%gWg32(s)98gJALmX?Gp|~OXD6EGTu^V9fN76Aw z6Kah(+@WrO&ya=_um@Y_+o2Z+JN+vd5X6C`b1lCo288*fHrOB7;<>G;c;1oXl$;aE z4M4qU$taP21Wl+tr_i6YK4+U=mB1y0bpc?3UK>D;;NCW>W^k$4nZ$$#GMb?63++(Z zTx{FIt+AcA!q2z`$__L~>Ep~u4udHs1v!G-EHynOy!7RJb|(A2W;;g8>=w z0Go3ym(|q@b}nj&Lfth6NivNQ!AczCeGmfQU zVE;db0fv6%luc-c<_^#i;{%G?1K^24PDoi8kQ5Kd%_FP&e)Xbyz`_o&jtAto z19XlE&NNK-HxlD|2<2+=I(_9-3*H$<-wy+f`%C@{;sHrGkj5dB7!$JTMa8cfO6fx+ z)_+8Le^Rgq`%-NYoUzN4ql35sa?Qtq#dkkLG_XQ9B^kgN8+q+N&F#$k|ptPAVi80Nuj?8!-ywqkNt<;g!{|4^cgOQAyzt{ipZ> zCLHWfv3OSX4`4uMA0ifK7}5EmYo*Q6uEmYf{9y)U@A0&sG*P0b0ou3Jj_`;7H4OZN z{1GLMZ~T2M@#eMrQ$&5i_r-uD9vK@9(7EDkr7g&wq6<(rD57eIzm_|T#RH-}Xl^Ki z0XBTn|2_=BctPV}!FZ!(2h-W}M`ZRXmJkoH#=sgW7!a!&I`Qg-R6NLd&b6H9TFQ$7 znH-{jU)PM|MNMaPp``6O8V5c-b$t%O9y5s;kYWc!deSNPEHim}Q!1$sk(@nf{w)rX zGREtpT~O(g=BsHOG_z4}xGTxxS#{d?#()Gnzy<>n>P15R$o^prJp3=l0F3u1+|X2S z>(Mk0R8%;ejHxD@j%7EHlRr|AUQ}Z70DJz3r2eG!>OZ1jPr84LLsZ}KM|CIksH)>j zM;k3G8VB&>-9vZe>E-Otu~JGeDmF2p6b_Nn`Vc9pFX4X+24K8B>V~#wxs+fNz!AiO zxsjUQ&Lpe*hZ)YbWWyg(+z!aXfDT!k4zck<4HHwl4C+y@xXsK2A&j2`UjaJz-Qjlecn(ns6*0rZs zD%hiz0RwXNAyP7jNRl1+zk~tE9b$j*-m|w^7g2pn!U6oWcGR@3&S-S|w7mUErJZdm z4+g~SfPx&N%}U}B{TKTJz`)yMUA_hkwe(`rwKN>SPa8)~r|Qf`x6ZAm`;*GgA(Dgv z(ev)V2L@#E%Kw`=MDk<6YP2Lh%fbP{LQ_qP{u>6Xi{7TJ?MMS?X$nY}6HKG#wtCj1|VNbd2x zx-6a}I;0J0D<2($99n7}9cCFX}on2kmpHv|`z~*dI7H1mD z#Vh~+h(pAz|4!)LaX0km!OpLLGbs(bAF;qO;xH?%#J7VZ$<#!1&s5na{?2ZBE? z_L_~y4KVV_n$aMyCda<^Vqw##SpVPH@<*h{gbe4~{vXD`^8=k<-`~~Y(vD1*lEoo* zA${G9Tbmeg>!m*$2mc%Y8%W3;bVoISkFSESX;QEKCHR^O^;(TEtjKF|La)V=*M#9` z3$J|>e$5bG`^xazN8#5r;kCbnUsGdvO$A=NC;K%{4R6SL%^i=p|GoCV*Z%j~|6cpw zYyW%gf3N*VyjH{FwHgVp-IM(qi5ZyUjgPWlBe4ooOd}Heka$QWM(R#pixYZ{ilv0V zAVX}X#t_39Qm+YpU@Y%7;U9P{X~>|y`a0G+_@Day`}G=zZvzL0mInUiJ7eQS4#$qu zzgLeDvseAGf6n%%$LH9-FMIar&X@Or@73F@oj%my4=cU*i6i^Puj}VgG;rt=hab0& z?=oo6s_R{9lO`N@+iBj^&CPAl+@%rYPkLFj%(9a(!A1V&z}7m{j#B6qIc(I*CM_=|MR8yyLr{6pG&J&+_UyLQgZP2=66-U z?ra#jw_#=Vo}JUqg#=Fu?>q0((ukDAGL;lnJC3`SajS>OsHv^3ZqNjuPxJeEopri+ zs3k}B)vNLASCp^n^sMw~PGPXQPjBz1PFa;MC$k?f4jjCr^{Q^y_JlsWezBy<%MNMP zk^c8@@46G5?>6J|nls=r0GxRJKMPw=%Dx6WVR|MJhzOK&y~?=w{nQ9(&*yQB(4}etmqp;klTZ&x)u2ee{;$7`I>3j{9bD-KXg5-Fg4lhQ796p0&O@ z>(=`@qik3C$7{~EiA%iwqwZTrJKGhjijRcevv!Doy?cb8cfWfp1|-C}wOTw{^ZE9b zx-VbGKEAjMJ-O=_^S8`3~T5;D67TSI;aq83k&CKe@V|Kk!c^p}@&!AnOrW3Zd9B$}nw`$Wv*WwB4 z$IbFjC6wJ<=H6%4oQN~ob9(!_lziwlRnseglb;-9nE&Ni_1|O9eS3vo9UoWb;}-gH zi>do>>%YuOjs0Z%_0;DL@4x-{wtbtpw*9?oJ+|K4`XK*E z*8#S**>j^-mWKoemfgSj+&Q^@;nc~#9^H~%uKeQJDdY0J=A$)TN@80~-DR}h;>DFU z=o7mC_-^$3N1kgwjsEcV`JH+8argUHf6jUy^XS8vSskaLsk=MtS}ZKiKl|HUv z{O_E*U$Wxot@+gYaH3E1zi&@<$$q%}uf73sNv?L*IjgzLu5#Yk4A?rP_b>UC>&8qO z?C$9LOLEDB((7wUb{d?u@>c3N`U%BeHYa#ND>9gKM<@~Yq{hzD<_Ktlrb>ID@%{w^mzq<~ctgi3K zIXL@@m)4AK=4~_FKc~+)x}E{l;qNJ)C@Ee9#5_ zsoM_RT=mlRhSx?N?I)=n27AwZzM}DyMlO+^3&P5u?VjNGuDy1Y-_Q(h_>q-ORhkak z+*8%NEtX`C-qf4hUM|GXNq3uDRolG2)n-n9Q2p`USevLPr>c!R{(e#Sk!RDP=bG#t zSv=(G_95!y(-t=0!V3yKRVsj8=cHeIjN!5 zJg5BDRsXoEyb&f(L-N&YOM5J+?7FhBEPb%;=%ZVzuI&i&ZRWQF8_Q_N@uu1vt162Q zIJtG6f4Ca0L?2(jL~ri4$lS4nd#mN%UB7(2SpC%{;lAAuFQ1|_PVr+#T`S%F@OQst z$Md$nODbJTHYI(sDZlgKMBxCZZgVT={Bb+0nNNUT+-1#*SJiLM#iZ>{^>qC!N4@!> z*&|MDSmdcT>Bg(}+2aD9p7`PIZx?H@kn!@4j*RzL?XFQyk+iwEng~_DRT{cUI4fT)w6_7I4p} zU<=#2ud4NpR{iWedk56asd~SFTXi+3MU_{LXHnV4?a!_+bbDghs`s^=%h!&~H9Y&V z^u=hj_wMJr?yqlmjno=)GvfF6Th{!YgKFFcRCfMTlM^t+ z^r(&3t0Hfh8ohoM7Bbj9re>>pan$Yc<*^w1n`RjHjhQuLM~PFxgHcbl=awg_tK90) z@S4T|UCYPst3R%f>UK%ZE+o~U+voOZ)sDi76H7*Y7&y><&f4CSbW#rPoS)k#(`ytO z@w3Komk}+R4cX&lw` z&0Nn0+|EOH(B{sI-cO}2r%G=ZAJoY~wnkId_SNqI)Nuc(CgMkk5s^B7zsM`Mduqw6Tw>PnGPd)3B z#OXIJPVcAJJ5a_an}=NnczpBhSKvHuM5M*~wp)8$?WLO2$YtKfJ3dy~D_fksIM`Rc zs&rRt$1zKoaFh5y*V~J^+hnud6k5}`Xy4qH$wT?Hh zEpzv}R=c}sUFj272W{8B1KkgKuI6svIiY69)(!5l!>^AyRC>Jn^{J~hLrkXqqE$1d zIwC*%?=#&Gx=pJHFkhPAw7Yl8l1JPB?6P&(fzc*IUYEF@s$CJlEjV9IHNCiz`>DM-|pStDO+kBGmQH(cC!e(2}aHBSzb|HeKj3Ql~Pc zzq|j@5nh#Q>wQ;VF<(--HDnb29!cfx98W!{&3)zZtZmykqn^iXKOZ`Gtb3Shf!U6g zf1=42f8ASil9QLlP3W4nI;2fa<5j&c?6~f;ee>R$rjyD{a*GD%?M`v@zuLj2?Afm_ zt&Vmx8+IbMOy!!#GiUV|O;cXXd!qaP{6^hgT>nistIpop{^rj4Hx64$9qp_$E#mL)Erbpcio-Uy2Q|+$&GWiCoHm^g?gD%hT6r~p$YG?bI zv^?3WVXLglz=dj`svbY6z0h)i>iXWJUG&ZeJ6v`s+|~VKXCu>^ohxm7S{1AqTC%mx z32cl!POQ*tGi_kI-R<67HXpBgWz@CT*k-k;IeL0`)m6{b2&-`XDWzK;X2yl?U+2=@ z*FJvCuw&nk4AYTpYOb_KK9RVK`G89w))x+t^5N`(w)2PPxiui*9d5N z%{=kKmbZ@n=RK3Q=FM<&My(zNx{QHh(2zGOSazm6z4gg-mR(cV_^x+*vi{n-T8nh|)h*3`8|E6A z$aQX}(X-{SySraBo3iOgs?0h1$r@Gr0Muym!Ab)rp?1m3n4n+Zn%w z{7`vQ&mzIy=;3eAz=zjfQORs~qGZ9_r;k57*QoayW{j7aEjqQeI5b6Xnqyh)m*t1G z4!`*PV$YX7IgwFoL;6~+?(m{~c<-HtRqul>SNHSo*<$gufcGyVLqF}YyysVSWbi02 zXWJQzoOW3E3E9&iIOdPA&V_~kHmw(w)&AM@6Am^u9s0B9o~qpREBEX?#-s%|ElC<_ z;g)yKwn}$#iTf|dEC$!vqyez^1E)}fTeA7 z8uq@is_n$U8*f{DYO7+Nx2}v+lviLD;p-dqzRSSszfA7AP5fPR_x+B~p7`!d7#{o9 z_THJ(sylNI7TX4SA5|~*^_k_C_2{HW(^h$N46CdIJsUk3?9w)VN(;T`W_rCMEOtEj zXnRs;n9qd3wIv%hyVfeF>xZ*uKDkX?o*&avc{9&<&eNRc%dYj#+dk&_t%E;L zYK*jgc-Ccv1HO&T!!4fXb4u6Q8$mac38;s5@s7!Z1d1O-MwiC>40HB(1u+~{XHe)LGUXoCSxgH@L z_w4^_y-({`?}Nn=t~RZX`b0U#J6BEYU*kHu_<&cg!E@6NZn}Dob|;&Q*x6@z zSjl4Fp~W^oX5>_Ca4~8A$aSE-Yi^iD&*r&<)@Zop-%%a5GxhPwOIkOl{q2d21%!s&h-OJ1Ca);p2M;j)e=G>vb$m9jZRhc$3wHY5@%fy1%FN2_tmW1Cjd@->Ra>Q2 z`gnTxD;T&g?wC*16762qCnAQ&b1&cg;GufxjMbXZi?tJN%TKJY%5I|a?dz{AI_&?z zna??ULaRJpW2Du@=kAW3E4IB|e9Fw!=&Va`>wM=MWho(rJJK?%CQj?`w6a@l(>BfZ zR9+vu@wM|Or*1iqo2a>tId5<6X*|yC$K2Ag@`+0;m;5>;^vSB?B`Qm*Oirn8X?fYJ z;(=~#RNI|)H8oc&?3QMYH$UZjzUglX8otZ-spMVgHa_veP4gSW#`w3HGj)?=jo#L+ zF>At23T_-q@A^wg%G-Tsx6J78esaUsDZN{4)1KGRU}M!|D?8Ib^V_xeR5>0!f?Lf` z?Cl%#Y_jjiQ_~MNuzk6jbI53dKc~sAJ9>{bbqtD6H@O|?>uQ;I;K196nr%y*%ro7W zw$%O{7=GpceCL%~%L7#R?2b#h9osW0?gOXj5NCYPiiwF?-r&b4Vlh<=Z<)KllWrI}WLi5>syuc76izW%=Xe(>1D4sGH-uGGyL zwm0?F-VbXJ#Mtz_d+v$zl{AaIKHiDk@L;>G@t0S9cD6Ry{AYN}UsSv7HksU{)!MT; zU!9uX(7TXqI`q6pmxoFA^VG9d9z<{Q?O1#KUDK0&I>kMXc<@%Q=vvaHOGf4%f%Z>o z&l%^J_rLbAi{8`cC8gyB179yXxyjU2^+6SW08a0F_tU`rZ*}f{SvLFaC9B)fny$Mv zrpGMZ^k~x*{{aK6Zf$E=*6r`m*X_~`@a<7I#22kDY#+RP!tLG8rLWMLK^-~Mdbd6Hu+#qSj+~;U`2p$8OipxgF3#lMe%q&b z#He$Qb`MNE`q`^IxX!U3Is3yrY#klkHVg{*>;330&t4tBH*k={AKQ($8tJ~A7k97L zY)Dy7nfYDKxwb#=x-&mw>}S=*(-wS+Davi^9dZ0(m*lypY8~Us1Ky=^Yt}3Z39U$X zAG7rr^PIk_C&u~PXg@sFtfz(vr}{v`(099>?4GaK?z&~2g?gB8cq`wU%gL?R&bepz z+fE_p?(LcipZ5OZsu#la`b|8)>5L zJ~pgbp~>@~x&__x!-9`!Q`32{jpf>x0iPdvw|Vm{*uVX@Nw?;jdUb!*;LfvMKQ8`d z_4SUUg3hgtc%1Ud{9c=cpW3Blj1K8B?>CJfcKT{Y`*YU*Zf`R@xoT^_mKUr2vOKcf zM^z?;-?-XgL&k|K<~{RsE_!ZkZSCT|?(Vy)n2V8?9u*h+sSZ7u^Z?A(EM%gPaaJQJG$Xxx0s4c8^Rv#J-2q=+s;E~w*9u}-1x6|qE$R* zm)V{)Q8n_|^6}1>uYR22AMUd3a?N~nI7fotO zdPX|hj@@f>eCKmB-`xJQy_Q8_hn5rjbo}$t!yhferrJ$dHs_P)ooB6GYescQ@>~E-^N5$#!2KwVduMOfRC;J}?KJ2D;`jUB)>(;=^ z!#UrUHI090kr9x*yXbn#`9js?(y`@gKWR^R-KDCJ_2hnbJsRzJ&#Aa_@64Hi5Oi}{ z_qp5`r@W0cR5ng4JP>8RF!IkMPg2*+Z~w!Qlb%oS&mGpk=IrLk){g1lmJLwla0}ag z;70vA)$HifmM43@boHvxnEp(svg_Y|t~T9N6YOtI8@=VRQ#ZrNch4r3+Xk<`lQzo2 zV(_Yj$fq7vE7MwiYHYoCR*lUXPIC3x5&m&*z7vB=uA3Sy9$DcR@O<@!9d^xzWOCch z>ES*8hF$i92fD5A-@0^e-OO*QmKNh%&Frx_`P}}v&kOZOqJT9ApM80$qN}>uF8kyk zru|eexN_)#j7qe$7>P3yQa}wCePJ_V4*m{~rx!9oO_1_3>>C7$J<& zNDKr)m`Ercqa+nnkcQDH-3=q9I~5Q?x>KaPy9Mbk>8@wL=XpKp->XHfvQw|$fziY>sp37Rx z^?hUk$_46w<~RVs&|8RiPnFf95l2re;sJ14Vj$#)j#%G`1zvNct)u~=!1=>HcaFaI zBPw$;;oSBMqlVM@%@%;p!-+TnMUWr2G)+D;s^u&zeQ&}7tx(JncK_@#De~)!y;p3^ z(Vuir9G`O`_f^08g$WS(O~G=SP6)pqG!YB%L4&A%Kj^ksP2c#N%@UD0tnP;HvM!X2jKVK!D(lE=Z=OBoHxjxjoUpf*A- z`3DjjUSKTO&bmR zUoe_i5BN%umM|O{OPK=Joc>ga`m%jr>j0?IZ5IE*o?+gpk`-R1fd0J zGpcEX)JvB7el`bP&SeXL=glLCB9!_y6uz!pAZ~wY+$OY z{o6PH<}yh0AL+6g=^5)Mhe8lx`s9NX3L!!_uTGy%Rfm&){ud-54T>SLGrI6aXM&=y z+9JY-{PEx_MPIiXov@Sy85tOx{a#*MT-yOFp7b;+NUQLN(+(Nu!{jfLfgzyvqr)eg zK8L`C^)K{EYlr~2rOSwrT?PD_p^b)4#%uMd^_CspGiH?nr@_{QiIhBx_g;o{(ibM= z?w|%boN_jwlbH8hT`jX#j+hm{8P4!p$Dd8&%yKZnPur$$DtuRox8delZL~KaX#+p; zNrgOHc-yF8Pg^yd-u~C)z{q}454_LEQ(mSFz?-QUB##C}b5{K>UDMXK|=~zQy|H@zx%%3&TC%n`~@B8Q@EWXASwE969wlx9)H9Y-S-I=8zvR zicT=ZW?@fiYax$@YD8i|`;w?Dp|+MP{UCxi^VgD3fs$+}Z8!<%)V~Y|6Po@0q!A$( zdd1D5EQf6#p~_0gx50^CyybUpM-LVKnMu5Xgbob!U29E^fiwkw^KWou>nJ;V2i-S5Dn!@sPo7(HY)jX=2qnh==?V|St{OC^0BIM)(BnD3Xsl>p7 zCnP3`imS}(F|l|4s;5jDD-2mPkgqK@vyJ*UQr~-lm%@M{Qu8AHsAbW5?lL#hC?_b$ z@Ff$=N z{+9f3$d$awsH3sOiU@n~DgL!*LW+f$1~P&fN!|56`-9B)xDrh&=A}g3_F4O=VBLzT zELS0To0*9+O5wiG+%!KnBnubXI;`_tbr&H%NDtJR{_BA~gHCt0NsL}S`yR(Y)7C+% zjGnUa%+|0c&G{Sj>>|RHmn~47m%zt)O5~nca$?E`;G}~-ax>3qP3i26=P`qoCHO@%G=i`EaT(q!`yk4rMmjJHfZ%^p#-7{pQBj&_kd;& zQG90NfQZGHY5PpP7Ur`!@L2uNUoe~WC*N*+V*!P02>e;|g3_y2++??nKNDA3+?O*( zQ5cR3{S_H&MD0jE{DB}XEU6_^-PeJX1yg2lfI*vAm@VV4ffG4E0NlLVb~!&6D9#lZ zmyFQ5r8%+BsjXPeN6x=Qy$FF38u4D${Qp}3o5l2K*V~@0Wt{FvIekV`&2w3QY>aX2 z{9gYA_;l^;BEm)u)441BUbDy}J;m&Ft0H{@wsX@ricyw->4@8J&J9tUkz2dM7021~ zXh0eP<-l`*5&TT(@2f($!+Z`Mwx>V?jn|JKA!xvcAt!zc~V7N!x zV;?@nmVgINMt?iXyHe`L`2o%g)XKidW|9Z4JTF{Y!C(95gM5~^iVkEn0I@KK4vj$fen_M<(4y6BS_-BOCUv0QIMr4f5jcJy3A!Kd z9{kV8-e2h{rCWQW&%V16o*zQ}KHl!ULKR@8k0U}}*AQJAkbSQU`toLb)3g*12H^3P zkf7+XzE|ne47O_juHQ1DFCJ)X#~q>Zg;B0C=tx^HQW4jX|+# zlrqX$DI}ND(o&#kf_5bkS|zr^2rI;4TMntqAFT-TD+$m*d81Quzx(=JRalBNMJ?n0 z`%>xrTptjyqAk}$yghsf3?EMI-!TPMZrSseG%3r+W zZ>tn$r`K|`l2F%)E1aHG_L)V~%Sz$x7_$>`wyUCFPw}rn&9>_`YVvVLB$i~>s|SOg zeKa>$S8P(jN_2mCOV)Z6h=qx%+#jL|JUn?+m^Vp8ITsNJUX@dn(k2s$_BXbP{8 zbo7Sk*R{9PY_OfYwx>@Qd$2w*v4Kc8*<>Rc2`TqL*^rXTXU_saNk&K%^j*RmDiu@o5z z->T~5droH?;;bPJLgzFwxjC8azfuA@ll135S6;E~>HA1S1aXn~>0t;{+sA`;W6Tik zhMspIZg_{}g$UtacaFbr9=B#rE&jBiwc~H1#cuhY@+yhXC<6DU;Edq$B`co;YlTK9ZX8_s=LH=#o6*gK_rewVZU61EDXKQ#%GM z7Nt(MxEJP~QrC4;D1(w~5A;S})3v_m_&k9fE_frPYDbX(#;B6EPDii!9WQ;=^Urtw z(2fe*`QZmdkc;J)=Gx?`M~v@0ar4Jdx+%8U347~0&a#l8nuYRHQQ+#VIbKE(R~-uw z{>-znGA{rKoon0UC~XmU5!OQ#nj84zFfPN&)QCh+zQbu$$ev6Qm)Jx*5{`Z)7U}!VW-aVZ?9b5z zkDoP}sxWu}e9N&mj>-%GurO!y|6ryXaJbztwBDb5xA0g);8aRX$1e4szlV1Vmf`4Y z)(ll;CVJw_h`oB!-KN7UHuvvj4M@6 z4gmTk%gWHd)%C+p)$sWsT(;v88B$V^x%~+?!ditGfbo z4=(o`t0fXIyVh6~1HgSjSFUILYgl0Wmww#4L@lcNP0k{pl}gC0B#O9S8ia^+=^$n@ zwdajN|M30&RX!9*C6836V$tA?dkzQ66>}8C0IJIlH@-n~b1QMkf-;^wG2fd_sJhSA zW2LBb{ml)OggOiLT1r}HfBb3)zbEQAgCP#SJDu?C$u& z|2lKvxa?uNHh>~1uT(#3RQMv(X@l@~o4PF8SBMD1C+`-kfX-R1n_F2WRWI+JmH48E z#4?H*FzM6p*Ib6?UA%nyqB~PYai5Q7uCzO+^j5XXN~6H++A|OwU0qz_4r1~MV+KGX zUIX#SUUI2(;C=JMXNIrcNP)hl1JK^q2uWJXeNxu4(|;cBt4Cfho%aJ?@pNGML)rTR z3YAb$VC#|;kKQq+i)yC5TtLy+ZOKmlIc-*j)rFZJ?lWC08VSb&&C#om3XgRI@&^|ek}%#3R}xs-3jTjG!avDM1Efh6^~?$ z2)N!r9Az%7EF&9~TQSH*R%#Hew=#P>S(?%0Y{m1B-{#AdJ}er`fAoz#t+p6nzc(#2 ziomuakc1=8`A=Oc-O`_i{Fj=EGFR`l?f&q6y&-OCwv{-*P{r)|u7Ps+$=!tmdo>}a zm5hwT0E!Wv+9P5F$j+!1YF@}hn`B)rlPEP`!WsxD>j(}zBgJ0^EPJ^ao<`1HaSTeZ z71@U0le-JZ*R%lM)Dx&3@R^x}>}Oyc>5$KEY1X6%cGu!IYG3(Q;I;LvKkCyn{ps3) zN6acTlmMqqc4~F4Nb%32zQ&LY4{li^ck@*2=x_yGD0jxhN(D2zB7j6xF;Bqo9k`NL zL&TQL2al7*d~b$vJ7;$&p_4_8Oio&!Q2t^(dUkWDRkIP_pgtlcNx!vC8274Lt^Ot) zm`1eK0thw!x&<#;8TLaV|ZMDDy65q8SwqeP&DAh+{vOh?0({< z%8RY*U$azA>!w9+rzG^JQd2d|x~ukmjJ{*Fv2&^{z@7?nIppWtL~eQdI67h}?cPtn zsAJzbJv?PpeB}3ifYoXjGRotD*KeCPCrstm;WGe}YZ zFEC7TBR0~S>u%ocDn9+7wb?diS0_6&Yl+@YmvFxkE6ZhH%4+ay&rz0g!n&Yy5IBJ6 zg#@V1GrbaSR*YmP(5M#5S-2J3SP)d%yGOj(6 zYSN%!Jgm^?GR_=Rz>e$%xzo`{DK}|9vs?19f<=8BKJhocJG&OL%lE>`(rzzb(rpNs z`ogdw8{rQ)E7q3SsdoIQKk~{e;E!gNcKnC8NZ!(>(5vZ1#6?}PNvp6=x_H&+LWW2B zIAYZVMi=v8*IkcpvmTEr@Q(t*Y$fa{c=1&KIMWJV88-%5Wr;drW9;|r?RC{*>LdMY zrqqy-;H~J+Kw53~kp!8y-<36bqj)$;@#JWpITH`sl4|N!n=EV^?*dHZktQAg!07leKrzAj_fJf95-ZFMJVtbu+i5zf{Y3w59;|# z+57iqjM%5AzSHgIFNQ1Me7l^`&W&UH8ph!kV6LjEX((u(Cg_jZ+NI|Y_5#fZSOKWR z8f`A;MK4>{r%-pgfHdcVLM<-0;^-h(&G_Lx%eYlUN`|ToEVz3p;5}GTvGy{}j2UY> zhYM_HS@f{7nKfMQqOe>5ql%|_S&Rs0R$+gN7Vyp}zbRk_oK7xSUIFK$0Y5(mcU%R4 z0k5`zY>I3w-H9BWX-}23SqwD~IrU%PWJRs<-|=i&);{Jx{{4?CIs|OrJ;cNbDubTb zH1x`6fB$CPkt|FnU@>iY`vaG|%t%;+ipe}_<`)rCRT-p;F!h&k2O?qbC0_^6w!>Mkg6SHC1IP0{*yZKe-6wUZgD7W7$B#U$=A zgqQliX^GNV`V1-~3@s`2=wN0A>B2zbln%clHH>%gbQC4SJM1s?E92ozPn0T86`|~yI{31jg zm~@^Bpc0C5PP92P!OsZ5~xsU`;@LhSO~p8`ENQ2^AGqxmD5q z3MJRkOcp#cZonz`vw5G0?6kC&P`B|Pzw4Mj#UiY$ANGO;b@-Gd{cYKs`qEtd!_9)x zNldZ&H@}D5KEKRtyeZga&#MTpCA*2~~554{Jg)aeSs z;58BFsFBdA08!p3V%C_(3V!9khN7~p_`xCLZLqcpgwbS*~O4^ zabGVVfOZnXBxj7DRh`gQ8hC^fHbR{d2}TOo>3QFGGS{Yj^8-wEfTu*RArAtDKMl$4 zP+y$o(&&Ff=_G7bUB`~?__zk@I<3^E(z_#bA!1s7DCvAsC6Pf1<(ea z8i8&d1|LU=SC#}u$^bUpI!o`IzqLUn3dsk(dz_*z(0(!56(C4)rFmZl0ZdMfI}YGP zH_&)P|Mg201@0R!hC=Z>C`Mt;*K@iOjR)Cd0UXZ?mv|<8NB?DuH^#Ks6XO1)LKCVm z`ZlzUP-SF%l!wU;KQ^JhoN0zwQnk@MUjH5wTC+IhK+(HOKuZwrt3lRLQO9X(6ly8} zYgBM9@APCM5d1FpZKseOPp%Ua*?1<)YP?`AnUu=(R z>gMmF&RZC(l*tFaaslEE&$6NpOP}IOF7Xj38AmokDL(X7E5cNcuZ5s}Iz8&G35>ov zI-Maq01Dx-ys+z*SY{LtJ2~9-qS@h`P@__l7M&GfbN$TPNi7BZa!6ACRDzi7m#NwZ zD!+-{vhME8=XIyj1C?HIUzii%9ayje$BZ$)P2bXRr+PY6zJ9#x@QnvogG2oxU)I8C z!Ak7QmjeBhPk_2jU{0Ab1m}m$*|5-58K4a)>_C7^ikGq8f7;uN4i8em6v zA5!74NswbH7442yNbe0bIPUy;zg)0_NC?8JL+3hb$f)OR^}%=RM3|$!>2jm66X_o&ShVW1r$DU^ds8!cksPoAKg_(1y)rf=gv(c)Kgy z;gmgZtr&-nWsUcF<$ArHJ1X{`DRlnLv53H9{>*YOVaehC$?78D`3^$&0vvGCVaMf@ zr?aap8^q;yAc{TiO?a$oC2l97UBdGc3opKkC9Whhd2fbBlN3)i98ZN!GC>ZBrNSOb zXs`v$o}#x$pgV2ebN`bsjKQm@J>MG% zOW{{9)uuy>RXFk1CViuasnmkN%whdP6pWBLE2ZYEkNHzRdy#X?C7N+*=O3KN%g^X2 zD~4hjeQ7llzrQFf3|E{~dt$)^#7?pneUmztfc9bmRv!*lyhdY+>iLnfN75~fh>muk zsRg#E`Qe?Au7M`x4jpwB_2T=<6A0J!p?{v$LdP^^@XjYf9<>jKgK{4WoXoWc*7!t) z!W?7eha~B62@ZVFLw_n+v>pt?_v=Z29FXs_rzV+bKG;&r!;kc&=z6A2ohFyq-+=5> zDC5w{)<+Fa&Er^nzC3Nuy>? z-vmF18>+y4-P2B0w@$HeHq7=x8q_P^_H0tq-k2BE7>g_dEH~yHG^>f|?7C7luJY9u zeq@=e#>hW=CQq$uH-(KAlkaIm0fl%%b@6=+x`^X~#56jg+}IHd$xHdn2$BZm#Kn^{ z%Wi`ozR+8%Ux~-4F&_>T*Tz^Us4dv!88(vZqAkqa$F=shMz`EM?X95h9pDME7L1 zzoJ0w&H^M)8p)j^3vz5EuB)6XnW+x%EjdB#CArFmv9%o582S{D=N1wV7S*myk{A?Z)zg4+rN+?5b(RN&<~D- zu}DpY+bzqva`oEpYRpmfCn!YlnrsNm@`uMSe~M|*mKr+Z&O+O zUCXAv>9^e0AEb2OhXW)1M;l!Zvu72C?XTpJLL*C|CF-fH6b60O6-Aka(FgMCN16$? z3FG8Ybr4Ox5KZDcb_I32ZG$A{7J!dCjvDL-SwQd$!JRagm|s?|n?nZ6ok^F!D~5d9 zA5nSjy}J)7b?siJLT_d{&r?MIU_4Qjs)-od=G{saC0LosGgJ-a_Vp9WdkyNW=%^`o zU6VU1oK64YYo$FpQ-${fb{l46Wy$Sfi&)NFs|~GGed^l;`$(>{?v$wa7A+f0{L;Y<26Db40eGVWvA#&JO6jXE@Pq|N9C|_aIxy_>i!p4`m)F@d*NPxO ztv_EK|A{PYQ`ST8W9n*qy7m+J*u<1+IE4IH>w zF4D&}YsYaQ^oM4Qx3=9gum!zu%>!7a^hc)QJ5L%a_#`tcvbDB(9AND`FFWhE^DjVV z&3}&n923y~qF7ounuu?ky`#?Jd#aqUjKoQjP}fb_#quvQ(;*yFXz>fnyS+2G^ zSQfB@_}T^q_(8#grbqPlb@8KWT{4!qinzo-?pnXBf4sU9+dAZWP47YIXsbe1pQABR z29df9C7lJb4XB$Tx6Q)ZU6;k80Ey;(?_=Pa&YBdk?7~JvG0|2_X9yY$AnsD8SDioA6Py#BSQlIO5f&&fb%+o|3 zJ@k<~5O!|1HeZr%B&1>&lqij=oul%bwW!s5TQVHw?dZ%+-UO(1lbPW}$8cqe8&rlY#42fYR6qxYv#$CIQ#BMCv`r;5YGUL>xJ ztiXJX2|Mh#ZTknQ{fC(6f?PHb6vXr(yEH?rfF>f>8fH9W;}g4Q;tE%R7vgd?hkb7X zP?uezeNm0k$N~;5p1K`6?I@0@zu`{*4Yp}u7!}6$Me*$0=i0SHcTHGy-ApH7a47Zz z731ohkJ`M4;y!*iGZI2YFzUJQ0WsU`lezU`z;fA_+7H^jqI73p4juBK-{JoY@R+Y# zIU}rz2s~)UKIkK-kKg0KTazB;tys4O0w96n;!zv23@QG35&#c-SVXb*RmCE#c1)IX zmz{wV3orOgGX$)#V%WIyUhXFdZ$z&f+AjkN=WgQHVR_iR8Gb^@Lrxxb(@4sCEdG=| z=PhovXg#;>$)J4y@JL`~8MLE@+wsP#bNDCO@(R<2o;UfCS#3Y2Uzz2ze+wfZoTw>x zTw(q$!|nXwMfh)q$ifzYAgr#bYG76gFB~aXVva7fkkQEt?U&X-ki6`DuNf5;1OCZI z10=vI%gn3z3aRz&{Py|vuO~x*TEYK+3lNEQut#0B;FjyyvA9r$=kKye=k>7x*USKL zB05oH6tb3m-3N%Tm?I*m!Y5f=c|A;{&F(ibdhk(T_{ge^~gT!v~17;D&O}!>H%@Eg? z+Y3F}%>m8(PbanLKwL7RFk^?%5^_4lFJVx8A8VrGakGKeiIy+*rjI`FPCu(;?dfFE zR3X>xG>AzA|NKU6{G(^bX>i8Nw+6Ij9xS6Ex+tWHhX-fI1qQI`^=kh5 zKnl7XP4ZZ=sn#M>yzxOFDzw5THIx;&T_5hsUI$&BIM^Op3hDr$?qaFc79+J+PcuG@ z5M+=IU@Y4oGZIcdL6U8D%@4Tw!M5G0N|Ku{XbrTxi*0}AtPW7zgf=a?#_oq+t#p5dT&L^JZ zm7RKaX{zdI{WtTUv7?2P^m_Vz?P=YZHD@eyJqz$i6CaLqc+pW<0)%5U)SwXCR2%Xw z%)IgJ<8KR5;-Ry-k=pIoT%~bzzt$a>U29T}%DKRH7F10KdJCT^9%1WH?mv;`y4Wf7 z^Z`m1#3Avr3}e4O%?eF_`^>NN>1^)XZystA0GGkfwT0@k2TEiDib3E$;g2?tb09M% zcrd7wTIt|uHCahfiRx1Pp3I0oGqq17a3cnJ<+f?Lm91*X*p|%#{rux>NVt>aGdk)< zR+iiKLRS*`-bPi3X`qM3Ht_#0@c+6i+99C;THG+qW(VHgNMycIIF@TMN4o`(e@~iF zjZkPccvtm8CqSI{gB&2jN;}ZzWlmkf6W`B~lXF4OZjp%*>7_CIxOiK~?z(C^Lb@_e z3b6oELx72PVpS}L-|USmQDJG=C2skkR7k57V<+w$SoFE z`viuyBtSJ&^T;6YO45M^#wJe7^{WJ*b8V)vz{36;0#CJV63f8EPU6KkDGj&UJofnC z!9U1asG@%wBv@DCb16luD#kO_dQunP-8|Xk3}$r2XyU$a<);rx!Y6(1Gju#Owy8%u0h}D0WMY!_UYmGoJEO?~7w3H89Vb2VnFf{NM*XniQ40{--RpJs z$6OWD(DMS%uTDB|?%(-!B|f(o48CBO2h|}fNs$YVu3-O5@NGvYaC&-A&J zdT;KldnMk1RyePrzFdafN9-9BK$*g^*MxNgiE{(DNhA;h98cHQrAYA((_2Q;Jl@Uy zCN*~nJ&W`J4U0wv9{4bHRAfDCD=K-Nwc`uc${hj}G$jA;G)eW@Zq~nM&qh9P;F`ck z8J*cK*;jmCfMRtRYShQHjc2KVjC3mqyyieSw%O`LnZW96m}Q9H0)myX9bhA5k1?Av zmCQc2NJN)C$u?Cj=0BLF424B;YfvmR1U?)OHA=7UVy{v`f8Pi44FU4)P$FW zICA18TNOrQ`YZeH@XP+-F^NyG9xP*P?h|=5wBWAAY&e9wr9!27)mcm`LrEFW&+94h zYU;fp4lvlr==7)?RjT>HS^x=I5-@MNI%Yu%IcryKckF<*v;1Y-=ybtPNN%-@j1K5be`(Is*RQf5!(Nd9uBkF zy~^;%qPp8NL%mUoX9ga2N_IyX?TCAmrj6%H%zrgimNtFKt~M<|l-1W(G4k6r|B~f- zzogZ8m-*bm>9g2MIUiNnh_K>Eir=-dbA>~(tt>P4dx&<6o!)-itlVPtzl-mU5lPBl;*mDQxu}I~GfV#;AV}0LvnAEgS>l zTDHsuVF18%pg6C8e)FZ`fX~D81&@k-!V;0Ju~>lP5U6VSJO8vil^@ZgR?TXK`;UGr zr=~C!r~Rx-V_Oy%vXV&wMT81$jJn=ED=VCFuf2ZCq>iks?ysQdfM=X zyCl25s5}Kw(a)mrtpEN>gd2lE#lPVJnO;Xsro^-z6Bah89SEzSz9|%e+X9i-zcxZ> zVId`U`uOkN<(r5t?%ZeQYM4$Nw%km0-Ihsz{OTW0>LgblB_UCN-|FfRAq^G8sJ--en3Ifq^Fr8&ajT1)$#|KDmZhw-$iSL!zYYPi1#k>%rt6ZK2GUA z^?p^68=!ju46ZN!BsOkE@nYQZAlVbTUNO(K&DwRz^GA;YtF!lF*>VoYVvvSw_yCmj zNuWi+=}&Sj<Gf)ikFVE!*6aOfp;AD&^Fc1RGD%$`=g*sC+yv z2S)D*fl`nB4Lp`DohD1YngJ@gMj|tNa>?~Dc|6V!DT+R-sh?BA%qnUoc5MLwlqTfc zo7DR(@zz`7g$*h8>B%|f>|2N9#K8aNOY+5U9Ll17cp3c*TmGFm4dM;$7{9qk+)CB| zmK)LTW3A?hK~{$ zwfOQ#mf8yDj14syL=sNO=%mzCb4@#oUd0>J?d`2%rmb#RUs*6arw6Lw{X z|2&d?HsLP!1^FM_C;Bmfbqm(7m?!0IEU`~mk4F0`R(lAG<&nwB`GgzC;B-PC22QqJ z{Wr&xBV1YEaIq5ly3=(yg-xezW^;k5Y5XdUJb3n5JHFMmbw;qi;9^?^Wq`lBQs)jU z_luMW=&FPQJind3eSDTCjEagf!mNMkyZA6&h2yDNo zy0V}zS#LBz0C0!X2u2Q07Cq>Squ$!K_3qy1pbVlS?N^|X&?I0$8>KCt6FlL!%Da#% z4ZF`NtiBRIh78rRi9CdWoS&dJH|!(<~3@At9Rn`qLKG8;)>pYH_;^YwkPziTt8U|IIe(J|5d zZjP)|z+B(^QNu6tNsSHu_E#;`S-dXX9n+?k|(NZw(wY`;^8_se4li2hsauzZ=pcQk>(laa`rPk$Ku-n+U($9P*7jR4`iDU@S2W#YPz@Lttn2ijYlM?>@llN4o}-yQ8*n zhNL<+_5?LKfLyOiHA}}Y?q~oIlI>~gfA~U$UpcL7Ww~8L#GWuMjPeQ*wt8yn^4<+n z*S*82Xl=?cx>TS9>gkyslL-tT$iykG?JRl=;z0sDDd#au)r#;*FZ@)Ye`2v6|{C)It4b(Suq4(0g>yzR1+4frKMu`;&iB_5=4V5J2P zPyC(sTMlLHbs;h7L@f`;XwV~LSE`~Ua^LtiaVPwt$bDMM{&uxMu%oDN4|kXrV>}!f zoU5vtRc1($qGRyHt^(Ft?T$sp(bMEh5==KK<8-+UvQG2uEPou zHR%(H3G@_Q;ei9NUp)Ejs}axeg|RIX*T$4$UomM!%!8Rz?Jlc|_@1MhTW=vAHFEd+;d% zsEkW`>k5^QJ7vwN@tM(_j|9QD{9@pVj!r=HjP%UsBYNdqx}L)ALqmMf$g)BB!5jgF zv;`B7XzE%wn;znVz0y~L^ZRU)rFKXZOC~lmzyOlL;yWRA$_y|O`5HqWA5bz^zzXcu z^aB_>lKp&#YvDqT3joYX+Ww>U+om2Vf45y}REPYKUII>Sf+hH}FP>$R#KP)aJbkE(vJjSyG+oA>J4Bhs1f=K4I%$m9~@6o`8QES9<4iT;YND@@Xg zbC%T!f{dtPq%qlY;&bzZxv;5umnY`cF~!9dxW(wvV)xx2TOn9S6uNA8z0=w8ji%bS zCWb=s7aLdlWcfn&OjJ&CuyY}&r61yNd+O_I4(hX+A;GB_&LMs|kM2a}HK^E}O=p1)B4j;n@k6)YxN$ z%dWV^_5a#tL@$_Tn;vbSksJGq*^7q4FVPa zGZ!Fbg)l6etmDi2qYy{-@{NSnBgchf3ggGRe{Z|^eW!w54BVdtA~>36Y2UuhJZYIv z7P$m;o&Sxn^`vd&P%k@fY}XKXz&YxBRFftGfXSF!E=Gpj{Og>MvXQc|rqC4M__YN` z@3+YrNIPlMc#_6f6xHFV_=Amcaae)v#V-NZ|0G`yqC@b&?ihY&IFwytCF1W^q;lB45zgEvQc`O+m z$;ItkK3~t}{ou8=H}Btd`Vr>~^Xr;&-;F)QhS>3H&(w5G(O+amIS>#mL?=D|0rNZZ zQevw5AmF8j>~A+_6a%n_n9A~64(Y-*{f*-%asvE&pD$x4?X&<2&UpMdSUFvKci(2y z0}SOY6ZuZ6Vp*&R;#%y_Zn!;DcohqHIQX#fw7G&=#>g25lZbL&O*yx(AN5HxVbeU4 z*8XK^dBGXJKkr{I?3~3dI@nYm&D?V>+T(;=O+LGhfDHcDth$^Cc#r=zN3LEsnSK!` zgL6cP>;0d^=m*QEzJ@_d@}P4P0EAbd8M6MUuY)H@&s+faY=L~QrtdG&&q2~Y{Cgy0 zXmqL<_Gr2&BqwLa;fxPfb|v#;hMl6uA{M>!S@UD_FN-I>LLJ)f6`cJ@AtUoe58|nG zxAOyB;F`hc09>g(8-C;Z6zS94Sc?wV_~QSzOpc|a z!q%pO%-9~(T4QC&ZJYdB0WxyHDCSMO@6udfi(42A2#`It;z-i(G@yemtrNHj0rGX8 zvA(GuuwsUDTc&`2@=WidyYRY*#Ly9|tTP|%vu3_*C$q0i9L{=AhZfWreI-90=oZSgOe9Lr z)&zZ!2k8XHfXSNIcuIA!qJhQ!bnA<{qB;3o##R(%YzZV#aJ@65$C;Y;_#trw&KLn@ z^nw$mUz+frl_&#=K_W}%BK7!E{p{E4D4WF7MU9T?)w0P_gp>exNQg@_0e{o+chinMg6yaA=9q~Xiwx_-ZNo%82;-RIo#x*yNib;~Co2I4O6 zTHi8;0%t#ORFRvh%p@hN$}m-1QB8Yl{r6uC={|pUwuX#q!jA){&)twnM{W`;xE1ip z*+U4iHoDOo2WFaTfCK8n4C_NyZkyn*w;y{KcRA}hcff1%wsUzM_})%3*8x0Cqc07d z%G5T?)pe{8RP8f)HlF@DbeU?ps;V8qN~q}}Kwp1BSI9$g7i^A4bI}LWer4QBGLs|W z!M8&8DCZ-(UpA59hQG8CX=UE1pM^MG+!YA7Wq70}u{x1X#$>k@C&K{)0^e}J5-7r- zM1-d2CE(_kjBm)@(7G`bmGyV;r!@8nE?t$QpJ_E^+OeUQ`*(N-Q8N_)IGPFj2#1w# zJC_E57x{sC5yT1sejpWP3NT;w_2R#o6wKAxx0}c=Ij%RxADz6YSr|M=119VhTGrFB z>19@IGBU_oG`mZx-O>k!2rWL;C)Mx1r(d}{(Mr>MUymG?w!Ac_H(qS1FoGia!i^|@ z9oI?Uf+Z_4&A(grOww&xIh$cNzooA(tepvmK}OH(v(H$= zP*6u=Z5v-Nl4d3)zMq_@&hVcPdy1dgXI(#mb-I4qCoOUL2>0bI3UvKPx4qC~D=ONhYE^`&0 zvazhdKhF$)P&UO_am2IMngNo(B}nEf2>-F z45|F+AaYMp?NKATU0jaVYiBNQH+q4OCr6H4U%j1iBniVfbN56~=H=Yaf6tP?Hk7>; zs3|Zz8}!U*63NKxKsZhhXBK5jWGMPt%QhaI7XR&?&n)r4N2e%Z$ZZ!Xud2HLI@SQ! z?NTaKxgaKhHk+3T+f#=^8vZNPOCw*##=NNe5w&=+VbR0}XKmBAIB+`ugf6mz>|Oju zDnMwX<4y<88|N_+H*WKi=)}dziR(tZaLqzTsnbJEdT0NzGGmx0vSvP0TDp{Lr4(eB z70m5dJLL2uI#4I?=QE3@5cNzV=ic#ve2RQF$2W%bnYu{-=TtiPZzjLng59~3$4(AF zvhm;b22bq~f3aB7K?yPsxou*F(c#tOlPXf%(CW-*`bR2ae-#cuAlq=))Po zRR1>Hx0hLaXtk#$;}>+lgRnT;K}(^{+o7rSSPJK ztdItYfITkALK>psB8TM?EeGvKDSlzjx=?~4CAGy9Ytdcfwy(iABMWq%kPZ*EKp*XP z_h=~WdY`<#_2_hAT9aC(qCg!Eo# z8m_9q%5gBant9?Sf<-V=J$qLIg1{)MG9n`}6@M9q-#iP8S|7Qb#t1(_rDCJY9-#g0 zGA=%6<5y&XC#NO6=_29_YY!7|jv*THfzf9F;%>Rc1H1=+e|)$+M5EbbE*;6?#0@t& z&Va+Je5m|qQB6M-Q;}4s1H3wZp5Jd>GKDh=C# z(w{n?->?@|BA@{^WXP(T^ik(u|9Z(;=B|BltMtT_9~g)45Z4y=x@ITamZF4|RL}5P z3O3+z*E0&pABW*2*Pd~Z68Dj&sGnwD*k%v&!KWbl6M@nv&_Pk7y9WYcW(^7@067s| zzYJ=`)Y^Nk)(P5N?_|O@lEHGI-s%U(fxaNj10ST=)jBW7fK7MNVp8G>Z*0Rr%PfJ&+U3P8e}pvH_%SEW@Xn+#Ejo2jLF^tNvm3FsU3Way-~Ycx_DCUQ zN3vIlj3n86WJR*)wf82nD=Q;AvSmhO?^RjJ-Xvsie)rZ#A2)7%`t^PHc)R}4>v>+! z^E|KfdY$urpQ|f0l6E^qW7<@yp*zrQAf`QA@+s35Bn(dH$2R*`g$0Ox9FoHXv{Bpr%_AUxvzDhzzs!Hpksz$|{Y<4t0QX z-e@;Ld%x{wecwID%hoWi#7`4Fy7-gIaq^QBNGl9)p61 z@o6ylT~)NAaCmtbKZ?`0H*asly}Y*CsYWRE1(z)O<{Wb$@I~$gb;7tzU?GubPl|?% z@lCc{@-%XyaPsXwCED!;N$)l0{RGL)UZ-udl?6=h#Qr zTbU=o*~OP9KJ`V*@Wyt!}5ZN zCN2ysf1|ol;%GD?S;yB_pb7HF^uhqcp0OmuycQR^s;fh(kHR<&s^%r5=hE$wU&p0a z_G0g4&?l0{hyk%;TVLWisvTUuC5${L6gmBJU5_i6{tmoL=>OVnYXTH?BQ-tp8bE(!0juf_4{j!o7@qLT7DMc59(M^-o(@AEWu`5YJ?pkmxBJ)h$x(qOME1b7n*X^e~E z`n1t4uDd2u@l_xQb;MQA1I+i3oc#s1aRmfS;Awp^>4FNqk_sgeND0 zAZI3^^GU}Mg z>NUk0SiYZZapY9{=;a+D;WYO)wI|hjz^lC#Pwt};5&t!T{U_dh8+8}q1iT)LRn?JY z5hvynr6ZnCb!myNPV%^wR~Hs6m^QK-J5AlV@#!7!C+qN8soWBVo^^)TiBIntX>@tY zBU%$y)LdfKLFFE`A@yv9O>ggSG;mT4He*a$44!ioE!eB|c*ZC0I|CF7(&HRVwRa5j zaqIhJWz6Mr8-q7v`#h1*u8SbWFyUuJ?K%4%63>oG`6^( zuP?he<9*ZVsrMxNL?yF*_7Xw_?AL`Pg7w^U4xa8(8#blD)K4z+or24FudlA6kt#{b z0>&h1xo{cppa-toR$6or@E})D^~KE%DtnqeN(y`x;t}~wu2T}8jcghtRmn>Ly!0i$R*2~veXUrZG)-@ry=dt`e%0`+ zo0m^a(_W9*3rM0< zzV#1WVNNlWAQ0Yb#zw@R5&cB0hTo_2Ij;Y!zOgZfa+4p$xZdoNCSSH7YQQJG&2a4ULMc8$ z{%xRBQux|89@RYU?ruw2>?)ACKh&|GiV_EmAKAGcZEk4so?%vauDWWr{__aqISY6N zswwPS`*?P9-?m&?QB8O*(rXgCv@%dskDm9e*&$17fBk`g`|Pj3I| z9@^p{(%W!Zlt+Uc9pEQIM14}N?s_nN~nwC z?LmdJd*iA~dn9H6FSmWO$h7%uVQTw66f2g?-(c5@f&jfyU8FgsvF5ivcC1xMd8O67 z8=A*T8}plCH#eWOeLm2#u5b{dh9#7x)_ZX4{9|UCFMZn)aopOUrB&vA zT(GUl)$S~`#f%r}JEpz8?*|Xr*q6VixCc`()hY|aUeg10MaQ%P|-)~=iXEwPcIIk6T73^%gF89@dzE-x+ zd+UX77%%4<3Xpo*GWP4@0oEnY@`L!TKy1dcj+bF{VhGjD=0sg&01BVMA8NJD{o^p7Y8jFhs_rEKx>N603 zg_#EH5`p3hxAX>2ycvC~Z4gI4q~zAs^%1#E0zzp4pe-G4CQ6+LPbirvOLtKMl)&Ye{jU~3W=Bn2zuN6op_G=D`moNGO%(QRMEtmj8WCS< zr`hGpjb%kWkBHpA#sJ65_{EVIKl!YOd2UC+e++&8WC^>4dy1!L)^CeC>YP4@>Ft2a zgd>eF7Rnx_b?vHzT@IA;waP$E(%~gdx*1Z4+!Z_GDVcTO5|y@&{uAo?5BJ}d%QjO- zktGsJZAj_iHZ(X2pgrxC6`FL;{-$hyd3I+9PGR)YnweVwzY;eMdhU!nk!Lj0(;O!0 z6nW7-BPq)OiAxtFOr-_^0B@CZLD$O|9f(E>gDg zHy20)NH?7;7k?)d+?At?;~dDBmhp;tA|I2XNLEFcPZM>o#`a(#7XAwMP6zXnN9iO! zrx$%n&;z^6*C>n9yNnph2NOWYh2`P8Yj5M`uai(LJ32|V&6dqxN)iN)Vnngyv%&Hs z6l+#BtV{N)i1kgciC$SjXmn&|NEhQe(B#bQiymn5T<=X$dMj~dyaTju{>IF>!nyL+ z>{8Z7jPHn9CF3)_R>1a_Rl8GXw5Ngq{oLnIj+3<5)wz;rI9|*w>K1qdgX0@K8DpQP zX~cRRkoUX@uJ3E)aLVut$u3xPET%c^_EcA{=Y_-?`l}LDX3_4%-p-ufBv|jOH$-6p zlr^%o&faM<*WwH@wK&k^R_H^@RepvV6h`JF{YXgKJFA3iPz*i>Z6WCz+d~d-=CVPm zol-tNnLJA_(@^yuZ0tk8%r>IbKW;!d9I{npf zFOd)}teDNcXnFi1r!Tf{7@9-(vAWw@W3(r9c5yTHZ|~jrOR^!8aiT)1O4!x*BkA!m zcuVbVFlo;c#l0kP0V7u|{G8+$vT>N)f#dZ`b<+Z(%KYI9^NEj2TN{0C;Or zbv*LwU?WFG4T<)wdKWRb>418P0AqcZ4*A{GJ?ixOXSNsT*`=Sd7Q%+0x0rpq*Uo?M10(Tel~*-p8|=4h<1k6{Mfl_;l{UN6g!?Uk3_ni`cWS$5f$l zFum8&k+2_lHZvMYI&=#L`^ASX#qhzomW!|G8a)%x7-1zh7Qe=dJn>@=+X9r-nWQ;8 zV8$3fzfiXJ`ms;ZUN5;jp_M#7oc8PG^ts(s=JBSF8xyWeB%#`Uam#4p3o5C};YME^ zqwj2R*g3^X5o~UKuy>mp$xIx68TKgf6O2PEwj$5P4y(bY+rXjZ?F6*`XQe}W@`a|d z02emIC<2FR`a&j;$_HEF*A@G`#QCNFB$bu~D&5YLia! z`I=4VuCoZUC5)_u&|S{N9brnR?kOE5GKv|mX2Ywy%<8nJ^18z#?+3=jzU<^Pz0+sz zTwacfIEU{Si~CZh;P%T9^e?VdSXWH_$IUF@ZEIO#-y>74nCm9Bw;*_ao@AJN=M7Ys z<7&|8?LqO+HdT5h-h)Nv+Dwhjcxgc@gm3Brah5>1YZ8k-Dii2TLVb%gSPwUh0A54t zwE41tkPnw7G<}rvg7Y(MgqaQVsY&4A?P1eC({bu3+TPHwirzDeU(bF+Ds5wA;*mIS zGjlVXq(Iw0IF8AHevMjAK;j`X_xZck81KEfzC|>feV)&)sX=z74e7sXiy2|3>SZ;9 zs)@$G6OhCFR4QwEiNnXh8raNjG`bI@dY&j?NqA%3`cysZL7GB!0u~Yyo2XuiaLOa5B4a@WW-Z zd7MOr+cIqR6*VHpKmbn($nDdD=Iepj~Q35gpcx- zGh#7x%v=n$eG*g=NPe&bl(XA)F;h`>)31(r4HV7NU>$iAyEV&}N#JGh+;yR6iKJGa zC=mJm$0_8C19u7%ccT%kM^%Sd?I#pMxx^5tGI!(}D+>kvt1wKc2nYu52;yYam^oZ9 z*@R~#xg1PW9#5)uAhqv}>WY8B%ge4VN;4u_*KlrI|He(g(F;kHWn)fD5JxkX&=>M@-w9Zi;$pshw>MW!;f2ui(vTG6#swXG}b zsHqDUA-?GV8oif$6vpCNeJGD8QzGd>r!>7Eo1AZrZP+%i!DKh%Lmf_a4BX?0=6(1m z_QgWn^@dp`OXDD(c}Wig`YisBYt@8B-Owk_o9ytk@yGo@|}t^+Le0sN>DJ^@6h z9E)U2+sT9o6kA6y=xpsC`L&j#kkj{LS&KaWrALkh~iS25w%HYvKC`8ABWP6LvpI{~Bzcw5!?F=urorl=o%M5rny zV9$eZHV)Ou_ZK$yD5reqyDsF}B2U?&^^Ue)G&}GMFVS_%9J_wSmbPZXtkG7qsz5(p zi+7$_d?lP>wL%x<-5s5ZYmi!DhGlPzhF~ECUwbA*8444g6#L>ctayKE)+9pw1iGhH zU8tt3{s*FBF1{NqZpNY$Qhbio8K%xp- z_Mz@Wj&r-?K!Xz-E~GENM!u?psU@TyQlPEsSI|(L-+E!~g)si3YIhv9bm^NF_rttD zrkYof&s5y*GsNYl;g~bz3clNW*Ii-N+R=TO`Z`kDr&fy_Ow>i8XpsT7Mb>wan<+sI54p=-(f%FjuHoxOaU^gg-v=sPl(x&$M{w*a2PqFEji z%mP?+9Q0)zB+71qgc|mkH%o!D#nyF6jrV5v=46XtXW(oYazv|l(C8Bn&IcmQNs_-5a4k8n!MOtCg;dpF-E`x8UTi>L zHjS~Hics>ng8}vDLIld!qCAD3vD4ZM;qRxlImwadUdhu{NKieb=Y}&CBEF}TR%hpn z{}H%Uh)czy^{IuTJtikBY%m{zj8E=5cVT%llNAMFXe78<#5BB? zRu9qN(&nP{v&FuD5tAthzr;e=#x1&Ns1D_$q!PDHTYKpE{h6T4<^eI27_}co!WsL^ z-%Btd^67HGM;I6wTHc@=tbOUO(4L??ba0arTZJ-cIYRPM3RMm-H`iq(O@x8^Ae>F5 z&#&APUN4r@egoX+{QS($oOqb;0_&Gp^cLV6Z8>j!5BikzW=>}u6G|hRH=mP+@#id! zRbmN^XcTqE3`eBv&#f|2R3Y3anpAgMgDo%$NrbS$-U`sg)WW}YCD3q&GBsd zUVbgnQ}RG7xT$!J1n=>Mweh=32#YnEb&my@uPkD9q_ZIPb9Sv`ic~PYU1OEw`LdqY z;@mzKfI5p@etsrC)h@^LKB_hRC8wtym5G8JjD~M_Y+F>B3(zAuklg6!cfDHIU-=7B za$QUz9KdInyIOF|z4IIgB{98{->d2O=?M>a-00}@ZedMDsl`VdNp!eNR(1K=&H7pf z3MS^fFtEbEdMEO|kj2jH1s}0`Q$6b>;=mkjEV@s#UXSs_?*iv^!=p!@%Q5DQP5EUY zR2@jorn*Zjep~S$719Zo;;h!V`Eq4fr#iF3;iDg8(E0T*76volRA*$Ww@j?v&?0LGGa@nE2~^+QkHU_> z_)MyeC(0$~IwvL0&VKCcLb!U*kE9&l*6v@F-RD%|iEbvn^kNHq-feAc#AcQ*wkY84cd=W0;#IOD=V&a6m*wz9%^Twd z3OiE?A%5;ALuAEM6g$xLcqx~q9zXIjdo!Xo&b7hq^l#YM8}V*+7>Vj%(C-A7OJ%Plh8XW8j>{o3&nAm{?sW?r5^e#gPs%{?iPKpXKV~-xGI8NumKlDYb1;Q zT&ISbK0Tu?hOP4n+YIGJDUW%J0hTlhL(oKq0lCiy=%+~=)jJ7#Zh!&pfRn5hX(%1&tUbn@7S{4rr?rcOw zcE8UVNMBWXdYdEoOUVS?5Nns#J+k6eSk_JD=?+<}QA7?UdjHr^QRDM;>vL7n^RHaI zWmhj6q281OE%S9CB4mEpCJReASF<^<25{@ycFhNT6mq=Yrz6QJaIIg#xsTyl->YbT z_R?EL=TZAWL`N z3eqMu=6CULl7EE5&41iWwGI$+4b48d5-hgI-lIS7E=96(Ew`@hGA}oWfE~)~Z0YT5 zL3*9R`}1tDVI$*|bw$e~FURXW316g^JkCgNfnCW|TXt5&>UUF!D&4N|rd@NR)?6hQ z`m~dwa4XWT?sCef;%!D2?kROLlXm(g-a0V}B|Xx#kE>5HgqK^C+|;rj&6cYXcXe^a zv9#vBde+|TyTJ8&PjBFk^X47B9=W9h{aq_fp}h?j&cgn*9tZC^j@!0jsxxeqKyua> z*cd{HZeMm2r>v9{UUJ-#!c1SZH(v7zrF|RPSAf^|u(^JYq^wcj`b}w^^j*vkY%z#_ zYx%3J17yZlYne!$asvq2sQ#ii+{P|cR>iVu!7X^lTRjo0&LL5Lo^h_qSuvDIVc|2+ zt-0-I`M}XjO;P9ygcHvx4DRljOU>X|wf1uQo2INw;{e$zd@IhD*Z_%(H` zr7dAOt3E+hpoZX@V7=y;f33@hK>UoiQoei9n5oiP2?_#f#NPDcaO87u?pVoNUsq3x zjI$XR8QKEI7>}(-zwi&^8EVOtMvxk32;*YQPxALWZ`h7pVC4^Zz|oLVtxIF7;D9~6 zWApGmm(h*FOhxjsJ~?8~cNERmX#^WFq~Y7|nv!8-qiY!=;&VBz3DoYT)*GlDOp;}5yUzYGk<`XTg&He=2RRg2 zUJ@d>?v{6Vm2EiOV#ZA$vG8T|Lhf25B9u+CrfmbQQIx5`Mpm|y>hwt-6U9w&=pkH&uNShaYy*Q$as%;;4Qq;N@A!%!YlQ3 znrBd3`lb_sibPm}zF2rBKFxm3bf?0!HJM-GrRH44^|sI;PXlM(;w@`2of`w=<^_ce zs^b=k0#|i!*cA06Qz83d4qP6eU$ZZrn&QA18W^_9uixRuDV8C8a?{2XN!jueTjPMf z#tXBjdTHGGGc0otS_F*D-cCYor)=Ze}cy4y^z`AR48sZ>)O- ze7x7cQ)aS96(!G^CYy(G)hYnsFVvRrEvC0p=Dbtv)O#Y63g&0*&c9j!uImm zZM`urqURCKk+iyPn^=+|ibVuZxAKcGwaUugl02WE0UsurBzyOT|6U+Xqh$J9+Q)YL z9}ldZaDw)d-qfrJz;fpHstmL6)K>)y4mt{{S#gXXBSDF@TmBk0FCc(YL zdLl49>E`7%hDTSJIp%jTa)#Ofz=x#Ory%C?$^KLW7F6$Q18*d$q?d~qm?fY!m zI1fY>eB=e9Hknt=)oAUB2}am_u4%bdeRabWD4C2r;)mfxos1=A4XI# z@!fAn*d&CbH6=IpSV%P*=m_xGC8#yh=5LbTnM`K(;_EnA${OnFct}x)$|^N|S;+2O zvuP;0So*w8&t2){xQ6D>1g_nfndAomxr+R_M0NbT zV>rqe%+n`nro%79Dd2f~@6=*{z}M;H!+*#klevZew98GOdGz8N2?I<+NnXr~Y`Y2N zem9wh5S=h*fzX2)!E@9Lg2Ep6FMeel6p-S~>6vao%r?xy7^5K~UKNvMAxk5939F>K zKB%!rFwz~XAW3(@B};S1W9RABtX!{zT>rRv42@3uTFr```26Pi%R|WPw%=f{1C#hv zm2p;Dyw@o7r%_wEDF>(`17#$zFb_yU$W}5C{>{j*4D(9fMoTa(~7>CNWY$PKeDuqZC$~OuDnNb zOI&l$3%(^a;31V>LoK&gv1{JPC6w%DN9Nn}aGA`db?qaQ_T$Bh#t*Tzd>$GKgVN`i zZSKTvM53f-z!|}1hudn{+{dhnTA$f1LfByN`06x{?D~y*+!d2a@rfX8iR8O0;ieJ* z9<=jYJe2-TurW{Ym{D(FxT{`aj~6Qv9b3mPsUwzG7RG%0IMJ4hp?a;pig-<}uGdN6 z;^-C*+-qD9QdcDM%Y$*ea((xARyPX{dSl1Z} zSKvVWLL(;BGGc@(k41McyF6!EEcFH>3^e+h0ePSAUxm$9{5 z890gp2;aL&3F@7v7bbL2@=P|%ck3?4|{|A0i{7xpz_e|0`*KcgS+y~?|Gv$nA3jrwJQKJym^zcuXa5Dk#_20h9! z0pPET-kEjm$PmK+ptIh-STTbWPa?(VO7NQ8*(oD2r{BK+9kyJ?s9q_fsIx%I%4f0b zG4=Pf?iJk&gi8?B&_IuCq(A?4Bkcj&f_XX0!Gvmc1}=j^vBqA>p3_yj)wO6_A*H*| zVVL^E`s7JNbYq$=5z-m2j z!BV)PJf!?316`;5V!@M2XDgVi^lAf-IR@-YD~o5mtkB(2h+H&6!^JW5J`ffSb1@Tf zSnK7H$j)!WX>0kEp_eY^Yt>;=$g?Uf2-4dx#z>~ZJdAr*fdad5HF&KxC_YySZv>sM z6&*0=pqml1qCWaSC%S&~_F{Ua*cy=w{|09pM;Snol26;*d85U@W*jSG6ICa;J}^t< zpq;`eKUk=wjrL2oX!Dnb8Wr0xGq(wV+shB>*U8XPQMxFX^&{OmYp@BcFTh>G;u`3X zgGuaKq*$ymUwp4Tk`nJDz8}+$K*1Ui#zT?))%TUiG8H_$wB%M)xbTBayQ?S!Kyf(f zrG9Uew|1POY;o&oM8y?L+e_HaoR-|%bF;ZSH9l_%WqRrXi=dMhEo|z`r36;)aIJiP z^f(R?3pk7jV>*OfDl^VFvi?>52?x^jW6z5rfUDRrx8ANw-+@JB2pEb}eT%gEwXb2d zH=+j_FgOnP{BO$44u09VnqZpo^SC2nesuOXOn^+QSuKd8SruC6O zChQYMJ#T-VE+coZ8gqoemoJSvd0gIIeC*^&SD>!Q89_D{BD=2D9kI(Uky9_cf%|Rs z9vVsDw9Yr1NJqChF{ysx47D1D-2;HM7#ut{0DN^z$0~gP<)0ro08)UZj+K>xsh%aH zrGbgHv8I&)(A1JqK^`4|NS>ap#qC+Bg#fy(?N9+Q@Z5T}2H$@`H+c?Z(%MqT;$IWs z|Na{jNZ(tf-47R|18S8G=tc#ZxT9lfWCb*1FfcXv*%mmD6Ae+eFr&CJq22m$e}>2b zCgTl~ho_zyHe#9#92-uE$I#HLai0yuhRa?fHMIc+wI8%+uF&IE7KQV}8%&PD2hFZl zo)e1#rcU_?v#QaENerID3=Go#ShJp!b-!Eb6K2WEVis)(&!NLefB_JPyp=mQ6hSR5 z0Np5{)|zQrY3VZJS>wIm0ExpV>D=-?ic$mJv}&x@+#=ELg-uEo8_2#YE+3#;arn(|jq@sBcjVuv%Wx61#{BcZEj| z4o*u;D?6rk?Acgto;=;N6gA(Ml=xeMx6v@E zcz${U27@w!{`KSsSk|*p1_=zP9FT#S1{6Vm1b2OVZ42PPA^r?*frk!-Z2kMkphmEOq6(y%t$wlm z-Tu$UpJ~7xANrS$FgMRHg$&tvO=DxA*7qp(!w)dX8A1R!7&LR4!ilyR7IfPv2t?ZCj+Ezjudr!4@XA4X>eh!&7w{N8_C zO_1Y?n#R^TmcL?yZ2mqtBYhV(bh!ndg8fr&py=>dE$^B)8cOruzkN%{;P76p~ zzo3CqYJ)?u|CNA53DU?>LHq;o9|O{_ltGrO_E0fES@M62564FnBvcPnC<`EDLJA&{ zrz}$(dIkPd@C6x)SP4#K?yz^xDD6XxL$N`+;{z4ruQN9R73!}u#}A54Cur_J28G`< z7X}sMuQRs{73vR|15Zsq)b`^i^8L{X;8f?I>f;;$4&~8rhyr|X{h=xFCuA>BQ9+tM3?|@qqny4CH3_0- zFJJIMImoaK%&)y*b=>#~y}ihk_Roz@Eh*N*vd_Fg#L0{s29ff_R;#9{ORPx5D= z>d^SfaX0O_@e`;5LxKD7lxgJGrAY8b_Te?pkHGTN51^*@ze|v37}3ARiVF~ir63Le zK`8?sX@?C3e;!>-pXZM|(f(oF04w&?Rn#9_bzswn-9UE4g=F_-Xb^`_C;W^Z;8F%` z=eJ$)L$#yZuMEgQf2s<)uRy@bu|jmkKa7Dq0&TL`=vY{So`Lw8t(+1`jt-Mf3RXdI z{CIpUE_Oo$)Yi1p{1Ye;%1;GFzak51EJDKxnMl@7TJ)M8{xg|kU z)u~D54?ltmlDi%MDYqaiyW-=6g}D9`?&EVy>h1Z z|DXywMBue!?fZbF=B|a1;_%8MTpenKVTg#kuF1EjYGxyH}?PoouQ66l*VDVQ9=OmvO;s} zq~zmFkjKLrq#Bb>hCCY8&Y;F$t1(D5Za~F2rp7atW4~9U^7RvG1o`y8QsV$r#J{gb zX*Ouy{be;~Kn41rsqsAfiM}1yWMIXgL5;uGWRPmqhKg}ajSOcW)X-yNJyg8^l^R7j zpt1P()mRP{>o2Pj?*=rd{#cF23o}TiIG+sp|ESCk!#{YY0AG*~vuyr?ceFG+qx8W5 zM~fK9*EU2rAvyd9;Cl*nv^WEUoiQhe4t9_0H(-C3azY2wx%nHg|9|p{ab%jF=eOiO z1hdlDu`tmz{tue~KVCf=dt^5TT1o~y1l>m;M^ARIIA;6%>pMT!&Cm1*%kdodD9Aj& z5YMj;Xc=2uf}TM=vO#%joIU;m($NL%dHxvaAcuPn;N0_6oa1{AkfU_aNl-8y{x z@JzYxaq=MjQsjk7-eJ~srUyNKC;=P=4wFGhzp{Ue1L4=1vZmv&^+5V{o)4;Dhx0FZ zK0HHz{eJ${|1A!LUuT+skH4J)x!urw4DV=3_uH3a54X!tgCM%~D|JUh_a8z)?mC+N zgs=s@NAw>8&T%F3<>%R01#hVwtu zVeg5EhcoOMb@=NH3#mhzyC;zcf;gtbGfl9k>Chh<-2W;bq6jm3d*;r^26~DJ06vfd>xj{0 zck_RZ{;>VCjy>bc3cv0Gfsds*yyp2=!RCRWGjD#LhH`3)kEim;5GFY!;Ql>I=j>*G z5RqJDav2i_0QdsBk7mKi?k-2of?rfJA3$=JhI7)Vxk~)F} z+Bw#-&@}!YdJpUDGx>A8Cm>hDVq}k?fc9E}))rca=^7Z|423Az4TH}nWH289fbdnA zUkIB&8Q{k;I|f?7pM-%0_uFUej=OTS_viVADd7JV)qgvm33>?%ITWHn5NABE>Cog4 zLH&AS6WCesmFzwQGWj3QZ#sHL2{=#w^>C#hX2FI7DB=IZQASXb=Uv^ literal 0 HcmV?d00001 diff --git a/tests/storage/business/test_study_version_upgrader.py b/tests/storage/business/test_study_version_upgrader.py index 1c137b1750..7083cd837d 100644 --- a/tests/storage/business/test_study_version_upgrader.py +++ b/tests/storage/business/test_study_version_upgrader.py @@ -1,5 +1,8 @@ +import filecmp import glob -import os +import re +import shutil +import tempfile from pathlib import Path from typing import List from zipfile import ZipFile @@ -12,62 +15,89 @@ from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( DUPLICATE_KEYS, ) -from antarest.study.storage.study_version_upgrader import InvalidUpgrade from antarest.study.storage.study_version_upgrader import ( - mapping_transmission_capacities, + InvalidUpgrade, + UPGRADE_METHODS, +) +from antarest.study.storage.study_version_upgrader import ( + MAPPING_TRANSMISSION_CAPACITIES, ) - -sep = os.sep -def test_study_version_upgrader(tmp_path: Path): +def test_end_to_end_upgrades(tmp_path: Path): cur_dir: Path = Path(__file__).parent path_study = cur_dir / "assets" / "little_study_700.zip" with ZipFile(path_study) as zip_output: zip_output.extractall(path=tmp_path) + tmp_dir_before_upgrade = tempfile.mkdtemp( + suffix=".before_upgrade.tmp", prefix="~", dir=cur_dir / "assets" + ) + shutil.copytree(tmp_path, tmp_dir_before_upgrade, dirs_exist_ok=True) old_values = get_old_settings_values(tmp_path) old_areas_values = get_old_area_values(tmp_path) - study_version_upgrader.upgrade_study(str(tmp_path), 840) - assert_study_antares_file_is_updated(tmp_path) + # Only checks if the study_upgrader can go from the first supported version to the last one + target_version = "840" + study_version_upgrader.upgrade_study(tmp_path, target_version) + assert_study_antares_file_is_updated(tmp_path, target_version) assert_settings_are_updated(tmp_path, old_values) assert_inputs_are_updated(tmp_path, old_areas_values) + assert (False, are_same_dir(tmp_path, tmp_dir_before_upgrade)) + shutil.rmtree(tmp_dir_before_upgrade) -def test_study_version_upgrader_fails(tmp_path: Path): +def test_fails_because_of_versions_asked(tmp_path: Path): cur_dir: Path = Path(__file__).parent - path_study = cur_dir / "assets" / "little_study_700.zip" + path_study = cur_dir / "assets" / "little_study_720.zip" with ZipFile(path_study) as zip_output: zip_output.extractall(path=tmp_path) with pytest.raises( - expected_exception=InvalidUpgrade, - match=f"The version {600} is not supported", + InvalidUpgrade, + match=f"Version '600' unknown: possible versions are {', '.join([u[1] for u in UPGRADE_METHODS])}", + ): + study_version_upgrader.upgrade_study(tmp_path, "600") + with pytest.raises( + InvalidUpgrade, match="Your study is already in version '720'" + ): + study_version_upgrader.upgrade_study(tmp_path, "720") + with pytest.raises( + InvalidUpgrade, + match="Impossible to upgrade from version '720' to version '710'", ): - study_version_upgrader.upgrade_study(str(tmp_path), 600) + study_version_upgrader.upgrade_study(tmp_path, "710") with pytest.raises( - expected_exception=InvalidUpgrade, - match="The version you asked for is the one you currently have", + InvalidUpgrade, + match=f"Version '820.rc' unknown: possible versions are {', '.join([u[1] for u in UPGRADE_METHODS])}", ): - study_version_upgrader.upgrade_study(str(tmp_path), 700) - path_other_study = cur_dir / "assets" / "little_study_720.zip" - target_other_study = tmp_path / "other_study_for_test" - with ZipFile(path_other_study) as zip_output: - zip_output.extractall(path=target_other_study) + study_version_upgrader.upgrade_study(tmp_path, "820.rc") + + +def test_fallback_if_study_input_broken(tmp_path): + cur_dir: Path = Path(__file__).parent + path_study = cur_dir / "assets" / "broken_study_720.zip" + with ZipFile(path_study) as zip_output: + zip_output.extractall(path=tmp_path) + tmp_dir_before_upgrade = tempfile.mkdtemp( + suffix=".before_upgrade.tmp", prefix="~", dir=cur_dir / "assets" + ) + shutil.copytree(tmp_path, tmp_dir_before_upgrade, dirs_exist_ok=True) with pytest.raises( - expected_exception=InvalidUpgrade, - match="Cannot downgrade your study version", + expected_exception=pandas.errors.EmptyDataError, + match="No columns to parse from file", ): - study_version_upgrader.upgrade_study(str(target_other_study), 700) + study_version_upgrader.upgrade_study(tmp_path, "840") + assert are_same_dir(tmp_path, tmp_dir_before_upgrade) + shutil.rmtree(tmp_dir_before_upgrade) -def assert_study_antares_file_is_updated(tmp_path: Path) -> None: - with open(str(tmp_path) + f"{sep}study.antares") as study_antares: - lines = study_antares.readlines() - assert lines[1] == "version = 840\n" - assert len(lines) == 7 +def assert_study_antares_file_is_updated( + tmp_path: Path, target_version: str +) -> None: + lines = (tmp_path / "study.antares").read_text(encoding="utf-8") + assert re.search(r"version\s*=\s*(\d+)", lines)[1] == target_version def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None: - general_data_path = str(tmp_path) + f"{sep}settings{sep}generaldata.ini" + general_data_path = tmp_path / "settings" / "generaldata.ini" reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) data = reader.read(Path(general_data_path)) general = data["general"] @@ -76,8 +106,8 @@ def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None: other_preferences = data["other preferences"] assert general["geographic-trimming"] == old_values[0] assert general["custom-scenario"] == old_values[1] - assert general["thematic-trimming"] is False - assert optimization["include-exportstructure"] is False + assert not general["thematic-trimming"] + assert not optimization["include-exportstructure"] assert ( optimization["include-unfeasible-problem-behavior"] == "error-verbose" ) @@ -86,26 +116,22 @@ def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None: == "accommodate rule curves" ) assert other_preferences["renewable-generation-modelling"] == "aggregated" - assert adequacy_patch["include-adq-patch"] is False - assert ( - adequacy_patch["set-to-null-ntc-between-physical-out-for-first-step"] - is True - ) - assert ( - adequacy_patch[ - "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step" - ] - is True - ) + assert not adequacy_patch["include-adq-patch"] + assert adequacy_patch[ + "set-to-null-ntc-between-physical-out-for-first-step" + ] + assert adequacy_patch[ + "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step" + ] assert ( optimization["transmission-capacities"] - == mapping_transmission_capacities[old_values[2]] + == MAPPING_TRANSMISSION_CAPACITIES[old_values[2]] ) assert "include-split-exported-mps" not in optimization def get_old_settings_values(tmp_path: Path) -> List[str]: - general_data_path = str(tmp_path) + f"{sep}settings{sep}generaldata.ini" + general_data_path = tmp_path / "settings" / "generaldata.ini" reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) data = reader.read(Path(general_data_path)) filtering_value = data["general"]["filtering"] @@ -115,55 +141,83 @@ def get_old_settings_values(tmp_path: Path) -> List[str]: def get_old_area_values(tmp_path: Path) -> dict: - links = glob.glob(os.path.join(tmp_path, f"input{sep}links{sep}*")) + links = glob.glob(str(tmp_path / "input" / "links" / "*")) dico = {} for folder in links: - all_txt = glob.glob(os.path.join(folder, "*.txt")) + all_txt = glob.glob(str(Path(folder) / "*.txt")) if len(all_txt) > 0: for txt in all_txt: - new_txt = txt.replace( - str(tmp_path) + f"{sep}input{sep}links{sep}", "" - ).replace(".txt", "") + path_txt = Path(txt) + new_txt = Path(path_txt.parent.name).joinpath(path_txt.stem) df = pandas.read_csv(txt, sep="\t", header=None) - dico[new_txt] = df + dico[str(new_txt)] = df return dico def assert_inputs_are_updated(tmp_path: Path, dico: dict) -> None: - input_path = str(tmp_path) + f"{sep}input" - assert os.path.isdir(input_path + f"{sep}renewables") is True - assert os.path.isdir(input_path + f"{sep}renewables{sep}clusters") is True - assert os.path.isdir(input_path + f"{sep}renewables{sep}series") is True - links = glob.glob(os.path.join(tmp_path, f"input{sep}links{sep}*")) + input_path = tmp_path / "input" + assert (input_path / "renewables").is_dir() + assert (input_path / "renewables" / "clusters").is_dir() + assert (input_path / "renewables" / "series").is_dir() + links = glob.glob(str(tmp_path / "input" / "links" / "*")) for folder in links: - all_txt = glob.glob(os.path.join(folder, "*.txt")) + folder_path = Path(folder) + all_txt = glob.glob(str(folder_path / "*.txt")) if len(all_txt) > 0: for txt in all_txt: + path_txt = Path(txt) + old_txt = str( + Path(path_txt.parent.name).joinpath(path_txt.stem) + ).replace("_parameters", "") df = pandas.read_csv(txt, sep="\t", header=None) - old_txt = ( - txt.replace(input_path + f"{sep}links{sep}", "") - .replace(".txt", "") - .replace("_parameters", "") + assert ( + df.values.all() == dico[old_txt].iloc[:, 2:8].values.all() ) - assert (df.values == dico[old_txt].iloc[:, 2:8].values).all() - capacities = glob.glob(os.path.join(folder, f"capacities{sep}*")) + capacities = glob.glob(str(folder_path / "capacities" / "*")) if len(capacities) > 0: for direction_txt in capacities: df_capacities = pandas.read_csv( direction_txt, sep="\t", header=None ) - old_txt = direction_txt.replace( - input_path + f"{sep}links{sep}", "" - ).replace(f"capacities{sep}", "") + direction_path = Path(direction_txt) + old_txt = str( + Path(direction_path.parent.parent.name).joinpath( + direction_path.name + ) + ) if "indirect" in old_txt: new_txt = old_txt.replace("_indirect.txt", "") assert ( - df_capacities[0].values - == dico[new_txt].iloc[:, 0].values - ).all() + df_capacities[0].values.all() + == dico[new_txt].iloc[:, 0].values.all() + ) else: new_txt = old_txt.replace("_direct.txt", "") assert ( - df_capacities[0].values - == dico[new_txt].iloc[:, 1].values - ).all() + df_capacities[0].values.all() + == dico[new_txt].iloc[:, 1].values.all() + ) + + +def are_same_dir(dir1, dir2) -> bool: + dirs_cmp = filecmp.dircmp(dir1, dir2) + if ( + len(dirs_cmp.left_only) > 0 + or len(dirs_cmp.right_only) > 0 + or len(dirs_cmp.funny_files) > 0 + ): + return False + (_, mismatch, errors) = filecmp.cmpfiles( + dir1, dir2, dirs_cmp.common_files, shallow=False + ) + if len(mismatch) > 0 or len(errors) > 0: + return False + for common_dir in dirs_cmp.common_dirs: + path_dir1 = Path(dir1) + path_dir2 = Path(dir2) + path_common_dir = Path(common_dir) + new_dir1 = path_dir1 / path_common_dir + new_dir2 = path_dir2 / path_common_dir + if not are_same_dir(new_dir1, new_dir2): + return False + return True diff --git a/tests/storage/test_service.py b/tests/storage/test_service.py index 8461b760ea..31d702f9ea 100644 --- a/tests/storage/test_service.py +++ b/tests/storage/test_service.py @@ -2,60 +2,56 @@ from datetime import datetime, timedelta from pathlib import Path from typing import Union -from unittest.mock import Mock, seal, call, ANY, patch +from unittest.mock import ANY, Mock, call, patch, seal from uuid import uuid4 import pytest from antarest.core.config import Config, StorageConfig, WorkspaceConfig from antarest.core.exceptions import TaskAlreadyRunning -from antarest.core.filetransfer.model import FileDownloadTaskDTO, FileDownload +from antarest.core.filetransfer.model import FileDownload, FileDownloadTaskDTO from antarest.core.interfaces.cache import ICache -from antarest.core.jwt import JWTUser, JWTGroup, DEFAULT_ADMIN_USER +from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTGroup, JWTUser from antarest.core.model import JSON, SUB_JSON -from antarest.core.permissions import ( - StudyPermissionType, -) -from antarest.core.requests import ( - RequestParameters, -) +from antarest.core.permissions import StudyPermissionType +from antarest.core.requests import RequestParameters from antarest.core.roles import RoleType -from antarest.core.tasks.model import TaskType, TaskDTO, TaskStatus, TaskResult -from antarest.login.model import User, Group, GroupDTO +from antarest.core.tasks.model import TaskDTO, TaskResult, TaskStatus, TaskType +from antarest.login.model import Group, GroupDTO, User from antarest.login.service import LoginService from antarest.matrixstore.service import MatrixService from antarest.study.model import ( - Study, - StudyContentStatus, - StudyFolder, DEFAULT_WORKSPACE_NAME, - RawStudy, + ExportFormat, + MatrixAggregationResultDTO, + MatrixIndex, + OwnerInfo, PublicMode, + RawStudy, + Study, + StudyAdditionalData, + StudyContentStatus, StudyDownloadDTO, - MatrixIndex, + StudyDownloadLevelDTO, StudyDownloadType, + StudyFolder, StudyMetadataDTO, - OwnerInfo, - StudyDownloadLevelDTO, - ExportFormat, - MatrixAggregationResultDTO, TimeSerie, TimeSeriesData, - StudyAdditionalData, ) from antarest.study.repository import StudyMetadataRepository from antarest.study.service import ( + MAX_MISSING_STUDY_TIMEOUT, StudyService, UserHasNotPermissionError, - MAX_MISSING_STUDY_TIMEOUT, ) from antarest.study.storage.patch_service import PatchService from antarest.study.storage.rawstudy.model.filesystem.config.model import ( Area, + DistrictSet, FileStudyTreeConfig, - Simulation, Link, - DistrictSet, + Simulation, ) from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy from antarest.study.storage.rawstudy.model.filesystem.ini_file_node import ( @@ -109,6 +105,7 @@ def build_study_service( ) +# noinspection PyArgumentList @pytest.mark.unit_test def test_get_studies_uuid() -> None: bob = User(id=2, name="bob") @@ -163,6 +160,7 @@ def study_to_dto(study: Study) -> StudyMetadataDTO: ) +# noinspection PyArgumentList @pytest.mark.unit_test def test_study_listing() -> None: bob = User(id=2, name="bob") @@ -268,6 +266,7 @@ def test_study_listing() -> None: assert expected_result == studies +# noinspection PyArgumentList @pytest.mark.unit_test def test_sync_studies_from_disk() -> None: now = datetime.utcnow() @@ -333,6 +332,7 @@ def test_sync_studies_from_disk() -> None: ) +# noinspection PyArgumentList @pytest.mark.unit_test def test_partial_sync_studies_from_disk() -> None: now = datetime.utcnow() @@ -411,6 +411,7 @@ def test_remove_duplicate() -> None: repository.delete.assert_called_once_with(mb.id) +# noinspection PyArgumentList @pytest.mark.unit_test def test_create_study() -> None: # Mock @@ -485,6 +486,7 @@ def test_create_study() -> None: repository.save.assert_called_once_with(expected) +# noinspection PyArgumentList @pytest.mark.unit_test def test_save_metadata() -> None: # Mock @@ -536,6 +538,7 @@ def test_save_metadata() -> None: repository.save.assert_called_once_with(study) +# noinspection PyArgumentList @pytest.mark.unit_test def test_download_output() -> None: study_service = Mock() @@ -763,6 +766,7 @@ def test_download_output() -> None: assert MatrixAggregationResultDTO.parse_raw(result.body) == res_matrix +# noinspection PyArgumentList @pytest.mark.unit_test def test_change_owner() -> None: uuid = str(uuid4()) @@ -816,6 +820,7 @@ def test_change_owner() -> None: ) +# noinspection PyArgumentList @pytest.mark.unit_test def test_manage_group() -> None: uuid = str(uuid4()) @@ -898,6 +903,7 @@ def test_manage_group() -> None: ) +# noinspection PyArgumentList @pytest.mark.unit_test def test_set_public_mode() -> None: uuid = str(uuid4()) @@ -935,6 +941,7 @@ def test_set_public_mode() -> None: ) +# noinspection PyArgumentList @pytest.mark.unit_test def test_check_errors(): study_service = Mock() @@ -981,6 +988,7 @@ def test_study_match() -> None: ) +# noinspection PyArgumentList @pytest.mark.unit_test def test_assert_permission() -> None: uuid = str(uuid4()) @@ -1107,6 +1115,7 @@ def test_delete_with_prefetch(tmp_path: Path): Mock(), Mock(), ) + # noinspection PyArgumentList service = build_study_service( raw_study_service, study_metadata_repository, @@ -1174,6 +1183,7 @@ def test_delete_with_prefetch(tmp_path: Path): ) +# noinspection PyArgumentList def test_delete_recursively(tmp_path: Path): study_metadata_repository = Mock() raw_study_service = RawStudyService( @@ -1366,7 +1376,7 @@ def test_unarchive_output(tmp_path: Path): service.task_service.add_worker_task.assert_called_once_with( TaskType.UNARCHIVE, - f"unarchive_other_workspace", + "unarchive_other_workspace", ArchiveTaskArgs( src=str(tmp_path / "output" / f"{output_id}.zip"), dest=str(tmp_path / "output" / output_id), @@ -1496,7 +1506,7 @@ def test_archive_output_locks(tmp_path: Path): service.task_service.add_worker_task.assert_called_once_with( TaskType.UNARCHIVE, - f"unarchive_other_workspace", + "unarchive_other_workspace", ArchiveTaskArgs( src=str(tmp_path / "output" / f"{output_id}.zip"), dest=str(tmp_path / "output" / output_id), @@ -1649,11 +1659,13 @@ def test_task_upgrade_study(tmp_path: Path): with pytest.raises(TaskAlreadyRunning): service.upgrade_study( study_id, + target_version="", params=RequestParameters(user=DEFAULT_ADMIN_USER), ) service.upgrade_study( study_id, + target_version="", params=RequestParameters(user=DEFAULT_ADMIN_USER), ) @@ -1693,19 +1705,14 @@ def test_upgrade_study(upgrade_study_mock: Mock, tmp_path: Path): study_id = "my_study" - res = service._upgrade_study( - study_id, - 800, - ) + target_version = "800" + actual = service._upgrade_study(study_id, target_version) - upgrade_study_mock.assert_called_with( - tmp_path, - 800, - ) - assert res == TaskResult( - success=True, - message=f"Sucessfuly upgraded study {raw_study_mock.name} ({study_id}) to 800", - ) + upgrade_study_mock.assert_called_with(tmp_path, target_version) + assert actual.success + assert raw_study_mock.name in actual.message, f"{actual.message=}" + assert study_id in actual.message, f"{actual.message=}" + assert target_version in actual.message, f"{actual.message=}" raw_managed_study_mock = Mock( spec=RawStudy, @@ -1728,18 +1735,14 @@ def test_upgrade_study(upgrade_study_mock: Mock, tmp_path: Path): study_id = "my_study" - res = service._upgrade_study( - study_id, - 800, - ) + target_version = "810" + actual = service._upgrade_study(study_id, target_version) - upgrade_study_mock.assert_called_with( - tmp_path, - 800, - ) + upgrade_study_mock.assert_called_with(tmp_path, target_version) file_study.tree.denormalize.assert_called_once() file_study.tree.normalize.assert_called_once() - assert res == TaskResult( - success=True, - message=f"Sucessfuly upgraded study {raw_managed_study_mock.name} ({study_id}) to 800", - ) + + assert actual.success + assert raw_study_mock.name in actual.message, f"{actual.message=}" + assert study_id in actual.message, f"{actual.message=}" + assert target_version in actual.message, f"{actual.message=}" diff --git a/tests/study/storage/__init__.py b/tests/study/storage/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/study/storage/test_study_version_upgrader.py b/tests/study/storage/test_study_version_upgrader.py new file mode 100644 index 0000000000..f04e722cd4 --- /dev/null +++ b/tests/study/storage/test_study_version_upgrader.py @@ -0,0 +1,117 @@ +from pathlib import Path + +import pytest + +from antarest.core.exceptions import StudyValidationError +from antarest.study.storage.study_version_upgrader import ( + can_upgrade_version, + InvalidUpgrade, + find_next_version, + UPGRADE_METHODS, + get_current_version, +) + + +class TestFindNextVersion: + @pytest.mark.parametrize( + "from_version, expected", + [ + (UPGRADE_METHODS[0].old, UPGRADE_METHODS[0].new), + (UPGRADE_METHODS[-1].old, UPGRADE_METHODS[-1].new), + (UPGRADE_METHODS[-1].new, ""), + ("3.14", ""), + ], + ) + def test_find_next_version(self, from_version: str, expected: str): + actual = find_next_version(from_version) + assert actual == expected + + +class TestCanUpgradeVersion: + @pytest.mark.parametrize( + "from_version, to_version", + [ + pytest.param("700", "710"), + pytest.param( + "123", + "123", + marks=pytest.mark.xfail( + reason="same versions", + raises=InvalidUpgrade, + strict=True, + ), + ), + pytest.param( + "000", + "123", + marks=pytest.mark.xfail( + reason="version '000' not in 'old' versions", + raises=InvalidUpgrade, + strict=True, + ), + ), + pytest.param( + "700", + "999", + marks=pytest.mark.xfail( + reason="version '999' not in 'new' versions", + raises=InvalidUpgrade, + strict=True, + ), + ), + pytest.param( + "720", + "710", + marks=pytest.mark.xfail( + reason="versions inverted", + raises=InvalidUpgrade, + strict=True, + ), + ), + pytest.param( + 800, + "456", + marks=pytest.mark.xfail( + reason="integer version 800 not in 'old' versions", + raises=InvalidUpgrade, + strict=True, + ), + ), + pytest.param( + "700", + 800, + marks=pytest.mark.xfail( + reason="integer version 800 not in 'new' versions", + raises=InvalidUpgrade, + strict=True, + ), + ), + ], + ) + def test_can_upgrade_version(self, from_version: str, to_version: str): + can_upgrade_version(from_version, to_version) + + +class TestGetCurrentVersion: + @pytest.mark.parametrize( + "version", + [ + pytest.param("710"), + pytest.param(" 71"), + pytest.param(" 7.1 "), + pytest.param( + "", + marks=pytest.mark.xfail( + reason="empty version", + raises=StudyValidationError, + strict=True, + ), + ), + ], + ) + def test_get_current_version(self, tmp_path: Path, version: str): + # prepare the "study.antares" file + study_antares_path = tmp_path.joinpath("study.antares") + study_antares_path.write_text(f"version = {version}", encoding="utf-8") + actual = get_current_version(tmp_path) + assert actual == version.strip(), f"{actual=}" diff --git a/tests/worker/test_worker.py b/tests/worker/test_worker.py index 12053b225a..0d47d23d22 100644 --- a/tests/worker/test_worker.py +++ b/tests/worker/test_worker.py @@ -62,6 +62,6 @@ async def notify(event: Event): # Wait a short time to allow the event bus to have the opportunity # to process the notification of the end event. - time.sleep(0.01) + time.sleep(0.1) assert msg == ["WORKER_TASK_STARTED", "WORKER_TASK_ENDED"] From da21fb40c9a4bfa0de7fda99f779ecd8cd6dae8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Omn=C3=A8s?= Date: Tue, 14 Feb 2023 15:18:12 +0100 Subject: [PATCH 32/60] ci(github): use ubuntu-20.04 instead of ubuntu-22.04 (latest) (#1311) --- .github/workflows/compatibility.yml | 4 ++-- .github/workflows/deploy.yml | 6 +++--- .github/workflows/main.yml | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/compatibility.yml b/.github/workflows/compatibility.yml index 7745986a9f..58c44c5cc4 100644 --- a/.github/workflows/compatibility.yml +++ b/.github/workflows/compatibility.yml @@ -10,7 +10,7 @@ jobs: strategy: max-parallel: 9 matrix: - os: [windows-latest, ubuntu-latest, macOS-latest] + os: [windows-latest, ubuntu-20.04, macOS-latest] python-version: [ 3.8 ] steps: @@ -35,7 +35,7 @@ jobs: strategy: max-parallel: 9 matrix: - os: [ windows-latest, ubuntu-latest, macOS-latest ] + os: [ windows-latest, ubuntu-20.04, macOS-latest ] node-version: [ 10.x, 14.x ] steps: - name: Checkout github repo diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1332788c53..7b576bd17e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,7 +11,7 @@ jobs: strategy: max-parallel: 3 matrix: - os: [windows-latest, ubuntu-latest] + os: [windows-latest, ubuntu-20.04] steps: - name: Checkout github repo (+ download lfs dependencies) @@ -57,7 +57,7 @@ jobs: git log -1 HEAD --format=%H > .\resources\commit_id pyinstaller AntaresWebWin.spec - name: Generate linux binary - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-20.04' run: | git log -1 HEAD --format=%H > .\resources\commit_id pyinstaller AntaresWebLinux.spec @@ -67,7 +67,7 @@ jobs: git log -1 HEAD --format=%H > .\resources\commit_id pyinstaller -F antarest\worker\archive_worker_service.py -n AntaresWebWorker --add-data ".\resources;.\resources" - name: Generate Linux worker binary - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-20.04' run: | git log -1 HEAD --format=%H > .\resources\commit_id pyinstaller -F antarest/worker/archive_worker_service.py -n AntaresWebWorker --add-data resources:resources diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5922b56b51..af2e0521b4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,7 +6,7 @@ on: jobs: python-lint: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - name: Checkout github repo (+ download lfs dependencies) uses: actions/checkout@v2 @@ -36,7 +36,7 @@ jobs: strategy: max-parallel: 9 matrix: - os: [windows-latest, ubuntu-latest] + os: [windows-latest, ubuntu-20.04] steps: - name: Checkout github repo (+ download lfs dependencies) @@ -60,11 +60,11 @@ jobs: run: | pytest --cov antarest --cov-report xml - name: Fix code coverage paths - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-20.04' run: | sed -i 's/\/home\/runner\/work\/AntaREST\/AntaREST/\/github\/workspace/g' coverage.xml - name: Archive code coverage results - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-20.04' uses: actions/upload-artifact@v3 with: name: python-code-coverage-report @@ -74,7 +74,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ ubuntu-latest ] + os: [ ubuntu-20.04 ] steps: - name: Checkout github repo uses: actions/checkout@v1 @@ -106,7 +106,7 @@ jobs: path: webapp/coverage/lcov.info sonarcloud: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 needs: [python-test, npm-test] steps: - uses: actions/checkout@v2 @@ -123,4 +123,4 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From ff4a115f7e94310b8de4d0c470f1cef547e84f68 Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Fri, 17 Feb 2023 18:12:18 +0100 Subject: [PATCH 33/60] feat(ui-model,api): update renewable form (#1313) Co-authored-by: Samir Kamal <1954121+skamril@users.noreply.github.com> --- antarest/study/business/hydro_management.py | 6 +- .../study/business/renewable_management.py | 115 +++++++++++++++++ .../study/business/table_mode_management.py | 12 +- antarest/study/service.py | 2 + antarest/study/web/study_data_blueprint.py | 61 ++++++++- tests/integration/test_integration.py | 52 +++++++- webapp/public/locales/en/main.json | 4 +- webapp/public/locales/fr/main.json | 2 +- .../Modelization/Areas/Renewables/Fields.tsx | 75 +++++++++++ .../Areas/Renewables/RenewableForm.tsx | 121 ------------------ .../Modelization/Areas/Renewables/index.tsx | 84 ++++++++++-- .../Modelization/Areas/Renewables/utils.ts | 104 ++++++++++----- 12 files changed, 448 insertions(+), 190 deletions(-) create mode 100644 antarest/study/business/renewable_management.py create mode 100644 webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx delete mode 100644 webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/RenewableForm.tsx diff --git a/antarest/study/business/hydro_management.py b/antarest/study/business/hydro_management.py index 6f77031e94..6c87c80358 100644 --- a/antarest/study/business/hydro_management.py +++ b/antarest/study/business/hydro_management.py @@ -5,6 +5,7 @@ from antarest.study.business.utils import ( FormFieldsBaseModel, execute_or_add_commands, + FieldInfo, ) from antarest.study.model import Study from antarest.study.storage.storage_service import StudyStorageService @@ -30,11 +31,6 @@ class ManagementOptionsFormFields(FormFieldsBaseModel): pumping_efficiency: Optional[Union[StrictFloat, StrictInt]] -class FieldInfo(TypedDict, total=False): - path: str - default_value: Any - - HYDRO_PATH = "input/hydro/hydro" FIELDS_INFO: Dict[str, FieldInfo] = { diff --git a/antarest/study/business/renewable_management.py b/antarest/study/business/renewable_management.py new file mode 100644 index 0000000000..7481b6d4a8 --- /dev/null +++ b/antarest/study/business/renewable_management.py @@ -0,0 +1,115 @@ +from enum import Enum +from pathlib import Path, PurePosixPath +from typing import Union, Optional, Dict, TypedDict, Any, List + +from pydantic import StrictFloat, StrictInt, StrictStr, StrictBool + +from antarest.study.business.utils import ( + execute_or_add_commands, + FormFieldsBaseModel, + FieldInfo, +) +from antarest.study.model import Study +from antarest.study.storage.storage_service import StudyStorageService +from antarest.study.storage.variantstudy.model.command.update_config import ( + UpdateConfig, +) + + +class TimeSeriesInterpretation(str, Enum): + POWER_GENERATION = "power-generation" + PRODUCTION_FACTOR = "production-factor" + + +RENEWABLE_PATH = "input/renewables/clusters/{area}/list/{cluster}" + + +class RenewableFormFields(FormFieldsBaseModel): + group: Optional[StrictStr] + name: Optional[StrictStr] + ts_interpretation: Optional[TimeSeriesInterpretation] + unit_count: Optional[StrictInt] + enabled: Optional[StrictBool] + nominal_capacity: Optional[StrictInt] + + +FIELDS_INFO: Dict[str, FieldInfo] = { + "group": { + "path": f"{RENEWABLE_PATH}/group", + "default_value": "", + }, + "name": { + "path": f"{RENEWABLE_PATH}/name", + "default_value": "", + }, + "ts_interpretation": { + "path": f"{RENEWABLE_PATH}/ts-interpretation", + "default_value": TimeSeriesInterpretation.POWER_GENERATION.value, + }, + "unit_count": { + "path": f"{RENEWABLE_PATH}/unitcount", + "default_value": 0, + }, + "enabled": { + "path": f"{RENEWABLE_PATH}/enabled", + "default_value": True, + }, + "nominal_capacity": { + "path": f"{RENEWABLE_PATH}/nominalcapacity", + "default_value": 0, + }, +} + + +def format_path(path: str, area_id: str, cluster_id: str) -> str: + return path.format(area=area_id, cluster=cluster_id) + + +class RenewableManager: + def __init__(self, storage_service: StudyStorageService): + self.storage_service = storage_service + + def get_field_values( + self, study: Study, area_id: str, cluster_id: str + ) -> RenewableFormFields: + file_study = self.storage_service.get_storage(study).get_raw(study) + renewable_config = file_study.tree.get( + format_path(RENEWABLE_PATH, area_id, cluster_id).split("/") + ) + + def get_value(field_info: FieldInfo) -> Any: + target_name = PurePosixPath(field_info["path"]).name + return renewable_config.get( + target_name, field_info["default_value"] + ) + + return RenewableFormFields.construct( + **{name: get_value(info) for name, info in FIELDS_INFO.items()} + ) + + def set_field_values( + self, + study: Study, + area_id: str, + cluster_id: str, + field_values: RenewableFormFields, + ) -> None: + commands: List[UpdateConfig] = [] + + for field_name, value in field_values.__iter__(): + if value is not None: + info = FIELDS_INFO[field_name] + + commands.append( + UpdateConfig( + target=format_path(info["path"], area_id, cluster_id), + data=value, + command_context=self.storage_service.variant_study_service.command_factory.command_context, + ) + ) + + if commands: + file_study = self.storage_service.get_storage(study).get_raw(study) + execute_or_add_commands( + study, file_study, commands, self.storage_service + ) diff --git a/antarest/study/business/table_mode_management.py b/antarest/study/business/table_mode_management.py index 48b4fe8534..e672fc119e 100644 --- a/antarest/study/business/table_mode_management.py +++ b/antarest/study/business/table_mode_management.py @@ -14,6 +14,9 @@ from antarest.study.business.binding_constraint_management import ( BindingConstraintManager, ) +from antarest.study.business.renewable_management import ( + TimeSeriesInterpretation, +) from antarest.study.business.utils import ( FormFieldsBaseModel, execute_or_add_commands, @@ -74,11 +77,6 @@ class LawOption(str, Enum): GEOMETRIC = "geometric" -class TimeSeriesMode(str, Enum): - POWER_GENERATION = "power-generation" - PRODUCTION_FACTOR = "production-factor" - - class BindingConstraintType(str, Enum): HOURLY = "hourly" DAILY = "daily" @@ -146,7 +144,7 @@ class ClusterColumns(FormFieldsBaseModel): class RenewableColumns(FormFieldsBaseModel): group: Optional[StrictStr] - ts_interpretation: Optional[TimeSeriesMode] + ts_interpretation: Optional[TimeSeriesInterpretation] enabled: Optional[StrictBool] unit_count: Optional[StrictInt] nominal_capacity: Optional[StrictInt] @@ -357,7 +355,7 @@ class PathVars(TypedDict, total=False): }, "ts_interpretation": { "path": f"{RENEWABLE_FIELD_PATH_BASE}/ts-interpretation", - "default_value": TimeSeriesMode.POWER_GENERATION.value, + "default_value": TimeSeriesInterpretation.POWER_GENERATION.value, }, "enabled": { "path": f"{RENEWABLE_FIELD_PATH_BASE}/enabled", diff --git a/antarest/study/service.py b/antarest/study/service.py index e05e037584..6a5eacdd0f 100644 --- a/antarest/study/service.py +++ b/antarest/study/service.py @@ -72,6 +72,7 @@ ) from antarest.study.business.config_management import ConfigManager from antarest.study.business.district_manager import DistrictManager +from antarest.study.business.renewable_management import RenewableManager from antarest.study.business.general_management import GeneralManager from antarest.study.business.hydro_management import HydroManager from antarest.study.business.link_management import LinkInfoDTO, LinkManager @@ -217,6 +218,7 @@ def __init__( self.storage_service ) self.hydro_manager = HydroManager(self.storage_service) + self.renewable_manager = RenewableManager(self.storage_service) self.ts_config_manager = TimeSeriesConfigManager(self.storage_service) self.table_mode_manager = TableModeManager(self.storage_service) self.playlist_manager = PlaylistManager(self.storage_service) diff --git a/antarest/study/web/study_data_blueprint.py b/antarest/study/web/study_data_blueprint.py index 14ea1819d5..50801a8d01 100644 --- a/antarest/study/web/study_data_blueprint.py +++ b/antarest/study/web/study_data_blueprint.py @@ -40,6 +40,7 @@ OptimizationFormFields, ) from antarest.study.business.playlist_management import PlaylistColumns +from antarest.study.business.renewable_management import RenewableFormFields from antarest.study.business.table_mode_management import ( ColumnModelTypes, TableTemplateType, @@ -446,9 +447,7 @@ def set_hydro_form_values( uuid, StudyPermissionType.WRITE, params ) - return study_service.hydro_manager.set_field_values( - study, data, area_id - ) + study_service.hydro_manager.set_field_values(study, data, area_id) @bp.put( "/studies/{uuid}/matrix", @@ -1002,7 +1001,7 @@ def get_advanced_parameters( tags=[APITag.study_data], summary="Set Advanced parameters new values", ) - def set_advanced_params( + def set_advanced_parameters( uuid: str, field_values: AdvancedParamsFormFields, current_user: JWTUser = Depends(auth.get_current_user), @@ -1040,4 +1039,58 @@ def generate_timeseries( return study_service.generate_timeseries(study, params) + @bp.get( + path="/studies/{uuid}/areas/{area_id}/clusters/renewable/{cluster_id}/form", + tags=[APITag.study_data], + summary="Get renewable options for a given cluster", + response_model=RenewableFormFields, + response_model_exclude_none=True, + ) + def get_renewable_form_values( + uuid: str, + area_id: str, + cluster_id: str, + current_user: JWTUser = Depends(auth.get_current_user), + ) -> RenewableFormFields: + logger.info( + "Getting renewable form values for study %s and cluster %s", + uuid, + cluster_id, + extra={"user": current_user.id}, + ) + params = RequestParameters(user=current_user) + study = study_service.check_study_access( + uuid, StudyPermissionType.READ, params + ) + return study_service.renewable_manager.get_field_values( + study, area_id, cluster_id + ) + + @bp.put( + path="/studies/{uuid}/areas/{area_id}/clusters/renewable/{cluster_id}/form", + tags=[APITag.study_data], + summary="Set renewable form values for a given cluster", + ) + def set_renewable_form_values( + uuid: str, + area_id: str, + cluster_id: str, + form_fields: RenewableFormFields, + current_user: JWTUser = Depends(auth.get_current_user), + ) -> None: + logger.info( + "Setting renewable form values for study %s and cluster %s", + uuid, + cluster_id, + extra={"user": current_user.id}, + ) + request_params = RequestParameters(user=current_user) + study = study_service.check_study_access( + uuid, StudyPermissionType.WRITE, request_params + ) + + study_service.renewable_manager.set_field_values( + study, area_id, cluster_id, form_fields + ) + return bp diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index b3c5405387..a426209fd5 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -15,7 +15,7 @@ TableTemplateType, TimeSeriesGenerationOption, TransmissionCapacity, - TimeSeriesMode, + TimeSeriesInterpretation, BindingConstraintType, BindingConstraintOperator, ) @@ -1337,6 +1337,8 @@ def test_area_management(app: FastAPI): "profit": True, } + # Hydro form + res_hydro_config = client.put( f"/v1/studies/{study_id}/areas/area1/hydro/form", headers={ @@ -1376,6 +1378,8 @@ def test_area_management(app: FastAPI): "pumpingEfficiency": 1, } + # Time-series form + res_ts_config = client.get( f"/v1/studies/{study_id}/config/timeseries/form", headers={ @@ -1823,14 +1827,14 @@ def test_area_management(app: FastAPI): assert res_table_data_json == { "area 1 / cluster renewable 1": { "group": "", - "tsInterpretation": TimeSeriesMode.POWER_GENERATION.value, + "tsInterpretation": TimeSeriesInterpretation.POWER_GENERATION.value, "enabled": True, "unitCount": 0, "nominalCapacity": 0, }, "area 2 / cluster renewable 2": { "group": "", - "tsInterpretation": TimeSeriesMode.POWER_GENERATION.value, + "tsInterpretation": TimeSeriesInterpretation.POWER_GENERATION.value, "enabled": True, "unitCount": 0, "nominalCapacity": 0, @@ -1847,7 +1851,7 @@ def test_area_management(app: FastAPI): }, json={ "area 1 / cluster renewable 1": { - "tsInterpretation": TimeSeriesMode.PRODUCTION_FACTOR.value, + "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value, "enabled": False, }, "area 2 / cluster renewable 2": { @@ -1872,14 +1876,14 @@ def test_area_management(app: FastAPI): assert res_table_data_json == { "area 1 / cluster renewable 1": { "group": "", - "tsInterpretation": TimeSeriesMode.PRODUCTION_FACTOR.value, + "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value, "enabled": False, "unitCount": 0, "nominalCapacity": 0, }, "area 2 / cluster renewable 2": { "group": "", - "tsInterpretation": TimeSeriesMode.POWER_GENERATION.value, + "tsInterpretation": TimeSeriesInterpretation.POWER_GENERATION.value, "enabled": True, "unitCount": 2, "nominalCapacity": 13, @@ -1975,6 +1979,42 @@ def test_area_management(app: FastAPI): # --- TableMode END --- + # Renewable form + + res_renewable_config = client.put( + f"/v1/studies/{study_id}/areas/area 1/clusters/renewable/cluster renewable 1/form", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + json={ + "name": "cluster renewable 1 renamed", + "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value, + "unitCount": 9, + "enabled": False, + "nominalCapacity": 3, + }, + ) + assert res_renewable_config.status_code == 200 + + res_renewable_config = client.get( + f"/v1/studies/{study_id}/areas/area 1/clusters/renewable/cluster renewable 1/form", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + ) + res_renewable_config_json = res_renewable_config.json() + + assert res_renewable_config_json == { + "group": "", + "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value, + "name": "cluster renewable 1 renamed", + "unitCount": 9, + "enabled": False, + "nominalCapacity": 3, + } + + # Links + client.delete( f"/v1/studies/{study_id}/links/area%201/area%202", headers={ diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json index e6d19187d9..36dea875b1 100644 --- a/webapp/public/locales/en/main.json +++ b/webapp/public/locales/en/main.json @@ -418,7 +418,7 @@ "study.modelization.clusters.matrix.tsGen": "TS generator", "study.modelization.clusters.matrix.timeSeries": "Time-Series", "study.modelization.clusters.backClusterList": "Back to cluster list", - "study.modelization.clusters.tsInterpretation": "Time-Series mode", + "study.modelization.clusters.tsInterpretation": "TS interpretation", "study.modelization.clusters.group": "Group", "studies.modelization.clusters.question.delete": "Are you sure you want to delete this cluster?", "study.modelization.bindingConst.comments": "Comments", @@ -554,7 +554,7 @@ "variants.error.commandUpdated": "Failed to update command", "variants.error.commandDeleted": "Failed to delete command", "variants.error.addCommand": "Failed to add command", - "variants.error.moveCommand": "Failed to move command", + "variants.error.moveCommand": "Failed to move command", "variants.error.fetchCommand": "Failed to retrieve commands", "variants.success.import": "File imported successfully", "variants.error.import": "Failed to import file", diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json index aa31e78699..4971c707c4 100644 --- a/webapp/public/locales/fr/main.json +++ b/webapp/public/locales/fr/main.json @@ -418,7 +418,7 @@ "study.modelization.clusters.matrix.tsGen": "TS generator", "study.modelization.clusters.matrix.timeSeries": "Séries temporelles", "study.modelization.clusters.backClusterList": "Retour à la liste des clusters", - "study.modelization.clusters.tsInterpretation": "Mode séries temporelles", + "study.modelization.clusters.tsInterpretation": "TS interpretation", "study.modelization.clusters.group": "Groupes", "studies.modelization.clusters.question.delete": "Êtes-vous sûr de vouloir supprimer ce cluster ?", "study.modelization.bindingConst.comments": "Commentaires", diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx new file mode 100644 index 0000000000..c7ab6c6123 --- /dev/null +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx @@ -0,0 +1,75 @@ +import { useTranslation } from "react-i18next"; +import NumberFE from "../../../../../../common/fieldEditors/NumberFE"; +import SelectFE from "../../../../../../common/fieldEditors/SelectFE"; +import StringFE from "../../../../../../common/fieldEditors/StringFE"; +import SwitchFE from "../../../../../../common/fieldEditors/SwitchFE"; +import Fieldset from "../../../../../../common/Fieldset"; +import { useFormContextPlus } from "../../../../../../common/Form"; +import { + CLUSTER_GROUP_OPTIONS, + RenewableFormFields, + TS_INTERPRETATION_OPTIONS, +} from "./utils"; + +function Fields() { + const [t] = useTranslation(); + const { control } = useFormContextPlus(); + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + + return ( + <> +

+ + + +
+
+ + + +
+ + ); +} + +export default Fields; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/RenewableForm.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/RenewableForm.tsx deleted file mode 100644 index c3fd7b4618..0000000000 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/RenewableForm.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { Box } from "@mui/material"; -import { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { noDataValues, RenewableType, tsModeOptions } from "./utils"; -import { MatrixStats, StudyMetadata } from "../../../../../../../common/types"; -import MatrixInput from "../../../../../../common/MatrixInput"; -import { IFormGenerator } from "../../../../../../common/FormGenerator"; -import AutoSubmitGeneratorForm from "../../../../../../common/FormGenerator/AutoSubmitGenerator"; -import { saveField } from "../common/utils"; -import { transformNameToId } from "../../../../../../../services/utils"; -import DocLink from "../../../../../../common/DocLink"; -import { ACTIVE_WINDOWS_DOC_PATH } from "../../BindingConstraints/BindingConstView/utils"; - -interface Props { - area: string; - cluster: string; - study: StudyMetadata; - groupList: Array; -} - -export default function RenewableForm(props: Props) { - const { groupList, study, area, cluster } = props; - const [t] = useTranslation(); - const pathPrefix = useMemo( - () => `input/renewables/clusters/${area}/list/${cluster}`, - [area, cluster] - ); - const studyId = study.id; - - const groupOptions = useMemo( - () => groupList.map((item) => ({ label: item, value: item })), - // eslint-disable-next-line react-hooks/exhaustive-deps - [JSON.stringify(groupList)] - ); - - const saveValue = useMemo( - () => saveField(studyId, pathPrefix, noDataValues), - [pathPrefix, studyId] - ); - - const jsonGenerator: IFormGenerator = useMemo( - () => [ - { - legend: "global.general", - fields: [ - { - type: "text", - name: "name", - path: `${pathPrefix}/name`, - label: t("global.name"), - disabled: true, - }, - { - type: "select", - name: "group", - path: `${pathPrefix}/group`, - label: t("study.modelization.clusters.group"), - options: groupOptions, - }, - { - type: "select", - name: "ts-interpretation", - path: `${pathPrefix}/ts-interpretation`, - label: t("study.modelization.clusters.tsInterpretation"), - options: tsModeOptions, - }, - ], - }, - { - legend: "study.modelization.clusters.operatingParameters", - fields: [ - { - type: "switch", - name: "enabled", - path: `${pathPrefix}/enabled`, - label: t("study.modelization.clusters.enabled"), - }, - { - type: "number", - name: "unitcount", - path: `${pathPrefix}/unitcount`, - label: t("study.modelization.clusters.unitcount"), - }, - { - type: "number", - name: "nominalcapacity", - path: `${pathPrefix}/nominalcapacity`, - label: t("study.modelization.clusters.nominalCapacity"), - }, - ], - }, - ], - [groupOptions, pathPrefix, t] - ); - - return ( - <> - - - - - - - ); -} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx index 0fb3216cf9..21f6816430 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx @@ -1,31 +1,91 @@ +import { Box } from "@mui/material"; import { useTranslation } from "react-i18next"; import { useOutletContext } from "react-router-dom"; -import { StudyMetadata } from "../../../../../../../common/types"; +import { MatrixStats, StudyMetadata } from "../../../../../../../common/types"; +import { transformNameToId } from "../../../../../../../services/utils"; +import DocLink from "../../../../../../common/DocLink"; +import Form from "../../../../../../common/Form"; +import { SubmitHandlerPlus } from "../../../../../../common/Form/types"; +import MatrixInput from "../../../../../../common/MatrixInput"; +import { ACTIVE_WINDOWS_DOC_PATH } from "../../BindingConstraints/BindingConstView/utils"; import ClusterRoot from "../common/ClusterRoot"; import { getDefaultValues } from "../common/utils"; -import RenewableForm from "./RenewableForm"; -import { fixedGroupList, noDataValues } from "./utils"; +import Fields from "./Fields"; +import { + CLUSTER_GROUP_OPTIONS, + getRenewableFormFields, + RenewableFormFields, + updateRenewableFormFields, +} from "./utils"; function Renewables() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const [t] = useTranslation(); + //////////////////////////////////////////////////////////////// + // Event handlers + //////////////////////////////////////////////////////////////// + + const handleSubmit = + (areaId: string, clusterId: string) => + ({ dirtyValues }: SubmitHandlerPlus) => { + return updateRenewableFormFields( + study.id, + areaId, + clusterId, + dirtyValues + ); + }; + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + return ( - {({ study, cluster, area, groupList }) => ( - + {({ study, cluster, area }) => ( + <> + + { + return getRenewableFormFields(study.id, area, cluster); + }, + }} + onSubmit={handleSubmit(area, cluster)} + autoSubmit + > + + + + + + )} ); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts index f60a99d35f..9ca021196b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts @@ -1,39 +1,79 @@ -import { FieldValues } from "react-hook-form"; +import { + Area, + Cluster, + StudyMetadata, +} from "../../../../../../../common/types"; +import client from "../../../../../../../services/api/client"; -type TsModeType = "power-generation" | "production-factor"; +//////////////////////////////////////////////////////////////// +// Enums +//////////////////////////////////////////////////////////////// -export interface RenewableType extends FieldValues { +enum ClusterGroup { + WindOnshore = "Wind Onshore", + WindOffshore = "Wind Offshore", + SolarThermal = "Solar Thermal", + SolarPV = "Solar PV", + SolarRooftop = "Solar Rooftop", + OtherRES1 = "Other RES 1", + OtherRES2 = "Other RES 2", + OtherRES3 = "Other RES 3", + OtherRES4 = "Other RES 4", +} + +enum TimeSeriesInterpretation { + PowerGeneration = "power-generation", + ProductionFactor = "production-factor", +} + +//////////////////////////////////////////////////////////////// +// Types +//////////////////////////////////////////////////////////////// + +export interface RenewableFormFields { name: string; - group?: string; - "ts-interpretation": TsModeType; - enabled: boolean; // Default: true - unitcount: number; // Default: 0 - nominalcapacity: number; // Default: 0 + group: string; + tsInterpretation: TimeSeriesInterpretation; + enabled: boolean; + unitCount: number; + nominalCapacity: number; } -export const noDataValues: Partial = { - enabled: true, - unitcount: 0, - nominalcapacity: 0, -}; - -export const tsModeOptions = ["power-generation", "production-factor"].map( - (item) => ({ - label: item, - value: item, - }) +//////////////////////////////////////////////////////////////// +// Constants +//////////////////////////////////////////////////////////////// + +export const CLUSTER_GROUP_OPTIONS = Object.values(ClusterGroup); +export const TS_INTERPRETATION_OPTIONS = Object.values( + TimeSeriesInterpretation ); -export const fixedGroupList = [ - "Wind Onshore", - "Wind Offshore", - "Solar Thermal", - "Solar PV", - "Solar Rooftop", - "Other RES 1", - "Other RES 2", - "Other RES 3", - "Other RES 4", -]; - -export type RenewablePath = Record; +//////////////////////////////////////////////////////////////// +// Functions +//////////////////////////////////////////////////////////////// + +function makeRequestURL( + studyId: StudyMetadata["id"], + areaId: Area["name"], + clusterId: Cluster["id"] +): string { + return `/v1/studies/${studyId}/areas/${areaId}/clusters/renewable/${clusterId}/form`; +} + +export async function getRenewableFormFields( + studyId: StudyMetadata["id"], + areaId: Area["name"], + clusterId: Cluster["id"] +): Promise { + const res = await client.get(makeRequestURL(studyId, areaId, clusterId)); + return res.data; +} + +export function updateRenewableFormFields( + studyId: StudyMetadata["id"], + areaId: Area["name"], + clusterId: Cluster["id"], + values: Partial +): Promise { + return client.put(makeRequestURL(studyId, areaId, clusterId), values); +} From 91553dce9d1b8b2e20924cc2839963abc18c6b2a Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Tue, 21 Feb 2023 16:44:43 +0100 Subject: [PATCH 34/60] build: update package.json and remove unused files (#1323) --- webapp/.gitignore | 1 - webapp/package-lock.json | 16856 ++++++++++++++++ webapp/package.json | 104 +- .../index.tsx => CreateVariantDialog.tsx} | 22 +- .../CreateVariantModal/style.ts | 25 - .../HomeView/InformationView/index.tsx | 4 +- .../index.tsx => PropertiesDialog.tsx} | 28 +- .../App/Singlestudy/PropertiesDialog/style.ts | 34 - .../Modelization/Areas/Properties/common.ts | 52 - .../Modelization/Areas/Properties/utils.ts | 2 +- .../DebugView/StudyDataView/utils/utils.ts | 22 - .../explore/Modelization/Map/index.tsx | 2 +- .../explore/Modelization/TableMode/utils.ts | 2 +- webapp/src/components/common/ButtonLoader.tsx | 73 - .../common/EditableMatrix/utils.test.ts | 30 - .../FormGenerator/AutoSubmitGenerator.tsx | 2 +- .../components/common/FormGenerator/index.tsx | 17 +- .../components/common/SnackErrorMessage.tsx | 62 +- webapp/src/components/common/TagTextInput.tsx | 64 - webapp/src/{i18n.js => i18n.ts} | 6 +- webapp/src/index.tsx | 4 +- webapp/src/reportWebVitals.ts | 15 - webapp/src/services/api/client.ts | 30 +- webapp/src/services/api/file.ts | 8 - webapp/src/services/api/matrix.ts | 2 +- webapp/src/services/api/study.ts | 4 +- webapp/src/services/api/xpansion.ts | 2 +- webapp/src/services/utils/index.ts | 5 +- webapp/src/setupTests.ts | 5 - webapp/src/types/i18next.d.ts | 7 + 30 files changed, 16999 insertions(+), 491 deletions(-) create mode 100644 webapp/package-lock.json rename webapp/src/components/App/Singlestudy/HomeView/InformationView/{CreateVariantModal/index.tsx => CreateVariantDialog.tsx} (76%) delete mode 100644 webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantModal/style.ts rename webapp/src/components/App/Singlestudy/{PropertiesDialog/index.tsx => PropertiesDialog.tsx} (83%) delete mode 100644 webapp/src/components/App/Singlestudy/PropertiesDialog/style.ts delete mode 100644 webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/common.ts delete mode 100644 webapp/src/components/App/Singlestudy/explore/Modelization/DebugView/StudyDataView/utils/utils.ts delete mode 100644 webapp/src/components/common/ButtonLoader.tsx delete mode 100644 webapp/src/components/common/EditableMatrix/utils.test.ts delete mode 100644 webapp/src/components/common/TagTextInput.tsx rename webapp/src/{i18n.js => i18n.ts} (91%) delete mode 100644 webapp/src/reportWebVitals.ts delete mode 100644 webapp/src/services/api/file.ts delete mode 100644 webapp/src/setupTests.ts create mode 100644 webapp/src/types/i18next.d.ts diff --git a/webapp/.gitignore b/webapp/.gitignore index 8c83629c66..7c8c611439 100644 --- a/webapp/.gitignore +++ b/webapp/.gitignore @@ -4,7 +4,6 @@ /node_modules /.pnp .pnp.js -package-lock.json # testing /coverage diff --git a/webapp/package-lock.json b/webapp/package-lock.json new file mode 100644 index 0000000000..180c77d5f1 --- /dev/null +++ b/webapp/package-lock.json @@ -0,0 +1,16856 @@ +{ + "name": "antares-web", + "version": "2.13.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "requires": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==" + }, + "@babel/core": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/eslint-parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", + "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/generator": { + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "requires": { + "@babel/types": "^7.21.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", + "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", + "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "requires": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "requires": { + "@babel/types": "^7.21.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.0.tgz", + "integrity": "sha512-eD/JQ21IG2i1FraJnTMbUarAUkA7G988ofehG5MDCRXaUU91rEBJuCeSoou2Sk1y4RbLYXzqEg1QLwEmRU4qcQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" + }, + "@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + } + }, + "@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", + "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", + "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.21.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", + "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", + "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", + "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-flow": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", + "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz", + "integrity": "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", + "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.21.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", + "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz", + "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/preset-typescript": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", + "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-typescript": "^7.21.0" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/runtime-corejs3": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz", + "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==", + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz", + "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.0", + "@babel/types": "^7.21.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz", + "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@braintree/sanitize-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", + "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" + }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + } + }, + "@csstools/normalize.css": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" + }, + "@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "requires": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==" + }, + "@csstools/selector-specificity": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", + "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==" + }, + "@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "requires": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "requires": { + "@emotion/memoize": "^0.8.0" + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "requires": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "@emotion/styled": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", + "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + } + }, + "@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==" + }, + "@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@handsontable/react": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@handsontable/react/-/react-12.3.1.tgz", + "integrity": "sha512-BwumRAQqHeuxaRF9xShWO6ivlNYZ9ZoU/WabKfjtnAv/Ke4g9/VBxe4UZ+x/rElpz06f0yzBm4cG0A6AS4Hyug==" + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==" + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + } + }, + "@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + } + }, + "@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "requires": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + } + }, + "@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/mapbox-gl-supported": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@mui/base": { + "version": "5.0.0-alpha.118", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.118.tgz", + "integrity": "sha512-GAEpqhnuHjRaAZLdxFNuOf2GDTp9sUawM46oHZV4VnYPFjXJDkIYFWfIQLONb0nga92OiqS5DD/scGzVKCL0Mw==", + "requires": { + "@babel/runtime": "^7.20.13", + "@emotion/is-prop-valid": "^1.2.0", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.9", + "@popperjs/core": "^2.11.6", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@mui/core-downloads-tracker": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.9.tgz", + "integrity": "sha512-YGEtucQ/Nl91VZkzYaLad47Cdui51n/hW+OQm4210g4N3/nZzBxmGeKfubEalf+ShKH4aYDS86XTO6q/TpZnjQ==" + }, + "@mui/icons-material": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.9.tgz", + "integrity": "sha512-SPANMk6K757Q1x48nCwPGdSNb8B71d+2hPMJ0V12VWerpSsbjZtvAPi5FAn13l2O5mwWkvI0Kne+0tCgnNxMNw==", + "requires": { + "@babel/runtime": "^7.20.13" + } + }, + "@mui/lab": { + "version": "5.0.0-alpha.120", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.120.tgz", + "integrity": "sha512-vjlF2jTKSZnNxtUO0xxHEDfpL5cG0LLNRsfKv8TYOiPs0Q1bbqO3YfqJsqxv8yh+wx7EFZc8lwJ4NSAQdenW3A==", + "requires": { + "@babel/runtime": "^7.20.13", + "@mui/base": "5.0.0-alpha.118", + "@mui/system": "^5.11.9", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.9", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@mui/material": { + "version": "5.11.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.10.tgz", + "integrity": "sha512-hs1WErbiedqlJIZsljgoil908x4NMp8Lfk8di+5c7o809roqKcFTg2+k3z5ucKvs29AXcsdXrDB/kn2K6dGYIw==", + "requires": { + "@babel/runtime": "^7.20.13", + "@mui/base": "5.0.0-alpha.118", + "@mui/core-downloads-tracker": "^5.11.9", + "@mui/system": "^5.11.9", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.9", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "csstype": "^3.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@mui/private-theming": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.9.tgz", + "integrity": "sha512-XMyVIFGomVCmCm92EvYlgq3zrC9K+J6r7IKl/rBJT2/xVYoRY6uM7jeB+Wxh7kXxnW9Dbqsr2yL3cx6wSD1sAg==", + "requires": { + "@babel/runtime": "^7.20.13", + "@mui/utils": "^5.11.9", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.9.tgz", + "integrity": "sha512-bkh2CjHKOMy98HyOc8wQXEZvhOmDa/bhxMUekFX5IG0/w4f5HJ8R6+K6nakUUYNEgjOWPYzNPrvGB8EcGbhahQ==", + "requires": { + "@babel/runtime": "^7.20.13", + "@emotion/cache": "^11.10.5", + "csstype": "^3.1.1", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.9.tgz", + "integrity": "sha512-h6uarf+l3FO6l75Nf7yO+qDGrIoa1DM9nAMCUFZQsNCDKOInRzcptnm8M1w/Z3gVetfeeGoIGAYuYKbft6KZZA==", + "requires": { + "@babel/runtime": "^7.20.13", + "@mui/private-theming": "^5.11.9", + "@mui/styled-engine": "^5.11.9", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.9", + "clsx": "^1.2.1", + "csstype": "^3.1.1", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", + "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==" + }, + "@mui/utils": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.9.tgz", + "integrity": "sha512-eOJaqzcEs4qEwolcvFAmXGpln+uvouvOS9FUX6Wkrte+4I8rZbjODOBDVNlK+V6/ziTfD4iNKC0G+KfOTApbqg==", + "requires": { + "@babel/runtime": "^7.20.13", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^16.7.1 || ^17.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "requires": { + "eslint-scope": "5.1.1" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@plotly/d3": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.1.tgz", + "integrity": "sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg==" + }, + "@plotly/d3-sankey": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", + "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + } + }, + "@plotly/d3-sankey-circular": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", + "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", + "requires": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + } + }, + "@plotly/point-cluster": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", + "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "requires": { + "array-bounds": "^1.0.1", + "binary-search-bounds": "^2.0.4", + "clamp": "^1.0.1", + "defined": "^1.0.0", + "dtype": "^2.0.0", + "flatten-vertex-data": "^1.0.2", + "is-obj": "^1.0.1", + "math-log2": "^1.0.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0" + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + } + } + }, + "@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + }, + "@reduxjs/toolkit": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", + "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==", + "requires": { + "immer": "^9.0.16", + "redux": "^4.2.0", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.7" + } + }, + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + } + } + }, + "@rushstack/eslint-patch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "requires": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/centroid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==" + }, + "@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "requires": { + "@turf/helpers": "^6.5.0" + } + }, + "@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/d3": { + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.16.4.tgz", + "integrity": "sha512-2u0O9iP1MubFiQ+AhR1id4Egs+07BLtvRATG6IL2Gs9+KzdrfaxCKNq5hxEyw1kxwsqB/lCgr108XuHcKtb/5w==", + "requires": { + "@types/d3-array": "^1", + "@types/d3-axis": "^1", + "@types/d3-brush": "^1", + "@types/d3-chord": "^1", + "@types/d3-collection": "*", + "@types/d3-color": "^1", + "@types/d3-contour": "^1", + "@types/d3-dispatch": "^1", + "@types/d3-drag": "^1", + "@types/d3-dsv": "^1", + "@types/d3-ease": "^1", + "@types/d3-fetch": "^1", + "@types/d3-force": "^1", + "@types/d3-format": "^1", + "@types/d3-geo": "^1", + "@types/d3-hierarchy": "^1", + "@types/d3-interpolate": "^1", + "@types/d3-path": "^1", + "@types/d3-polygon": "^1", + "@types/d3-quadtree": "^1", + "@types/d3-random": "^1", + "@types/d3-scale": "^2", + "@types/d3-scale-chromatic": "^1", + "@types/d3-selection": "^1", + "@types/d3-shape": "^1", + "@types/d3-time": "^1", + "@types/d3-time-format": "^2", + "@types/d3-timer": "^1", + "@types/d3-transition": "^1", + "@types/d3-voronoi": "*", + "@types/d3-zoom": "^1" + } + }, + "@types/d3-array": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.9.tgz", + "integrity": "sha512-E/7RgPr2ylT5dWG0CswMi9NpFcjIEDqLcUSBgNHe/EMahfqYaTx4zhcggG3khqoEB/leY4Vl6nTSbwLUPjXceA==" + }, + "@types/d3-axis": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.16.tgz", + "integrity": "sha512-p7085weOmo4W+DzlRRVC/7OI/jugaKbVa6WMQGCQscaMylcbuaVEGk7abJLNyGVFLeCBNrHTdDiqRGnzvL0nXQ==", + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-4zGkBafJf5zCsBtLtvDj/pNMo5X9+Ii/1hUz0GvQ+wEwelUBm2AbIDAzJnp2hLDFF307o0fhxmmocHclhXC+tw==", + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-chord": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.11.tgz", + "integrity": "sha512-0DdfJ//bxyW3G9Nefwq/LDgazSKNN8NU0lBT3Cza6uVuInC2awMNsAcv1oKyRFLn9z7kXClH5XjwpveZjuz2eg==" + }, + "@types/d3-collection": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.10.tgz", + "integrity": "sha512-54Fdv8u5JbuXymtmXm2SYzi1x/Svt+jfWBU5junkhrCewL92VjqtCBDn97coBRVwVFmYNnVTNDyV8gQyPYfm+A==" + }, + "@types/d3-color": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz", + "integrity": "sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA==" + }, + "@types/d3-contour": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.3.3.tgz", + "integrity": "sha512-LxwmGIfVJIc1cKs7ZFRQ1FbtXpfH7QTXYRdMIJsFP71uCMdF6jJ0XZakYDX6Hn4yZkLf+7V8FgD34yCcok+5Ww==", + "requires": { + "@types/d3-array": "^1", + "@types/geojson": "*" + } + }, + "@types/d3-dispatch": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz", + "integrity": "sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ==" + }, + "@types/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw==", + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-dsv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.2.2.tgz", + "integrity": "sha512-GRnz9z8ypqb7OsQ/xw/BmFAp0/k3pgM1s19FTZZSlCMY0EvyVTkU8xzZKKDXzytGXPpTNC4R5pGl9oxEvVSnHQ==" + }, + "@types/d3-ease": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.11.tgz", + "integrity": "sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA==" + }, + "@types/d3-fetch": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-1.2.2.tgz", + "integrity": "sha512-rtFs92GugtV/NpiJQd0WsmGLcg52tIL0uF0bKbbJg231pR9JEb6HT4AUwrtuLq3lOeKdLBhsjV14qb0pMmd0Aw==", + "requires": { + "@types/d3-dsv": "^1" + } + }, + "@types/d3-force": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.4.tgz", + "integrity": "sha512-fkorLTKvt6AQbFBQwn4aq7h9rJ4c7ZVcPMGB8X6eFFveAyMZcv7t7m6wgF4Eg93rkPgPORU7sAho1QSHNcZu6w==" + }, + "@types/d3-format": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.2.tgz", + "integrity": "sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ==" + }, + "@types/d3-geo": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.12.4.tgz", + "integrity": "sha512-lNDaAuOaML6w2d1XE0Txr5YOXLBQSF1q2IU6eXh/u1TTPQSm2Ah+TMIub1+CIMq8J/7DOzi5Cr8/yHqjNvqLKA==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==" + }, + "@types/d3-interpolate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz", + "integrity": "sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg==", + "requires": { + "@types/d3-color": "^1" + } + }, + "@types/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==" + }, + "@types/d3-polygon": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.8.tgz", + "integrity": "sha512-1TOJPXCBJC9V3+K3tGbTqD/CsqLyv/YkTXAcwdsZzxqw5cvpdnCuDl42M4Dvi8XzMxZNCT9pL4ibrK2n4VmAcw==" + }, + "@types/d3-quadtree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.9.tgz", + "integrity": "sha512-5E0OJJn2QVavITFEc1AQlI8gLcIoDZcTKOD3feKFckQVmFV4CXhqRFt83tYNVNIN4ZzRkjlAMavJa1ldMhf5rA==" + }, + "@types/d3-random": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.3.tgz", + "integrity": "sha512-XXR+ZbFCoOd4peXSMYJzwk0/elP37WWAzS/DG+90eilzVbUSsgKhBcWqylGWe+lA2ubgr7afWAOBaBxRgMUrBQ==" + }, + "@types/d3-scale": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.2.6.tgz", + "integrity": "sha512-CHu34T5bGrJOeuhGxyiz9Xvaa9PlsIaQoOqjDg7zqeGj2x0rwPhGquiy03unigvcMxmvY0hEaAouT0LOFTLpIw==", + "requires": { + "@types/d3-time": "^1" + } + }, + "@types/d3-scale-chromatic": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.1.tgz", + "integrity": "sha512-7FtJYrmXTEWLykShjYhoGuDNR/Bda0+tstZMkFj4RRxUEryv16AGh3be21tqg84B6KfEwiZyEpBcTyPyU+GWjg==" + }, + "@types/d3-selection": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz", + "integrity": "sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA==" + }, + "@types/d3-shape": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz", + "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==", + "requires": { + "@types/d3-path": "^1" + } + }, + "@types/d3-time": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.1.tgz", + "integrity": "sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw==" + }, + "@types/d3-time-format": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.1.tgz", + "integrity": "sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA==" + }, + "@types/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg==" + }, + "@types/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-J+a3SuF/E7wXbOSN19p8ZieQSFIm5hU2Egqtndbc54LXaAEOpLfDx4sBu/PKAKzHOdgKK1wkMhINKqNh4aoZAg==", + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-voronoi": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz", + "integrity": "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==" + }, + "@types/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-3kHkL6sPiDdbfGhzlp5gIHyu3kULhtnHTTAl3UBZVtWB1PzcLL8vdmz5mTx7plLiUqOA2Y+yT2GKjt/TdA2p7Q==", + "requires": { + "@types/d3-interpolate": "^1", + "@types/d3-selection": "^1" + } + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/draft-convert": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/draft-convert/-/draft-convert-2.1.4.tgz", + "integrity": "sha512-NbhE0ijzENK6ZQa3zO0KK6cNS80XESnQ03Bg7DEzE/qBg6YvpIEni6vzruYCYPkm1Sc6z0K7XbtJu4p53elGdA==", + "requires": { + "@types/draft-js": "*", + "@types/react": "*" + } + }, + "@types/draft-js": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@types/draft-js/-/draft-js-0.11.10.tgz", + "integrity": "sha512-o/DST8x0wNerwhRiaE577UHFIXb6HCywaZOZfj9TF2vU3CONvsCGoQmdOsKqERdXp+3ZNlSvFUH0B8lEEYOT4A==", + "requires": { + "@types/react": "*", + "immutable": "~3.7.4" + } + }, + "@types/draftjs-to-html": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@types/draftjs-to-html/-/draftjs-to-html-0.8.1.tgz", + "integrity": "sha512-NBkphQs+qZ/sAz/j1pCUaxkPAOx00LTsE88aMSSfcvK+UfCpjHJDqIMCkm6wKotuJvY5w0BtdRazQ0sAaXzPdg==", + "requires": { + "@types/draft-js": "*" + } + }, + "@types/eslint": { + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", + "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "requires": { + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/js-cookie": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.3.tgz", + "integrity": "sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@types/lodash": { + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "dev": true + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "@types/node": { + "version": "16.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.20.tgz", + "integrity": "sha512-lAKaZ0Lc1Umwd0AqLr6iy5U8u/1DpK7/JzNgQn9cMMUk2mFR8bbhEP8BQrI9Cm5CU0bOVCaWbkGBvgqKMOJHsw==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/pikaday": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@types/pikaday/-/pikaday-1.7.4.tgz", + "integrity": "sha512-0KsHVyw5pTG829nqG4IRu7m+BFQlFEBdbE/1i3S5182HeKUKv1uEW0gyEmkJVp5i4IV+9pyh23O83+KpRkSQbw==", + "requires": { + "moment": ">=2.14.0" + } + }, + "@types/plotly.js": { + "version": "2.12.18", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-2.12.18.tgz", + "integrity": "sha512-ff+CIEWnqZNjZqHtQZvkEAVuLs9fkm1f54QnPVmgoET7wMHdSqUka2hasVN4e5yfHD05YwGjsAtCseewJh/BMw==", + "dev": true + }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/ramda": { + "version": "0.28.23", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.28.23.tgz", + "integrity": "sha512-9TYWiwkew+mCMsL7jZ+kkzy6QXn8PL5/SKmBPmjgUlTpkokZWTBr+OhiIUDztpAEbslWyt24NNfEmZUBFmnXig==", + "dev": true, + "requires": { + "ts-toolbelt": "^6.15.1" + }, + "dependencies": { + "ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "dev": true + } + } + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/react": { + "version": "18.0.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", + "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-beautiful-dnd": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.3.tgz", + "integrity": "sha512-BNdmvONKtsrZq3AGrujECQrIn8cDT+fZsxBLXuX3YWY/nHfZinUFx4W88eS0rkcXzuLbXpKOsu/1WCMPMLEpPg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-color": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.6.tgz", + "integrity": "sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w==", + "dev": true, + "requires": { + "@types/react": "*", + "@types/reactcss": "*" + } + }, + "@types/react-d3-graph": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/react-d3-graph/-/react-d3-graph-2.6.3.tgz", + "integrity": "sha512-OYM7eO/4U6ARP8E3izk5VrkHLqO/0YI3QGFymLGt/AR/ETbc4Spx0Ljpa/3hJ/0wLmncLTyUV6gegcNooDAEww==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-is": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", + "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-plotly.js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.6.0.tgz", + "integrity": "sha512-nJJ57U0/CNDAO+F3dpnMgM8PtjLE/O1I3O6gq4+5Q13uKqrPnHGYOttfdzQJ4D7KYgF609miVzEYakUS2zds8w==", + "dev": true, + "requires": { + "@types/plotly.js": "*", + "@types/react": "*" + } + }, + "@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/reactcss": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.6.tgz", + "integrity": "sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/redux-logger": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.9.tgz", + "integrity": "sha512-cwYhVbYNgH01aepeMwhd0ABX6fhVB2rcQ9m80u8Fl50ZODhsZ8RhQArnLTkE7/Zrfq4Sz/taNoF7DQy9pCZSKg==", + "dev": true, + "requires": { + "redux": "^4.0.0" + } + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/swagger-ui-react": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-react/-/swagger-ui-react-4.11.0.tgz", + "integrity": "sha512-WPMR+GWbLd7zvY/uOTGzGzP44zK2rIZSnU00+pDR2YANnEV6/qj0kqYfdSY1Vk6qdvI7dR0Tx8JEMgUUrUQDjw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "@types/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", + "dev": true + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "requires": { + "@types/node": "*" + } + }, + "@types/xml-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/xml-js/-/xml-js-1.0.0.tgz", + "integrity": "sha512-tRJYQN/uAD8Br9K+pqqzJNd/htIxQaFy6ppfNEWbwsAoWRK3oAxzROCGA39GHT+E3BHLyuBnSB7XKsnJ0s4w2g==", + "requires": { + "xml-js": "*" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", + "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "requires": { + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/type-utils": "5.53.0", + "@typescript-eslint/utils": "5.53.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.53.0.tgz", + "integrity": "sha512-4SklZEwRn0jqkhtW+pPZpbKFXprwGneBndRM0TGzJu/LWdb9QV2hBgFIVU9AREo02BzqFvyG/ypd+xAW5YGhXw==", + "requires": { + "@typescript-eslint/utils": "5.53.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", + "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "requires": { + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", + "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "requires": { + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", + "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "requires": { + "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/utils": "5.53.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", + "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", + "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "requires": { + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", + "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", + "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "requires": { + "@typescript-eslint/types": "5.53.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "requires": { + "deep-equal": "^2.0.5" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-normalize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", + "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "requires": { + "array-bounds": "^1.0.0" + } + }, + "array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==" + }, + "array-rearrange": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", + "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==" + }, + "attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" + }, + "autolinker": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", + "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, + "axe-core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", + "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==" + }, + "axios": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.3.tgz", + "integrity": "sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "requires": { + "deep-equal": "^2.0.5" + } + }, + "babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "requires": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "bignumber.js": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", + "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==" + }, + "bitmap-sdf": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz", + "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==" + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001457", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", + "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==" + }, + "canvas-fit": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", + "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==", + "requires": { + "element-size": "^1.1.1" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "check-types": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", + "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==" + }, + "chevrotain": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", + "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "optional": true, + "requires": { + "regexp-to-ast": "0.4.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==" + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "color-alpha": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", + "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", + "requires": { + "color-parse": "^1.3.8" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", + "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "requires": { + "clamp": "^1.0.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "color-normalize": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", + "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", + "requires": { + "clamp": "^1.0.1", + "color-rgba": "^2.1.1", + "dtype": "^2.0.0" + } + }, + "color-parse": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", + "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", + "requires": { + "color-name": "^1.0.0", + "defined": "^1.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "color-rgba": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", + "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", + "requires": { + "clamp": "^1.0.1", + "color-parse": "^1.3.8", + "color-space": "^1.14.6" + } + }, + "color-space": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", + "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", + "requires": { + "hsluv": "^0.0.3", + "mumath": "^3.3.4" + } + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "compute-dims": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz", + "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==", + "requires": { + "utils-copy": "^1.0.0", + "validate.io-array": "^1.0.6", + "validate.io-matrix-like": "^1.0.2", + "validate.io-ndarray-like": "^1.0.0", + "validate.io-positive-integer": "^1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + }, + "const-max-uint32": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz", + "integrity": "sha512-T8/9bffg5RThuejasJWrwqxs3Q0fsJvyl7/33IB6svroD8JC93E7X60AuuOnDE8RlP6Jlb5FxmlrVDpl9KiU2Q==" + }, + "const-pinf-float64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz", + "integrity": "sha512-wfs+V4HdSN7C3CWJWR7hVa24yTPn3mDJthwhRIObZBh6UjTjkUMUrCP3UrNGozB/HjTpcScnGXtQUNa+yjsIJQ==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "core-js": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", + "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==" + }, + "core-js-compat": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.28.0.tgz", + "integrity": "sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==", + "requires": { + "browserslist": "^4.21.5" + } + }, + "core-js-pure": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.28.0.tgz", + "integrity": "sha512-DSOVleA9/v3LNj/vFxAPfUHttKTzrB2RXhAPvR5TPXn4vrra3Z2ssytvRyt8eruJwAfwAiFADEbrjcRdcvPLQQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==" + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "css-declaration-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==" + }, + "css-font": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", + "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", + "requires": { + "css-font-size-keywords": "^1.0.0", + "css-font-stretch-keywords": "^1.0.1", + "css-font-style-keywords": "^1.0.1", + "css-font-weight-keywords": "^1.0.0", + "css-global-keywords": "^1.0.1", + "css-system-font-keywords": "^1.0.0", + "pick-by-alias": "^1.2.0", + "string-split-by": "^1.0.0", + "unquote": "^1.1.0" + } + }, + "css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==" + }, + "css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==" + }, + "css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==" + }, + "css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==" + }, + "css-global-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", + "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==" + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "requires": { + "hyphenate-style-name": "^1.0.3" + } + }, + "css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-system-font-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", + "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" + }, + "cssdb": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.4.1.tgz", + "integrity": "sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "requires": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + } + }, + "d3-geo-projection": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", + "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.12.0", + "resolve": "^1.1.10" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==" + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-kerning": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", + "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + } + } + }, + "dompurify": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.4.tgz", + "integrity": "sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ==" + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "draft-convert": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/draft-convert/-/draft-convert-2.1.13.tgz", + "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==", + "requires": { + "@babel/runtime": "^7.5.5", + "immutable": "~3.7.4", + "invariant": "^2.2.1" + } + }, + "draft-js": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.7.tgz", + "integrity": "sha512-ne7yFfN4sEL82QPQEn80xnADR8/Q6ALVworbC5UOSzOvjffmYfFsr3xSZtxbIirti14R7Y33EZC5rivpLgIbsg==", + "requires": { + "fbjs": "^2.0.0", + "immutable": "~3.7.4", + "object-assign": "^4.1.1" + } + }, + "draftjs-to-html": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/draftjs-to-html/-/draftjs-to-html-0.9.1.tgz", + "integrity": "sha512-fFstE6+IayaVFBEvaFt/wN8vdj8FsTRzij7dy7LI9QIwf5LgfHFi9zSpvCg+feJ2tbYVqHxUkjcibwpsTpgFVQ==" + }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==" + }, + "draw-svg-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", + "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", + "requires": { + "abs-svg-path": "~0.1.1", + "normalize-svg-path": "~0.1.0" + } + }, + "dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==" + }, + "dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==" + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.304", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.304.tgz", + "integrity": "sha512-6c8M+ojPgDIXN2NyfGn8oHASXYnayj+gSEnGeLMKb9zjsySeVB/j7KkNAAG9yDcv8gNlhvFg5REa1N/kQU6pgA==" + }, + "element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" + }, + "elementary-circuits-directed-graph": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", + "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "requires": { + "strongly-connected-components": "^1.0.1" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "requires": { + "stackframe": "^1.3.4" + } + }, + "es-abstract": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "requires": { + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + } + } + }, + "eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", + "dev": true + }, + "eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "requires": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "requires": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "requires": { + "@typescript-eslint/experimental-utils": "^5.0.0" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "requires": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==" + }, + "eslint-plugin-testing-library": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.2.tgz", + "integrity": "sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==", + "requires": { + "@typescript-eslint/utils": "^5.43.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" + }, + "eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "requires": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "requires": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-isnumeric": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", + "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", + "requires": { + "is-string-blank": "^1.0.1" + } + }, + "fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fast-loops": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz", + "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==" + }, + "fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "requires": { + "format": "^0.2.0" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "requires": { + "bser": "2.1.1" + } + }, + "fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "requires": { + "fbjs": "^3.0.0" + }, + "dependencies": { + "fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "requires": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + } + } + }, + "fbjs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-2.0.0.tgz", + "integrity": "sha512-8XA8ny9ifxrAWlyhAbexXcs3rRMtxWcs3M0lctLfB49jRDHiaxj+Mo0XxbwE7nKZYzgCFoq64FS+WFd4IycPPQ==", + "requires": { + "core-js": "^3.6.4", + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "requires": { + "tslib": "^2.4.0" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "requires": { + "micromatch": "^4.0.2" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "flatten-vertex-data": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", + "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", + "requires": { + "dtype": "^2.0.0" + } + }, + "flip-pixels": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz", + "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA==" + }, + "flux": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", + "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "requires": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "dependencies": { + "fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "requires": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + } + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "font-atlas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", + "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", + "requires": { + "css-font": "^1.0.0" + } + }, + "font-measure": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", + "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "requires": { + "css-font": "^1.2.0" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + } + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" + }, + "formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "requires": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-canvas-context": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", + "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "gl-text": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.3.1.tgz", + "integrity": "sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==", + "requires": { + "bit-twiddle": "^1.0.2", + "color-normalize": "^1.5.0", + "css-font": "^1.2.0", + "detect-kerning": "^2.1.2", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "font-atlas": "^2.1.0", + "font-measure": "^1.2.2", + "gl-util": "^3.1.2", + "is-plain-obj": "^1.1.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "parse-unit": "^1.0.1", + "pick-by-alias": "^1.2.0", + "regl": "^2.0.0", + "to-px": "^1.0.1", + "typedarray-pool": "^1.1.0" + } + }, + "gl-util": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", + "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", + "requires": { + "is-browser": "^2.0.1", + "is-firefox": "^1.0.3", + "is-plain-obj": "^1.1.0", + "number-is-integer": "^1.0.1", + "object-assign": "^4.1.0", + "pick-by-alias": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", + "requires": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", + "requires": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==" + } + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==" + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", + "requires": { + "glsl-tokenizer": "^2.0.0" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==" + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", + "requires": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==" + }, + "glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==" + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==" + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + }, + "glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==" + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "requires": { + "through2": "^0.6.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "requires": { + "bl": "^2.2.1", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "requires": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "requires": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "handsontable": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/handsontable/-/handsontable-12.3.1.tgz", + "integrity": "sha512-gm6dUoOwWo4ppwBnWFWn3VKSD2SkM00rwnI8JCU4TpsuDebkmqQqBcXZVPLqoOnB2USm/5t64/R4kXqJPaMB2g==", + "requires": { + "@types/pikaday": "1.7.4", + "core-js": "^3.0.0", + "dompurify": "^2.1.1", + "hyperformula": "^2.0.0", + "moment": "2.29.4", + "numbro": "2.1.2", + "pikaday": "1.8.2" + } + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-hover": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", + "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, + "history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "requires": { + "@babel/runtime": "^7.7.6" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==" + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + } + } + }, + "html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "requires": { + "void-elements": "3.1.0" + } + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true + }, + "hyperformula": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hyperformula/-/hyperformula-2.3.0.tgz", + "integrity": "sha512-23hP3/+jq8PzEqcu94JYRugaPU2VGSg2OOuYKeVTiPh7c6JYw71wWteXr2Q3CbSiccmtjfF3EqaA8NrmkJyA1w==", + "optional": true, + "requires": { + "chevrotain": "^6.5.0", + "tiny-emitter": "^2.1.0", + "unorm": "^1.6.0" + } + }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "i18next": { + "version": "22.4.10", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.10.tgz", + "integrity": "sha512-3EqgGK6fAJRjnGgfkNSStl4mYLCjUoJID338yVyLMj5APT67HUtWoqSayZewiiC5elzMUB1VEUwcmSCoeQcNEA==", + "requires": { + "@babel/runtime": "^7.20.6" + } + }, + "i18next-browser-languagedetector": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz", + "integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==", + "requires": { + "@babel/runtime": "^7.19.4" + } + }, + "i18next-xhr-backend": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-3.2.2.tgz", + "integrity": "sha512-OtRf2Vo3IqAxsttQbpjYnmMML12IMB5e0fc5B7qKJFLScitYaXa1OhMX0n0X/3vrfFlpHL9Ro/H+ps4Ej2j7QQ==", + "requires": { + "@babel/runtime": "^7.5.5" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + }, + "idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "image-palette": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz", + "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==", + "requires": { + "color-id": "^1.1.0", + "pxls": "^2.0.0", + "quantize": "^1.0.2" + } + }, + "immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==" + }, + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-prefixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz", + "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==", + "requires": { + "css-in-js-utils": "^3.1.0", + "fast-loops": "^1.1.3" + } + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-base64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz", + "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==" + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + } + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==" + }, + "is-float-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz", + "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==" + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-mobile": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-3.1.1.tgz", + "integrity": "sha512-RRoXXR2HNFxNkUnxtaBdGBXtFlUMFa06S0NUKf/LCF+MuGLu13gi9iBCkoEmc6+rpXuwi5Mso5V8Zf7mNynMBQ==" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-string-blank": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" + }, + "is-svg-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", + "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "requires": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==" + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + } + }, + "jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "dev": true, + "requires": { + "xml": "^1.0.1" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "requires": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", + "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "requires": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "dependencies": { + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "requires": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + }, + "string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "requires": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" + } + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "requires": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==" + }, + "js-file-download": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz", + "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==" + }, + "js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, + "kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "requires": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "requires": { + "tmpl": "1.0.5" + } + }, + "map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "requires": { + "wrappy": "1" + } + } + } + }, + "mapbox-gl": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", + "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.0", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "minimist": "^1.2.5", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.0.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + } + }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-css-extract-plugin": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", + "requires": { + "mouse-event": "^1.0.0" + } + }, + "mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==" + }, + "mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==" + }, + "mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", + "requires": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mumath": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", + "integrity": "sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==", + "requires": { + "almost-equal": "^1.1.0" + } + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, + "nano-css": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz", + "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==", + "requires": { + "css-tree": "^1.1.2", + "csstype": "^3.0.6", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^6.0.0", + "rtl-css-js": "^1.14.0", + "sourcemap-codec": "^1.4.8", + "stacktrace-js": "^2.0.2", + "stylis": "^4.0.6" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "normalize-svg-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", + "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "notistack": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.8.tgz", + "integrity": "sha512-/IY14wkFp5qjPgKNvAdfL5Jp6q90+MjgKTPh4c81r/lW70KeuX6b9pE/4f8L4FG31cNudbN9siiFS5ql1aSLRw==", + "requires": { + "clsx": "^1.1.0", + "hoist-non-react-statics": "^3.3.0" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-integer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", + "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==", + "requires": { + "is-finite": "^1.0.1" + } + }, + "numbro": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", + "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", + "requires": { + "bignumber.js": "^8.0.1" + } + }, + "nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "requires": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parenthesis": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==" + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "requires": { + "pick-by-alias": "^1.2.0" + } + }, + "parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==" + }, + "parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "patch-package": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", + "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^1.10.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "pick-by-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", + "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pikaday": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.8.2.tgz", + "integrity": "sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew==" + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, + "plotly.js": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.18.2.tgz", + "integrity": "sha512-Z8ZgWNfjeIEYxt/PCfpKZoWMxWylGYiuz28W2frUwEeTEcnnspi+JveC3IWYGmlq6dS3AWlJiZOJWJgdrJjCmA==", + "requires": { + "@plotly/d3": "3.8.1", + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@turf/area": "^6.4.0", + "@turf/bbox": "^6.4.0", + "@turf/centroid": "^6.0.2", + "canvas-fit": "^1.5.0", + "color-alpha": "1.0.4", + "color-normalize": "1.5.0", + "color-parse": "1.3.8", + "color-rgba": "2.1.1", + "country-regex": "^1.1.0", + "d3-force": "^1.2.1", + "d3-format": "^1.4.5", + "d3-geo": "^1.12.1", + "d3-geo-projection": "^2.9.0", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^3.0.1", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.3", + "fast-isnumeric": "^1.1.4", + "gl-mat4": "^1.2.0", + "gl-text": "^1.3.1", + "glslify": "^7.1.1", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "is-mobile": "^3.1.1", + "mapbox-gl": "1.10.1", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "native-promise-only": "^0.8.1", + "parse-svg-path": "^0.1.2", + "point-in-polygon": "^1.1.0", + "polybooljs": "^1.2.0", + "probe-image-size": "^7.2.3", + "regl": "npm:@plotly/regl@^2.1.2", + "regl-error2d": "^2.0.12", + "regl-line2d": "^3.1.2", + "regl-scatter2d": "^3.2.8", + "regl-splom": "^1.0.14", + "strongly-connected-components": "^1.0.1", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.2", + "to-px": "1.0.1", + "topojson-client": "^3.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + }, + "dependencies": { + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + } + } + }, + "point-in-polygon": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", + "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" + }, + "polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ==" + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==" + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + }, + "postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" + }, + "postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==" + }, + "postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" + }, + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "requires": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==" + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" + }, + "postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "requires": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" + }, + "postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + } + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + } + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, + "probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "requires": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "pxls": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz", + "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==", + "requires": { + "arr-flatten": "^1.1.0", + "compute-dims": "^1.1.0", + "flip-pixels": "^1.0.2", + "is-browser": "^2.1.0", + "is-buffer": "^2.0.3", + "to-uint8": "^1.4.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "quantize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", + "integrity": "sha512-25P7wI2UoDbIQsQp50ARkt+5pwPsOq7G/BqvT5xAbapnRoNWMN8/p55H9TXd5MuENiJnm5XICB2H2aDZGwts7w==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==" + }, + "ramda-adjunct": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-3.4.0.tgz", + "integrity": "sha512-qKRgqwZzJUZmPJfGK8/uLVxQXkiftKhW6FW9NUCUlQrzsBUZBvFAZUxwH7nTRwDMg+ChRU69rVVuS/4EUgtuIg==" + }, + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + } + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "requires": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "dependencies": { + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + } + } + }, + "react-app-rewired": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz", + "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==", + "dev": true, + "requires": { + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + } + } + } + }, + "react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "requires": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, + "react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "requires": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + } + }, + "react-d3-graph": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-d3-graph/-/react-d3-graph-2.6.0.tgz", + "integrity": "sha512-U72didZuPuYEqAi1n2bJvnph+9MviIw2x9I0eoxb1IKk3cyEwsJV96n3RL72z/7HDsa1FOvDKuOJE7ujSNZB/Q==" + }, + "react-debounce-input": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.3.0.tgz", + "integrity": "sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==", + "requires": { + "lodash.debounce": "^4", + "prop-types": "^15.8.1" + } + }, + "react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "requires": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "requires": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + } + }, + "react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "react-hook-form": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.34.0.tgz", + "integrity": "sha512-s0/TJ09NVlEk2JPp3yit1WnMuPNBXFmUKEQPulgDi9pYBw/ZmmAFHe6AXWq73Y+kp8ye4OcMf0Jv+i/qLPektg==" + }, + "react-i18next": { + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-12.1.5.tgz", + "integrity": "sha512-7PQAv6DA0TcStG96fle+8RfTwxVbHVlZZJPoEszwUNvDuWpGldJmNWa3ZPesEsZQZGF6GkzwvEh6p57qpFD2gQ==", + "requires": { + "@babel/runtime": "^7.20.6", + "html-parse-stringify": "^3.0.1" + } + }, + "react-immutable-proptypes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz", + "integrity": "sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==", + "requires": { + "invariant": "^2.2.2" + } + }, + "react-immutable-pure-component": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz", + "integrity": "sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==" + }, + "react-inspector": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.1.tgz", + "integrity": "sha512-cxKSeFTf7jpSSVddm66sKdolG90qURAX3g1roTeaN6x0YEbtWc8JpmFN9+yIqLNH2uEkYerWLtJZIXRIFuBKrg==" + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "requires": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-plotly.js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", + "integrity": "sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==", + "requires": { + "prop-types": "^15.8.1" + } + }, + "react-redux": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", + "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + }, + "react-router": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "requires": { + "history": "^5.2.0" + } + }, + "react-router-dom": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "requires": { + "history": "^5.2.0", + "react-router": "6.3.0" + } + }, + "react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "requires": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "fsevents": "^2.3.2", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + } + }, + "react-split": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", + "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", + "requires": { + "prop-types": "^15.5.7", + "split.js": "^1.6.0" + } + }, + "react-syntax-highlighter": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "requires": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" + } + }, + "react-textarea-autosize": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz", + "integrity": "sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==", + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + } + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==" + }, + "react-use": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz", + "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==", + "requires": { + "@types/js-cookie": "^2.2.6", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.3.1", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" + }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + } + } + }, + "react-virtualized-auto-sizer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.7.tgz", + "integrity": "sha512-Mxi6lwOmjwIjC1X4gABXMJcKHsOo0xWl3E3ugOgufB8GJU+MqrtY35aBuvCYv/razQ1Vbp7h1gWJjGjoNN5pmA==" + }, + "react-window": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.8.tgz", + "integrity": "sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, + "reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "requires": { + "lodash": "^4.0.1" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "requires": { + "minimatch": "^3.0.5" + } + }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", + "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==" + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==" + }, + "refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "dependencies": { + "prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "regex-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz", + "integrity": "sha512-FPbEhFTLpxKNgHKay3zMfkHzFK2ebViAlyvsz5euO4kwekH0T6fAL4Sdo2CgQ7Y1tGB5HqQm8SBq7pW5GegvVA==" + }, + "regexp-to-ast": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", + "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "optional": true + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "regexpu-core": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz", + "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==", + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + } + } + }, + "regl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", + "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==" + }, + "regl-error2d": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", + "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "requires": { + "array-bounds": "^1.0.1", + "color-normalize": "^1.5.0", + "flatten-vertex-data": "^1.0.2", + "object-assign": "^4.1.1", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-line2d": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.2.tgz", + "integrity": "sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==", + "requires": { + "array-bounds": "^1.0.1", + "array-find-index": "^1.0.2", + "array-normalize": "^1.1.4", + "color-normalize": "^1.5.0", + "earcut": "^2.1.5", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0" + } + }, + "regl-scatter2d": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz", + "integrity": "sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig==", + "requires": { + "@plotly/point-cluster": "^3.1.9", + "array-range": "^1.0.1", + "array-rearrange": "^2.2.2", + "clamp": "^1.0.1", + "color-id": "^1.1.0", + "color-normalize": "^1.5.0", + "color-rgba": "^2.1.1", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "image-palette": "^2.1.0", + "is-iexplorer": "^1.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-splom": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", + "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "requires": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "color-alpha": "^1.0.4", + "flatten-vertex-data": "^1.0.2", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "raf": "^3.4.1", + "regl-scatter2d": "^3.2.3" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "requires": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + } + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + } + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "reselect": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==" + }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + }, + "sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==" + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "requires": { + "stackframe": "^1.3.4" + } + }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==" + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "requires": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==" + } + } + }, + "stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "requires": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "requires": { + "escodegen": "^1.11.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "requires": { + "debug": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "string-split-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", + "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "requires": { + "parenthesis": "^3.1.5" + } + }, + "string-to-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz", + "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==", + "requires": { + "atob-lite": "^2.0.0", + "is-base64": "^0.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "strongly-connected-components": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", + "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==" + }, + "style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "supercluster": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", + "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", + "requires": { + "kdbush": "^3.0.0" + } + }, + "superscript-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", + "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svg-path-bounds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", + "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "requires": { + "abs-svg-path": "^0.1.1", + "is-svg-path": "^1.0.1", + "normalize-svg-path": "^1.0.0", + "parse-svg-path": "^0.1.2" + }, + "dependencies": { + "normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "requires": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + } + } + }, + "svg-path-sdf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", + "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "requires": { + "bitmap-sdf": "^1.0.0", + "draw-svg-path": "^1.0.0", + "is-svg-path": "^1.0.1", + "parse-svg-path": "^0.1.2", + "svg-path-bounds": "^1.0.1" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "swagger-client": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.5.tgz", + "integrity": "sha512-c0txGDtfQTJnaIBaEKCwtRNcUaaAfj+RXI4QVV9p3WW+AUCQqp4naCjaDNNsOfMkE4ySyhnblbL+jGqAVC7snw==", + "requires": { + "@babel/runtime-corejs3": "^7.11.2", + "cookie": "~0.5.0", + "cross-fetch": "^3.1.5", + "deepmerge": "~4.2.2", + "fast-json-patch": "^3.0.0-1", + "form-data-encoder": "^1.4.3", + "formdata-node": "^4.0.0", + "is-plain-object": "^5.0.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "qs": "^6.10.2", + "traverse": "~0.6.6", + "url": "~0.11.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "swagger-ui-react": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-4.15.5.tgz", + "integrity": "sha512-jt2g6cDt3wOsc+1YQv4D86V4K659Xs1/pbhjYWlgNfjZB0TSN601MASWxbP+65U0iPpsJTpF7EmRzAunTOVs8Q==", + "requires": { + "@babel/runtime-corejs3": "^7.18.9", + "@braintree/sanitize-url": "=6.0.0", + "base64-js": "^1.5.1", + "classnames": "^2.3.1", + "css.escape": "1.5.1", + "deep-extend": "0.6.0", + "dompurify": "=2.3.10", + "ieee754": "^1.2.1", + "immutable": "^3.x.x", + "js-file-download": "^0.4.12", + "js-yaml": "=4.1.0", + "lodash": "^4.17.21", + "patch-package": "^6.5.0", + "prop-types": "^15.8.1", + "randexp": "^0.5.3", + "randombytes": "^2.1.0", + "react-copy-to-clipboard": "5.1.0", + "react-debounce-input": "=3.3.0", + "react-immutable-proptypes": "2.2.0", + "react-immutable-pure-component": "^2.2.0", + "react-inspector": "^6.0.1", + "react-redux": "^7.2.4", + "react-syntax-highlighter": "^15.5.0", + "redux": "^4.1.2", + "redux-immutable": "^4.0.0", + "remarkable": "^2.0.1", + "reselect": "^4.1.5", + "serialize-error": "^8.1.0", + "sha.js": "^2.4.11", + "swagger-client": "^3.18.5", + "url-parse": "^1.5.8", + "xml": "=1.0.1", + "xml-but-prettier": "^1.0.1", + "zenscroll": "^4.0.2" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "dompurify": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.10.tgz", + "integrity": "sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "tailwindcss": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", + "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.0.9", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "requires": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.4.tgz", + "integrity": "sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "to-array-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz", + "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==", + "requires": { + "flatten-vertex-data": "^1.0.2", + "is-blob": "^2.0.1", + "string-to-arraybuffer": "^1.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-float32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" + }, + "to-px": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", + "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==", + "requires": { + "parse-unit": "^1.0.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "to-uint8": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz", + "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==", + "requires": { + "arr-flatten": "^1.1.0", + "clamp": "^1.0.1", + "is-base64": "^0.1.0", + "is-float-array": "^1.0.0", + "to-array-buffer": "^3.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + } + }, + "tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==" + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + }, + "ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha512-kkgkuqR/jKdKO5oh/I2SMu2dGbLXoJq0zkdgbxaqYK+hr9S9edwVVGf+tMUFTx2gH9TN2+Zu9JZ/Njonb3cjhA==" + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typedarray-pool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", + "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "requires": { + "bit-twiddle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", + "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==" + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "optional": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "update-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", + "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + } + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==" + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" + }, + "use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "requires": { + "use-isomorphic-layout-effect": "^1.1.1" + } + }, + "use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==" + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "utils-copy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz", + "integrity": "sha512-+NhJVV+PcxjdpkMrVTqXhQHPldlFGca5XR9YnGyNn7kQ0fMi+DqNLzdnhJ4TJ1HNy/HzB7c+FPg3y+4icY99ZA==", + "requires": { + "const-pinf-float64": "^1.0.0", + "object-keys": "^1.0.9", + "type-name": "^2.0.0", + "utils-copy-error": "^1.0.0", + "utils-indexof": "^1.0.0", + "utils-regex-from-string": "^1.0.0", + "validate.io-array": "^1.0.3", + "validate.io-buffer": "^1.0.1", + "validate.io-nonnegative-integer": "^1.0.0" + } + }, + "utils-copy-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz", + "integrity": "sha512-RbJcGPZ6Ru2HQk9SWkvbdWNPX58pt4MO5uXsOQRu4LEGWB3LglkRrmnE/Ph1qWg6ywQ0qj95wTz1OeqQ2l8DCA==", + "requires": { + "object-keys": "^1.0.9", + "utils-copy": "^1.1.0" + } + }, + "utils-indexof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz", + "integrity": "sha512-76QBfRJpn4A0P5uTO1x00x+Yog36w2Pab0n+aT9UfUvVa4l+e8k3p7YwNpDvfQ6+aKGZdxZpxcNotNS4YjFcyg==", + "requires": { + "validate.io-array-like": "^1.0.1", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "utils-regex-from-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz", + "integrity": "sha512-xKfdmEF19iUu9TKxFiohQUlQTuqYdV80/CxHiudVI37iEV/OA4HHlXZoc4qvuO1B74EcBVpErBreRO/dpdLeYA==", + "requires": { + "regex-regex": "^1.0.0", + "validate.io-string-primitive": "^1.0.0" + } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + } + } + }, + "validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==" + }, + "validate.io-array-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz", + "integrity": "sha512-rGLiN0cvY9OWzQcWP+RtqZR/MK9RUz3gKDTCcRLtEQ/BvlanMF5PyqtVIN+CgrIBCv/ypfme9v7r4yMJPYpbNA==", + "requires": { + "const-max-uint32": "^1.0.2", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "validate.io-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz", + "integrity": "sha512-6Tad+/QYOxWEXsesKYak1mHOzGdPYS4QeHFImWn7ECi4GR0x3vh7+6+1yoLKNXiklKuTFOxHLG3kZy9tPX0GvQ==" + }, + "validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "requires": { + "validate.io-number": "^1.0.3" + } + }, + "validate.io-integer-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz", + "integrity": "sha512-4ARGKA4FImVWJgrgttLYsYJmDGwxlhLfDCdq09gyVgohLKKRUfD3VAo1L2vTRCLt6hDhDtFKdZiuYUTWyBggwg==", + "requires": { + "validate.io-number-primitive": "^1.0.0" + } + }, + "validate.io-matrix-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz", + "integrity": "sha512-86mqLUIkZCRAOVKZvpCB7sDCw1dKBjBkY+C6WO/wLo/jQx0sOqQZz3LLtDw0DCfuAKxRuhSmIpX3nzr0nWrbdw==" + }, + "validate.io-ndarray-like": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz", + "integrity": "sha512-OV85AosxraPFSXJwzv/d7Cu5/dLiyLtsHmxtHTJcHW1N0uscd0eJ2df1Zk+HdID0eUctUllW/1YuQPUJFv1pTA==" + }, + "validate.io-nonnegative-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz", + "integrity": "sha512-uOMekPwcl84yg8NR7zgIZCZ9pHCtd9CK1Ri51N+ZJLTe1HyLbmdFdy7ZmfkiHkMvB1pOxeQmd1/LBjKhUD1L3A==", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + }, + "validate.io-number-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz", + "integrity": "sha512-8rlCe7N0TRTd50dwk4WNoMXNbX/4+RdtqE3TO6Bk0GJvAgbQlfL5DGr/Pl9ZLbWR6CutMjE2cu+yOoCnFWk+Qw==" + }, + "validate.io-positive-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz", + "integrity": "sha512-eg4LSdyqjICNUZWRilcQ5l+YayRlu6yi+GQsWw1bCmtG9yayOPmLa1fPymEHPPhbvWPAv3w0LLbCsf03pBHZkg==", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-string-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz", + "integrity": "sha512-TORbkLMdOFkEbPtfdx76FSVQGSAzyUEMxI+pBq5pfFm1ZzIesP+XiGc6eIK75aKu7RA7a8EcqUv5OrY5wfog5w==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, + "vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "weak-map": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", + "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==" + }, + "web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==" + }, + "webgl-context": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", + "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==", + "requires": { + "get-canvas-context": "^1.0.1" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "webpack": { + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "ws": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==" + } + } + }, + "webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "requires": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "workbox-background-sync": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", + "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.5.4" + } + }, + "workbox-broadcast-update": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", + "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", + "requires": { + "workbox-core": "6.5.4" + } + }, + "workbox-build": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", + "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", + "requires": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.5.4", + "workbox-broadcast-update": "6.5.4", + "workbox-cacheable-response": "6.5.4", + "workbox-core": "6.5.4", + "workbox-expiration": "6.5.4", + "workbox-google-analytics": "6.5.4", + "workbox-navigation-preload": "6.5.4", + "workbox-precaching": "6.5.4", + "workbox-range-requests": "6.5.4", + "workbox-recipes": "6.5.4", + "workbox-routing": "6.5.4", + "workbox-strategies": "6.5.4", + "workbox-streams": "6.5.4", + "workbox-sw": "6.5.4", + "workbox-window": "6.5.4" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "workbox-cacheable-response": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", + "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", + "requires": { + "workbox-core": "6.5.4" + } + }, + "workbox-core": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", + "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==" + }, + "workbox-expiration": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", + "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.5.4" + } + }, + "workbox-google-analytics": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", + "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", + "requires": { + "workbox-background-sync": "6.5.4", + "workbox-core": "6.5.4", + "workbox-routing": "6.5.4", + "workbox-strategies": "6.5.4" + } + }, + "workbox-navigation-preload": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", + "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", + "requires": { + "workbox-core": "6.5.4" + } + }, + "workbox-precaching": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", + "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", + "requires": { + "workbox-core": "6.5.4", + "workbox-routing": "6.5.4", + "workbox-strategies": "6.5.4" + } + }, + "workbox-range-requests": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", + "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", + "requires": { + "workbox-core": "6.5.4" + } + }, + "workbox-recipes": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", + "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", + "requires": { + "workbox-cacheable-response": "6.5.4", + "workbox-core": "6.5.4", + "workbox-expiration": "6.5.4", + "workbox-precaching": "6.5.4", + "workbox-routing": "6.5.4", + "workbox-strategies": "6.5.4" + } + }, + "workbox-routing": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", + "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", + "requires": { + "workbox-core": "6.5.4" + } + }, + "workbox-strategies": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", + "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", + "requires": { + "workbox-core": "6.5.4" + } + }, + "workbox-streams": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", + "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", + "requires": { + "workbox-core": "6.5.4", + "workbox-routing": "6.5.4" + } + }, + "workbox-sw": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", + "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==" + }, + "workbox-webpack-plugin": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz", + "integrity": "sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==", + "requires": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.5.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "workbox-window": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", + "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.5.4" + } + }, + "world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==", + "requires": { + "object-assign": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" + }, + "xml-but-prettier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz", + "integrity": "sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==", + "requires": { + "repeat-string": "^1.5.2" + } + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zenscroll": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz", + "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==" + } + } +} diff --git a/webapp/package.json b/webapp/package.json index 712b1a2c14..acb70e12b3 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -3,85 +3,75 @@ "version": "2.13.0", "private": true, "dependencies": { - "@emotion/react": "11.10.0", - "@emotion/styled": "11.10.0", - "@handsontable/react": "12.1.2", - "@hookform/resolvers": "2.9.7", - "@mui/icons-material": "5.8.4", - "@mui/lab": "5.0.0-alpha.93", - "@mui/material": "5.11.2", - "@reduxjs/toolkit": "1.8.3", - "@testing-library/jest-dom": "5.16.4", - "@testing-library/react": "13.3.0", - "@testing-library/user-event": "14.4.1", + "@emotion/react": "11.10.6", + "@emotion/styled": "11.10.6", + "@handsontable/react": "12.3.1", + "@mui/icons-material": "5.11.9", + "@mui/lab": "5.0.0-alpha.120", + "@mui/material": "5.11.10", + "@reduxjs/toolkit": "1.9.3", "@types/d3": "5.16.4", "@types/draft-convert": "2.1.4", - "@types/draft-js": "0.11.9", + "@types/draft-js": "0.11.10", "@types/draftjs-to-html": "0.8.1", - "@types/jest": "28.1.6", "@types/node": "16.11.20", - "@types/react": "18.0.15", + "@types/react": "18.0.28", "@types/react-d3-graph": "2.6.3", - "@types/react-dom": "18.0.6", + "@types/react-dom": "18.0.11", "@types/xml-js": "1.0.0", "assert": "2.0.0", - "axios": "0.27.2", + "axios": "1.3.3", "buffer": "6.0.3", "clsx": "1.2.1", "crypto-browserify": "3.12.0", "d3": "5.16.0", "debug": "4.3.4", - "downshift": "6.1.7", - "draft-convert": "2.1.12", + "draft-convert": "2.1.13", "draft-js": "0.11.7", "draftjs-to-html": "0.9.1", - "fs": "0.0.1-security", - "handsontable": "12.1.2", + "handsontable": "12.3.1", "hoist-non-react-statics": "3.3.2", "https-browserify": "1.0.0", - "i18next": "21.8.16", - "i18next-browser-languagedetector": "6.1.4", + "i18next": "22.4.10", + "i18next-browser-languagedetector": "7.0.1", "i18next-xhr-backend": "3.2.2", - "immer": "9.0.15", + "immer": "9.0.19", "js-cookie": "3.0.1", "jwt-decode": "3.1.2", "lodash": "4.17.21", "moment": "2.29.4", - "notistack": "2.0.5", + "notistack": "2.0.8", "os": "0.1.2", "os-browserify": "0.3.0", - "plotly.js": "2.13.3", + "plotly.js": "2.18.2", "ramda": "0.28.0", - "ramda-adjunct": "3.2.0", + "ramda-adjunct": "3.4.0", "react": "18.2.0", - "react-beautiful-dnd": "13.1.0", + "react-beautiful-dnd": "13.1.1", "react-color": "^2.19.3", "react-d3-graph": "2.6.0", "react-dom": "18.2.0", - "react-dropzone": "14.2.2", + "react-dropzone": "14.2.3", "react-hook-form": "7.34.0", - "react-i18next": "11.18.3", + "react-i18next": "12.1.5", "react-json-view": "1.21.3", - "react-plotly.js": "2.5.1", - "react-redux": "8.0.2", + "react-plotly.js": "2.6.0", + "react-redux": "8.0.5", "react-router": "6.3.0", "react-router-dom": "6.3.0", "react-scripts": "5.0.1", "react-split": "2.0.14", - "react-tsparticles": "2.1.4", "react-use": "17.4.0", - "react-virtualized-auto-sizer": "1.0.6", - "react-window": "1.8.7", - "redux": "4.2.0", - "redux-thunk": "2.4.1", + "react-virtualized-auto-sizer": "1.0.7", + "react-window": "1.8.8", + "redux": "4.2.1", + "redux-thunk": "2.4.2", "stream-http": "3.2.0", - "swagger-ui-react": "4.13.2", + "swagger-ui-react": "4.15.5", "ts-toolbelt": "9.6.0", "url": "0.11.0", - "uuid": "8.3.2", - "web-vitals": "2.1.4", - "xml-js": "1.6.11", - "yup": "0.32.11" + "uuid": "9.0.0", + "xml-js": "1.6.11" }, "scripts": { "start": "react-app-rewired start", @@ -107,34 +97,34 @@ "homepage": "/", "devDependencies": { "@types/debug": "4.1.7", - "@types/js-cookie": "3.0.2", - "@types/lodash": "4.14.182", - "@types/ramda": "0.28.15", - "@types/react-beautiful-dnd": "13.1.2", + "@types/js-cookie": "3.0.3", + "@types/lodash": "4.14.191", + "@types/ramda": "0.28.23", + "@types/react-beautiful-dnd": "13.1.3", "@types/react-color": "3.0.6", - "@types/react-plotly.js": "2.5.1", + "@types/react-plotly.js": "2.6.0", "@types/react-virtualized-auto-sizer": "1.0.1", "@types/react-window": "1.8.5", "@types/redux-logger": "3.0.9", "@types/swagger-ui-react": "4.11.0", - "@types/uuid": "8.3.4", - "@typescript-eslint/eslint-plugin": "5.32.0", - "@typescript-eslint/parser": "5.32.0", + "@types/uuid": "9.0.0", + "@typescript-eslint/eslint-plugin": "5.53.0", + "@typescript-eslint/parser": "5.53.0", "cross-env": "7.0.3", - "eslint": "8.21.0", + "eslint": "8.34.0", "eslint-config-airbnb": "19.0.4", - "eslint-config-prettier": "8.5.0", - "eslint-plugin-import": "2.26.0", - "eslint-plugin-jsx-a11y": "6.6.1", + "eslint-config-prettier": "8.6.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-jsx-a11y": "6.7.1", "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-react": "7.30.1", + "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "4.6.0", - "husky": "8.0.1", + "husky": "8.0.3", "jest-sonar-reporter": "2.0.0", - "prettier": "2.7.1", + "prettier": "2.8.4", "process": "0.11.10", "react-app-rewired": "2.2.1", "stream-browserify": "3.0.0", - "typescript": "4.7.4" + "typescript": "4.9.5" } } diff --git a/webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantModal/index.tsx b/webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantDialog.tsx similarity index 76% rename from webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantModal/index.tsx rename to webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantDialog.tsx index 4d26dd85ea..3f6e4f8915 100644 --- a/webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantModal/index.tsx +++ b/webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantDialog.tsx @@ -3,15 +3,15 @@ import { useNavigate } from "react-router"; import { useTranslation } from "react-i18next"; import { AxiosError } from "axios"; import AddCircleIcon from "@mui/icons-material/AddCircle"; -import { GenericInfo, VariantTree } from "../../../../../../common/types"; -import { createVariant } from "../../../../../../services/api/variant"; -import { createListFromTree } from "../../../../../../services/utils"; -import useEnqueueErrorSnackbar from "../../../../../../hooks/useEnqueueErrorSnackbar"; -import FormDialog from "../../../../../common/dialogs/FormDialog"; -import StringFE from "../../../../../common/fieldEditors/StringFE"; -import Fieldset from "../../../../../common/Fieldset"; -import SelectFE from "../../../../../common/fieldEditors/SelectFE"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import { GenericInfo, VariantTree } from "../../../../../common/types"; +import { createVariant } from "../../../../../services/api/variant"; +import { createListFromTree } from "../../../../../services/utils"; +import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; +import FormDialog from "../../../../common/dialogs/FormDialog"; +import StringFE from "../../../../common/fieldEditors/StringFE"; +import Fieldset from "../../../../common/Fieldset"; +import SelectFE from "../../../../common/fieldEditors/SelectFE"; +import { SubmitHandlerPlus } from "../../../../common/Form/types"; interface Props { parentId: string; @@ -20,7 +20,7 @@ interface Props { onClose: () => void; } -function CreateVariantModal(props: Props) { +function CreateVariantDialog(props: Props) { const { parentId, open, tree, onClose } = props; const [t] = useTranslation(); const navigate = useNavigate(); @@ -99,4 +99,4 @@ function CreateVariantModal(props: Props) { ); } -export default CreateVariantModal; +export default CreateVariantDialog; diff --git a/webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantModal/style.ts b/webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantModal/style.ts deleted file mode 100644 index a8fd95b316..0000000000 --- a/webapp/src/components/App/Singlestudy/HomeView/InformationView/CreateVariantModal/style.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Box, styled } from "@mui/material"; - -export const Root = styled(Box)(({ theme }) => ({ - width: "500px", - height: "200px", - display: "flex", - flexDirection: "column", - justifyContent: "flex-start", - alignItems: "center", - padding: theme.spacing(2), - boxSizing: "border-box", - overflowX: "hidden", - overflowY: "auto", -})); - -export const InputContainer = styled(Box)(({ theme }) => ({ - width: "100%", - display: "flex", - flexDirection: "row", - justifyContent: "flex-start", - alignItems: "center", - boxSizing: "border-box", -})); - -export default {}; diff --git a/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx b/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx index 9cfad709fd..f863ec6d17 100644 --- a/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx +++ b/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx @@ -4,7 +4,7 @@ import { useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { AxiosError } from "axios"; import { StudyMetadata, VariantTree } from "../../../../../common/types"; -import CreateVariantModal from "./CreateVariantModal"; +import CreateVariantDialog from "./CreateVariantDialog"; import LauncherHistory from "./LauncherHistory"; import Notes from "./Notes"; import LauncherDialog from "../../../Studies/LauncherDialog"; @@ -134,7 +134,7 @@ function InformationView(props: Props) {
{study && tree && openVariantModal && ( - setOpenVariantModal(false)} diff --git a/webapp/src/components/App/Singlestudy/PropertiesDialog/index.tsx b/webapp/src/components/App/Singlestudy/PropertiesDialog.tsx similarity index 83% rename from webapp/src/components/App/Singlestudy/PropertiesDialog/index.tsx rename to webapp/src/components/App/Singlestudy/PropertiesDialog.tsx index 098002413e..cec5266ade 100644 --- a/webapp/src/components/App/Singlestudy/PropertiesDialog/index.tsx +++ b/webapp/src/components/App/Singlestudy/PropertiesDialog.tsx @@ -4,25 +4,25 @@ import { useTranslation } from "react-i18next"; import { AxiosError } from "axios"; import { useSnackbar } from "notistack"; import { useMemo } from "react"; -import { StudyMetadata } from "../../../../common/types"; +import { StudyMetadata } from "../../../common/types"; import { addStudyGroup, changePublicMode, deleteStudyGroup, updateStudyMetadata, -} from "../../../../services/api/study"; -import { getGroups } from "../../../../services/api/user"; -import useEnqueueErrorSnackbar from "../../../../hooks/useEnqueueErrorSnackbar"; -import { PUBLIC_MODE_LIST } from "../../../common/utils/constants"; -import usePromiseWithSnackbarError from "../../../../hooks/usePromiseWithSnackbarError"; -import FormDialog from "../../../common/dialogs/FormDialog"; -import StringFE from "../../../common/fieldEditors/StringFE"; -import SelectFE from "../../../common/fieldEditors/SelectFE"; -import CheckboxesTagsFE from "../../../common/fieldEditors/CheckboxesTagsFE"; -import Fieldset from "../../../common/Fieldset"; -import { SubmitHandlerPlus } from "../../../common/Form/types"; -import useAppDispatch from "../../../../redux/hooks/useAppDispatch"; -import { updateStudy } from "../../../../redux/ducks/studies"; +} from "../../../services/api/study"; +import { getGroups } from "../../../services/api/user"; +import useEnqueueErrorSnackbar from "../../../hooks/useEnqueueErrorSnackbar"; +import { PUBLIC_MODE_LIST } from "../../common/utils/constants"; +import usePromiseWithSnackbarError from "../../../hooks/usePromiseWithSnackbarError"; +import FormDialog from "../../common/dialogs/FormDialog"; +import StringFE from "../../common/fieldEditors/StringFE"; +import SelectFE from "../../common/fieldEditors/SelectFE"; +import CheckboxesTagsFE from "../../common/fieldEditors/CheckboxesTagsFE"; +import Fieldset from "../../common/Fieldset"; +import { SubmitHandlerPlus } from "../../common/Form/types"; +import useAppDispatch from "../../../redux/hooks/useAppDispatch"; +import { updateStudy } from "../../../redux/ducks/studies"; const logErr = debug("antares:createstudyform:error"); diff --git a/webapp/src/components/App/Singlestudy/PropertiesDialog/style.ts b/webapp/src/components/App/Singlestudy/PropertiesDialog/style.ts deleted file mode 100644 index a4046cc69a..0000000000 --- a/webapp/src/components/App/Singlestudy/PropertiesDialog/style.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Box, styled } from "@mui/material"; - -export const Root = styled(Box)(({ theme }) => ({ - width: "100%", - height: "100%", - display: "flex", - flexDirection: "column", - justifyContent: "flex-start", - alignItems: "center", - padding: theme.spacing(2), - boxSizing: "border-box", - overflowX: "hidden", - overflowY: "auto", -})); - -export const InputElement = styled(Box)(({ theme }) => ({ - width: "100%", - display: "flex", - flexDirection: "row", - justifyContent: "flex-start", - alignItems: "center", - boxSizing: "border-box", -})); - -export const ElementContainer = styled(Box)(({ theme }) => ({ - width: "100%", - display: "flex", - flexDirection: "column", - justifyContent: "flex-start", - alignItems: "flex-start", - boxSizing: "border-box", -})); - -export default {}; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/common.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/common.ts deleted file mode 100644 index 31d0adbc33..0000000000 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/common.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { result } from "lodash"; -import usePromise, { - PromiseStatus, -} from "../../../../../../../hooks/usePromise"; -import { getStudyData } from "../../../../../../../services/api/study"; - -export interface FieldElement { - path?: string; - value?: T; -} - -export interface FieldsInfo { - [field: string]: FieldElement; -} - -// export type Fields = Record; -interface ResultType { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - data?: any; - status: PromiseStatus; - isLoading: boolean; - error?: string | Error; -} - -interface Props { - fieldsInfo: T; - studyId: string; - pathPrefix: string; -} - -export function useGetDefaultValues( - props: Props -): ResultType { - const { studyId, pathPrefix, fieldsInfo } = props; - const { data, status, isLoading, error } = usePromise(async () => { - const fields: T = { ...fieldsInfo }; - await Promise.all( - Object.keys(fieldsInfo).map(async (item) => { - const result = await getStudyData( - studyId, - `${pathPrefix}/${fieldsInfo[item].path}` - ); - fields[item].value = result; - }) - ); - return result; - }); - - return { data, status, isLoading, error }; -} - -export default {}; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts index ebd713b607..7b5b492fd2 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts @@ -1,4 +1,4 @@ -import { TFunction } from "react-i18next"; +import { TFunction } from "i18next"; import { getStudyData } from "../../../../../../../services/api/study"; import { transformNameToId } from "../../../../../../../services/utils"; import { rgbToString } from "../../../../../../common/fieldEditors/ColorPickerFE/utils"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/DebugView/StudyDataView/utils/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/DebugView/StudyDataView/utils/utils.ts deleted file mode 100644 index 55ffa6f329..0000000000 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/DebugView/StudyDataView/utils/utils.ts +++ /dev/null @@ -1,22 +0,0 @@ -export const writeLeaf = ( - keys: Array, - dataElm: never, - value: never, - index = 0 -): void => { - if (index >= keys.length || keys.length === 0) { - return; - } - if (!(keys[index] in dataElm)) { - return; - } - const key = keys[index]; - if (index === keys.length - 1) { - // eslint-disable-next-line no-param-reassign - dataElm[key] = value; - } else { - writeLeaf(keys, dataElm[key], value, index + 1); - } -}; - -export default {}; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx index 7e01c705b4..8175f655ef 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx @@ -58,7 +58,7 @@ function Map() { R.map( RA.renameKeys({ area1: "source", area2: "target" }), studyLinks || [] - ) as LinkProperties[], + ) as unknown as LinkProperties[], [studyLinks] ); const mapNodesRes = useStudyMaps({ diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts index 89d4a9d816..b3e8eed44a 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/TableMode/utils.ts @@ -71,7 +71,7 @@ const TABLE_TEMPLATE_COLUMNS_BY_TYPE = { } as const; export type TableTemplateColumnsForType = Array< - typeof TABLE_TEMPLATE_COLUMNS_BY_TYPE[T][number] + (typeof TABLE_TEMPLATE_COLUMNS_BY_TYPE)[T][number] >; export interface TableTemplate< diff --git a/webapp/src/components/common/ButtonLoader.tsx b/webapp/src/components/common/ButtonLoader.tsx deleted file mode 100644 index 2fa04bc62c..0000000000 --- a/webapp/src/components/common/ButtonLoader.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import * as React from "react"; -import { Box, Button, ButtonProps, CircularProgress } from "@mui/material"; -import { blue } from "@mui/material/colors"; - -interface OwnProps { - // eslint-disable-next-line react/no-unused-prop-types - progressColor?: string; - fakeDelay?: number; -} - -function ButtonLoader(props: ButtonProps & OwnProps) { - const { children, onClick, fakeDelay = 0 } = props; - const [loading, setLoading] = React.useState(false); - - const handleButtonClick = async ( - event: React.MouseEvent - ) => { - if (!loading && !!onClick) { - setLoading(true); - setTimeout(async () => { - try { - await onClick(event); - } finally { - setLoading(false); - } - }, fakeDelay); - } - }; - - const forwardedProps = { ...props }; - const { progressColor } = forwardedProps; - delete forwardedProps.fakeDelay; - delete forwardedProps.progressColor; - - return ( - - - {loading && ( - - )} - - ); -} - -ButtonLoader.defaultProps = { - progressColor: blue[400], - fakeDelay: 0, -}; - -export default ButtonLoader; diff --git a/webapp/src/components/common/EditableMatrix/utils.test.ts b/webapp/src/components/common/EditableMatrix/utils.test.ts deleted file mode 100644 index 595340d1f1..0000000000 --- a/webapp/src/components/common/EditableMatrix/utils.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import _ from 'lodash'; -import moment from 'moment'; -import {formatDateFromIndex} from './utils'; - -test('Date from weekly input', () => { - const weeks = Array(52).fill(0).map((e,i)=>1 + ((i+26) % 52)); - const startDate = moment("2005/07/02 00:00", "yyyy/MM/DD HH:mm"); - const weeksDate = Array(52).fill(0).map((e,i) => moment.utc(startDate).add(i, 'w').format("yyyy/MM/DD HH:mm")); - expect(formatDateFromIndex(weeks)).toStrictEqual(weeksDate); -}); - - -test('Date from monthly input', () => { - const months = Array(12).fill(0).map((e,i)=>1 + ((i+6) % 12)) - const monthsDate = [ - "07/01 00:00", - "08/01 00:00", - "09/01 00:00", - "10/01 00:00", - "11/01 00:00", - "12/01 00:00", - "01/01 00:00", - "02/01 00:00", - "03/01 00:00", - "04/01 00:00", - "05/01 00:00", - "06/01 00:00", - ] - expect(formatDateFromIndex(months)).toStrictEqual(monthsDate); -}); diff --git a/webapp/src/components/common/FormGenerator/AutoSubmitGenerator.tsx b/webapp/src/components/common/FormGenerator/AutoSubmitGenerator.tsx index 69434d5733..89ed888fc3 100644 --- a/webapp/src/components/common/FormGenerator/AutoSubmitGenerator.tsx +++ b/webapp/src/components/common/FormGenerator/AutoSubmitGenerator.tsx @@ -8,7 +8,7 @@ import FormGenerator, { IGeneratorField, } from "."; -interface AutoSubmitGeneratorFormProps { +interface AutoSubmitGeneratorFormProps { jsonTemplate: IFormGenerator; saveField: ( name: IGeneratorField["name"], diff --git a/webapp/src/components/common/FormGenerator/index.tsx b/webapp/src/components/common/FormGenerator/index.tsx index ae58c05252..21713db545 100644 --- a/webapp/src/components/common/FormGenerator/index.tsx +++ b/webapp/src/components/common/FormGenerator/index.tsx @@ -21,7 +21,7 @@ export type GeneratorFieldType = | "switch" | "boolean"; -export interface IGeneratorField { +export interface IGeneratorField { type: GeneratorFieldType; name: Path & (string | undefined); label: string; @@ -41,32 +41,33 @@ export interface IGeneratorField { | undefined; } -export interface SelectField extends IGeneratorField { +export interface SelectField extends IGeneratorField { options: SelectFEProps["options"]; } -export interface BooleanField extends IGeneratorField { +export interface BooleanField + extends IGeneratorField { falseText: BooleanFEProps["falseText"]; trueText: BooleanFEProps["trueText"]; } -export type IGeneratorFieldType = +export type IGeneratorFieldType = | IGeneratorField | SelectField | BooleanField; -export interface IFieldsetType { +export interface IFieldsetType { legend: string | ReactNode; fields: Array>; } -export type IFormGenerator = Array>; +export type IFormGenerator = Array>; -export interface FormGeneratorProps { +export interface FormGeneratorProps { jsonTemplate: IFormGenerator; } -function formateFieldset(fieldset: IFieldsetType) { +function formateFieldset(fieldset: IFieldsetType) { const { fields, ...otherProps } = fieldset; const formatedFields = fields.map((field) => ({ ...field, id: uuidv4() })); return { ...otherProps, fields: formatedFields, id: uuidv4() }; diff --git a/webapp/src/components/common/SnackErrorMessage.tsx b/webapp/src/components/common/SnackErrorMessage.tsx index b732ae7a38..27223411cb 100644 --- a/webapp/src/components/common/SnackErrorMessage.tsx +++ b/webapp/src/components/common/SnackErrorMessage.tsx @@ -1,7 +1,7 @@ import { useState, forwardRef, useCallback } from "react"; import * as React from "react"; import { useSnackbar, SnackbarContent } from "notistack"; -import axios, { AxiosError } from "axios"; +import axios from "axios"; import { Box, Card, @@ -16,7 +16,6 @@ import { import CancelRoundedIcon from "@mui/icons-material/CancelRounded"; import CloseRoundedIcon from "@mui/icons-material/CloseRounded"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; -import * as R from "ramda"; const Snackbar = styled(SnackbarContent)(({ theme }) => ({ [theme.breakpoints.up("sm")]: { @@ -95,41 +94,30 @@ const SnackErrorMessage = forwardRef( - {R.cond([ - [ - axios.isAxiosError, - () => { - const err = details as AxiosError<{ - exception?: string; - description?: string; - }>; - const res = err.response; - return ( - - - - {res?.status} - - - - {res?.data.exception} - - - - - {res?.data.description} - - - - ); - }, - ], - [R.T, () => <>{details.toString()}], - ])(details)} + {axios.isAxiosError(details) ? ( + + + + {details.response?.status} + + + + {details.response?.data.exception} + + + + + {details.response?.data.description} + + + + ) : ( + details.toString() + )} diff --git a/webapp/src/components/common/TagTextInput.tsx b/webapp/src/components/common/TagTextInput.tsx deleted file mode 100644 index eb1fcebddf..0000000000 --- a/webapp/src/components/common/TagTextInput.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import * as React from "react"; -import Chip from "@mui/material/Chip"; -import Autocomplete from "@mui/material/Autocomplete"; -import TextField from "@mui/material/TextField"; -import { SxProps, Theme } from "@mui/material"; - -interface Props { - label: string; - value: Array; - fullWidth?: boolean; - type?: React.HTMLInputTypeAttribute | undefined; - onChange: (values: Array) => void; - sx?: SxProps | undefined; - tagList: Array; - required?: boolean; -} - -function TagTextInput(props: Props) { - const { label, fullWidth, sx, type, value, tagList, onChange, required } = - props; - return ( - onChange(value)} - sx={{ - ...sx, - background: "rgba(255, 255, 255, 0.09)", - borderRadius: "4px 4px 0px 0px", - borderBottom: "1px solid rgba(255, 255, 255, 0.42)", - p: "0px !important", - }} - renderTags={(value: readonly string[], getTagProps) => - value.map((option: string, index: number) => ( - // eslint-disable-next-line react/jsx-key - - )) - } - renderInput={(params) => ( - div": { p: "9.5px !important" } }} - /> - )} - /> - ); -} - -TagTextInput.defaultProps = { - sx: undefined, - fullWidth: undefined, - type: undefined, - required: false, -}; - -export default TagTextInput; diff --git a/webapp/src/i18n.js b/webapp/src/i18n.ts similarity index 91% rename from webapp/src/i18n.js rename to webapp/src/i18n.ts index 38711d972c..1b483de406 100644 --- a/webapp/src/i18n.js +++ b/webapp/src/i18n.ts @@ -3,7 +3,7 @@ import Backend from "i18next-xhr-backend"; import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; -export function initI18n(version = "unknown") { +export default function i18nInit(version = "unknown"): void { i18n // load translation using xhr -> see /public/locales // learn more: https://github.com/i18next/i18next-xhr-backend @@ -22,14 +22,12 @@ export function initI18n(version = "unknown") { }, react: { useSuspense: false, - wait: true, }, interpolation: { escapeValue: false, // not needed for react as it escapes by default }, ns: ["main"], defaultNS: "main", + returnNull: false, }); } - -export default {}; diff --git a/webapp/src/index.tsx b/webapp/src/index.tsx index 53c5e92452..083ad2a743 100644 --- a/webapp/src/index.tsx +++ b/webapp/src/index.tsx @@ -1,7 +1,7 @@ import { createRoot } from "react-dom/client"; import { Provider } from "react-redux"; import { StyledEngineProvider } from "@mui/material"; -import { initI18n } from "./i18n"; +import i18nInit from "./i18n"; import "./index.css"; import App from "./components/App"; import { Config, initConfig } from "./services/config"; @@ -15,7 +15,7 @@ initConfig((config: Config) => { window.location.reload(); } - initI18n(config.version.gitcommit); + i18nInit(config.version.gitcommit); const container = document.getElementById("root") as HTMLElement; const root = createRoot(container); diff --git a/webapp/src/reportWebVitals.ts b/webapp/src/reportWebVitals.ts deleted file mode 100644 index 41784a3668..0000000000 --- a/webapp/src/reportWebVitals.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ReportHandler } from "web-vitals"; - -const reportWebVitals = (onPerfEntry?: ReportHandler): void => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/webapp/src/services/api/client.ts b/webapp/src/services/api/client.ts index cebc8b3402..a3256afda1 100644 --- a/webapp/src/services/api/client.ts +++ b/webapp/src/services/api/client.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios from "axios"; import debug from "debug"; import Cookies from "js-cookie"; import * as R from "ramda"; @@ -39,24 +39,22 @@ export function initAxiosInterceptors(): void { client.interceptors.request.eject(axiosInterceptor); } - axiosInterceptor = client.interceptors.request.use( - async (config): Promise => { - try { - if (config?.headers) { - const authUser = await store.dispatch(refresh()).unwrap(); - if (authUser) { - // eslint-disable-next-line no-param-reassign - config.headers.Authorization = makeHeaderAuthorization( - authUser.accessToken - ); - } + axiosInterceptor = client.interceptors.request.use(async (config) => { + try { + if (config?.headers) { + const authUser = await store.dispatch(refresh()).unwrap(); + if (authUser) { + // eslint-disable-next-line no-param-reassign + config.headers.Authorization = makeHeaderAuthorization( + authUser.accessToken + ); } - } catch (e) { - logError("Failed to refresh token", e); } - return config; + } catch (e) { + logError("Failed to refresh token", e); } - ); + return config; + }); } export function setAuth(token: string | null): void { diff --git a/webapp/src/services/api/file.ts b/webapp/src/services/api/file.ts deleted file mode 100644 index b80ffc8281..0000000000 --- a/webapp/src/services/api/file.ts +++ /dev/null @@ -1,8 +0,0 @@ -import client from "./client"; - -export const getFileData = async (fileUrl: string): Promise => { - const res = await client.get(fileUrl); - return res.data; -}; - -export default {}; diff --git a/webapp/src/services/api/matrix.ts b/webapp/src/services/api/matrix.ts index 9f74587ece..af7edd43b2 100644 --- a/webapp/src/services/api/matrix.ts +++ b/webapp/src/services/api/matrix.ts @@ -48,7 +48,7 @@ export const createMatrixByImportation = async ( if (onProgress) { options.onUploadProgress = (progressEvent): void => { const percentCompleted = Math.round( - (progressEvent.loaded * 100) / progressEvent.total + (progressEvent.loaded * 100) / (progressEvent.total || 1) ); onProgress(percentCompleted); }; diff --git a/webapp/src/services/api/study.ts b/webapp/src/services/api/study.ts index 7db6144088..3035baeaa1 100644 --- a/webapp/src/services/api/study.ts +++ b/webapp/src/services/api/study.ts @@ -221,7 +221,7 @@ export const importStudy = async ( if (onProgress) { options.onUploadProgress = (progressEvent): void => { const percentCompleted = Math.round( - (progressEvent.loaded * 100) / progressEvent.total + (progressEvent.loaded * 100) / (progressEvent.total || 1) ); onProgress(percentCompleted); }; @@ -248,7 +248,7 @@ export const importFile = async ( if (onProgress) { options.onUploadProgress = (progressEvent): void => { const percentCompleted = Math.round( - (progressEvent.loaded * 100) / progressEvent.total + (progressEvent.loaded * 100) / (progressEvent.total || 1) ); onProgress(percentCompleted); }; diff --git a/webapp/src/services/api/xpansion.ts b/webapp/src/services/api/xpansion.ts index b7cfb17578..12569f079c 100644 --- a/webapp/src/services/api/xpansion.ts +++ b/webapp/src/services/api/xpansion.ts @@ -120,7 +120,7 @@ export const uploadFile = async ( if (onProgress) { options.onUploadProgress = (progressEvent): void => { const percentCompleted = Math.round( - (progressEvent.loaded * 100) / progressEvent.total + (progressEvent.loaded * 100) / (progressEvent.total || 1) ); onProgress(percentCompleted); }; diff --git a/webapp/src/services/utils/index.ts b/webapp/src/services/utils/index.ts index dce53316b4..be007f5836 100644 --- a/webapp/src/services/utils/index.ts +++ b/webapp/src/services/utils/index.ts @@ -1,7 +1,6 @@ import moment from "moment"; import debug from "debug"; -import { TFunction } from "react-i18next"; -import i18n from "i18next"; +import i18n, { TFunction } from "i18next"; import * as R from "ramda"; import { StudyMetadataDTO, @@ -236,7 +235,7 @@ export const sortByProp = ( }; export const sortByName = (list: T[]): T[] => { - return sortByProp(R.prop("name"), list); + return sortByProp((v) => v.name, list); }; // This should work better diff --git a/webapp/src/setupTests.ts b/webapp/src/setupTests.ts deleted file mode 100644 index 1dd407a63e..0000000000 --- a/webapp/src/setupTests.ts +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import "@testing-library/jest-dom"; diff --git a/webapp/src/types/i18next.d.ts b/webapp/src/types/i18next.d.ts new file mode 100644 index 0000000000..557b3de4e2 --- /dev/null +++ b/webapp/src/types/i18next.d.ts @@ -0,0 +1,7 @@ +import "i18next"; + +declare module "i18next" { + interface CustomTypeOptions { + returnNull: false; // https://www.i18next.com/overview/typescript#argument-of-type-defaulttfuncreturn-is-not-assignable-to-parameter-of-type-xyz + } +} From 698fb621914d697902b4b4054b37b0bd14e190c3 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE <43534797+laurent-laporte-pro@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:53:16 +0100 Subject: [PATCH 35/60] build: update `requirements.txt` and correct mypy issue (#1327) --- antarest/core/logging/utils.py | 2 +- requirements.txt | 48 +++++++++++++++++----------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/antarest/core/logging/utils.py b/antarest/core/logging/utils.py index 4e15b808c5..b0feb93ad2 100644 --- a/antarest/core/logging/utils.py +++ b/antarest/core/logging/utils.py @@ -3,7 +3,7 @@ import os import re import uuid -from pythonjsonlogger.jsonlogger import JsonFormatter # type: ignore +from pythonjsonlogger.jsonlogger import JsonFormatter from contextvars import ContextVar, Token from typing import Optional, Type, Any, Dict diff --git a/requirements.txt b/requirements.txt index 291075b02c..9bf8eb4e4f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,34 +3,34 @@ mistune~=0.8.4 m2r~=0.2.1 -jsonref~=0.2 -PyYAML~=5.4.1 -filelock~=3.4.2 -SQLAlchemy~=1.4.31 -redis~=4.1.2 -requests~=2.27.1 -pandas~=1.4.0 -numpy~=1.22.1 -fastapi[all]~=0.73.0 -fastapi-jwt-auth~=0.5.0 -python-multipart~=0.0.5 aiofiles~=0.8.0 -Jinja2~=3.0.3 -uvicorn[standard]~=0.15.0 +alembic~=1.7.5 +asgi-ratelimit[redis]==0.7.0 bcrypt~=3.2.0 +checksumdir~=1.2.0 +click~=8.0.3 contextvars~=2.4 -scandir~=1.10.0 -starlette~=0.17.1 +fastapi-jwt-auth~=0.5.0 +fastapi[all]~=0.73.0 +filelock~=3.4.2 +gunicorn~=20.1.0 +Jinja2~=3.0.3 +jsonref~=0.2 locust~=2.7.0 MarkupSafe~=2.0.1 -checksumdir~=1.2.0 -pydantic~=1.9.0 -gunicorn~=20.1.0 -alembic~=1.7.5 +numpy~=1.22.1 +pandas~=1.4.0 +plyer~=2.0.0 psycopg2-binary==2.9.4 -python-json-logger~=2.0.2 -click~=8.0.3 +pydantic~=1.9.0 PyQt5~=5.15.6 -plyer~=2.0.0 -asgi-ratelimit[redis]==0.7.0 -xarray +python-json-logger~=2.0.7 +python-multipart~=0.0.5 +PyYAML~=5.4.1 +redis~=4.1.2 +requests~=2.27.1 +scandir~=1.10.0 +SQLAlchemy~=1.4.46 +starlette~=0.17.1 +uvicorn[standard]~=0.15.0 +xarray \ No newline at end of file From ce51b5913ca2a747167471732bac229b689f751b Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Wed, 22 Feb 2023 17:03:23 +0100 Subject: [PATCH 36/60] feat(model,api): update thermal form (#1317) --- .../study/business/table_mode_management.py | 15 +- antarest/study/business/thermal_management.py | 194 ++++++++++++++++ antarest/study/service.py | 2 + antarest/study/web/study_data_blueprint.py | 55 +++++ tests/integration/test_integration.py | 65 ++++++ .../Modelization/Areas/Thermal/Fields.tsx | 177 ++++++++++++++ .../Areas/Thermal/ThermalForm.tsx | 218 ------------------ .../Modelization/Areas/Thermal/index.tsx | 66 +++++- .../Modelization/Areas/Thermal/utils.ts | 172 +++++++++----- 9 files changed, 671 insertions(+), 293 deletions(-) create mode 100644 antarest/study/business/thermal_management.py create mode 100644 webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx delete mode 100644 webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/ThermalForm.tsx diff --git a/antarest/study/business/table_mode_management.py b/antarest/study/business/table_mode_management.py index e672fc119e..1f7bf3a348 100644 --- a/antarest/study/business/table_mode_management.py +++ b/antarest/study/business/table_mode_management.py @@ -17,6 +17,10 @@ from antarest.study.business.renewable_management import ( TimeSeriesInterpretation, ) +from antarest.study.business.thermal_management import ( + TimeSeriesGenerationOption, + LawOption, +) from antarest.study.business.utils import ( FormFieldsBaseModel, execute_or_add_commands, @@ -66,17 +70,6 @@ class TransmissionCapacity(str, Enum): ENABLED = "enabled" -class TimeSeriesGenerationOption(str, Enum): - USE_GLOBAL_PARAMETER = "use global parameter" - FORCE_NO_GENERATION = "force no generation" - FORCE_GENERATION = "force generation" - - -class LawOption(str, Enum): - UNIFORM = "uniform" - GEOMETRIC = "geometric" - - class BindingConstraintType(str, Enum): HOURLY = "hourly" DAILY = "daily" diff --git a/antarest/study/business/thermal_management.py b/antarest/study/business/thermal_management.py new file mode 100644 index 0000000000..8dc5eca1b1 --- /dev/null +++ b/antarest/study/business/thermal_management.py @@ -0,0 +1,194 @@ +from enum import Enum +from pathlib import PurePosixPath +from typing import Optional, Dict, Any, List + +from pydantic import StrictStr, StrictInt, StrictBool + +from antarest.study.business.utils import ( + FormFieldsBaseModel, + FieldInfo, + execute_or_add_commands, +) +from antarest.study.model import Study +from antarest.study.storage.storage_service import StudyStorageService +from antarest.study.storage.variantstudy.model.command.update_config import ( + UpdateConfig, +) + + +class TimeSeriesGenerationOption(str, Enum): + USE_GLOBAL_PARAMETER = "use global parameter" + FORCE_NO_GENERATION = "force no generation" + FORCE_GENERATION = "force generation" + + +class LawOption(str, Enum): + UNIFORM = "uniform" + GEOMETRIC = "geometric" + + +THERMAL_PATH = "input/thermal/clusters/{area}/list/{cluster}" + + +class ThermalFormFields(FormFieldsBaseModel): + group: Optional[StrictStr] + name: Optional[StrictStr] + unit_count: Optional[StrictInt] + enabled: Optional[StrictBool] + nominal_capacity: Optional[StrictInt] + gen_ts: Optional[TimeSeriesGenerationOption] + min_stable_power: Optional[StrictInt] + min_up_time: Optional[StrictInt] + min_down_time: Optional[StrictInt] + must_run: Optional[StrictBool] + spinning: Optional[StrictInt] + co2: Optional[StrictInt] + volatility_forced: Optional[StrictInt] + volatility_planned: Optional[StrictInt] + law_forced: Optional[LawOption] + law_planned: Optional[LawOption] + marginal_cost: Optional[StrictInt] + spread_cost: Optional[StrictInt] + fixed_cost: Optional[StrictInt] + startup_cost: Optional[StrictInt] + market_bid_cost: Optional[StrictInt] + + +FIELDS_INFO: Dict[str, FieldInfo] = { + "group": { + "path": f"{THERMAL_PATH}/group", + "default_value": "", + }, + "name": { + "path": f"{THERMAL_PATH}/name", + "default_value": "", + }, + "unit_count": { + "path": f"{THERMAL_PATH}/unitcount", + "default_value": 0, + }, + "enabled": { + "path": f"{THERMAL_PATH}/enabled", + "default_value": True, + }, + "nominal_capacity": { + "path": f"{THERMAL_PATH}/nominalcapacity", + "default_value": 0, + }, + "gen_ts": { + "path": f"{THERMAL_PATH}/gen-ts", + "default_value": TimeSeriesGenerationOption.USE_GLOBAL_PARAMETER.value, + }, + "min_stable_power": { + "path": f"{THERMAL_PATH}/min-stable-power", + "default_value": 0, + }, + "min_up_time": { + "path": f"{THERMAL_PATH}/min-up-time", + "default_value": 1, + }, + "min_down_time": { + "path": f"{THERMAL_PATH}/min-down-time", + "default_value": 1, + }, + "must_run": { + "path": f"{THERMAL_PATH}/must-run", + "default_value": False, + }, + "spinning": { + "path": f"{THERMAL_PATH}/spinning", + "default_value": 0, + }, + "co2": { + "path": f"{THERMAL_PATH}/co2", + "default_value": 0, + }, + "volatility_forced": { + "path": f"{THERMAL_PATH}/volatility.forced", + "default_value": 0, + }, + "volatility_planned": { + "path": f"{THERMAL_PATH}/volatility.planned", + "default_value": 0, + }, + "law_forced": { + "path": f"{THERMAL_PATH}/law.forced", + "default_value": LawOption.UNIFORM.value, + }, + "law_planned": { + "path": f"{THERMAL_PATH}/law.planned", + "default_value": LawOption.UNIFORM.value, + }, + "marginal_cost": { + "path": f"{THERMAL_PATH}/marginal-cost", + "default_value": 0, + }, + "spread_cost": { + "path": f"{THERMAL_PATH}/spread-cost", + "default_value": 0, + }, + "fixed_cost": { + "path": f"{THERMAL_PATH}/fixed-cost", + "default_value": 0, + }, + "startup_cost": { + "path": f"{THERMAL_PATH}/startup-cost", + "default_value": 0, + }, + "market_bid_cost": { + "path": f"{THERMAL_PATH}/market-bid-cost", + "default_value": 0, + }, +} + + +def format_path(path: str, area_id: str, cluster_id: str) -> str: + return path.format(area=area_id, cluster=cluster_id) + + +class ThermalManager: + def __init__(self, storage_service: StudyStorageService): + self.storage_service = storage_service + + def get_field_values( + self, study: Study, area_id: str, cluster_id: str + ) -> ThermalFormFields: + file_study = self.storage_service.get_storage(study).get_raw(study) + thermal_config = file_study.tree.get( + format_path(THERMAL_PATH, area_id, cluster_id).split("/") + ) + + def get_value(field_info: FieldInfo) -> Any: + target_name = PurePosixPath(field_info["path"]).name + return thermal_config.get(target_name, field_info["default_value"]) + + return ThermalFormFields.construct( + **{name: get_value(info) for name, info in FIELDS_INFO.items()} + ) + + def set_field_values( + self, + study: Study, + area_id: str, + cluster_id: str, + field_values: ThermalFormFields, + ) -> None: + commands: List[UpdateConfig] = [] + + for field_name, value in field_values.__iter__(): + if value is not None: + info = FIELDS_INFO[field_name] + + commands.append( + UpdateConfig( + target=format_path(info["path"], area_id, cluster_id), + data=value, + command_context=self.storage_service.variant_study_service.command_factory.command_context, + ) + ) + + if commands: + file_study = self.storage_service.get_storage(study).get_raw(study) + execute_or_add_commands( + study, file_study, commands, self.storage_service + ) diff --git a/antarest/study/service.py b/antarest/study/service.py index 6a5eacdd0f..55f028fa4c 100644 --- a/antarest/study/service.py +++ b/antarest/study/service.py @@ -73,6 +73,7 @@ from antarest.study.business.config_management import ConfigManager from antarest.study.business.district_manager import DistrictManager from antarest.study.business.renewable_management import RenewableManager +from antarest.study.business.thermal_management import ThermalManager from antarest.study.business.general_management import GeneralManager from antarest.study.business.hydro_management import HydroManager from antarest.study.business.link_management import LinkInfoDTO, LinkManager @@ -219,6 +220,7 @@ def __init__( ) self.hydro_manager = HydroManager(self.storage_service) self.renewable_manager = RenewableManager(self.storage_service) + self.thermal_manager = ThermalManager(self.storage_service) self.ts_config_manager = TimeSeriesConfigManager(self.storage_service) self.table_mode_manager = TableModeManager(self.storage_service) self.playlist_manager = PlaylistManager(self.storage_service) diff --git a/antarest/study/web/study_data_blueprint.py b/antarest/study/web/study_data_blueprint.py index 50801a8d01..83ce875852 100644 --- a/antarest/study/web/study_data_blueprint.py +++ b/antarest/study/web/study_data_blueprint.py @@ -48,6 +48,7 @@ from antarest.study.business.thematic_trimming_management import ( ThematicTrimmingFormFields, ) +from antarest.study.business.thermal_management import ThermalFormFields from antarest.study.business.timeseries_config_management import TSFormFields from antarest.study.model import PatchArea, PatchCluster from antarest.study.service import StudyService @@ -1093,4 +1094,58 @@ def set_renewable_form_values( study, area_id, cluster_id, form_fields ) + @bp.get( + path="/studies/{uuid}/areas/{area_id}/clusters/thermal/{cluster_id}/form", + tags=[APITag.study_data], + summary="Get thermal options for a given cluster", + response_model=ThermalFormFields, + response_model_exclude_none=True, + ) + def get_thermal_form_values( + uuid: str, + area_id: str, + cluster_id: str, + current_user: JWTUser = Depends(auth.get_current_user), + ) -> ThermalFormFields: + logger.info( + "Getting thermal form values for study %s and cluster %s", + uuid, + cluster_id, + extra={"user": current_user.id}, + ) + params = RequestParameters(user=current_user) + study = study_service.check_study_access( + uuid, StudyPermissionType.READ, params + ) + return study_service.thermal_manager.get_field_values( + study, area_id, cluster_id + ) + + @bp.put( + path="/studies/{uuid}/areas/{area_id}/clusters/thermal/{cluster_id}/form", + tags=[APITag.study_data], + summary="Set thermal form values for a given cluster", + ) + def set_thermal_form_values( + uuid: str, + area_id: str, + cluster_id: str, + form_fields: ThermalFormFields, + current_user: JWTUser = Depends(auth.get_current_user), + ) -> None: + logger.info( + "Setting thermal form values for study %s and cluster %s", + uuid, + cluster_id, + extra={"user": current_user.id}, + ) + request_params = RequestParameters(user=current_user) + study = study_service.check_study_access( + uuid, StudyPermissionType.WRITE, request_params + ) + + study_service.thermal_manager.set_field_values( + study, area_id, cluster_id, form_fields + ) + return bp diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index a426209fd5..8f95f24d09 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -2013,6 +2013,71 @@ def test_area_management(app: FastAPI): "nominalCapacity": 3, } + # Thermal form + + res_thermal_config = client.put( + f"/v1/studies/{study_id}/areas/area 1/clusters/thermal/cluster 1/form", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + json={ + "group": "Lignite", + "name": "cluster 1 renamed", + "unitCount": 3, + "enabled": False, + "nominalCapacity": 3, + "genTs": "use global parameter", + "minStablePower": 3, + "minUpTime": 3, + "minDownTime": 3, + "mustRun": False, + "spinning": 3, + "co2": 3, + "volatilityForced": 3, + "volatilityPlanned": 3, + "lawForced": "uniform", + "lawPlanned": "uniform", + "marginalCost": 3, + "spreadCost": 3, + "fixedCost": 3, + "startupCost": 3, + "marketBidCost": 3, + }, + ) + assert res_thermal_config.status_code == 200 + + res_thermal_config = client.get( + f"/v1/studies/{study_id}/areas/area 1/clusters/thermal/cluster 1/form", + headers={ + "Authorization": f'Bearer {admin_credentials["access_token"]}' + }, + ) + res_thermal_config_json = res_thermal_config.json() + + assert res_thermal_config_json == { + "group": "Lignite", + "name": "cluster 1 renamed", + "unitCount": 3, + "enabled": False, + "nominalCapacity": 3, + "genTs": TimeSeriesGenerationOption.USE_GLOBAL_PARAMETER.value, + "minStablePower": 3, + "minUpTime": 3, + "minDownTime": 3, + "mustRun": False, + "spinning": 3, + "co2": 3, + "volatilityForced": 3, + "volatilityPlanned": 3, + "lawForced": LawOption.UNIFORM.value, + "lawPlanned": LawOption.UNIFORM.value, + "marginalCost": 3, + "spreadCost": 3, + "fixedCost": 3, + "startupCost": 3, + "marketBidCost": 3, + } + # Links client.delete( diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx new file mode 100644 index 0000000000..031cd8f285 --- /dev/null +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx @@ -0,0 +1,177 @@ +import { useTranslation } from "react-i18next"; +import NumberFE from "../../../../../../common/fieldEditors/NumberFE"; +import SelectFE from "../../../../../../common/fieldEditors/SelectFE"; +import StringFE from "../../../../../../common/fieldEditors/StringFE"; +import SwitchFE from "../../../../../../common/fieldEditors/SwitchFE"; +import Fieldset from "../../../../../../common/Fieldset"; +import { useFormContextPlus } from "../../../../../../common/Form"; +import { + CLUSTER_GROUP_OPTIONS, + ThermalFormFields, + TS_GENERATION_OPTIONS, + TS_LAW_OPTIONS, +} from "./utils"; + +function Fields() { + const [t] = useTranslation(); + const { control } = useFormContextPlus(); + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + + return ( + <> +
+ + +
+
+ + + + + + + + + + + +
+
+ + + + + +
+
+ + + + + +
+ + ); +} + +export default Fields; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/ThermalForm.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/ThermalForm.tsx deleted file mode 100644 index cb085bdc10..0000000000 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/ThermalForm.tsx +++ /dev/null @@ -1,218 +0,0 @@ -import { Box } from "@mui/material"; -import { useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { genTsOptions, lawOptions, noDataValues, ThermalType } from "./utils"; -import { StudyMetadata } from "../../../../../../../common/types"; -import ThermalMatrixView from "./ThermalMatrixView"; -import { IFormGenerator } from "../../../../../../common/FormGenerator"; -import AutoSubmitGeneratorForm from "../../../../../../common/FormGenerator/AutoSubmitGenerator"; -import { saveField } from "../common/utils"; -import { transformNameToId } from "../../../../../../../services/utils"; - -interface Props { - area: string; - cluster: string; - study: StudyMetadata; - groupList: Array; -} - -export default function ThermalForm(props: Props) { - const { groupList, study, area, cluster } = props; - const [t] = useTranslation(); - const pathPrefix = useMemo( - () => `input/thermal/clusters/${area}/list/${cluster}`, - [area, cluster] - ); - const studyId = study.id; - - const groupOptions = useMemo( - () => groupList.map((item) => ({ label: item, value: item })), - [groupList] - ); - - const saveValue = useMemo( - () => saveField(studyId, pathPrefix, noDataValues), - [pathPrefix, studyId] - ); - - const jsonGenerator: IFormGenerator = useMemo( - () => [ - { - legend: "global.general", - fields: [ - { - type: "text", - name: "name", - label: t("global.name"), - path: `${pathPrefix}/name`, - disabled: true, - }, - { - type: "select", - name: "group", - label: t("study.modelization.clusters.group"), - path: `${pathPrefix}/group`, - options: groupOptions, - }, - ], - }, - { - legend: "study.modelization.clusters.operatingParameters", - fields: [ - { - type: "switch", - name: "enabled", - path: `${pathPrefix}/enabled`, - label: t("study.modelization.clusters.enabled"), - }, - { - type: "switch", - name: "must-run", - path: `${pathPrefix}/must-run`, - label: t("study.modelization.clusters.mustRun"), - }, - { - type: "number", - name: "unitcount", - path: `${pathPrefix}/unitcount`, - label: t("study.modelization.clusters.unitcount"), - }, - { - type: "number", - name: "nominalcapacity", - path: `${pathPrefix}/nominalcapacity`, - label: t("study.modelization.clusters.nominalCapacity"), - }, - { - type: "number", - name: "min-stable-power", - path: `${pathPrefix}/min-stable-power`, - label: t("study.modelization.clusters.minStablePower"), - }, - { - type: "number", - name: "spinning", - path: `${pathPrefix}/spinning`, - label: t("study.modelization.clusters.spinning"), - }, - { - type: "number", - name: "min-up-time", - path: `${pathPrefix}/min-up-time`, - label: t("study.modelization.clusters.minUpTime"), - }, - { - type: "number", - name: "min-down-time", - path: `${pathPrefix}/min-down-time`, - label: t("study.modelization.clusters.minDownTime"), - }, - { - type: "number", - name: "co2", - path: `${pathPrefix}/co2`, - label: t("study.modelization.clusters.co2"), - }, - ], - }, - { - legend: "study.modelization.clusters.operatingCosts", - fields: [ - { - type: "number", - name: "marginal-cost", - path: `${pathPrefix}/marginal-cost`, - label: t("study.modelization.clusters.marginalCost"), - }, - { - type: "number", - name: "fixed-cost", - path: `${pathPrefix}/fixed-cost`, - label: t("study.modelization.clusters.fixedCost"), - }, - { - type: "number", - name: "startup-cost", - path: `${pathPrefix}/startup-cost`, - label: t("study.modelization.clusters.startupCost"), - }, - { - type: "number", - name: "market-bid-cost", - path: `${pathPrefix}/market-bid-cost`, - label: t("study.modelization.clusters.marketBidCost"), - }, - { - type: "number", - name: "spread-cost", - path: `${pathPrefix}/spread-cost`, - label: t("study.modelization.clusters.spreadCost"), - }, - ], - }, - - { - legend: "study.modelization.clusters.timeSeriesGen", - fields: [ - { - type: "select", - name: "gen-ts", - path: `${pathPrefix}/gen-ts`, - label: t("study.modelization.clusters.genTs"), - options: genTsOptions, - }, - { - type: "number", - name: "volatility.forced", - path: `${pathPrefix}/volatility.forced`, - label: t("study.modelization.clusters.volatilityForced"), - }, - { - type: "number", - name: "volatility.planned", - path: `${pathPrefix}/volatility.planned`, - label: t("study.modelization.clusters.volatilityPlanned"), - }, - { - type: "select", - name: "law.forced", - path: `${pathPrefix}/law.forced`, - label: t("study.modelization.clusters.lawForced"), - options: lawOptions, - }, - { - type: "select", - name: "law.planned", - path: `${pathPrefix}/law.planned`, - label: t("study.modelization.clusters.lawPlanned"), - options: lawOptions, - }, - ], - }, - ], - [t, pathPrefix, groupOptions] - ); - - return ( - <> - - - - - - ); -} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx index 5f7b8bcfe2..61d5d00968 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx @@ -1,30 +1,76 @@ +import { Box } from "@mui/material"; import { useTranslation } from "react-i18next"; import { useOutletContext } from "react-router-dom"; import { StudyMetadata } from "../../../../../../../common/types"; +import { transformNameToId } from "../../../../../../../services/utils"; +import Form from "../../../../../../common/Form"; +import { SubmitHandlerPlus } from "../../../../../../common/Form/types"; import ClusterRoot from "../common/ClusterRoot"; import { getDefaultValues } from "../common/utils"; -import ThermalForm from "./ThermalForm"; -import { fixedGroupList, noDataValues } from "./utils"; +import Fields from "./Fields"; +import ThermalMatrixView from "./ThermalMatrixView"; +import { + CLUSTER_GROUP_OPTIONS, + getThermalFormFields, + noDataValues, + ThermalFormFields, + updateThermalFormFields, +} from "./utils"; function Thermal() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const [t] = useTranslation(); + + //////////////////////////////////////////////////////////////// + // Event handlers + //////////////////////////////////////////////////////////////// + + const handleSubmit = + (areaId: string, clusterId: string) => + ({ dirtyValues }: SubmitHandlerPlus) => { + return updateThermalFormFields(study.id, areaId, clusterId, dirtyValues); + }; + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + return ( - {({ study, cluster, area, groupList }) => ( - + {({ study, cluster, area }) => ( +
{ + return getThermalFormFields(study.id, area, cluster); + }, + }} + onSubmit={handleSubmit(area, cluster)} + autoSubmit + > + + + + + )}
); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts index 2e2158b4ce..0c4e1e9e23 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts @@ -1,36 +1,34 @@ import { FieldValues } from "react-hook-form"; -import { Cluster } from "../../../../../../../common/types"; +import { + Area, + Cluster, + StudyMetadata, +} from "../../../../../../../common/types"; +import client from "../../../../../../../services/api/client"; import { getStudyData } from "../../../../../../../services/api/study"; -type GenTsType = - | "use global parameter" - | "force no generation" - | "force generation"; - -type LawType = "geometric" | "uniform"; - export interface ThermalType extends FieldValues { name: string; group: string; - enabled?: boolean; // Default: true - unitcount?: number; // Default: 0 - nominalcapacity?: number; // Default: 0 - "gen-ts"?: GenTsType; // Default: use global parameter - "min-stable-power"?: number; // Default: 0 - "min-up-time"?: number; // Default: 1 - "min-down-time"?: number; // Default: 1 - "must-run"?: boolean; // Default: false - spinning?: number; // Default: 0 - co2?: number; // Default: 0 - "volatility.forced"?: number; // Default: 0 - "volatility.planned"?: number; // Default: 0 - "law.forced"?: LawType; // Default: uniform - "law.planned"?: LawType; // Default: uniform - "marginal-cost"?: number; // Default: 0 - "spread-cost"?: number; // Default: 0 - "fixed-cost"?: number; // Default: 0 - "startup-cost"?: number; // Default: 0 - "market-bid-cost"?: number; // Default: 0 */ + enabled?: boolean; + unitcount?: number; + nominalcapacity?: number; + "gen-ts"?: string; + "min-stable-power"?: number; + "min-up-time"?: number; + "min-down-time"?: number; + "must-run"?: boolean; + spinning?: number; + co2?: number; + "volatility.forced"?: number; + "volatility.planned"?: number; + "law.forced"?: string; + "law.planned"?: string; + "marginal-cost"?: number; + "spread-cost"?: number; + "fixed-cost"?: number; + "startup-cost"?: number; + "market-bid-cost"?: number; } export const noDataValues: Partial = { @@ -57,32 +55,6 @@ export const noDataValues: Partial = { "market-bid-cost": 0, }; -export const genTsOptions = [ - "use global parameter", - "force no generation", - "force generation", -].map((item) => ({ label: item, value: item })); - -export const lawOptions = ["uniform", "geometric"].map((item) => ({ - label: item, - value: item, -})); - -export const fixedGroupList = [ - "Gas", - "Hard Coal", - "Lignite", - "Mixed fuel", - "Nuclear", - "Oil", - "Other", - "Other 2", - "Other 3", - "Other 4", -]; - -export type ThermalPath = Record; - export async function getDefaultValues( studyId: string, area: string, @@ -96,4 +68,96 @@ export async function getDefaultValues( return data; } -export default {}; +//////////////////////////////////////////////////////////////// +// Enums +//////////////////////////////////////////////////////////////// + +enum ClusterGroup { + Gas = "Gas", + HardCoal = "Hard Coal", + Lignite = "Lignite", + MixedFuel = "Mixed fuel", + Nuclear = "Nuclear", + Oil = "Oil", + Other = "Other", + Other2 = "Other 2", + Other3 = "Other 3", + Other4 = "Other 4", +} + +enum TimeSeriesGenerationOption { + UseGlobal = "use global parameter", + ForceNoGeneration = "force no generation", + ForceGeneration = "force generation", +} + +enum LawOption { + Geometric = "geometric", + Uniform = "uniform", +} + +//////////////////////////////////////////////////////////////// +// Types +//////////////////////////////////////////////////////////////// + +export interface ThermalFormFields { + name: string; + group: string; + enabled: boolean; + unitCount: number; + nominalCapacity: number; + mustRun: boolean; + minStablePower: number; + spinning: number; + minUpTime: number; + minDownTime: number; + co2: number; + marginalCost: number; + fixedCost: number; + startupCost: number; + marketBidCost: number; + spreadCost: number; + genTs: TimeSeriesGenerationOption; + volatilityForced: number; + volatilityPlanned: number; + lawForced: LawOption; + lawPlanned: LawOption; +} + +//////////////////////////////////////////////////////////////// +// Constants +//////////////////////////////////////////////////////////////// + +export const CLUSTER_GROUP_OPTIONS = Object.values(ClusterGroup); +export const TS_GENERATION_OPTIONS = Object.values(TimeSeriesGenerationOption); +export const TS_LAW_OPTIONS = Object.values(LawOption); + +//////////////////////////////////////////////////////////////// +// Functions +//////////////////////////////////////////////////////////////// + +function makeRequestURL( + studyId: StudyMetadata["id"], + areaId: Area["name"], + clusterId: Cluster["id"] +): string { + return `/v1/studies/${studyId}/areas/${areaId}/clusters/thermal/${clusterId}/form`; +} + +export async function getThermalFormFields( + studyId: StudyMetadata["id"], + areaId: Area["name"], + clusterId: Cluster["id"] +): Promise { + const res = await client.get(makeRequestURL(studyId, areaId, clusterId)); + return res.data; +} + +export function updateThermalFormFields( + studyId: StudyMetadata["id"], + areaId: Area["name"], + clusterId: Cluster["id"], + values: Partial +): Promise { + return client.put(makeRequestURL(studyId, areaId, clusterId), values); +} From 2f91c822dd370c92e9cade62735a0cfe53c763c5 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Wed, 22 Feb 2023 17:47:04 +0100 Subject: [PATCH 37/60] fix(ui-studies): remove regex support in search field (#1326) --- webapp/src/utils/studiesUtils.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/webapp/src/utils/studiesUtils.ts b/webapp/src/utils/studiesUtils.ts index 1277a7a917..85f6346358 100644 --- a/webapp/src/utils/studiesUtils.ts +++ b/webapp/src/utils/studiesUtils.ts @@ -3,6 +3,7 @@ import * as R from "ramda"; import * as RA from "ramda-adjunct"; import { StudyMetadata, StudyType } from "../common/types"; import { StudiesSortConf, StudyFilters } from "../redux/ducks/studies"; +import { isSearchMatching } from "./textUtils"; //////////////////////////////////////////////////////////////// // Sort @@ -49,11 +50,9 @@ const folderPredicate = R.curry( const inputValuePredicate = R.curry( (inputValue: StudyFilters["inputValue"], study: StudyMetadata) => { - if (!inputValue) { - return true; - } - const regex = new RegExp(inputValue, "i"); - return study.name.search(regex) !== -1 || study.id.search(regex) !== -1; + return inputValue + ? isSearchMatching(inputValue, [study.name, study.id]) + : true; } ); From 0f31566549da00f7cc7b663b067ed82b7bc14cd5 Mon Sep 17 00:00:00 2001 From: MartinBelthle <102529366+MartinBelthle@users.noreply.github.com> Date: Thu, 23 Feb 2023 15:02:51 +0100 Subject: [PATCH 38/60] feat(storage): add v8.5 template (#1328) --- .../study/business/optimization_management.py | 48 +++++++++++++++- antarest/study/model.py | 5 +- .../filesystem/root/settings/generaldata.py | 13 +++++ resources/empty_study_850.zip | Bin 0 -> 61129 bytes tests/integration/test_integration.py | 12 ++++ .../business/test_raw_study_service.py | 53 ++++++++++++++++++ 6 files changed, 125 insertions(+), 6 deletions(-) create mode 100644 resources/empty_study_850.zip diff --git a/antarest/study/business/optimization_management.py b/antarest/study/business/optimization_management.py index 698ec76c2b..6c6daa85bf 100644 --- a/antarest/study/business/optimization_management.py +++ b/antarest/study/business/optimization_management.py @@ -1,7 +1,7 @@ from enum import Enum -from typing import Optional, Union, Literal, List, Any, Dict, TypedDict +from typing import Optional, Union, List, Any, Dict -from pydantic.types import StrictBool +from pydantic.types import StrictBool, StrictFloat, StrictInt from antarest.study.business.utils import ( FormFieldsBaseModel, @@ -45,6 +45,11 @@ class SimplexOptimizationRange(str, Enum): WEEK = "week" +class PriceTakingOrder(str, Enum): + DENS = "DENS" + LOAD = "Load" + + class OptimizationFormFields(FormFieldsBaseModel): binding_constraints: Optional[StrictBool] hurdle_costs: Optional[StrictBool] @@ -71,6 +76,13 @@ class OptimizationFormFields(FormFieldsBaseModel): StrictBool ] ntc_between_physical_areas_out_adequacy_patch: Optional[StrictBool] + # version 850 + price_taking_order: Optional[PriceTakingOrder] + include_hurdle_cost_csr: Optional[StrictBool] + check_csr_cost_function: Optional[StrictBool] + threshold_initiate_curtailment_sharing_rule: Optional[StrictFloat] + threshold_display_local_matching_rule_violations: Optional[StrictFloat] + threshold_csr_variable_bounds_relaxation: Optional[StrictInt] OPTIMIZATION_PATH = f"{GENERAL_DATA_PATH}/optimization" @@ -151,6 +163,36 @@ class OptimizationFormFields(FormFieldsBaseModel): "default_value": True, "start_version": 830, }, + "price_taking_order": { + "path": f"{ADEQUACY_PATCH_PATH}/price-taking-order", + "default_value": "DENS", + "start_version": 850, + }, + "include_hurdle_cost_csr": { + "path": f"{ADEQUACY_PATCH_PATH}/include-hurdle-cost-csr", + "default_value": False, + "start_version": 850, + }, + "check_csr_cost_function": { + "path": f"{ADEQUACY_PATCH_PATH}/check-csr-cost-function", + "default_value": False, + "start_version": 850, + }, + "threshold_initiate_curtailment_sharing_rule": { + "path": f"{ADEQUACY_PATCH_PATH}/threshold-initiate-curtailment-sharing-rule", + "default_value": 0.0, + "start_version": 850, + }, + "threshold_display_local_matching_rule_violations": { + "path": f"{ADEQUACY_PATCH_PATH}/threshold-display-local-matching-rule-violations", + "default_value": 0.0, + "start_version": 850, + }, + "threshold_csr_variable_bounds_relaxation": { + "path": f"{ADEQUACY_PATCH_PATH}/threshold-csr-variable-bounds-relaxation", + "default_value": 3, + "start_version": 850, + }, } @@ -205,7 +247,7 @@ def set_field_values( ) ) - if len(commands) > 0: + if commands: file_study = self.storage_service.get_storage(study).get_raw(study) execute_or_add_commands( study, file_study, commands, self.storage_service diff --git a/antarest/study/model.py b/antarest/study/model.py index 51472feea3..5ec9140c93 100644 --- a/antarest/study/model.py +++ b/antarest/study/model.py @@ -43,11 +43,10 @@ "820": "empty_study_820.zip", "830": "empty_study_830.zip", "840": "empty_study_840.zip", - # we use the version '8.5.0-rc3' - "850": "empty_study_840.zip", # todo: "empty_study_840.zip" + "850": "empty_study_850.zip", } -NEW_DEFAULT_STUDY_VERSION: str = "840" +NEW_DEFAULT_STUDY_VERSION: str = "850" class StudyContentStatus(enum.Enum): diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py index a5b035c68b..0b88a9b2b6 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py @@ -136,6 +136,19 @@ def __init__(self, context: ContextServer, config: FileStudyTreeConfig): ] = str # none, optim-1, optim-2, both-optims if config.version >= 840: del types["optimization"]["include-split-exported-mps"] + if config.version >= 850: + types["adequacy patch"]["price-taking-order"] = str + types["adequacy patch"]["include-hurdle-cost-csr"] = bool + types["adequacy patch"]["check-csr-cost-function"] = bool + types["adequacy patch"][ + "threshold-initiate-curtailment-sharing-rule" + ] = float + types["adequacy patch"][ + "threshold-display-local-matching-rule-violations" + ] = float + types["adequacy patch"][ + "threshold-csr-variable-bounds-relaxation" + ] = int IniFileNode.__init__( self, diff --git a/resources/empty_study_850.zip b/resources/empty_study_850.zip new file mode 100644 index 0000000000000000000000000000000000000000..a142dae66ce1ad91c02af3581c6a0408fdacef46 GIT binary patch literal 61129 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Ⓢ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 literal 0 HcmV?d00001 diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index 8f95f24d09..f0fc467202 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -1017,6 +1017,12 @@ def test_area_management(app: FastAPI): "enableAdequacyPatch": False, "ntcFromPhysicalAreasOutToPhysicalAreasInAdequacyPatch": True, "ntcBetweenPhysicalAreasOutAdequacyPatch": True, + "checkCsrCostFunction": False, + "includeHurdleCostCsr": False, + "priceTakingOrder": "DENS", + "thresholdInitiateCurtailmentSharingRule": 0.0, + "thresholdDisplayLocalMatchingRuleViolations": 0.0, + "thresholdCsrVariableBoundsRelaxation": 3, } client.put( @@ -1055,6 +1061,12 @@ def test_area_management(app: FastAPI): "enableAdequacyPatch": False, "ntcFromPhysicalAreasOutToPhysicalAreasInAdequacyPatch": True, "ntcBetweenPhysicalAreasOutAdequacyPatch": False, + "checkCsrCostFunction": False, + "includeHurdleCostCsr": False, + "priceTakingOrder": "DENS", + "thresholdInitiateCurtailmentSharingRule": 0.0, + "thresholdDisplayLocalMatchingRuleViolations": 0.0, + "thresholdCsrVariableBoundsRelaxation": 3, } res_general_config = client.get( diff --git a/tests/storage/business/test_raw_study_service.py b/tests/storage/business/test_raw_study_service.py index c455542ff4..83205a9337 100644 --- a/tests/storage/business/test_raw_study_service.py +++ b/tests/storage/business/test_raw_study_service.py @@ -287,6 +287,7 @@ def create_study(version: str): md720 = create_study("720") md803 = create_study("800") md810 = create_study("810") + md850 = create_study("850") path_study = path_studies / md613.id general_data_file = path_study / "settings" / "generaldata.ini" @@ -382,6 +383,58 @@ def create_study(version: str): is None ) + path_study = path_studies / md850.id + general_data_file = path_study / "settings" / "generaldata.ini" + general_data = general_data_file.read_text() + assert ( + re.search( + "^price-taking-order = DENS", + general_data, + flags=re.MULTILINE, + ) + is not None + ) + assert ( + re.search( + "^include-hurdle-cost-csr = false", + general_data, + flags=re.MULTILINE, + ) + is not None + ) + assert ( + re.search( + "^check-csr-cost-function = false", + general_data, + flags=re.MULTILINE, + ) + is not None + ) + assert ( + re.search( + "^threshold-initiate-curtailment-sharing-rule = 0.0", + general_data, + flags=re.MULTILINE, + ) + is not None + ) + assert ( + re.search( + "^threshold-display-local-matching-rule-violations = 0.0", + general_data, + flags=re.MULTILINE, + ) + is not None + ) + assert ( + re.search( + "^threshold-csr-variable-bounds-relaxation = 3", + general_data, + flags=re.MULTILINE, + ) + is not None + ) + @pytest.mark.unit_test def test_copy_study( From f6dbed9c77d714169a642369b1a8b6a49f5392e9 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE <43534797+laurent-laporte-pro@users.noreply.github.com> Date: Thu, 23 Feb 2023 17:50:41 +0100 Subject: [PATCH 39/60] test: simplify unit tests (#1325) --- tests/storage/web/test_studies_bp.py | 99 ++++++++++++++-------------- 1 file changed, 48 insertions(+), 51 deletions(-) diff --git a/tests/storage/web/test_studies_bp.py b/tests/storage/web/test_studies_bp.py index bd589e684e..2d99096d2f 100644 --- a/tests/storage/web/test_studies_bp.py +++ b/tests/storage/web/test_studies_bp.py @@ -1,51 +1,47 @@ import io import shutil +import uuid from datetime import datetime from http import HTTPStatus from pathlib import Path from unittest.mock import Mock, call import pytest -from fastapi import FastAPI -from markupsafe import Markup -from starlette.testclient import TestClient - from antarest.core.config import ( Config, SecurityConfig, StorageConfig, WorkspaceConfig, ) -from antarest.core.exceptions import ( - UrlNotMatchJsonDataError, -) +from antarest.core.exceptions import UrlNotMatchJsonDataError from antarest.core.filetransfer.model import ( - FileDownloadTaskDTO, FileDownloadDTO, + FileDownloadTaskDTO, ) -from antarest.core.jwt import JWTUser, JWTGroup -from antarest.core.requests import ( - RequestParameters, -) +from antarest.core.jwt import JWTGroup, JWTUser +from antarest.core.requests import RequestParameters from antarest.core.roles import RoleType from antarest.matrixstore.service import MatrixService from antarest.study.main import build_study_service from antarest.study.model import ( DEFAULT_WORKSPACE_NAME, + STUDY_REFERENCE_TEMPLATES, + MatrixAggregationResultDTO, + MatrixIndex, + OwnerInfo, PublicMode, StudyDownloadDTO, - MatrixIndex, - StudySimResultDTO, - StudySimSettingsDTO, - STUDY_REFERENCE_TEMPLATES, - StudyDownloadType, StudyDownloadLevelDTO, + StudyDownloadType, StudyMetadataDTO, - OwnerInfo, - MatrixAggregationResultDTO, + StudySimResultDTO, + StudySimSettingsDTO, TimeSerie, TimeSeriesData, ) +from fastapi import FastAPI +from markupsafe import Markup +from starlette.testclient import TestClient from tests.storage.conftest import SimpleFileTransferManager ADMIN = JWTUser( @@ -107,10 +103,10 @@ def test_404() -> None: ) client = TestClient(app, raise_server_exceptions=False) result = client.get("/v1/studies/study1/raw?path=settings/general/params") - assert result.status_code == 404 + assert result.status_code == HTTPStatus.NOT_FOUND result = client.get("/v1/studies/WRONG_STUDY/raw") - assert result.status_code == 404 + assert result.status_code == HTTPStatus.NOT_FOUND @pytest.mark.unit_test @@ -134,16 +130,16 @@ def test_server_with_parameters() -> None: parameters = RequestParameters(user=ADMIN) - assert result.status_code == 200 + assert result.status_code == HTTPStatus.OK mock_storage_service.get.assert_called_once_with( "study1", "/", 4, True, parameters ) result = client.get("/v1/studies/study2/raw?depth=WRONG_TYPE") - - assert result.status_code == 422 + assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY result = client.get("/v1/studies/study2/raw") + assert result.status_code == HTTPStatus.OK excepted_parameters = RequestParameters(user=ADMIN) mock_storage_service.get.assert_called_with( @@ -176,7 +172,7 @@ def test_create_study(tmp_path: str, project_path) -> None: result_right = client.post("/v1/studies?name=study2") - assert result_right.status_code == HTTPStatus.CREATED.value + assert result_right.status_code == HTTPStatus.CREATED assert result_right.json() == "my-uuid" storage_service.create_study.assert_called_once_with( "study2", "", [], PARAMS @@ -185,19 +181,18 @@ def test_create_study(tmp_path: str, project_path) -> None: @pytest.mark.unit_test def test_import_study_zipped(tmp_path: Path, project_path) -> None: - tmp_path /= "tmp" - tmp_path.mkdir() study_name = "study1" path_study = tmp_path / study_name path_study.mkdir() path_file = path_study / "study.antares" path_file.write_text("[antares]") - shutil.make_archive(path_study, "zip", path_study) + shutil.make_archive(str(path_study), "zip", path_study) path_zip = tmp_path / "study1.zip" mock_storage_service = Mock() - mock_storage_service.import_study.return_value = study_name + study_uuid = str(uuid.uuid4()) + mock_storage_service.import_study.return_value = study_uuid app = FastAPI(title=__name__) build_study_service( @@ -214,13 +209,13 @@ def test_import_study_zipped(tmp_path: Path, project_path) -> None: result = client.post("/v1/studies") - assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY.value + assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY study_data = io.BytesIO(path_zip.read_bytes()) result = client.post("/v1/studies/_import", files={"study": study_data}) - assert result.json() == study_name - assert result.status_code == HTTPStatus.CREATED.value + assert result.json() == study_uuid + assert result.status_code == HTTPStatus.CREATED mock_storage_service.import_study.assert_called_once() @@ -252,7 +247,7 @@ def test_copy_study(tmp_path: Path) -> None: use_task=True, params=PARAMS, ) - assert result.status_code == HTTPStatus.CREATED.value + assert result.status_code == HTTPStatus.CREATED @pytest.mark.unit_test @@ -435,10 +430,12 @@ def test_delete_study() -> None: matrix_service=Mock(spec=MatrixService), ) client = TestClient(app) - client.delete("/v1/studies/name") + + study_uuid = "8319b5f8-2a35-4984-9ace-2ab072bd6eef" + client.delete(f"/v1/studies/{study_uuid}") mock_storage_service.delete_study.assert_called_once_with( - "name", False, PARAMS + study_uuid, False, PARAMS ) @@ -606,13 +603,13 @@ def test_output_whole_download(tmp_path: Path) -> None: res = client.get( f"/v1/studies/my-uuid/outputs/{output_id}/export", ) - assert res.status_code == 200 + assert res.status_code == HTTPStatus.OK @pytest.mark.unit_test def test_sim_reference() -> None: mock_service = Mock() - study_id = "my-study-id" + study_id = str(uuid.uuid4()) output_id = "my-output-id" app = FastAPI(title=__name__) @@ -631,22 +628,22 @@ def test_sim_reference() -> None: mock_service.set_sim_reference.assert_called_once_with( study_id, output_id, True, PARAMS ) - assert res.status_code == 200 + assert res.status_code == HTTPStatus.OK assert res.json() == "" @pytest.mark.unit_test def test_sim_result() -> None: mock_service = Mock() - study_id = "my-study-id" + study_id = str(uuid.uuid4()) settings = StudySimSettingsDTO( - general=dict(), - input=dict(), - output=dict(), - optimization=dict(), - otherPreferences=dict(), - advancedParameters=dict(), - seedsMersenneTwister=dict(), + general={}, + input={}, + output={}, + optimization={}, + otherPreferences={}, + advancedParameters={}, + seedsMersenneTwister={}, ) result_data = [ StudySimResultDTO( @@ -700,7 +697,7 @@ def test_study_permission_management(tmp_path: Path) -> None: 2, PARAMS, ) - assert result.status_code == HTTPStatus.OK.value + assert result.status_code == HTTPStatus.OK result = client.put("/v1/studies/existing-study/groups/group-a") storage_service.add_group.assert_called_with( @@ -708,7 +705,7 @@ def test_study_permission_management(tmp_path: Path) -> None: "group-a", PARAMS, ) - assert result.status_code == HTTPStatus.OK.value + assert result.status_code == HTTPStatus.OK result = client.delete("/v1/studies/existing-study/groups/group-b") storage_service.remove_group.assert_called_with( @@ -716,7 +713,7 @@ def test_study_permission_management(tmp_path: Path) -> None: "group-b", PARAMS, ) - assert result.status_code == HTTPStatus.OK.value + assert result.status_code == HTTPStatus.OK result = client.put("/v1/studies/existing-study/public_mode/FULL") storage_service.set_public_mode.assert_called_with( @@ -724,10 +721,10 @@ def test_study_permission_management(tmp_path: Path) -> None: PublicMode.FULL, PARAMS, ) - assert result.status_code == HTTPStatus.OK.value + assert result.status_code == HTTPStatus.OK result = client.put("/v1/studies/existing-study/public_mode/UNKNOWN") - assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY.value + assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY @pytest.mark.unit_test From 23a9d813911c8f18564702667e5947a7dbf315cd Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Thu, 23 Feb 2023 18:08:18 +0100 Subject: [PATCH 40/60] fix(ui-hydro): add path for ror matrix in hydro (#1340) fix #1331 --- .../App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts index b81653ec25..c953df8f4c 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts @@ -97,7 +97,7 @@ export const MATRICES: Matrices = { }, [MatrixType.RunOfRiver]: { title: "Run of river", - url: "input/hydro/common/capacity/waterValues_{areaId}", + url: "input/hydro/series/{areaId}/ror", stats: MatrixStats.STATS, }, }; From d51f5dd01a7b0871ce57a0649cf4a12e069bb9b9 Mon Sep 17 00:00:00 2001 From: Hatim Dinia Date: Fri, 24 Feb 2023 13:14:03 +0100 Subject: [PATCH 41/60] feat(ui-hydro): disable unnecessary matrices stats columns (#1342) --- .../Singlestudy/explore/Modelization/Areas/Hydro/utils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts index c953df8f4c..23038fe4e1 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts @@ -66,7 +66,7 @@ export const MATRICES: Matrices = { [MatrixType.Dailypower]: { title: "Daily power", url: "input/hydro/common/capacity/creditmodulations_{areaId}", - stats: MatrixStats.TOTAL, + stats: MatrixStats.NOCOL, }, [MatrixType.EnergyCredits]: { title: "Standard credit", @@ -77,13 +77,13 @@ export const MATRICES: Matrices = { "Pumping Max Power(MW)", "Pumping Max Energy(Hours at Pmax)", ], - stats: MatrixStats.STATS, + stats: MatrixStats.NOCOL, }, [MatrixType.ReservoirLevels]: { title: "Reservoir levels", url: "input/hydro/common/capacity/reservoir_{areaId}", cols: ["Lev Low(%)", "Lev Avg(%)", "Lev High(%)"], - stats: MatrixStats.TOTAL, + stats: MatrixStats.NOCOL, }, [MatrixType.WaterValues]: { title: "Water values", From 511fbd7c995bc90f511300dfe7a3c5e7ccc1a18f Mon Sep 17 00:00:00 2001 From: MartinBelthle <102529366+MartinBelthle@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:41:51 +0100 Subject: [PATCH 42/60] feat(study): make projection in XpansionSensitivitySettings optional (#1349) --- .../study/business/xpansion_management.py | 2 +- .../storage/business/test_xpansion_manager.py | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/antarest/study/business/xpansion_management.py b/antarest/study/business/xpansion_management.py index c540e8b3e6..d18159df5d 100644 --- a/antarest/study/business/xpansion_management.py +++ b/antarest/study/business/xpansion_management.py @@ -64,7 +64,7 @@ class MaxIteration(str, Enum): class XpansionSensitivitySettingsDTO(BaseModel): epsilon: float - projection: List[str] + projection: Optional[List[str]] capex: bool = False diff --git a/tests/storage/business/test_xpansion_manager.py b/tests/storage/business/test_xpansion_manager.py index 57881ed091..e7091b3d97 100644 --- a/tests/storage/business/test_xpansion_manager.py +++ b/tests/storage/business/test_xpansion_manager.py @@ -18,6 +18,7 @@ XpansionFileNotFoundError, XpansionResourceFileType, FileCurrentlyUsedInSettings, + XpansionSensitivitySettingsDTO, ) from antarest.study.model import RawStudy from antarest.study.storage.rawstudy.model.filesystem.config.files import build @@ -254,6 +255,41 @@ def test_get_xpansion_settings( assert xpansion_manager.get_xpansion_settings(study) == expected_output +@pytest.mark.unit_test +def test_xpansion_sensitivity_settings(tmp_path: Path): + """ + Test that attribute projection in sensitivity_config is optional + """ + + empty_study = make_empty_study(tmp_path, 720) + study = RawStudy(id="1", path=empty_study.config.study_path, version=720) + xpansion_manager = make_xpansion_manager(empty_study) + + xpansion_manager.create_xpansion_configuration(study) + expected_settings = XpansionSettingsDTO.parse_obj( + { + "optimality_gap": 1, + "max_iteration": "+Inf", + "uc_type": "expansion_fast", + "master": "integer", + "yearly_weight": None, + "additional-constraints": None, + "relaxed-optimality-gap": None, + "cut-type": None, + "ampl.solver": None, + "ampl.presolve": None, + "ampl.solve_bounds_frequency": None, + "relative_gap": 1e-12, + "solver": "Cbc", + "sensitivity_config": XpansionSensitivitySettingsDTO( + epsilon=0.1, capex=False + ), + } + ) + xpansion_manager.update_xpansion_settings(study, expected_settings) + assert xpansion_manager.get_xpansion_settings(study) == expected_settings + + @pytest.mark.unit_test def test_update_xpansion_settings(tmp_path: Path): """ From 30a29dd8c28fb498bb3b5dbf16bf38784c789cf5 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE <43534797+laurent-laporte-pro@users.noreply.github.com> Date: Tue, 28 Feb 2023 18:56:44 +0100 Subject: [PATCH 43/60] feat(adequacy-patch): consider `excluded_areas` before launching and cleanup output (#1361) Co-authored-by: AssilMa <48201741+AssilMa@users.noreply.github.com> Co-authored-by: MANSOURI Assil Ext --- .../adequacy_patch/resources/post-processing-legacy.R | 4 +++- .../extensions/adequacy_patch/resources/post-processing.R | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/antarest/launcher/extensions/adequacy_patch/resources/post-processing-legacy.R b/antarest/launcher/extensions/adequacy_patch/resources/post-processing-legacy.R index 0ae848aba0..f6d296fdff 100644 --- a/antarest/launcher/extensions/adequacy_patch/resources/post-processing-legacy.R +++ b/antarest/launcher/extensions/adequacy_patch/resources/post-processing-legacy.R @@ -1,5 +1,6 @@ library(AdequacyPatch) library(antaresRead) +library(antaresEditObject) library(yaml) library(parallel) library(data.table) @@ -10,7 +11,7 @@ opts <- setSimulationPath(".") print(readLayout(opts = opts)) config <- read_yaml("user/adequacypatch/config.yml", fileEncoding = "UTF-8", text) -areas = config$areas +areas = setdiff(config$areas, config$excluded_areas) virutal_areas = config$areas mcYears = config$mcYears antaresfbzone = config$antaresfbzone @@ -77,3 +78,4 @@ for (output in list.files("output")) { } } +cleanUpOutput(areas = config$areas, opts = opts) diff --git a/antarest/launcher/extensions/adequacy_patch/resources/post-processing.R b/antarest/launcher/extensions/adequacy_patch/resources/post-processing.R index 8292b5d1b1..b90dc4e96e 100644 --- a/antarest/launcher/extensions/adequacy_patch/resources/post-processing.R +++ b/antarest/launcher/extensions/adequacy_patch/resources/post-processing.R @@ -1,5 +1,6 @@ library(AdequacyPatch) library(antaresRead) +library(antaresEditObject) library(yaml) library(parallel) library(data.table) @@ -11,7 +12,7 @@ print(readLayout(opts = opts)) config <- read_yaml("user/adequacypatch/config.yml", fileEncoding = "UTF-8", text) -areas = config$areas +areas = setdiff(config$areas, config$excluded_areas) virutal_areas = config$areas mcYears = config$mcYears antaresfbzone = config$antaresfbzone @@ -78,4 +79,4 @@ for (output in list.files("output")) { } } - +cleanUpOutput(areas = config$areas, opts = opts) From b1ed6d20bb441165f8037b51a8e42cc13b45dd11 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Thu, 2 Mar 2023 10:43:58 +0100 Subject: [PATCH 44/60] docs: update change log --- docs/CHANGELOG.md | 60 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7af33ec75a..de548fef99 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,60 @@ -Antares-Web Changelog +Antares Web Changelog ===================== -v2.0.0 (09/2021) +v2.13.0 (unreleased) -------------------- -Initial Version \ No newline at end of file + +### Bug Fixes + +* **ui-map:** prevent duplicate layers and districts on create/update (#1239) ([eff4ca3](https://github.com/AntaresSimulatorTeam/AntaREST/commit/eff4ca369212e9998f9ccd96a938a6f91f5dbf44)) +* **ui-maps:** empty page (#1243) ([71f19d3](https://github.com/AntaresSimulatorTeam/AntaREST/commit/71f19d3484bb802f645140523a7b66f321a2aec2)) +* **api-workers:** Prevent scanning of the default workspace (#1244) ([06fd2bc](https://github.com/AntaresSimulatorTeam/AntaREST/commit/06fd2bca478fc4f579ba0760e37969038e560f97)) +* **ui-study:** remove the create command button (#1251) ([463e7a7](https://github.com/AntaresSimulatorTeam/AntaREST/commit/463e7a789eebd2b28c33bd18e833bbd30dc9268a)) +* **ui-wording:** correct wording of user messages (#1271) ([7f66c1a](https://github.com/AntaresSimulatorTeam/AntaREST/commit/7f66c1aa518bea09c2db52ae87ef36e14cd5b9e0)) +* **ui-wording:** correct french translations (#1273) ([f4f62f2](https://github.com/AntaresSimulatorTeam/AntaREST/commit/f4f62f252d8b5556ba1cb2b6027360b9066327e0)) + + +### Features + +* **ui-common:** add doc link on subsections (#1241) ([1331232](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1331232e418ebfbf3cc1a82725b95cb11cf8b9bc)) +* **api-websocket:** Better handle the events in eventbus braodcasting (#1240) ([99f2590](https://github.com/AntaresSimulatorTeam/AntaREST/commit/99f25906559f782bcad857650f1b8ebfcfe584c8)) +* **ui-commands:** add confirm dialog on delete command (#1258) ([0be70f8](https://github.com/AntaresSimulatorTeam/AntaREST/commit/0be70f87ec03c491faf1d29c8d78b29615d1da9a)) +* **redux:** extend left menu by default (#1266) ([1c042af](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1c042af7d4c713bcbd530062cb9e31ead45e1517)) +* **ui-study:** add text ellipsis on study name (#1270) ([6938114](https://github.com/AntaresSimulatorTeam/AntaREST/commit/69381145ab1e4224e874a59dcec2297dae951b51)) +* **launcher:** integrate Antares Solver v8.5.0. (#1282) ([57bbd3d](https://github.com/AntaresSimulatorTeam/AntaREST/commit/57bbd3d0974b104dc4b58f0f1756e40f50b2189f)) +* **ui:** add tooltips to folded menu (#1279) ([b489dd9](https://github.com/AntaresSimulatorTeam/AntaREST/commit/b489dd9db8e5d5b3a8ab6a29721d292d3841dcce)) +* **github:** add feature request template (#1284) ([73aa920](https://github.com/AntaresSimulatorTeam/AntaREST/commit/73aa920fa15d5a3397d49e00319acf808678d021)) +* **github:** add bug report template (#1283) ([8e05370](https://github.com/AntaresSimulatorTeam/AntaREST/commit/8e05370c5b1ba212545515984eb379c7a7fe6f9d)) +* **ui-results:** add download button on results matrix (#1290) ([343df96](https://github.com/AntaresSimulatorTeam/AntaREST/commit/343df968fec3dc6658f1e41040bc656cd80a104c)) +* **ui-redux:** add menu state in local storage (#1297) ([3160f29](https://github.com/AntaresSimulatorTeam/AntaREST/commit/3160f295ffd06312f2a77ec0ea2dd7da0c04fbed)) +* **ui-study:** add path tooltip on study title (#1300) ([429d288](https://github.com/AntaresSimulatorTeam/AntaREST/commit/429d288ce5aa96c0c65724647b211639b4153417)) +* **ui-map:** add layers and districts French translations (#1292) ([12f4e92](https://github.com/AntaresSimulatorTeam/AntaREST/commit/12f4e9235d5cd2256a52d9e31ec440c0756272b4)) + + +### Code Refactoring + +* simplify the maintenance mode and service. ([1590f84](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1590f840dbec5ca4fcd1eba2c125de3e4f40ebef)) +* change the `MaintenanceMode` class to implement a conversion from/to `bool`. ([a5a5689](https://github.com/AntaresSimulatorTeam/AntaREST/commit/a5a568984c9562e3eba67ba30c0a076b8f30190e)) + + +### Build System + +* update version to 2.13.0 ([a44a896](https://github.com/AntaresSimulatorTeam/AntaREST/commit/a44a8964da226931b7a67b95765abc7baf031eb4)) +* remove redundant call to `mypy` in GitHub actions. ([96e2b82](https://github.com/AntaresSimulatorTeam/AntaREST/commit/96e2b824eb348d1a3fe5bacf89de35e9cb7fc0fa)) +* upgrade Black version in `requirements-dev.txt` and `.github/workflows/main.yml`. ([464c7ff](https://github.com/AntaresSimulatorTeam/AntaREST/commit/464c7ff1ea877646815a3c70891e36b976b856d8)) + + +### Styles + +* fix mypy error: Unused "type: ignore" comment. ([86f9076](https://github.com/AntaresSimulatorTeam/AntaREST/commit/86f90764591e7b863db236891e2aba926d4b1ab1)) +* Reformat the source code and unit tests in accordance with the rules of black v23.1.0 (new release). ([73bc5b0](https://github.com/AntaresSimulatorTeam/AntaREST/commit/73bc5b0f7f858f589d525f39228b0af4963dd4be)) + + +### Continuous Integration + +* remove Create Issue Branch app file (#1299) ([4e81fa6](https://github.com/AntaresSimulatorTeam/AntaREST/commit/4e81fa646552a58d56984171c644104d4dd79ab7)) + + +### Contributors + +
hdinia, skamril, laurent-laporte-pro, pl-buiquang From 130f196ef76416e399cd80ed4a7efc3ba2a7f802 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Thu, 2 Mar 2023 11:08:19 +0100 Subject: [PATCH 45/60] docs: reformat CHANGELOG.md --- docs/CHANGELOG.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index de548fef99..2663119a37 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -8,7 +8,7 @@ v2.13.0 (unreleased) * **ui-map:** prevent duplicate layers and districts on create/update (#1239) ([eff4ca3](https://github.com/AntaresSimulatorTeam/AntaREST/commit/eff4ca369212e9998f9ccd96a938a6f91f5dbf44)) * **ui-maps:** empty page (#1243) ([71f19d3](https://github.com/AntaresSimulatorTeam/AntaREST/commit/71f19d3484bb802f645140523a7b66f321a2aec2)) -* **api-workers:** Prevent scanning of the default workspace (#1244) ([06fd2bc](https://github.com/AntaresSimulatorTeam/AntaREST/commit/06fd2bca478fc4f579ba0760e37969038e560f97)) +* **api-workers:** prevent scanning of the default workspace (#1244) ([06fd2bc](https://github.com/AntaresSimulatorTeam/AntaREST/commit/06fd2bca478fc4f579ba0760e37969038e560f97)) * **ui-study:** remove the create command button (#1251) ([463e7a7](https://github.com/AntaresSimulatorTeam/AntaREST/commit/463e7a789eebd2b28c33bd18e833bbd30dc9268a)) * **ui-wording:** correct wording of user messages (#1271) ([7f66c1a](https://github.com/AntaresSimulatorTeam/AntaREST/commit/7f66c1aa518bea09c2db52ae87ef36e14cd5b9e0)) * **ui-wording:** correct french translations (#1273) ([f4f62f2](https://github.com/AntaresSimulatorTeam/AntaREST/commit/f4f62f252d8b5556ba1cb2b6027360b9066327e0)) @@ -17,7 +17,7 @@ v2.13.0 (unreleased) ### Features * **ui-common:** add doc link on subsections (#1241) ([1331232](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1331232e418ebfbf3cc1a82725b95cb11cf8b9bc)) -* **api-websocket:** Better handle the events in eventbus braodcasting (#1240) ([99f2590](https://github.com/AntaresSimulatorTeam/AntaREST/commit/99f25906559f782bcad857650f1b8ebfcfe584c8)) +* **api-websocket:** better handle the events in eventbus braodcasting (#1240) ([99f2590](https://github.com/AntaresSimulatorTeam/AntaREST/commit/99f25906559f782bcad857650f1b8ebfcfe584c8)) * **ui-commands:** add confirm dialog on delete command (#1258) ([0be70f8](https://github.com/AntaresSimulatorTeam/AntaREST/commit/0be70f87ec03c491faf1d29c8d78b29615d1da9a)) * **redux:** extend left menu by default (#1266) ([1c042af](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1c042af7d4c713bcbd530062cb9e31ead45e1517)) * **ui-study:** add text ellipsis on study name (#1270) ([6938114](https://github.com/AntaresSimulatorTeam/AntaREST/commit/69381145ab1e4224e874a59dcec2297dae951b51)) @@ -57,4 +57,7 @@ v2.13.0 (unreleased) ### Contributors -hdinia, skamril, laurent-laporte-pro, pl-buiquang +hdinia, +skamril, +laurent-laporte-pro, +pl-buiquang From 8bb02af0ca04c849dcc1ea3023bc24c8350b17f0 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Thu, 2 Mar 2023 19:05:22 +0100 Subject: [PATCH 46/60] fix: change extension of i18n config file and change prop value fix #1369 --- webapp/src/{i18n.ts => i18n.js} | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename webapp/src/{i18n.ts => i18n.js} (82%) diff --git a/webapp/src/i18n.ts b/webapp/src/i18n.js similarity index 82% rename from webapp/src/i18n.ts rename to webapp/src/i18n.js index 1b483de406..dd2da8e41c 100644 --- a/webapp/src/i18n.ts +++ b/webapp/src/i18n.js @@ -1,9 +1,10 @@ +// ! Keep .js extension, because the file is used in scripts/build-front.sh import i18n from "i18next"; import Backend from "i18next-xhr-backend"; import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; -export default function i18nInit(version = "unknown"): void { +export default function i18nInit(version = "unknown") { i18n // load translation using xhr -> see /public/locales // learn more: https://github.com/i18next/i18next-xhr-backend @@ -18,7 +19,7 @@ export default function i18nInit(version = "unknown"): void { .init({ fallbackLng: "en", backend: { - loadPath: () => `/locales/{{lng}}/{{ns}}.json?v=${version}`, + loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`, }, react: { useSuspense: false, From fb06566128143fbff8aa4c6d32d76c8df4c78b6b Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Thu, 2 Mar 2023 18:56:18 +0100 Subject: [PATCH 47/60] style: reindent the Bash script and fix potential issues with variable expansions --- scripts/build-front.sh | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/scripts/build-front.sh b/scripts/build-front.sh index 5207edb1d1..110ff5d971 100755 --- a/scripts/build-front.sh +++ b/scripts/build-front.sh @@ -2,26 +2,28 @@ set -e -CURDIR=$(cd `dirname $0` && pwd) +CURR_DIR=$(cd "$(dirname "$0")" && pwd) -cd $CURDIR/../webapp +cd "$CURR_DIR"/../webapp +# shellcheck disable=SC2016 if [[ "$OSTYPE" == "darwin"* ]]; then -sed -i '' 's|"homepage".*|"homepage": "/static",|g' package.json -sed -i '' 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js + sed -i '' 's|"homepage".*|"homepage": "/static",|g' package.json + sed -i '' 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js else -sed -i 's|"homepage".*|"homepage": "/static",|g' package.json -sed -i 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js + sed -i 's|"homepage".*|"homepage": "/static",|g' package.json + sed -i 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js fi ./node_modules/.bin/cross-env GENERATE_SOURCEMAP=false DISABLE_ESLINT_PLUGIN=true npm run build +# shellcheck disable=SC2016 if [[ "$OSTYPE" == "darwin"* ]]; then -sed -i '' 's|"homepage".*|"homepage": "/",|g' package.json -sed -i '' 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js + sed -i '' 's|"homepage".*|"homepage": "/",|g' package.json + sed -i '' 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js else -sed -i 's|"homepage".*|"homepage": "/",|g' package.json -sed -i 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js + sed -i 's|"homepage".*|"homepage": "/",|g' package.json + sed -i 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js fi cd .. From 9742be102fbfebf9dae3387210c1ec50421de538 Mon Sep 17 00:00:00 2001 From: hatim dinia Date: Fri, 3 Mar 2023 10:40:36 +0100 Subject: [PATCH 48/60] fix(api): replace StrictInt with int to fix validation error fix #1354 --- antarest/study/business/thermal_management.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/antarest/study/business/thermal_management.py b/antarest/study/business/thermal_management.py index 8dc5eca1b1..716acde83a 100644 --- a/antarest/study/business/thermal_management.py +++ b/antarest/study/business/thermal_management.py @@ -2,7 +2,7 @@ from pathlib import PurePosixPath from typing import Optional, Dict, Any, List -from pydantic import StrictStr, StrictInt, StrictBool +from pydantic import StrictStr, StrictBool from antarest.study.business.utils import ( FormFieldsBaseModel, @@ -33,25 +33,25 @@ class LawOption(str, Enum): class ThermalFormFields(FormFieldsBaseModel): group: Optional[StrictStr] name: Optional[StrictStr] - unit_count: Optional[StrictInt] + unit_count: Optional[int] enabled: Optional[StrictBool] - nominal_capacity: Optional[StrictInt] + nominal_capacity: Optional[int] gen_ts: Optional[TimeSeriesGenerationOption] - min_stable_power: Optional[StrictInt] - min_up_time: Optional[StrictInt] - min_down_time: Optional[StrictInt] + min_stable_power: Optional[int] + min_up_time: Optional[int] + min_down_time: Optional[int] must_run: Optional[StrictBool] - spinning: Optional[StrictInt] - co2: Optional[StrictInt] - volatility_forced: Optional[StrictInt] - volatility_planned: Optional[StrictInt] + spinning: Optional[int] + co2: Optional[int] + volatility_forced: Optional[int] + volatility_planned: Optional[int] law_forced: Optional[LawOption] law_planned: Optional[LawOption] - marginal_cost: Optional[StrictInt] - spread_cost: Optional[StrictInt] - fixed_cost: Optional[StrictInt] - startup_cost: Optional[StrictInt] - market_bid_cost: Optional[StrictInt] + marginal_cost: Optional[int] + spread_cost: Optional[int] + fixed_cost: Optional[int] + startup_cost: Optional[int] + market_bid_cost: Optional[int] FIELDS_INFO: Dict[str, FieldInfo] = { From fb9e4ce5d1014077cd694c047f9a0fb6b649f371 Mon Sep 17 00:00:00 2001 From: MartinBelthle <102529366+MartinBelthle@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:50:06 +0100 Subject: [PATCH 49/60] feat(storage): add missing folders in empty_study_850.zip (#1363) Co-authored-by: Laurent LAPORTE --- resources/empty_study_613.zip | Bin 131637 -> 131485 bytes resources/empty_study_700.zip | Bin 62679 -> 62527 bytes resources/empty_study_710.zip | Bin 62699 -> 62547 bytes resources/empty_study_720.zip | Bin 63993 -> 63573 bytes resources/empty_study_803.zip | Bin 62766 -> 62614 bytes resources/empty_study_810.zip | Bin 62164 -> 62028 bytes resources/empty_study_820.zip | Bin 64070 -> 63650 bytes resources/empty_study_830.zip | Bin 63805 -> 61031 bytes resources/empty_study_840.zip | Bin 63856 -> 61082 bytes resources/empty_study_850.zip | Bin 61129 -> 64087 bytes resources/templates/empty_study_840.zip | Bin 62772 -> 0 bytes tests/test_resources.py | 87 ++++++++++++++++++++++++ 12 files changed, 87 insertions(+) delete mode 100644 resources/templates/empty_study_840.zip create mode 100644 tests/test_resources.py diff --git a/resources/empty_study_613.zip b/resources/empty_study_613.zip index 23e0f5913c178466d6524572b178778c01eff92e..94c97776cfab45913004174eb7b31ce7c025b849 100644 GIT binary patch delta 119 zcmdnm!ZEj*W5X=o<_EmnAMi4M{xH4ZKO-M|11|$ZPJa6I_x~7OnD+BdZ}`vX$@GtR z`sx3SzRZq%43j_diA>dJa$@cSv*o8wW^!OU{(9H3UJiHv>ICo(d{GWJY= X&&XuKXTV^2@!0e^{}{cPSox;E_{ZqUU5?=#w$~QGQ~1pnjX%`WWi_1V94-KfPq2r JBO?O?0{}ejJMsVk diff --git a/resources/empty_study_700.zip b/resources/empty_study_700.zip index 483bbcb1dba34c09bde2b3db77f1db2dd9513efb..897f88f746a7cb91b2f9ce4e894b9b1b5cd6458e 100644 GIT binary patch delta 117 zcmV-*0E++D=>xy$1F)D4v)&Dt003-nXOoffLwSjFXYR{Sj{5At7&m$L=UB#)$v;0^@EI}~GW-)@U^x7k0SEwmH9jB! diff --git a/resources/empty_study_710.zip b/resources/empty_study_710.zip index 6ee11415f433984103a7f0f73e476843be7758dc..49cccf83617bbaa87880754db91964769ba4104c 100644 GIT binary patch delta 127 zcmaF;lKJur<_$A=H{au3{dn^2k9>@ElV5%G;@Hc}z))J8S~U6NM^gb#1_=fT5MX%g z_=k6L<0oH6`^o1&MKJaNNwLXxpS>9aCwG00Vq8D@>E}ddi3bdms~<>DW_zJD`M@)Q c$^Gy67@a0B{bIpqz+k|zMu34~;$x730PNf}J^%m! delta 147 zcmccog8B7J<_$A=`FI#)81hR?3Q9}#a}x_DEAm-vp255N@nqkZeEfC13`latlleY6 zvmF77<>XKP_|bfF-$yYuK6)}a@lAgD(U-Ax@`O)flYKuqF0g-3qC^zLxz6>3=G#FGXMbqC`LN< diff --git a/resources/empty_study_720.zip b/resources/empty_study_720.zip index 8f13baedef8f500be1ecb195bf662d620ff8aa61..e22fad96f0300238c2492ea929c081e4c88dc053 100644 GIT binary patch delta 1017 zcmY*YZD>>3J@N2YI><^W=tnEZ$ zT`hD!#>Tez4ECjEL1lx12pRtJqJUT2j@V6N-CRzw`VWn)rpC%i=R=h=dvde1{p-TK@I$Xfdr|NJ=Di3!ku%x|u zi0kIBNF$SWqRY~uYao;{MU$4`|2lb|Zh47E#WL#&+SEDY#Lw1!Mq`!AN&bc>T2$ac zv)W&1_tc=@w-Gnh9z&(eb{th&KwCQbxl6%HJCF8hZJf^T!nD1yfE{`m^zf1Brs9uA z-g4`k15a-+M`Y}co?^o4@%O2Vfdyyu%kg!>F!BCGU7>}8kHqP2l*Z1O4bu@`bmDQW z7k!fzIPv^f+UkgR(R?iK5#x-(&VBej=|VED@$c|5-a?o^;o%b$yU?H5FLp`{5vdNL zsR~q2YGRo3q_i2M^InmoI4m64DOMTy6yYsGulXsL@nO;}hAB^q22!aJIf^4D2dvXx z(os?#(PGjo0UedDnQ$i6$&2wSwTJJ;uJmqx78ldav^10UNI5e~GC>~1K&Df=V!>!; zA6L*c^$FjFU#9km$TEf%a)TjUlyZwK<)6w1wFt@#FAb~$Wiy(%N_newow0WRjGK4{ zXAX)%D={dWjiZFf>n&MDx@X1qY!|P_h3o=(yJvcPV@Yh%~ z+}Ro_HwyoPpGXE4JYwq@NsKoxbtK~%W1shS_n>`pH5wP);@&fccVo4>3QkczG{NvF VwzjOT)ojt(>*=d~hcsh)_8OGiYhVBX delta 1371 zcmZvbTTC2f6vw~I?9N_i7lj~&B4ZFSs>VwusH!R&&X{A6*O~XS2 z+VFs;5&zmIY7DRO92ws}TDt;HHSEPPy25k!+kI4#%bD}C6n zsIWUK^Pn#&dr5k_Cf->};1WhqUnH)0d7jQ{ZCkDzvQ$ToTU+yW7TaCCO1z!$W5gE7 zL$0*%A!P8<^pOXsbhS~sEb_6vHy>H$ysLC27Spx(RNRNnvkGoHYx2;It^h*c2y! z6`0r7=L1(kO)}NmWsP zWJ;Gu%}kTY-j~p%$HH(~S!=S5S}hdUShBTlO>6v1xc}ZEXDK^kX~^+|X+0L_UWy-5voY1-Kj68UmnF9`oKcPHhHt~)3zYHL zZu{d`(35BpwRT)itRqQ*y%@fvgZH2@85Z1ulgVA;MF&JG#J@l|)yi++Txy5d>V%$t zls+J@{6qAn_lx^oNT!3L!-c?X-Gl#)-O{u&R=_H#Q`vQ@@05#Si)*#9!y?NaZ*FdR z!p+zl9j{?z`Z4+wGj80{wueU4!6;bWNmo=<*q&u0h5z{zJnM=@@k ptnnq0S?U49wNNMY@J;7DT4VDAH(F8eDagOd~#r( weve^t-aU!Q{+}HfzfYdcfH z@$eOs66h3@weUIu^bM2o@N5AelV0&{0c?}Z@n!*^lQZ&O2q)hF0CjU^a+4A0CzHVP T1`aR)FaYcl002tg000005xFj6 delta 145 zcmX@}g!#%-<_$8O{5%W{4Ed!c1*IkWxrqhEn;AKeKb>6gl#h>z6Io*N!*_C%c^|1v zKJku^QD^e?cTtSNla1b|F;1U6^L-}MTi(e6e4>*jKlm}p@d24~liPtz&wG=t@5xR6 o`oWKJ+GLlHX^bZ)ul^Xv7&w{hlL?<8gCT>LFatx$eV_{%07_&xcmMzZ diff --git a/resources/empty_study_820.zip b/resources/empty_study_820.zip index 1fd8241e8b36c76cff061165736abcaebfdceb82..f5519dfa175d7ccb503c1471e9d3802ff0f5dc39 100644 GIT binary patch delta 1088 zcmZ8gYiv_x82&D&r(G|Hj&>Hvs%_1Z4H*mu1VlH5@dGNCFcz7xZUekwbR9CI{2&Z3 zf96cKM>NC;=x>C@68NDm@&^+y$&5fuW*~;FbgWBHx3l$BW8!;G>5QC{@8tWQ_j#Z9 z_MPj7{4y^CyW>&`GR9nN`GNS}-}iic`Or|{Gf3}}pDqzabKq5E^s^3AyGW>*um1m6vUtGmKgq;Z?mEqhnJmytXUpZec`>d$w#G`7-XWZq*JNY{JD-`Gz&n*N?j8C12VVnCU zQjg*EOydKFf*wyS)#O=Pj?&{z*a?go3dQkY+9-5d$_~y83qd>d|lX(O8e{O|Jpck@a`{FSQ{)g%c_4g zxRFX9HA6UM1~6~drQ%icS0vKUhb(=Zi0`c#T-??{Q|Y1QV-Z{`uEbyIQak$ZttR)> zz2p1>R%TkI&KSac6_UCO-(({EN&Jy%CPwvSlz)V#$!&6Df~m zqg3hSEO+`)Ibfayyo7dv%>^{-!L8b8&x$ZQg z;+hA&#_N0&?iih7z>8<*R@an&8~d8jfLdr(vIu=k&*lCxFTwELXqv$R^9(1Ty-VOAwSj<=#nHc*QK+Szi delta 1547 zcmZWoZA@EL7(VBoe%#*PUb?p03<~MRVc5z7IH_N$W3XssF~Twh0$ltF+Uu%0NJ zGTK0)|4aYv|CHe!BBQcEstH>4!OOcSAxYfD7vG8x ziC!%kV3>?|ZcWvA7$Kh-x8sV*D77EQWQ@Ij=f?+7mL0eH#1nR(w(-3Ex!dT#|9iho zZxiximZF0W)g_GPQw#4dUPesS1>1|SBGo|Nd~dXd5gI*EzuufBiY5d z4A8OKE}b&u2UFWO(0x*!PF>mxo2wGN0byxXO-auEz}K^=|ql^sl!wDiRnsH{=_kO4f#z1#{DuTXezZ zvDPjsC`F(ZA{HI2{4EF`eDA*Qvpu09m|WY7f~vDJ3t9-I#7B_81y{2YV-kU&rCNKL zdq#rIY=in%o@GfIlQ46|f029r=~C0Sh-@DE1pz}n!^8eSZ=v1!dopvC5I87#m7Jk~ z3nk8rIf0w7f|zT<^9wnd$qoX0>^{uaKJK~${>Uj0a?8GbbQuTu?!Uo0?Vq0-C5FQVWdT0%$d%$&24Tir*0PxJ7+7h_vZh9p7-~>&-*^SuV%Pdkh?Ph zGdt^dQYFjEsK{3$!ac?inemOUE^0xP(Io7HYLGD~oGa!u@4qD0u*D!Q)%y1vtSsDu z3}4y(zXXQM1VFCFq`U%Lb|vb|`+8rR{acKx;J;CE{+$l`8@~rxj3i~KtfJH~rDePF zq9@3pf1;CBz=yol$6^hw#V0B_=7^V64ws`A3`CsNRy5uKT<3!#1(qR!<6vQ1dj`elVlR`QIqWg>XIGQ zDWErbn(pdiLASIF_NZe?!?b`e)9tvOQfQrs{?rL-6S0`;qK6`e4OIvyO0+#9!;$Cd ztB4P2FUb8%0d*+w|DSwv?QKCRaMvnWV|uS{!U0NfBHJGQ1lMaa%Um)jGDiX6vP`v`tM~ zWFWdu5bYn0&yQ*SAuHk^Q96Qym033^XhrOAw|uo}m$qxnm{<@N^qhRBH*n6$dEWPV z-t(UKJ*kNB(^KKIMCi5^*YrlCFQEB?ZZ_f%zB#lLqX6mPFdlV4Pa49@d^1nCoOX`m zhR4PyC)`6<2LgWg760g{f2=TtZaElPO&-dPSmqtzh3{by71wU(@qji?ISLczL^~FQ z*3ezME-#VW$q3zzN=bFZ?;CKlp`eA6;uzz0+Nw>esl#*Pt2{H~?U<9S`bx$3B?Zsv zT3O&y&_Ch}pigQIAJ(~eo3+F_F{A}XeIxF|%*1>3H|rMz#vW=@`fQleTPoPw(ICHI zE=T|F@Yn$Q^)2X<8$BL;=8H^f^NJl-^IMB)S2j>e{zDQc+@u@q*7*PR@kCb z=m%F=HrORfK%5-*Zd<~N`TFndc=QlrLr|NT7#Ws&sJe)R=wBwXDjKVnJX!dYZge{A-0N=H+kT zLadL!k2|p;eg|#w0kTiP5^>?%_?hiuu+FXHv6gC_q)V-D#|H45ApGNuv^dV~3Vy=}zv zo99}qFJ#78lx5xM&b4GwaC*yZ{FUPQo-D_)ZfeY`=@Q_s!bL1>wh&tl5}Q8#do|SC zKL~#9C@35Gx&|{_hl{nMWYtA#P;T#>T|7tsR~g9TRNje>bQ7y!#ZZyDd#c@pzqig4 z)r3yN9%zrfgjuM44=|@%U%!5dM4ALiWbcpVr9P7=B6j$$!Q;ZZfC^a5L$|!nUzVqIJk| PN9peXednK1nB)EjJEBXE diff --git a/resources/empty_study_840.zip b/resources/empty_study_840.zip index c9e017d096146016eebd444d525e33d028ac347e..6954ff5841715c14cbdb98d279304897fdbfccf8 100644 GIT binary patch delta 672 zcmYjOT}V@57(VAc|EIZ*m5N85jl2kWZCaIx;KTNhvh$Wd9MMltF5L6Ep z31LNeCkY4YM#3(mkzEvpKQ*_eZtC3pn_gJ$91;93-tT#y@AdHIsdT>ljJFa(WV zH9VBZWvKhM&CC+P6d%<-$4WvWgEvz|u0<=o3p=i^Qa3Mvd%X(JH7IRG#fP zFs2Cjo08D4>Ikd*;oLLyXhbtk*s2BNeRg-yG#Z`1Hd(l4RD22PG|3p zTd@YqJdiYR5A$e_cTkAONW7i01QgA;(`f;B=3B@oz`c+IIbNDcR6{`&{GL%FqzTE!pYaIC?ky6dT9n#szvXfwIlx Qb{FGfzU^a};R&v=6O3$|JB<#jvMxk zj)fdUr`!R*^}E~-_EPqFS?y!k#LD4fvRYfjicG7I^32ZLFs-pD<~-nO zjf7gEiB+iy`n|3IPH37U2ZaXSYANj#8uA22TwX_UWxMrgFILV54Ba%Q^jI;Wt=WOz z472WGal71ihJ9|lrESCkT~+wH*(lOXuj`a25Oma%{;|MGPvo%p(JjW7a#EX1?$QUN9a*^Z z7mu4u0-Om6eQB{KN}&qpyxsF4q}3ZR>Bb z76nY&%PG;)cuwXB4cLd_Bc&B<)(bR`bNA@^hUm#Fb$4MCY}* zz1p3h2~MZb$ScE9&7kRKGLhh)Y>44=rAK#VPAKWln&l?52@4R*Y%zU zEM>%+yH$7(a_IVs))K`Ei4i%5XTwF_H{$F@H@RTM>c&B3Fr=J3Yb5P+nSaB}fOFApjm+gc_M`l0zm&{Z|B6%f_3!5G?9*1!EbzO6U f4fcWvp+z6 zQ9`P*n&{>vMC*eM!9*TNY%nJ9fFbGwz8ECN#Ds_P(`})sMAOIv>bZC3&fGgY+iBX} znYrgX=Y03v^PS$fE&uwrTs<-@D*=gI6JxPLb)DaRt0KPqpdwzx-@@BLIHm*&$F}*% zt^R1p2igB(^!v@%ePQD}JXdjrTl6e6x_Y^VyS&83TVpXOxLW*e=z{^mx2|D+AGxL-HwvJs{U_%_cHhA{(VfEu0HXgSu~@ z)Yrw*lauL`zV1)V>mU3jpSW&-go*1$$tSz&q$WvAP33dZiRpMI9X0G@>XaJOa?=(N z0Wp9M5M#_&01DZF)MPRpQ*#;%hUbL^T{#|uI;GivP)rE-WiQ8fD_m3dh^!F9Gu}{r zGOfm=JT*2XN=;}yR(LrS%BGWQM$c!g#Gk$`bM899@0?r%kKL`JZ-m1g3BkPEBkYO| zl)CQ1wF%D-|NDZ&R=DbEvp^qshI`w`%dwf8NMt6}WHgq{XLE^+Q3CG>fWbbpBONx3 zpt&OqV=9xF!ab%%G~|Rr9VA;FF zB7)RA0XXBW6PUGuQD#*<(YUEeEp@`6WbJ3`;9-IF5K7*(6=|(W$)uKzbskR`C#6CR zm)c^_5Xi7>GYO>OBs-0ysjvf&eo0e-312`+^`fuEO7oWQjrK2RQ~}(LfhE(&ja2+b z%qMAwFw$NSf(dq!6t=%x zN>m={*OUHBAZnYuGNXdF*zA7~pR-O5=N21WT|@BA;?c^JJu5FH5cPE7k8RL>r@4E59>l@<``va6(yD4;%Tg1M+X$DI!;o8w+Py1OL57zjZMBLd zbb9_M^NM0*tjI)Ch~c=+u$;s&!ihU_J|p7t*|!cbp(l#h62l+>(PEA3q8pws*4yd#!$z?Kk?uMMi(c-SY((aO6owU+|%#=WuQ%)1mNjfdSA4&ju25oHUZGi|Osm!e#SbC?lR9tU+ydWA8(8`q6 z4H6W*)(}Ivy|heAQ(nNAi{9NO{0^Y2b!u~el@I_QxI-L@jLJ-F^8?eaj7T%?4mzo{ z#oaF^PI=8Xp`1k9f@<-zRLV;@{VpD_ZY2=3hn#-ouuZAcSw82@{>x$`{l22H2uyXNdgoSH(Gf`JhsiAITqB}0df<|f-jjiTsNVPDpR z9})^Bi9YnD{FHtQ{E|_yFNL7QgnY&6eA%=hy4~$|=iL=!JNAE`=lA@c-~adA_dWd6 zA`Whf^|K5$T^Q+_uZ(mBxF@vgvi!{_iL9zfSL~eopAO?Dqkpo5IK>EO{y+y2i}CTA zqz|fO$i^CE*`-j6o8Tpu&UaEG!{ZbhcCbuEK{ZjUpa5g|8L4klY9rL+M!2gtDPg$* zjPN3vft-+0jlv{XsZjj4Nwe4Ow0W%8ucaYFY%m#39`6cH!UaQy8gC4z;hCXCg$dn+ zS;>r-65bLgr0fNvDLw}YbtI{*h|fYoXR01@b~WdrVQ}}jgeWTWgfbDbYZZFWQAJYb z9(4<^c+>_9Y55ezseO$5#-8G(Lm6#JWKZ3s-AP1YJY_1t)aep2NH@8NMb1Jp%hV^L zQ$J0Xfd9Y<@0K&mL=(+(8V?Mmq9k2i&#Z(0Df#@7Y-lh(49@J(zjZTn7h!+7UH9PE z#1gcw)bVh!Di~dP3PW2)s9eqEEp!SxLp1hA2kuarx(TOVVU=EN@~^cJ zMdF6Q@97boGibJA@h@C(#GuhP}xW1 z<(JJL$*}KFVT+ z41A52%4-Cha(9J|GjR4GPg+*7*Zl()3p4Qi;7A=mkFbIhhZzMOL4+FZ-a9^bf4Rfu x;9r*Vg^sf*y2LJV1NsKKhs$j)pUq?Us!|oZ-_oS#tbkBH_gPFu=o<%s&|gOx(_H`n diff --git a/resources/templates/empty_study_840.zip b/resources/templates/empty_study_840.zip deleted file mode 100644 index fec7f7a7a42bff9aa2357cc8d4560be02b2de3bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62772 zcmbrk2UwHa(mxsqBp{(l3mv3)BE3hdbP$v(9RcZtD!unAg7hK?DoPWO9(r$zG!c+q zLY0odjc0#nyN~<-?Q`${=6M!*ftgt|vwkyc*1Stg6^KO&`1w(@55NDfhyVEjLVw#i zxp=tqY5lJ>U^I<`xsSCQ;va~xe-b&{{1XW-ngn6(?r!Jwk7Pe3c_6Ia{+tZwUs?yA z7c5$%|K*Jyc<3Q-jj(rjcHy;ivSS%&y8(w21$}EgAh^J4>{sY-6A)GTm}&iZs6TFT z8$Th?KhW7H9O|F_JXx0N0ODU5M66~Bl}{q~1iOe65~B2n&uSkBLf4!qmeQ_Cc+ zH;&*Msc!8L=|8G2Bz^pBZqHe8A*Mc%X=C`{rM!+a;U%3t-9CCHPknzt);@PqRtI+ zd-LpL3{uxEz|KUOI3*^f(>*C6A+kax}Tq)iRZ6?aIizT^SXPx1OEikA3W*Pcu7WRTDSiL4?1lienz^~KqY<< zKSX|PPR9yEF+blNLq*>87HiBh5tr+Y+8+G(yI0#pxVCWtqqsH3yZn(Wa^m(Jenwui zq-o#eRN_hEeD_YTb!cC9NE$Qd;J!Xk(<5J6je@c{N1OaY^zWYG{?mZ}15W=BfBLti zzq^9(|C^+r7XR|n-$RY!PjP=lg1Li(v!%Jao%3Iz_PaGCzcE=lJ39U&!>{%JW0v2e z?swq-K7osywab5m>3?HD2Y}sQ0^kofTEs2fwneL+jUHsbneZ=-emcu~;Lgv)D?jG1 z@eOZTz5tKq!3<-Sm2P9Vls~O){^&|x5BF%hv{J~SkH+rx%>P>SW*2iod0cke&_oicmL+~KX$Dqo(&gj^gKT^@2%hF`yU2NXE!%% zhkt?Sr$=KoG>24qR0gA0`iC@??^oQvJ2=3lKKN}B^Uvu0d)guTQ}n-b2AN|76fAIa^VCZ)z{mO0s-nuLuJP_{xT!j8g4F6{O&4jBIDn){QLXgdEt+g)tLOG<)?>!?jL_Q=U?0Aze0?6h)aWq6CGvBKSQlt zZJ3WYdSx+&m$!GYPg#Ks>o1Y^yO(|~^uIRkzghcV=>My!zasfx^8ZU^@GH{(s?Bdo z{T)TWBJHni|2H7|eXsjj|NPI%<+lUOA6ldY%LoagY2?v^_;=cWt2RgW-md)ydZB_9THLO#R@91H|+B4y#hDTN<(|FT-YtMfCC|2zPp z3q5BKH_N|lbbklu&*lA-;m?PEqwMeWKf(Mb8N$xdH3B}gM3j9 z#f0Sb8C76ONlWb_wZDC@@{|HDj=LCHw;k?U`N=kh#x&~@YdO?6ASr=bp5NtdSWLZ7 z?9#if!gsrB1<7Bcnj##S# z*blL7&Z0wyP#f&FIyRGAk zgFUnRw0GRm=m8)u0MHE{rZ6kbzO}<=uP^XznkQ2LEhTATt;RfN_J3pe*gKT zcx63-)gZU((#CV4{ZQNc!yJ);vFV8e!ma;y`yW2ke6ObB1Oxyc;s5~9zq%b==v%v) zJ6M^!oBu?RziwaJtT3eMJJ%sFdo5Zj!M_)#H1C!*362S4e)J(jwNA)1?^exWp{vGM zSqug(_5}}SCGF=V)h5~}dM9;@pw2|f;UF(SAHi#USA4qezWqt z?IL5Il5D28=-Aod-f&xzqD%7iq9}w5`42xI1%fqq^C>rmLKeU@Y3VQ;4OS&j&d!YJB>8hQ}=n^ z2NZt3MBv*^RP!6f=SfT5@-0xZeRCW&o9c&k(m>6e>h)+&*{XadJVjIO%R*M6*#V1) zQ6?jqO2cuwC1XT^Vnu+mJ8f>1+sCzVU>K;Pa6XGp^L|#_C?8!o^;Y)l2B@uD-)8DU zdohmeW|NC;6KTYYW!Y%T?K$sUpd*0&*-Q3C{gg1~b!R?@(3dx#F>ZV!?oW}Ep30ij z+M|e}m)I-xrbRKuJR~BidG&SLo+U$($MSRg8BuzOCqdOEK282(hk0kM^ZSt&ax>E{ zN_*bP_448iUHHr?isjzzOFajAM%9E}RX4p~D!2JdteHHyV@ZJ|3nP;Ctn5ENR)6^*7@s ziQS1$xyJ*glAUUQF_}y){`6Iova{~wFpGU-7aJ$>B$$oG`-SyaY{ud`4?S0P3)pyH zh+UBoKp^EggK6R+!@Wo9cl`LDU9lbu7v3Fjvv2N+E{;xpUGPR_)5z}TbBYM*O{2tS z@&zJUhW#}CJ4Q`uFRNM7cR5|Uj@jD?UEp7+A1QBG7#Mxx^k~WLYjF77^?W750%<11 z3Nrux67@`S@qsApouzvbye;m z4s9IHA!Qy79`p|UPbDtxU&Z}O<-eZ(Qxm%xM@Eb>03huU<3Ba|#qdW5$Fe)YodnTC)J+(VReJhxWHpL|mNcX&tT2&Ge4_ zMHf*|&+&Qc{VnjG{m#z#{E)AkD9Mmm_SydUd~=+xsA{v=GWbe5rTv>RKtJ=gk zlWZGu%nehzNH_c{l{#H9glfrdtaN$H=Ha-56>Q&;Q7%<6euK9Eaa6*JPz$w0R492{ zO~81~SsSPAw7d|h$X)y)`hEr64k4|GR^b^Mo4D6uL!wnvncL9q#lcH@NDDv&=u39cg%4PYk%UR z-7PBR&M+T3*{Ajs17cx+wXF68EvK!KKj;8xaK@D$s)XDon^|x7Z_FYU33#G>QydEe#gN@f@Evab@GVmN^d}_4IAKX`DuPPTl^Q}x|Y?;9R zIy0VP+$b$e68@to=7-Un{P<+hsYzD8-NSm@4XFP?&Qm4o1s~eICUtFV2RUvzOFu_0 zcV{CbH%Gfvg0!62msh0`V2Yug66JSN*m)6K}8YNWCE3&8RD*ZiHC?eQATV~@^Bs)Y-S zI1fv;mhZLLKisc*J9bHX zDzSTZ2W1F7ooQ4;IF2fR@Kh&pFQ}l*tqVuiY>zHU(RRLD!v9c<-*U`*Jrh4(<5l}! zk#J##vu|>7OtH}1?CevvjpeNM6y-VFqD_KCtw>hkIf7^^`%I3#vD%6mTx@ZX3`?t$ z83;utxQuSvy)FfON%1h>>?C)5Uaa77V}Ss5V*%_iP>ZeD*@7~(QgIlZBaKy`dhh{n z=xgi}{d87n;YNMr#1MWhSBI(hj*z!gg=P5dHDU4`Y82CJW#^!Z_`|iKZMx~mOo_DI zFV#*vYQgp2Lk$LLxy0)z19yOjvr`kaeRf#2A8EgAY}yh&-ob_-LNAL}9}wqCWOvP; zQeu9Aj1Xr~%MfBBLTRU%MMb7iEYj_W^5^JB3bJ9d=f1gnvl0}UNo(moPSlTg$Z9($ zLh}mNG>!{?#23|5_`WKjl+ulECZa8v%CkzCWW2h2JnLz-^XUz3g=uLPwV%eS=zjfE zf8DXLV@?Z1$iqmVZz7j7AA~ulS~heLCDDV;YA!ph>&C$^MrREmh)*qvbPF<16(8pp zW;ECew5%B|#j~5v$mR4lKYq=4Tt36@6jj?<-$ou%4s1m0c&c_a%eaW(JDz~Aj5Ty7 zrqox;7?T$%UD2PqxsB*>)QiYx7IZNkjV8}F)N4i$;}=6{mZip2pbC zEMMOcn4!SepeCC~n)p|hI9W|J4PTtL={*k;ss~{j)k@qh4bMGu{5K*3G9u^}08YZ21_$ipx*g@EoqjoV=3$POmTo=971nUfYFuds7YIta{d8XAe+74h~rq_Gf&&K z!iZ9rm)IFuS4|Ipumo{H# zshMiDo$}L0F9-5o_neqBhz!ymJQa`bF>^v1nj{hX>=vN9Wf7+Aj}Gb9dNWV;sVYF%ffusWeF$fYT#sWU0(an!GhW}5}dZmhE#joZJ*B?js&Khm4MnEsU zqNIFad^%;d0cpg}Z_VTvi;t3D+8Tcm_s!;)CH!JYy(qI$&qpqnECl&+P1Z*4y^|)3 zxMmftgEw(;n1meNm=Y8>iCK@&tK1oXVlTPd$bI;+r$vL%a*nv1eouQTc8lW!-a4pHKwEdWd!f6Z5CUD?66A)&^>w@zvIDGHNh6Y(Ha)Ft zWH9{wtw-#ZO}H_1`2(h^xCuIMa#)7(~8rA@o7u)YPN7c1zuJwHkZlwDRYDT<{Iny+-H+bDGHjK zYmcHnFPw#(iF64Su6EZN+wRaF45^pvgs-L%^W|{ZcAw;p&%Pzgr3NJ!2;&a(kXDzG zC#FANbLz>vh^9d-X~$niNeuD`m{?@`QVX5PNs5$pZOn$!gqF$e&t7$Ub>U^=rdJ)l)~FLPnERKAo^Z#4d7y+ z{=6Iw!Inc*Bx4W29;4S4`2=u4WA7S=Q%_KJ75<#Vn8Yz^w7n9qhJZKcg`A&Q=fHvv zqX{^#C1Y)#Ap-0A28?^kH_DQ+1#l60`J?`|Rjignr2c%+UY?jDakHphl1N(>6XP^k zU?5j^KsursW$#lZH(YR6>)4>mO2mv!qPA7v^X6I*Pv^cORjsn(Z7b(c>sHkPIv&mo ztw+=8RmuLGED~jS@MDjde!7w*)Hv1c=C+3pPbm>WlGCO)`lU7LrZ0;JS`;^`sAC6m zJGp&@SR}-8uGp);snXcseGSFA@!d$_EX3bRCaBV?M97dSmaJPnQ+Xo*Vus?>l=`cm}W z@1}JgM>#4Yu4?kk)5ofgIL#mX*%zce(W@%9v8u!e@}9gb7m$@+f-U8Ys*(W~i9S2D z2o7EenRm$y7yTTYrvk6eF>|i1sDf#AmDPoPQppXeUn;GznB(V}70OR zeLy9(YSOBIR$oq&ii^#o7J7BiPnE=^cJyMC7jwVNqKeNZr5V>Cu`kuX%&&^?;GSjK z2D>b5)lNkpx=nWViTYt2c=^5}~Nia*33Qd!O*P^s^3b({>=Izq!q67n}RQA}uFj zCBs^8Wq|HG9^z{%ole8T+LYc?pGy_19$~sK4GMD}N4UKtu~NII2ByM&N#nSSK0G%fD8+k7 zC|Sx$S9eFt^Ufe}griSM^X@T;u5;RT3oA1!)|bEu0OlA9mWxb!s(& z{m3+rx1&AI6F1AlCu`C|&N%J1^i+=hx~w8+TP4ppuO}88MxZ6Hf>0hlcuBOIdm(wa zN7@T7LK1-lSmT`L@VA1N*^I9YFrA;)ps1f)M;hM#($sa&)D@+<`|`oAADK)1R<$%B zVXyzyqf@a;h461_Q}p^bop6%`$SW3@d(-a zDCP2H5K8O2CDTO%zk1~eIJc$g?Dc&e{IEr1=u`1m1$!n`vgPQCf{VBD?p#Q~oMxE| zT(yTP+P^g(QKrm8D=MosaQ#eg4J&}0M`HZ>^ztTFz0qON(HpcYrYIP^{fW}3Pqz-w zh1f4M?l)b&_eu8WQ*J+`y zgVc(iQ00JLozxMb(t*z`G5t=wMPB-i?=qaYVa~8u0xOngGNF=HI{VyR_$2Lq;mp%t zZcZ0W5Y~&^RmmB%DF;9iVB5Q?w7Fh)rU%wCm4~K-<~B}tRUJE@mt)qCPzaMnuaG7A zvvu(#b2k!vBSDB49ry*5Vd_7l=XUyhbY97C)`<6Jd@c`SDFT0xf(DhZold|vk1;K>g=_MOY;Z;`i zjNB4?F-3hEJ=I*STR44$RiW{wsJA@sgu?Rod?$pvCS1{LcxO1m@g472^-jxA41>G}4o?gv?`5?{d=a15wY|hVf$!DN=bCYFOT_x! zFZKN@B^Bo1*k0wF&MUDOwzcW<@%#OKxvdtRn`x%w6VdO!tz&G7Xipcfy~#}SQ2W{} zTpEem?zFnjVUrj#vdpUH$Tm2EjQU!z8!7Gcc=A>;z-T{7P0=_j@AFyro74pqixu#j z$uQ@Xr*K>dKbj6!#i@!tU|;FeQ%9Bd*Llc$66eMya!nl?3^xQDpV4fGjAZ#5mSRgss^%iHe&IX zNS?iZi>G#W;dWEXL%!Y`O88*eC!LgQc=JX0)_9^&Mq$>0 z3?(T3<(0G*b-@K0U?aIvl-oeBG{?CFg~Icve$UqZgR+NK&nilK>E=I0Oq~cNqY<pqEuq%)Tv;7&aOxaZN2q>$&`7m>|2Px(`XX(ln)!L;r3I{Y z{cb0A*~63K8I?i3Hae{HW{#F_3wu%6^qZ+Zf>6g6l_aBD`$`sr5oD=~6GJBq(?}^$ zuU9A6Si3GFv>BA*CTzBAo_8HFJy9y&ai@3UA-AVuo6N-9JMDoJinzHEqMo+HPn(-% zt2(q&jUK>8vQb~7>GD}p^WJGVcV6dKw1(PUKH>kQVSAlj1gkC~ACnU5{9c5y{duq1 zwb+Ux#(wJi#8wB-7gGB>4iczX(m_3Sa{V4v!$!FT@`F_Q6Q|80=isu7HbDYw2{d-% z&fNwWYJ+_%#5+^-$}yWi%@ZCAMz8SPc-7R!;;^)_MmqtkNOaY#qMcrQCe#+U?zaQq zICGtfEGk9ur?!=c`0G|gLe8C#;*UB|4W~j9qhT-`gz~*PS(TPeMIWxFxz|QUWP=s& z($VC7JWNum6^ZkS9vbCK-@Jz9N&0&@7)=!%zB+Z~d5sk~I8pZIZrb#w=h2Ot7MYyA zrcIe}i5VaW)%Ij@8IaG@iL!o{Tz>B*ik~zk2fI#!anV?kD@4EbpT zw}BR=7L{nG__^zFYmxS<`TN3kYIM^pebembvt4qweC%n>_-U8Lx9hD#B&n^JH&X>o zq@Rs~2?pjsJqKRTx_C&2K65ac7GpK5ZU;yH6j4%%wyHH|XRNTy@4kPom-e9QMH^a; zT8{$#V?<2%K{C);+>MqJ9EJCf>Nr+P=J) zA8GwgqI9{q^(Nx{t!Lu-Tji~c35mn#=ZTT8V-BT>aSERJ^9e{Lcu;_c+4JZ{xk~C0 z!}2Fd0nq*QVyE?>-kFZ+c%;lOG&&@T_i6248-tkV!twS=iPN zyL?uidf4KbsVYC2xsl2B(6`7ZHB3`fGjH+p*sM540Bz2j)ydWMS?dtoyhQk< z{axo_=IY5}7^}$bmsF0KqFQ`qvDGi%q(v+y@|(elX-eO?iaI)qN?nS(O^j>~`4Hpz zlfifC##`*8q0oLhpjFBMy*bs4MCm%Hk!N+2;NkOjo!b1O()7fx%B+> z{aV>`JnwP$^zY<{1eX!a=0V5UH(|)Fp>}eh6`zcAInx(!z;XAUB}P3eND?~wC=ny0CFoA9gPEZ`1V2l9CQl=zoqW8cjka`RZ$YA->c7Ho^r)zLOhzNAg4sy2+ z=)N8Gjyl)qD|Bd2_=b5X(9t7dA~jF6 zP$?-213wzNu-i!727g5aIt=pr$u$iXOh6$~5-d2VfAho3i35sxTc;^KawC-(|%m7m4+`(IJM+&Y?VYK;|9JRxn zxFOH)cEX=M=SwmNS6oe-0UmGhzayP_p)3apW&UR74jzty5)wo9o)BLzL2=4DkSgJ@ z{Nddb)sq0S*JL|+@%UwO69i%@MJS)D#9H+zOIM(8xb@4Ld z@p++W#rWFPg6P6m8Y&?7BF0O@wp(q681cbl2R*=n4U;^yPwsIMCE|V#M+M14?v|19 zcLG21Gt@jV<2D1TK_|j7p?8HTOer`+f@#blG%MzS53I<%mU~u-m|)6yimp3>6dK;M z01l{`fq?O#7GDZAFiuPs{c9CaV0`O%_8Jd5^%4h^R)K_z`%1Xzb`p$20dqt3LY}3P z1>dwC)yc@Hz=p;No2gFOO!;2Ypj0i9cZ8tzId2Ogx$fs$O^@zc=HG00ep`U?yByU;GHEQDCmyGT^Bmx>-4&XUO z0rQ~AH@Wzr6vc_7_pH#p`w_IKY%pY%6L+`-0~O&9YA8`W_&Gnoc#BJcz;*^_iJuDW zpDk8^q&MpXs7mDPLe$cRXp_P)qJJa@0)f%@_!)RK%X%B&8V~^ee!C&~z4+_4M^s?T zMi&)EkX9yNDI4g(z&xLq&TN8S4!8%R;dNz}yO$Dw&usy>lncGppGVN85 zJ{_sgnAWhy^5%2)i+jAq_%x z!jequ>gYi9;1JJzI+|NBh#&Y0XP(0BvOF>Wu+_5xl$##wp_Ib`5U1Vfyknv+*4s#V zVj{K2fU)2Cm%Lnv1lv_zhSd!`BkpfW3(>ilnJv1E)05(2#YZf znh8`{3L*yHa09o9fNoUMP7z^9!)dMK*9yh_KlfG>G`#c}F4{VW+;Kq8Gd`?m@1n3! zl`FHA4Jo_X6U0D}Iz*og29}A*%U_$}jqlIM<6}3zBJvLnfNS=T zH@?3!va!<37yx?mog$pt;xaQ?+ms-g-7DxB?Lt>53bugk0ieDXxaR8;B-1px)zTCm zeM{vF5^zU%tiQ>eT&M07n}^gAYhUiqSfw%6?yrXF@KOU0I>Y)q;UtU@oW-DScnBtx zXoYCZ6HZA}*iLCobK>ecd*{sGdNVHpY#S)s1GHMO`T8k&x^>hwf?2W?f1=&~hEACd zUPvUTkC=SMfdxE-PoIU3FuUMl^#;l`?9LM0);SncvPumDvOEecWsAgdK=yMOlkN+w zTx=CzlebILT}i!UsS(CGQ^r>~TrI2z?wwmifodZ&t(X%=nXgU9*WiOVlPRL($>);d ztic$k!MS|XB!?XSB?brE@MeBwIYlKBsWJo7x)?7u2OPV76eU``$r&uyNe6sw0oA8? z9Wfb9lqE-hU&SkCGuK2QC;(oP?EitiPl<#luPD@C{Jz}GO&j<`*cXz$2L3UeZ9^RY zxcFW}GZhLU=_>#s#`b+}gZIRgZ{#3%WqRv@f@90Wx|;GxfMd1UTyIOJ?UtWF*(cD^ zY9h`A#NZ5*6+((*5wxkq5(Tt24|0iOW$&eLdtnPABSF8I?Kj=(dlUE}VnS*e|7Jvo zLEKEK;0za04iVO%FC_ zMDSw9<5PcQ!6PNImh$`Z*GYIG0`&}fI5i>jS)U9Ps_*%FjAA*+M9gSUzP#9a(P1#2i&+mtva*sQgUY<& zM8FWyg{`hO##r}9C(fhYdL-X5q(to!)5F2b=*FNW;nl_jJ?QOV0zwwN`4QPvV!kT5`bi06-_A4-b(N?e*^yj^?vSnC94>i` z?fX={HzQn-)tt9iJ57<2I1ibo^dQG6{AfDpkU$e!Aorsa)nbSRRC1&0Urvth1}@fM zQbO62;xX1I?=A)H;-$7RS`2Uy6fCwu0)+zTp7Vg#rx<5|2Lm(ut>Q%i>=cnv!Fn1w zyOwbtFIiGU={{$RpCEL~aHH{{XGQlOM?~%+0tF|j9HRug>~V!?Oz4E9?%cWL7_#v?TjhITwusDR%tTAb0r$w2Ey{tZQGAxoq!cz-(zu&Ledw- zf4;+%8MTIk6h@vsy10jRAm?_Vl(5oPe;5Dm{9&(jru<1hLfP-0frq8F8Q^^4qo@{D zdQ!AZdr)v8{^4hzTWI5(xWKC6GN<1=#9sFVTx2bwJ~N*a+6v zJy!za^$UFyCYr$Yf-^afirlS5Kr~eU>XP5Z0091R$#S%iSY{QCQA$D<=F&HP;9x0> zyiwMb;y;e-6*dK^_Z_{v_Ea{f^maEi-u}(4G3mAweUT2Ftq%b-x1#Vh-r2_8?xrqO zlhk*|b`oa4A&V{V=Aa?ZY z(9dyoJp66aO3%g=#{vok`?0oWs^%nbSK!s?Uk|WSzBsBL+-r3t`;L9o2{>#ja?PhP zsdpe4JICQQTz}O+Lx8+kXqprH^nNoK!$7i1{0gTtD7L9a*^lA;;X+N62^F(uMIsBR zb5p?}Kbdj53w6xV91u2^iDa7TOSpXo?L9h8JLUk4!O@qfab8<}>sFf|!nYWv6vt zm#Bp^nUqgZQ%gB_KIgCcw?WxfX2^^~$r4xO3HE%n9M+XtWjYlX1c|`eM{e4oQ+pG| zXYy!I`0Yd#@*V=!`2MV3zU>3xKz6YOP97OWo4&{F2wX-Y>oLFmAj)nvT*I3(2b_1H zK{rLAW}SeGeO6=!o>0?an}r$pV4hxA@Djz~S|2hN!YY)xl}h27;vqo1R8d(dcrS-@ zHRC1?|Gv^@EQW%pyv?&P4AG0=?qEsi0wSt&5o6Uvm-^AG7gKj0mra1p_)?T!J^hhC z3ypd!17c9pkDm;S&V`6Z!MdK1uO)K~GoA-PlgLR@a`!NyK_+8@1j}7P-fF#Z7z-(@ z;5RQS-&*%X1d;R-N1tPM(+QSc-0Y9U=q15S#2J2YNZNMCI*xMMi1RJs*vT?!9@!E0 zkLsr7XmBSCV6!kPx?l`UElIvGl|YUS`r66nvzCS&xQ}mf<8{Za3gCzQh%d05A6hEz{Lh)DcV!H%%v_>e%y7<3d%Qu{3saRY2Q-p<>;WywjO(=UpEmZ2VcW3c;N15z*IJ= zs9z$?tci10&|p4biWjo;tc{6efUvR+9?cFiKC=lQ6*Wu5IF_;%M&DQHnlsKo2RoUT z2o@w&c}tbO#>x2FL^p{dNS}WX{OCfV`DObOxe&9>kaLc6uq70s3w4T_P!qYs6&gQQ zrHnKXV5~1VN?tt`;29fMm{@Kawj6M%OxUiFrmgS?=V@-3um%>vm7(lpJ%DURbSa>H z71b#%FCesMs0~!#dVQ-V0m~CG5v3&&@gb<5&-~JNw0BbhTg(FbsS$B@1y8vSk-}q? zc}3Eak;i4d)r9?FI5)xL`gqmV;+y~8mEA*h(*k3L-LZ@jU6Ar3m_mYM!xQw&6PVdL zt-!WKPV0S3UB{{c{(IKcQZ`pUb%^G89#$hqPBVj zOMl*@-pA@pAG{PlN{fx1pl^1}U1N$pKE*#pzt91)oI&$H+H$!Ij?itr=a}GGxhQuC zGiDHa_e|8BR-&>SDMSZ)H-P+E$38>hUk^QdV*0HGK!2yBh?Y~%ID4estM+ywTwgeT+MTY zDM~4nD}ffU0xl-df+PzSxPM2z-ZhQ&#zwz!9m#uaBpVjptJ%xmRn_jGGHLm7vDsD9 z62Z@y7rsoSpG{*Wvm8zo4o+(Ke*o6Us&S8;pCIj-yvu#WZhRrK3jn_>_)*MxEnrT! z@cyi!v@oRs6>yEd!X8e1acJuGh&3J<4nvNHf}RkT<-WY*t(ao< zatU)G^}(PH5%4BD(eEl?``jv}c$fLO*OX#Z(yJB2Zr4}OuwP&Cn8MS6RaF1M`Qd2(8v8$p&Xudy&PHm~j3Q>y#1Z#f_;i7-uke-iXOlr(of(jKwv**w(z{4d1>hJomt` z7${x{&`z?7J? zg~!C!^KgNa1~VAQAa(-%6PDDOtdz|=q%#kzB=aL*$-F*5$i*D=G9Ph}zXzIKpYYYd z#YhhOq#n&Q-gpu|X+E-u3dmeOJ4_+s3sFNdh0Z3)(`C@m-0Hz zqNw;rq+A8m5}8f5jVP27q;%wc8yM9?o;cnGYY_WJlCGFRJkLkgT8e6Boh6ezNlC7Tlyu zNTF9PApN}BgYW$YZc(;Zqo{xx`FXX3J%h1 z5vj-6XL(N>Jc7Q&qWl>LT{l$mBNODXmNvUrPrqj-K>-t_6(%&_;Fr0x2DIDiH62ep ztZRW5P+OL10wTzJmNlnOqDkYiDsu=PuGPmcAc6Q9zBkwPUGG;AOjI&jI;)&*bw6UJ zGZyO#Do1Fy-tfnLpe}UFH?faSj>A7H-vs9>I04bya^m@V9d5`Jqxsru2dRLugRDtG zANY)kKM@sQWaW>;y1nDa0H$k2?vPoE_B#&)Kb~h>V$&2ZYg3hpMSW^`oqUCEeX$($ zPwy!KfNdZPd*=obh0~GD)9TV0SNvG?4n?QGUd*4s_dQVJP5!=|wN#TU zFj0)xfNxpN)rZGL4LtFBzqAx|RG)TxSU5bBaT#ZNM?L7|4xjkCQ~|o->gbW^7M2r7i44>k4PR`({bAwCuxP+O+3V6d#{ z!Wm{X)XZyGXaR7p(c4dp(~U|R;mLfZd7RD}f}u}=egVqp+R8pjwW-6G zqsKc)AMB4UK_NucFA{1@EUGA46Vs2^+a3h;_zG$CIotH$(l>JnP zQ4n&|zR=u^LN|XybRhMMq)iVpG-+?r|p)3EYibjx4r-Z_wP@_g;8VY!*=ZOe;YP0{nsv8_i7&M&G|J z?Z6oLjA2=FnHfezn zd{wOoIngnt`erBDW)`Tjw{5VSnf`D-GT2iV>dhPkR2UYw z5g&lKBng?!?tBu@l+h*G`iw(piEdlv>hoE76S{N&fTPv=HzRRQ7p?Sqxlw9k-i&+?Q!bwHq$9syX6UXYeiB^a`Ay;4EB_!%;4N~W)(ng{=E;cf#{Z%hvhc` z{F-I)Pehy8;Q}6GP`&+g%=l0#EbzF=QjYf^ilb#X?1cAtg3%ZM&Pj-IduT=)`hN4f z(eJq8m^BGX5K<8l5 zM70klMF5cJcm9eJ0`&3SOnUO3G(jX(0agnPs0by2}Op6${4&R3t8 z;^jQN)r;<_01kN?BJ%6alBfswCMkSb**xws`6d>4G9=Q9vSI+)(4CwP3={`@))zR= ze9?pBr=VAqK|9vwa7k8o^EmL7OH?OpG=U5hK+%SL>YsBesue+-UmrG#Hj&%EeS>VA zjcmZRa*ji~l07kQH4$F^SUWeLLDQI&sUmG&v?tCbdUHNc_jcsEF-8|Xqt7D@?jV2m zTMG56gxJSVGoglEjA+A-Ptgkx|il8oOLU zErJg9%i|^j_a*CCzWr>0t!!y>X34o*%L%-9dKtcFi0wxARWOPN(2Um&OtHs4*zYf% zgoOLI$bv?z%gcUDs})!d@Pf+#*t^Qb`T!7HqBFTOinXc zA+OpKwU)t*ui5@}{FZ3`QMm&od&N~nv)r@O{;mgOE7%otDlChPN8b$oU`Q*5HYpfG zTVl^!6Py7h>I$A+`*PbXXf-it+mzxFvKJpTJSAU>H+rutm~HB09n%VNfi2wP75 znpt+|U{5w7Md?Bz9i^$037oA;>*iCYqXe+N1snoa=?0YHeM6;G*;-cFgth2d$>5k! zv}eL6G9r`^Wzi!xzE1R0wBD?86}!CgRp`#jyV`U-U}3feD`ZqiZh?d?QTUcG9@b=K zlC!iC+;tG$p-sMIL45#jhd++cP0$KJcfR2dG{w7~XlLwy5BnbZ`Ez<(qULUQv3njT zCD6SY=Rl5#Pc|WF!vVqN?0GlDimjFY*dD87+o>vMV^lz6{ots z{I=mYrOGfY5que8fI({dFtrE1YqW<5zO)B<)0Gm7FbXkwLd|+unwqDvpN-hF3(J@l zuoq%XnA&%pGF=mauv{6uG{x<*EkFds;|Yv>^7CBnj5P1mbL`l0ftWvt*Ok(jnOaJ$ zRGY{e^lcMsS@a8{=2C}SBQReMIe&-Y&ZC(|?5OgyS$iNzQj_Lo7 zcO1KxOu;Va;_p@4N4M7Dx3ydUn5}LD3^6qtd<)qhr%~UyHTWtxP}B7jGH)sF=t~46D`~~g z_kw-U(}&7XqR!xZix?4ff+1_u7$q)pMbSw^8gy@!j@Z@HhkqUwN7J>4z(f?wngWbc zI2!>gqk+p>o|Yfe333Bpey{DF4I*J%(6s+{gi|cxy?ZzA*$2iaP@@DZQ%d_QG~STs z`J7#Jfi3)|1P7{PbWgB=dxKoY1_N-gzkIXq4!oO%ls{rcKx z`Y&O$(d1!zobfW4mo_o&Lt(i!#InAFn{M(YdOANCqreQjL6>*cj)UjEv-bN3f7i1F zZzb0t%U5(Y_HL-sQBGZl@N+R<1AtGaxhbvVJid@iO@ATSBDA>l>{R5p%)j)C2Qz;CxHyQ7nl&aAH|we0@VSzFi&fk?_&nHTWDdN&JxuBo1tf4rbY+ z>F?`&y_b=V4z*8K5s7ufz* zD0+aNSbrVB0`#|lLE+c{W2hC@b9=ctM9RW|AP(fg08<|#q281%&a;F3P-Toc$;ZPp z3S8g=Y1H|qO#Bg=J0jYT0Qwo!WY`d2Agc!r-G``lRTH#fwiOBz*qb6XH|50Zf$G5F z$0rbr&g`j$<_|YO8RJdSnoui@kw$38B0Kz?J7D|egkuE3AiD>RgqV1!3yJ`6ElzOJ7Yiy2O?*i%IZTTjX%P4mYJmfBlNkJwb%y0IR;QK zg!{X3wmIodDp)s$I1u&~LGOBgKLTw;jX2z)Zh+5_h7+&{ zTjtxL7Y952D;N;OfuwUSzb6KS`J^`3AK2o#t*Ch3k>Zq`6Uhxgy=ciOk$wbCs6D69 zpR_(_n_iW`C4_YWV1Zs6K#t(vHmYWDso0ssga`7M_6DoGrxg-qG@c>}qU}ht{=A!nC zK%V&gT38EE>q5vER?M>!3xRMF(BbAGkNxx@b;EKei(8EuvUcp(4*aL@$*dO zh+sT{vF`_L?>nIKn8qXqf@j~0mp6fY)r9uy=-Be+#3v}q9Z)6?*z}~6#Uqm!1BWG? zWd=QKPvKY~FUXk04DkFzZ(^t$!|&tRH%#s#yyp~b^TA9z-o7G5&o-5(N38&VL>h;P zmmhkHpY>zQnxoV)W@vUlT^w`hqZK$NxKh&UU&nwb4wQod8Swy{b1j$E)e3elYKTJJ zHA!FceW_I47I88^bfxZV0H0A7ZB3nDBZE62FR#2leTXFUNB%twh~hvg7^r6t8a8K}LX9AC zguZaEJW(9rHG7J$5vd#3rx%qh46x&oF>s3igD@b71JN^%rD0(IKZOB?e&v)+Xoltv z&=KPUirNF)vpgxJ$g||;Sl|&_yQ&z>`$?HR`m~HKxQ8z z7H1gI`Jrp2&C#yKjnVvJ24wH?w4XFlqNf4cx73dChyOJU{Db@vC5>< zeZlv|fFvFn8w}97;%lWX$eyALP&X)|YKOm;JB!5wqCIGCD1reteA53u48V9n<6yyf zqh$xv+4Dza_9>PS53t6-8YvhMs~I}+>V;H1$av1Roab7~ivgJ&qJLl4jN?U3XLO;Y z?Kv6;K0S4P4#6HXi5QS#2Sj?(DfcWhd3sYSsSlByJ!t+d4v{j(>!V#z>5}HFX&f}O zQE#{_$>Ldc+V{qQ1UtY60}|>*LjB18VGKO{FUA0j_b1%YRB!9iG!9f$IGl{BCYz3B zH;|J*QjcC#V(|cb{)nXhr1k1QqF_(De~Uv@-|yEh`!a@Z;S>cjW2i z?9Z`MN-rulF`*O=k<$7QDXA~ve+vd+ygllMwr9DNU=zR*#DTeyn%>SNtNVu;&b4I2 zA5q*6$ijdVGj~8v4w0gLh$P1Y{~nJ_8RO$gH{>_a!kr_61NfOV*kI$AB~r5x*Ce68jMSr;OJ}x}a0VZ4PQ{s;V&Iz|2rhZ%;~tTSs#kderhT zpuBZ~g7JWoI7E_TLRs;^e>Vo69l-J7aW~}M*Ss68cTpU`k8f}NLFe;r6yOjkh5)5dDX82jm%l9qNo8?CNm4g}sikEF8d(sezjAw#C-9r&lW2qm}^!a`honGKWZ# z9r(Y50mvO58 z`vSng+hbk61`M_IV$!uV9KcT-M@^^d%tp7)t)}~v%FiK^gaOg>?!N~HWbw-Xn>j@C zW58;(Bt6T*0l`93O}m}RjgDVhXD1T_?9aEAQY)w@2L3PcM`R6HAO3Z?%byd5S`Cq= zV>UQ|9}8nOy^QIW%dZyMlRZU(HA9)bDdj%bQY0q)ABRZp@w~b-`c(TPx>(xog!>PM zt!3$#Ee_xZY7pZ*42K=ew!L<(*a4kgUDuyfAv?h4Y*Q9z8p_2h|Nn?X#H{~L=-qKQ z^yk6Oud^bX#F-hXYq8O-JUF0#EKRujp^#)&~cIKQ8u~jmHfz^2wUfAg?CJ zzV>2a)2CSf-`Mg;q{oB|=iB}t#=!FfonPPI)#1{POqY_yA$B2s-HcnC7;x*QKN<)B z8~+HGq$=g0E>(ul*(XnhNz=jWDdpYjHxa#gf;A;b#l4eG`7o5MKMr@Y+Y= z*EHd^zl2{?V|YykUb`pzHBJq0$a>8kkGTK6_P^Ku_uBtn``>H-d+mR({YSi3!{W6X z39sFg{ThiGnBt9(vR@;y3R6rY68n&NNF+w;PF{->dX0*ugufs|Y^KH#!x>Vq34LHJ z?=|5ccr9tjpuYM#);jo~`u+R$8isEJ2Zojg{^dJk<3tX}j?=$aj}fz1{jq<}_NK?@ z*uF1&_UO)+_kr)#+pC>E)Zh;*z4wVD`^B&8=TS6p=n{t?w~p^JXwa(bU22mi9CzDk z-qg*_ZP47M5#vvKS+vaUd11TbFpkRjv08Cfs_lQCx^3M1zhAsO5IwzhPWRHh(r3?} z{TcnTp0+Rln|R7`eA$W%Zt&)6Rti zPYUll@6ytUl*BTX6jeKpyOwdQhsda@t*vg*1fNgy`+1#px_GE1NA=aK@#|NVuj=%y z^k`0Du(?lf@25^#l`bc`x|^!MMYXt*w!csCwHLR}U*G@o&(BM5HV*GJ?QYQE^4lRDG`ts#vf#wE z-CT3cx?njs_u!VQh(A&)ZQE=2+x1fann&&6gi&#U@o{lm+USiw^YmH+Wg3lCo@7j3Quk+^p*Otr~iHQmf;w;U(=5JW^vu8=lgFB z;obK^8@`52kN(A&Q_`W$*BZ;18E@O88?i4#?tC&D$+j_N;IW?GRQ`wA#eJV29h{z`}XoE`J*^_}i=ME-3XbDm;6%eMRZ6s%Bbo*9{ih zelBt9)BVlN>c?Yty-|4_S+mceU7w~CwzeE@=xDcU(?i$d3F^nq@=qm{-CXA0XV#pE zGud-``?{2T=rvW-D}a-q9AudP@Wc&5h z=MC?_{qTJIoK9n-Mwu60Y*;jAr+3iPz*T-J+~cbtx}ZK!fSeq6h6kI-k^)UNN_BeToafiH>=G`M%AiAs-~)#DuP zesjJUk;tvg=@lGdH04X)>aSU`5fAQuy)^cvZ?|2OGB@?)Y;SF?y3sH8())MSpEUh|47#Xwzb)FqgIxO1O}Gf zzxdoaxqac($-W-ll3lL+;@K(V^1bGxHC;+#TTI<$wB6#xl{M%Sy8rlY^!rDiYd($s z@b>wgdG>Ml`&NI>dLHxW!a{-O^$s3#z2*6Q`pr+Rzr76F^yLfsquPGwr8m=}9XR8E z9Qkeldf@GZ-gp0$w)u}8N>kfC!lEQ1C;Q%pF9TIQBXV|}%sZ3ru2T8T zvBuH&^>1f(U)Rxg4c7T_8uv`%vB%Y4f>G49>0j@^tSY;@cmJ(T!Kwud3g4HG{dOky z$G3mw#WwLB#ns(+u_Cx~Tk}sNilR;0L~b#^y?xI9KelFZ0+v*&?@muEbJIRiwN6$0 zNL58q;J}oFYgQh6*ktVIFVWvVRDYc~?eB=+Zr>?&QQhoaF}?inoV#DL;^(dT)cSCu zPxHTTPj$(Dxcsla0dYyLcGfwoxy!C{-q;M-I;8h6`IYO&Od0I%==w`?$%E4JvQ>G3 z%N<-yatC=gud1z@+~0k;<|^)zXYQ`Y%}qxB`S9F1|9hW*T66R7n|Eh#-TAF*$L(8% z?NqL3J%1kj?SA#Qg?s1xK6ud?^^Ip8zHECo^3e1y8YRAgb}A383+`-rIAA~)XTZ6< zrsb}!-hJAi9ycSPSx!|SZ?#qS0K z>bGkl@{Q@U-bCg6vGo0)tN-?neKK|5{iMx1IPSl@4xFs6@5nhg`-+#=jBe&_Gu%I? z&pkfA%T_nPUzRqVRMfeb_wIK4HY`n?!{gEGD z&i!rElZRE>ciQ9)DAtba+^X5Pv*_#Ivyc78YUe$id}4gi1^lVo4%}Sz()EVdMjh=Z zsT~G;&wRe3@sma_k(~>|%Af6?;P>XJ=f_TEHs9rK zQD!tOX048~#Vf7fBdR6_zKO`0Ff*)obwuLxDbGuNd?#G=^lRhTYUUUp*X^g1>_as- zhy8il_UntYU#hJ>#*AB@SDLYQQT6MiNn<}c-PIeN%uP9|q18O6{MJ?fxT?GnCQn21 z)oV+8EU4_dval?Duv4nf8<=$Pte7#ux)g|G+-48FHqBBnMV@6#o-Tm-)zhuYrw!TX$T}n13eX=RP z^Wj9{0HDON94DgZ{B#cfp=-<>+;O1_bI1}%9i|M^Sjg5smnuK;P3XW*)gN2 zX+bx;f6MQ_ar(ZP(~eUd<1V!Rwm5XrZ^UG&!=Du+q$o+^^I2j>^yr1 z)Xb@RzkpkHHK#?DSB+;;*~ab9t}k?ZV%VzpwVcb>j?6VY`?2)JXtek4=ezE&Z+DH< z8get@_xD@Y{GEep+y+#3{!^0^FvR1;h8r=nR+gpp&6}>aw2_Z#Wz5rGHGLBg$9H>> zSr!`DIkbbx8#k+4b57lPf8)2-ts8d>^>r#N)_8Ea&Ffm}Cd#SsoLDV0?NO$z8jn}IpZd^3-#sFQ*$M35@u8-<= zNzE=K)u7ww_Gs0P!ip11MtvAK(0$I@-jj4v4(^-&Cs zb8*N*j&16uJ`O$;~#e=zu3y#)8st% zKOLGTeY;ot%y~(m_JD(d4)LnsB9Exr{`s&fwc)onv2Ra3>ypIjH!V)@r`J1B#wVMH zT?Tl3^XymPJZ?m!#rn2edtL3Nn$yT--o`sVR@p0CoV_^MSG}rqS8L;B$w)yas%4_=z6T%L9JUEKax3%~d{h5Q{InOmB0p={fe)FnN- zm1N|Mc$&!FT2*^?m`UDWHFJHV{07_~U%RbRRr|@*$=G8K8h>EXuPc68dF}7Zt^aQM z>O(e1>uAl-V?PC2Xk0KqS$t!OX_|+du8EIV^P9TbR;jg)H?J*o_qtZQyJ%hM6ITaq z*S-VY4|%TUZr?efX2;eI?yuYKs%OZD$V#TRxg<34QH zdVp$!+g`&4w|M*Oq^UP{Ob>r~IPzF^Q|^%Jr{7wi|Fx!h&jWX=U(epY@xkj9=ZqYy zK3j_`SE)x8);_D95Y!^n_0G}UIP1`os;whN+qX7d=rK~KGNiw||Ira%m1^sKS6(q+ zQn@u`6#gDb& zoz=R;(4fhUbG9ck<9vrMuNrA!VstjIL(PLO&+rtb7aD43`8~&Ly_`+7GS#15MJMyX;T)!g$vRXnD;%@xqq3j{fI8leXr~ zaBX(G=HAE))936CKdjQU_0v&_n~T0=JH@|_C^&>aJI2xCT4QvQ1gLaZS5#E-z2wuIoEtTK@{Q+yNuM4mr9fv)0jqyZN|xh0U+? zz6_c&{Z2%a68(Yga{V~m?4~NK&vkJA)Msu=Ny&)(ZQ04%51+5-_k2#@WVIzBfnnM! z8ibqM4qwe(lHc@m?^n_HTlx5|cYCt_+PYecbobRQ&3_x_8kop+Zl=+*<*>WEUo@Mt z>1LGf+T0xPu()Ge3O4Qb=;L`=$J0S&LFFiu^C!l12pT#;+r7E^TC=ak*JIoUs8lvO z{>)ap*EyH$iX{WCPD|ug^>aN^v-5WJ#%=c(-aa{T&CsLfZn;Bt?Qd{pMxP6brUR>v zr0BNY_j-3bjgbW|Yq{GW&#!7_l8)@O6P`q-KRd`N#@@roUyQIpt+UaI_aSP(Lw|?5q z^&I9?QOPN}V&v-TfB%Kr$j&pk`KP>hzcJN`o~@O7W@XzMzlHozc~j3K!QJTLZ_mJo z*IrS{YgKRef`_Zeo4mzga(wY4}jMQ@s8S?rhPhqVsB`21qempwU=QENl` zTCMKzqI`JoorYEKgDqG0^X}PV@w9;VFCs%f?XkS)S9N6YC@*K*8H=2DSoaCp(;ztJ zkFd^#h5k0J7nIfh+4B<)HZ~plv*(_w-1IB=>^#P#1vf288foE{ch0s+S?u$Y$#E$v z>SrAu2LAlX*eTxE_d-%kI;UwtZff%2pHiRZjZtycx!!SxX@Gl~e&pYyrheYDrpLU$ zKL=-V3pS~J+FVuXmsL}15pcz%IInr!&=<2ues1!+Zs35WZF3s-zOkz9#K0SGTYPG( zVxG6Ij8l|XU>4!)8}+`+!0NwD?zv6;U32&Sj?bR>?n@XR`_}f}nbWE}a}E~U26-P< zFZT7B<(Bp6q({?Md20j=y9cM-_j^@%&hVT4d+U3L#&%aX>h@>FA0y4f zbBbo_*f%-#y1!jkrzg&1uQt)P(h6?c|KwV?pmB>&otZG=lVeT6rsjSw*{^@e2#6eD z<#W5%DyQp*vt~ZIO6HKTm3mw0?NjWrPF1jm^U? zp5}8*$30AUAGPafRkO(E{Z$)`&Mc@*cRzV#QsuT9chwnZEDSY|c;wFQJACLmn-agF z8#PYOnDFV-nEo|WM`+yWXE}cKNVjN%0ZxNemoBI@v5)(G+@JUC|7yKY>sRlC#SyMH zt&aLcImSCzP3&LeI=c9PSFXWx(++OBdX9D{o!^`tc0btJXLwl2V&9>~Ha}+MRBUiD zY5vG{puKBum_^U#xr5edxaHqb9kw&|@ySbCH>dseSFZa){NR6D-QRuGrnTvD>krI` zxN_ag%jb|a_EAL8(IR)_xXd4mIwx(%_M{piVxTgQ5-PV_T<8WJ|| z&~OiqM$m-@%N_UoI@)<{y}&7M7(9QrhDr0JvaZ@%$5ZU5ez^Ym_%0pQgc!T8>5WeW z)_h)6#x)+0mg_Pwqj%-hrY7fewk@vE^+iI(TWr%d&Gl4XAG`6j^CzcnIggvD zxsEw+Z|!M3&g{qB(z5c2ODmWBIwbVTs^TRoOR7vxscva`*{kA#ZfsQBopv=fS1at6 zW{o#L<$J#AZwVT{%lE0|UFbGG@xe{=8^gxquU zxtepxXo5ed$*wzkk2Q4+icdGW9q8+7nRnp8+lZQNOPtIz-Iuo1{u~&7<^Fua6kZd~iyhoRZ zN%r&9vsE5MZ}RO}d;DF~lYKhHJ&t(rRCH?|bZ{=t)y2~me2OW`ZR{O!{9>2nxu>yPWKvuh{OoWu1k3m~VJ1-!&m2BU7+Iq(y^fS*gLyS zPUi20MFHB`zwWK<*=dWdV;uLhQxaom%Zls+42qU}C5tXZMS^Pjo}-SWeN zk7!fVd9aP;+Lr;JA9=TV^DNlE{kBQB=9+qSf7Rg5vt2(f{$=&`j-!Ikt&Mn`^2z*O zn}na*rDTi_=`rs&jURUUYDW8W*8Xm9Gd#I!YrmEktNpS(vfM{iCWYU)+F?V+i7Vzk z^K&kGZftGs;=b)u zZSGGVO$s}@;bXU$ic1^99_>B1cHZ00LuR)9w&&dVuXmzVJZ6{Ko-|Q4^4Rk6&X=!# zoZ%ntzG*Y-TDS73x5fz-9S_y?JsZ{7vZl1<+_TP%6b342-Lpq=elKH?Wo?<3t> z-gmH2kFen+Y+5nF{%+8PS)4Wrt2Heax;WZ7j-J+IW`B;yxCwejI@*riYjb?(b2H!E z{@h^U=c}EyAYSO;|SPljoghtzBzIbx87D6Ro=7$4Cs69uGXLwx}8F z9=vE`k=E$`&6r2U>G1~o<3g_u;wC5i9|}I~rgr+0d6Mhaz{s*m;Les(ED(OP~~t7+kN0h{W{g`=+c%ad%kq_ zs?eDJOsBHz-+rz(-Bc6oZ%rG$<*`#Y!^n5fCY9R;ufCHu%EDsss)Wd=9#t#TT77D4 zy?0iP%^FT}_1O{rac;g7gG#QO8Z91K;TQ0H^@SaF&4y%h+s*0WJ^qGW_Jaqyt?%Eu zbZ*_uZ>p9S<6F(_u{inM{b~S{WiE}%4Or7qkVka?io7& z@%_W@_tbW__&m7H_MlGgR|XA?bWA^K`HnlI(SYQ#0)w|z&!Pf8>3f*_jT`MBpY~hq z$Dn0Vk2=)M`dB%jOG(7Hu1nEgq^o;;>A2_D4(N=(Fc>?zjFQ(&1N92D=PY*~QD`#l z>Oj@zljDBPRd)-Dx3IM8^nUj5`A`2J4QCzK^cVH^6D6;zOh z(J0*wBc(eP5J9?Aq`SKX=`QK6XTRrpJ^$?Q`#txZ&v}3Dy=RnqZF?4ripD_~3%VM`q0Kw2( zh<8tw)uRzdPb=a9a9Uy@5-H~~eFAGb73J~OK2EGvC)!UC;O%n^3~>@g|w>x;ctY|PQ0bWa?gb0POtzxss< z5cy5Pa+*#EzaBIZ3-CdMsD3}_DT$mypoEZlpO$;r`f+##5kXXIBKF1!yy>X@t~Emim4*MGU1> zqIW^*Uq*5Nbze#m!%w}Ux!7O$S3(s=Mea$KJkTav_aFRP)8<+gB^+};<7k9{0nlus zOOu~8c*qj}fHDX&58F^Sk_bc*1Q8{^UtzlKlmVX*9Byo2s;d3lH~;1`Nb?`*vKi?a z>nDdo5Mlb{gA)oNLN~8YpH5YWlYageBp?lnA+a;M@I_~WqOaN_!iW6v;3`F5w;G+W zlmrFp!K7}C!0Qpz=icM^hs-o0Jx>g zh>%?c{F(>1)`W?aJd5{UhIG;wCgkp*20EN_HlLH2_gq~q zvsR9n6~7tI@LI>8P2$XQFu_mTrfw>HSBbab=2>mDHy~*PKk-S0JX?6%s9;Z9HJsl5 z*WQ#bY(W{|OND0*`JWs)^*OihZ}MzrAs*(CA1{hdFvMnIPiku+kA`YQ zVnO?os4JnimMZ-qf;RKll23t>Y$$Cw3Fp+m3yn%!c4D?-VO^tyyr~C=vJwl|xKyRgH*0t+@hg&~u(RrCKYt4&; zIvJY6@^hQo>%Y}Js+yyk^}y|-_XPatPRkEYEj6=^`ZrSFdx4k2fFV-zBK@dk(R%JOH_|94D9G?AkzYqka`P4&ktQ0p zkw0#pCi-P)g3RUI_0G>kSNpBCLVTvv5v=X1S1UC<%*-!IVz0a74n7%Oa5h{au>2M@k& zAhG&H9AEw`&PzeXWm|w;xQh5t&{C0|FUJ9~w77-(qo;x2A$ZJy?3K&LxO9J&cSp@t zAKTk}{gb_~Q}V(-1JiL`R^636&nr;@5d95uJBbmsZNm?6^Is!kE(^EE%Fq_wUlc=^ zRQgxATXe#_@e)@b<#zIqe9Rkzwtt0^uim5DDA$Xgai84yzzR%n= zKQ<%_7uq_k^IUZoAwEbC)S3S4fjxsxceY84UOoFB$3WB8L8^?Nvhd8-uqVy=8}#fV z!jzXSP@I>*$9YQRo>+2X$_C)1gFbRI&uLBR?2P9zgOw-+=tO5@+$(X^(k=gkAF-2C zJES@VL@t5)1(w~ap&S6SSbGe%Jujtl)28EZuCNIv|5 zAT2DZB~#tkfs_SPW^jN(n^%}En^?npU(MpMmmS$}MdaqRqF{{;AS?d&4LMh(-s zEBs!w$Rj<)>~yOleFC;~(>IDymVfDp+i%VdQJaxlyTTR6+45*W8Uf|NbAS>2Oz7{c zLbt3n zNbAp5H?z0OPmWUNow`F#y^e`Ec;s2&I{DazQ|^h2d+FXTw1|j`{#pvmbZ!yWK4XU-Z8Liqc=aLGj0C?e}>Pz7^iR) zEh+%9FozC}K=*z~q%+W>)ofY{rVS=_pxrptRvHmFejf?CAMPIf&&S?h=_#dKd!x_3 zyAhrrLj6A8?z}=3V5N^ELSEMpT^f*muM7I}W_#1L6b}aA@s*IE=&`<6>Cz0gYX7d^ zGNCUXXlutEq49-Lt}*CHS)9;Nv$sZjevea{O=jeC>$j9;U}pnakS!}KQdd3sVR}j7 zJAB#iGaA9u!lulIZAS+VdxN+=6dj-!KyS#hx`x&1#JG2%;ovs3uy8f{D}jeG_}>iG z-w?an!l&=PC8K%ya6DWg=SZxH;-ia;tn5~>^wv>l@pDDJS;4DZec78^H;3Cy6?MQM zi;~zW;NzkPvERqXA*2?T94THrG3fWWvGY=-8I3`)X_PX`St%r!($Z3(Xo7Yn5LzX+ z!U!wGVOtKV%O9->@+%3@KzXB6a=-ifTvb?#G(|1r{`*qt{9GRpu%a-?3iLyH16vKp z|6-vC|9yQmdg~J^XoN<%f9(ATslocJxux^l@5*1i<8P}JW~bM3vyxEPi7T9*RQ8!g z)5}WX?HIEYaki_XUr+I`K+U%6HEQy4MkJPG)~g4Do_#boS66IO!Ag8c<_G*RmDJnu zQltA8iHy-LJ)1>b5n@u}g{a-8^YI4Ut_V6e=4cA9kaYBh=-0Kk(`dP2gzb9|_(4&OR0Jed+SJ{Nz2ttC(iZT{ zhV?pui!~RnyB&-5RB;Gkm~x5_eW3)XwU|cDuSOZ3VO<nwGuZazVV+770chqx}?hiE;mgVEDi~0Wg`}Cy3 zLc7%GYj}{`6zY?Ohj8Co&b`rh^Z{hHIX=mfAaoT?ED2gVa+vBX>s!O~8ykb8cH&ko ztA*Le3n2&WfsB8hEVyf(I512pVbty}V3Y;7j=0g7I3pH~B1IWeG*%~1wE%LOni(k5 zZ{G^?oQMdJl2R>HW9?&v?-qV7G|n94ve&W|;jt7M3E!&fQ`^Ubc4N#C?S`IrAZ~bv~Uw4kbZyvX1 zPA&elpta*~qQ!3cp7JV*&nN>6tLzI-W{GXhbgY?bd8Nu1o3+0p?u5KH-VB3JWPgwU z{&$QRITD%Rvu>Hvzn0O!dZb6;-O~Jy$|_hAATj-UC{`9U;Z*K=3x4Z!_xN@t6OePz z{`qCu8KpPTlX~YPbx+{ip_)O;8&~?gg%m*@%PUtA?T7k;)8Ma=Cz!3lmnqJl~X$gEEc6swzwDOol@6zQz(OyYY+5B zUemR{=lDE<9WHnyq-sZz0LG}2woXT{_#H2O)$`AH{?LvJ+xg)KM39T+m*(2!sYi_O zJaO~KPr50#*a>^zh}iOYWb)^q;c-6tIj>hb)Il#GIkx2~jk&?bVB6q{StD&=$> znlnR$1Uf?hj=jse5nI9`#3;<&WUQqkv_z8bXM~cI&a@ETp(ya?HHeGHW11WI<1jA6 z%G8KNPrk!xRLGu85trCRI}(n5B^K%X&1Nm^P3+In1dpFJnW`{&0DQ}_Hjc^+0I)D; z^Z#I`8gRJXFtpyEe7EpeL*P_OOvf(upTCE93zp&NYt{@^WhQ#!%ZR;t(%q)RD>nD< zWDQ8rr-jp;Tsr~i`l?Xbj+2h(x!{2JL$To|F53CAh0iTsQPTrGc(i8Eg#YoY9rkFn z(i2mLt9MU)nQ>I)Kxox>SH2Puv<8n%S0xSxTvrMj-wpu!CCkdtzt#1_PSx=FAY8WN z5gAfakh%Q{Ho{tk805rYxEZNZFAc5I^0V3&sF(4COxaAwUSX-hzv8=F6WZzhp(AR= zg?^W*qOP7n{{N065Dho=M}FT2)Q6a&D0L07J4 z{A*ZX`r)o|X8bhr}|988GS7@7G+0=3Tse`l35i zMsc5yX0Eh5r}S2}%1Wca?AkLB99>;p;tpc+2xA67B3=XW$X;@(bKrgR!)J!C-AIAH zrUTI4)(A;j%6(GSveSPa?yE;$FP--TUh#Bb`9sAeFKaAu%B`CIn9^PVP{c%ruEX^3 z5?skk$Ml1f_41uti%({wJQ8Af(0jT-hedbT{MGcN!IC>DeyY9+f}kq#MOJDM zthX|IJ6W31)7HVF| zM4Mz?Et4oUU&0y)DC-CgJ0rzk1}uBI7@kJXU2zObuoc;c-;=uw$k((0-qaJQ9q^f% zgzRTv9O;nHZfVw}2X@!uHfmq_R^YYutUv10GyUn>fk(_LG?W0RO?GN^tw{0DqQ1tE z3=eKuB6sst?C5X>Tqt+O#7YG-x*~u?R54G$@Ey34S3|^>%Lk8>#e8puaXV*sD4~-@ zjZ98jo>2Z`JbHF>s8zEO-=IDsB}u=vO&Is8TCM&j9GFJ5)dC1Q_!|}@e1I1I9eVKn zd&3xFtKd_D!ee+`e=4P?yczKQ%1|`m#oWoFH|&1mrOJz~>tC}}P3xvbZl@&lr&3cj z%(|=geT=?iwXt)mEWn-$ayjJZ+eB`8`ZzjbDec}*zo=v1IXygORD9(3eSp<>OQe|` zh#(mJMU3u@v44dPEb5gP*qxTuUwr5EhN=w2`7=mT05331aU(X;n(J=f>?%I}ptadH zW>+UWGi!<7PM2`M5i84OU&?CmYtK=Za>BZxa}YRy=Y<5Q&NICdZdQzBC(x)C%2~J- z+gK1(*}F|AHalbHyPHV5JQM4$E;fWAGYjb{dFnvYU24*xU_7kQ=Q7S5Q^1bw1-aAF zM=3XHKeJo%v4TZ?8$R(jzB{`Xvdj0v$r$6$_ zE8vf2m3I7xw@BX7rqHYDMZ`s2u}Q12Pr7*3=R$@@`Z!|M1V$J0Vb@)cZnGYbDe#X1 z!fYk%D0uNy|2WeMUKuwAS!IbjVPov~?Co{cVd^9OYo^qYkl?N8&Olmi_K^gcx8IdD zdZTzaN%7=po;ec_+LCJOR+}tr8t(#3ls~3x5zI1ayX2?X{Py_ zTU%t71=I6M-<_xGU%-|Wq74H>4TwIoU&oxXplh~IF3d>F#|u{k<_yB=2PzT(kA0e% zI8sk;g7H-zVS+WD;33UO|KI!zYeV|gkM;RFS8roT!si|MgKX*(Y?xQvqBqi7?S2?@ zs78X}0%1EE1(m8#fLbox7YjGZ^AG+jdMe#gUj0rQH!0n5rM%R3XG$P@?d%BsyxLHA z5Y3#zPlr{W{E}N+H#ztbt*%T;nvCp!?t+X8ArI>LOWFJPW{lXUr@qte<}ZdT-+a5A z(9Vrx`x?gK7GSQbsc9%^o+jvz+1jP&5B37h2Ur29!y0Wa=S44D)~8T+x_~t2fHvY9np?xL_<0Hcbh zd0C7IXI5c|Q;-(*Ft@!#=mS=K)0KmPrXDmnyg-#x^{2`Yo0*fjLYXMg`@-H|LzCtxvcc>4pF zyUa*fgNn&KY33IZQsg0>oBdJAPbF0t(wR}!o)F?jhlkunlozen)!xplkBB+d)$U@% z>G-IdtLiQ&Z&$x0EKSk+cWtH*IJJ`*suuKFQN<+gF@&8W24L^>22!HTj54EF@ddve zY^w42q(_k-69{#U*~wp#>iBN(kokAoatWKn~trZm1h#lI3tuJIktk z<`dP}(;9TpgsGDSEDIFes~KruM5~L9pw1dw?sK51zQ`%`*MXt;0I1-UFbzH}N>0>H zf;u1zH_(1pD(f?EE4`9GG;T3ZN2-a!#~4GQrOY1nx~1 zN?14{T`%;SO6ijj{a{T%e1_9)78}!Ia|sm{R=HKt{R$=5(M%RRGH$>r_p^DQi0rhq zmQc6xAHVCEKE)!es~`4)1$Fq8B>ipKoBGmR{KL(H(Me3P`ZvFa+djX{Y`iJhWzVY! zuO+*Q-a+c?t9b@+H(D!AR`*Meh<9|tJLWV!r(O#=jBGIu&}^)E@tyWwhAWO z9~4$#^v_b^C<*jXXIOt_C!bMS_v==W{vRGCk-b20rhZ}=I9X2}2Q5TI5kF1!k!HuM1oIi z$#glMvhQShweUovbuJ0*#B+nWFcw1CgQ#^PJ_XPQof?5|9R?pqh*y>bM#=y-+&W9| zoWHd}B?`$0y?dOZEzo{3*%cs2aiw`*1_4Y?jXMtDL^sfQL;v+l6b0@ZFNQ+#J19nB z&DV3f5{(DhV*wn`3YT~$d`JIfi#Nu!*c0OZq(T#_F#0yMjZkG|e3XaD4L>%azMN@> zSW>moJYN4E6I!!4`N6fms(y_3pa7WkzB)RcAv*vH;jp~0>y}t% z6c0N&-1VZ_;ha#TQj->)6<~Ay%-TsU1^jYIQvOtenCzFS+6OAXiQTg9?#$M+j4sc7@?u=^?q9iO)9cr8U#o_M+YW* zZBRSDP1`xhtpPMm`Cxj?lPA4(fkh>tc<(c?f}r9Qpg$U5M|U4m;jl@NV<{Ewj#WtS z4K+CK{CU4zu!2Yk!m2~(I%>$M=WO-Cck4u$qrK^Mu(+l*rEPmF`-Lg`f$@r5-;F4P#^OO9 zX=WT^NrD&r>j}7Z1(u`llO?@-U~n3#{cf=~23M1}j+2!$Pw)Fa9#`U%IUAT9wwe>^ zA0}9|>a(XntqyxrGkK95umM2pkVOuVh<(t8&1Hg1Wo3A~E8O9fJ#VcThmK{9_j%=d zy`4KM_MRzp{>`z7z+?W*axY=Y;r_|$BH;NBLiYk3aMEGN<&&qgt1KJD<#r&7J?>3- ztZF50C!t-!^AZa$zKSKTBr|z$hDMVVPcz4~Bzs9}Aq!wFlPtM1{f}W95e=>2L`Se9%LG zDp|B148r&8Nq-!W@3N;RnP@)PQp>}S^rYx|rcIqDm)PHc>{BS?(8=SxfP@20B*+p2 z6wh-INXch@`P=UmeMnWXurg^(VNgdo&P*@_Ye4jZR^LgZW=`J(KZqNuzSaA_}KByPfWS3 z3LG8TW9r26Wt30ARBzn6)`Rec-__AfGd`z;Hnz2(PQgxNG~k0{LMG_$36SN5d=fK| zT)po7(ynoN8jsc@W5z$j)SpCO{{?@zMh(p3LPOM zG&VC5L9l;9IVxh`(XjJ^Pyz>+tH$NUgG$(_MrEBsO}rgK;z{CFzEDZJTnm{rq9wuH zqAi;dh%K95g4iJ$-=mV;=L?%=Wuae`nR?@n_7lL(&|xxM=0(E-92`8aOV=*HYfuCm zk>ig1Ob2|g`AjbquyKFau&b5RKDsd^etnq*$VSl-FOR`ed+{*jcg(+d49kX?nvMv$ zfy$nD;;F&7sMWAxBRJW~O#Nit@AsutWt}Mu-wn`-sEX+Bx=~$Ea868>#MC|5|N670 z5nBFO4xW%;XKYulqf@}pQ$eH4dzQU2HZAdbT2iN?vrJUg(_ud#a zdQ^cxJ`WlCh?@~&nll*rQ*5pVIJaD!9RdyzdH8urf@nGy6&qJEtsTV#*+}>`g9lm0 z$75_=y#lhc$2Fhu72kjdFBX&yajuv%QukP%qPW;|)_8AIS^HhfroQR7+}0nYbl-;q zBmGAkT@JHn6^8Av<3vu@C(76G?tiOR<4^v2FsmEm%l59eA*vTdF{Qs4=Hu+UZz5C zW;xGOME_tsQIx8Q7~1CDN);tonaML$4dnLq6UuuH>a6IfDR*6yJ1U$_|Ke+c{*MVZtVCV&b?-R!@?@wck1n`#Uw*?-B~p326U9t(D8V{t}NC=j&^M1~C>b8%+Gt z!3_p-z9Ip5qXV(NNU!6|Aw^8!K*sO%6x12+DGDH^cg#}>%6HFcMO6Kec(1LSBc@}7 z{*qZ+MG87?YSeLhGtCp=!8zuL+xn*59_&U3WM0FffhG|J;_bd2c|ukJgQnH!W(GalO^;RX_Dg)RoQkI2nY@{QX~vvRJaXud1KgQb zfEOe6!3jSie~=pn;`EH=nqyj^D!}q_@d;&_<4zTI=|Q_@J&pgIO|V$bS7i-uzTy)6 zk^<)F#4J~NH<(K4t1j?_1xFluLH0T@?DLB;Y|)q3*)!LQAV94@Us8)!u|oYpv^k*- zg0Sr(SKo90)uq{R;@tf73948xFs7RU%So5(1zO`W^8^hXxL7XI$2DumaUk@EW{kJC z-7~NSy>HC}Sf%twrr|qJ8Y=iCGb^&Sws{<2?K>|!>$meSKxWN_4P1(irFEZ0198+lV3(Mqqui06ywmMiAu!H#81_k&*!Goqp z^!9b}qiS6;mbi+z#6Rv@zpQ_}x)R$uEb* zn&@r-1!WlJ#M;wG2Haxv(_&uugTEHoFSKl+=!wr%ZhP-$NJ%{#oAQc-Ij;DHFz9ME z5Aqn?@zVnUy0{)TzM-0M-H0j_lrvBQDxXrH>wJO(4d=|$L>@i#kvkA}ZnidGl5QlV zVi%MsjjEla@|(4&)q7hq9Odok%uU_|sJ)+FlTI&ECDYVVZIJ&2Lm$SKvqqDd;Y7!9 zWr`bAhAhM?X>?RT2Zpn*`U+Du6dJS$CAm(Q{B5U-!^B=Bu8gd}e2fV@?6__F2dVvs znCF6AHV_oV^dP%5L#%)%BG(#bJY(Y%yJzAGSAiGeay5s2Zvs%4U7~$ajnT*g4lJI! z9XjnOj;O!kPX7(IXYR_-yocgGem64` zLPap@x$gln+w7CM^!9_6iAw*>+qf#Tv(8?p>3{&^Ar4|`ZdvG!HPBCK{ymU5S!ffEZa_)IedtgvF( zxbj}^CkSsuuN&Gg0}AJE;@4q$*t{8jLdZi-9(B`5%6csRls)GyZnbDVx9!QGeE;xB zU}YJ!qlVk@#;SApC)x4}(}tcm`H@*|Kc-)q<+FbaBOsipDR*39{w~Aq{NP3SZ-&Ui z7JwkEuBmEZRtYa0DOX~SF0_!*$qVh5))5flP=)93vPkFku>sf20B|BYQDYTY@5Hf0J%tTG z?`C?PvVA?E1?#w^q-A^PAcW>_4{bNZj^6+Uh=QE=l_->0TsYfUW-XPOGrHA!%gI!f zR2MaH8@s{BcH2(mouP8@5MU2;h7PmZ>$jBk%q==u?}6766DB1B;6to?pDGG8NvQ27 zyuoSx7ySQ-K_f9FgrbLl#Vq}l5(R_AZt??W5ywrvCN<3v*OuE0J=x6x&HGO$wdg=x zGNCYIhtLvoI>j$xP<$V2qT+G0f!2wZFZHI6KJQLHt7PrzWYJV1*X=ZjNd*7=Ms56~ zXUA!9#>=-P+c>3(s9@{sgeD#=qaeB{q=|i`SA9ZlNS1zt4zFjc zawv1nNS8eZ9nF6g{B|0_naH6X0_Ld&TRF(1&3-ETvlM&ap#uZnNrPyzVox7oEtnKl z;b4?OBNq#Vo*@!qNJDNOF592nrAKwqxwQNtvl?bGpCE>z(xZON*>I#&fB|zsKHEH| z=^p8eek1?nGPHFQ8s65p?YU0%tmA@8!dmyIPx8g%D)Y`Kp5v9BdUk25>S+Bp^PjP! zg_HDp`hD$b-Iz6JEOR{z@JJIMj&pd?QCI?mV>HyD5ZhE6@-57~@$BPo3sK^sv$>Jl z?blqTadf}d9hY5eQjN;Fz;+f?O$T}lpD7+;>rn1Lk>$GBDfILKN*2T+@v;nKzdp?h zO@I5$uk-0_?%Qu3Y7zjK!OyjY>aqt)WCDso;6CAxHji^4GbMO1sFPah;Ak~jNl}UF zQv9CGh(0s5Pb6?726^SSX}OiHYRK4@%>w=W<7`N{ljJix>PA+U+x0?M68YXnRfuVz zhsHMW|1R+Vx+~ftp#WOkFwABL-rY!KzEL=qYcWT=1(1JFnox~UXf=3O^+G2=ocDtq zAi_#J(B@@MUBVOJ&ykaJLC zYGzfD1_c~uEMXYjZ3`N#?eA!o{hkHep01D`ucsFBLqo_d7FYWOhP5O>HBk}Xf8j${Fs`tajl0H=nJ;UY=CXNNgpA~6928dw^nYVXXROQ8_$W z9GhfflJ#DjcxpSN$pIJVeBm7@J@T0bmElJHu;Eb)5Zc}Ab@sl}d7ZW63)adV0u(eP|L-(O_1SLLzh=)yK5yWfz(*OK*)G{vd|rTJbr@>Y z$Fz-Ssep`hD+s*iKsdJ9>O`5q>T8%~h~EN&m9ZUQBV>;;n=+NrWEOSmUi$V|-w@N< zc)MjMi@2=Csw}-XWN72fZ99`p$orNGu7~5oWUplzKrjV?iPPY0mI5fVLEu+Jy7 zIZTeY$6GGZd*tCrg@9BJ#l}la@hDz^!|VELm4*zNKgraDmxMTS;w4)ZMq~Ob`|j|| z{@^i*Pp}>=V{7gcc{H@(uElIPguA6erFqp^Oe#Z38PCt_De!9Qy&w)S*vRPgs2f$P z`N3KM30V>_Z@S~lX+E<8hrNMzPj2;L5d7T;3LWqslO=~{rh`WbTu84~oCRTtJQ2TV zK7BFBk5fe)q{rLEs%9in^{l{RFI713IVX$$BXu`eMpsy}YmCmj1bHMjGkNL?!hp)^ zpXNWKjD*b|OtmIV>o|BxOIv)R4M@W-OM+cQJGQHo~< z9(GE0M;Yyidy}S(=Ss|fHC2{2eaWsiEkKmj*H$s|+cp1^<$1rP)p(cr+`;Ly*h)Dc zRoIBI;zx?#wXt)BL$R$aGxp@&FgheA8+4i2r%g(KfJ+qWa_*HJUii7k6jX(9^#S8w zr~}@MJFc1hXs=Mu;%I5G5x?)9tF#+ZKA-@P)f1yS}JA1yIq?qVTN$ z{z`-!gFwZ<;Q^UmM@*)~v>g)`HmDsB8`QrMM#r37i~+XskaYVf>8Zjuq-rmwNo@AC%SLiO2V+Hc1Br7F^oqYDqZ zO!A5DP+UQ9V?yGY=7$v7+Ta|b=)B$prU?*R>z*(!_uchl4Izg_qp(%kcr+0q%66AR z>8}fMkn=x)r?}fAoiTEGMl(A`Z4LnLJR7}0k@w8Dkm_OVx1m9my{B^~c zgnd&HVpNCYUfS~UasmhBg)aLqucT+(I4YsO9{+%JG)j6rJ48tZ7QP7ipFcgn4kii$ z(Qq)GWk!t?M+3(PNN#R_lD~=XmDp@|WNW=G$@wMKUO9KPt5Y^wJJ+Hh)OM_9IjtGp z>5oeQLNf*(G+_NJkS}xnjwDISAIKKBUr^l;(q@k!xE2b2V2Sk4m~8tk{_vDj{7%<( zocGqfe}&+OCC9Uap{tW*j6&ajU6S`h8&$P|jb;W+_hQ*{4##4UhHLl$l=MlUMZxJ$axCS~?77h9 zvPj}tbJSi4gOt@Yrx-2U+>=Z)TiPn+)RqJrPtwX44FRZpJS_)C?+AfXkNgchmMxto zOTC%_D!E1?GkbE$^)Pun&JQVyKB}poQ^L$DY9@AV0RWUH~b#cv$SqJ4N7{R>R7hbnrO z>SJ<4t`X>Rk$Xw-T6a0L>Un{HJfHSEEf~rjOG&QfLIM#QBg@d*qI=_dki9hzuLLUZBwq5-<$CD#mS>JH668gH+ zbvT7hr)_3)fvIWyDvdmN_E|f=)wOj-u)pA9TLoo+zq(TA4lDPIlnCgmgaSOjoxXj1 zmL`mfiZa5if9bpUFkOY^9}TiHoy&3FWUq5U1ie78?>Fm?mLa;bpf6c(G(Z4whtmi~ z4o((5=!&D>+P3xX-shkUq9W~AppeicU_cwCEuIrR;kU}WkSYzk&nc|F5*!9e8d(o#ZV_Q9vfg zMm^9A=Iq09paS&2c0ETth#~p={iw0*Xa%PAhsB%ercHhWLO`YXoW`^=L@(u8)ZiSV zbPz0!cBwp@MWX+Xkadu>YlyVW><)vjO@tp`p2a6Y zfU{O3<#rlzaq_!Q*-Lp_^yJ}E=AJqrnP=+gKit9g76d(eGn*e&m8wZ)9^V05+c zR;o}$HnDhsxD)pNxEa^O?C#&oet{-5Mz|6qX@U8ZBQsUc=GFe76~%P)U|fCg@ptOV zbST4QBMtBOvDTYt(vmV8NnfAu1qt)@eX+l5GpS%%_RP^S(fn?c^yE~FgBVxAaXHqS zcg)jNj4l+h96C1oP8H(zDb8o(W$NxPle%vW95m$KK+b#CIg|cxSsQ=kxHyH%A5)~6 z*~uiNW<`b(8vv&8-qqi`3s_8{jt2S5Pw#Q_$3M!CUIQt>8tw;P_u453tZVZGEdvfO zTIi`;mxkydjYKPwJ-eZwt?&S&6Tpn3ch5v=M|xoRpXY9~5Q>T#ms{WspG)i0@^Sjy z?|48@1_@sJHg@Mlf)a&x;13;gO>O!p$-MBFi~O)2Y^t-tz)(X%xB-NRXH0jOfwf=K zb{p3ATQK^EK{Qu1-D6M<7#FPT^q*^ll0qp7Kgq#a=Hz||aApV*1Smwx{}=~az2rLH zR?e!idQ7q48ux-WG`#M8s2uSzvb z$1m<^01%SxY3hIYLWN&Bt!rhuT|>m4FfEMo3K6z?YU=Xd4N}*=!>DL&$}qZApakma znH`e}3?InEDX#4-dJEz~0z4__F-z5o@JTQHR!+r;EW~~opsw{eM+f=_k*HyaMok_d z=_XSl$c(NHz@TD14UhWA5-f^K6wtTcgy88^sqD!JD>Ov{C>#_K_@owGm$iWT@GmkWI2dAU#F z7btVdTlwE~!O(jDA*a4CKYw>_Y&#d8=ebGVhj>p0se0%C?&E5-W9W<*%Xt(>$GSYAH*5U5cR)^t8So~I`Wh$)ZPBd9F%m!5bR0^TIa!jxK*XA2Xz9wx zQlGv!o`pHo5d}EM2xqH=hCfzD1de$`=~+ezmSnNHC4GDFDFLXAOM2@Hm5w`Q&8YF2 z(VUM2!MFTk;E9e-K=X|B%;zI|$6OU->S~r^>;)1=> zSAz5VY?7sRNEAyZHZ#BglELCTA$7_OFcJA0LmnScGFQL~?A7!G7(0^ve1~h{LX8Um z%t_k*qxIXS9w~pfU1?N@{E%J(P2)=P^_9f_H}|t=Il@sIJB%{WUaAQu2$WNMePfdzw6@@J&s_d>y4>lwDyq~dJGBT z1$Dby1v@(z3$`wFlw2QlOPjB+ZwhuU3bX19qcUC25$3=8`J^B5f7*QoxGHWnzM?6s z4fnp^`b=aC!g=paP)S7x!S*yFVW;;Wn$yzbywdl6eEQK}mpC3|=l3V7iDB@Mrg39B zAjcmZPg40eQA8fCJ8R?hOr3Itj=`hBJikwLR_KEK2M@7$X();OM?tQBiu(`IreUJQ zDrbxe>hORwLW5xQY0jfR+`VQi$BHNZu2-EW7T)q&v=u8%(u#AI)d_-(s9~fr*>d7@ z^Mkptsd<+t=G8I9#TB^4=+R>L-5*;aSVt7PY9a; zrC;`TCYNbGLD3~8On<8he$I0aR(39%#-at9^O@n<36|8@V}#4DxW)DV+Ga#Am}Z+E zZJ&`F`-|C&hQcq_YMQmFE5f}xQ%ueO{S7&~Ign|vr*pK@o#FWM68qXKV3joa=I~3| zU88u9vvlnDb{7L_1p>`=K%nERG8U%}mT$qY0HQdl?YJiY2FB0$DM-YrbFp+NUP^HZ zw+A_2{k4upLbkeaV#jkwJ?FIFi5RGUHPgQ38JG(mePN~1HJ&pUAZ3LxESs$3%le}b zNA~iKgw`X+g<}fi$GU%SyZC*lf?W*Up9CT}nr3O=zRf&onNJqE1azJMjj;8kZRAid zJ8o>(5O=^i>U&g^CIW!Tm|HGJhTQz?oRG4SvaqJm6yNx@1xN3<$r(sHY14R;##a>8 z;i&k7jd5{Uf$haF0oVT|Uk;)}@WA8aJrtB*=HSePF%8G~nO--@u5O9r{1!AbO5q#( zPz@)l*f?dQP!6yz#QlnWmB}#C_q;B+#)jd(_ZPob&op@~863&Q?OQ%y&*lB#wY4|z z-*x&C=L_@ensVQbJ;a9C@oLZ1bWG7-WJNg;5G+I|J^lgnJMvOus`?<{rH1TpH)a$A zu!oq+@>&k*!ZrPk<0oXTwjY@7z+rHJ+|UV((g2&gDtHSxCsIBb)K=lsUEOmhI3n{fPeB# z@1nc#x`@Qk5v!~-AMCSczHlFWT37S*dS?S=8a`XEOAs%cyf!6Wo}tRjfA-R>ChNBm zQSooVmo?T>0;51YP|YW^uS^`ydQXQI)EIpwKOX27%C$@+O3&5=eUJy~1jc~Ln%8(r zb+Dp=#r|~bi@KsY`CP_U6lH7)Bv5d@Go#0un)di1aRkm70cG@p6Qy68@Sl|^1BpQ* zOXni>_)`7s*Xt;o#M4EMj_TF2$x?)r0Cz};OEUp~)A8hWDMi1pzuiuwcmT?h@aULl zY*OuKVPVhI|I}#KVNLz-|KG-l(M~!COr!@$hm4evmWd#YR8o{uYK#)38wF!XNDan- z(GrTZbf>%lrKP0d%jdd&zjK}Q=Xu@d-0`{}&)0R!Cm#mlF78_2GKKv5-YeB@X6Uj2(dQ0(HaM4nreUp z>cR}`Lso8^;IFqIdlz>(>p6G8Yx1^pc^&xPPBPa4JWQi64V=oQ5F zv=M1#-l(62I9=Qo2)AW;q$aUCkxs^Bw-qPD0RsZxaKI8M!k=jzp)3E7fR%|jd$XYbJORC+{ z2ZjhOKGY}G@4lyBxjWHH(|cc!9G14cG^aOSY^gAUBKg9ND1RN-N#BAcD>2Q#TlP%S zZCN>+VK%>|uP&^e35P*O&+D_#TZbG)Xk3&mnU>@b%d!02$zYg`K_#8@BUT98bmkaB z|HhIhFQ!R`x2hv?AqMlci1Lw<1DX%V%^_kGi=@&mjoKV8fGSW>M`CRoUoVnoCMCX~ zoTtw4pAUPApV?<>E~QiERIA^##XoO`Gg;dityfvN%xL&@6|ZZ{<&Jm zQ!-xU@5{53+Y`lY2qv6%CUfat`W0Vq?0*hg$%W@3*y=8G6`r!OtiV6d41Q2H#aMB~ z#w^7&V|s|IN`GtpM$VTO$dg$uJYEzU}7N1jGQJHpWC1yFyiT8Ip({OBNZPf_hrBf4E& zj@D~uE^aq^fsZFgj$B{8opB@y!#H#IL{H}B+|Pf{lD{^Ty%ne_FgqLc%xDtH$m>8j zP7h}mWlCfy`dZ629-J2c?VZmo@xVu?C}GHL7b&l*y8k-X0N3qODpa{3CV)1ZmkHZb zhe8_uE7VIPU&h9~sQVGMc(Gy8#0F<=)3!KpI{$<&vV!bg{6;E3Xrtp!2hJPkF%ma! z^OESq#mR~5M!ay%LPx37Lrr>T|FAM+m?yGkK2ut{lxw9FWS14p?N>YG^dmY@C-3Jo zi>46uOd{vr@qm1ad^X27hV+@bNdMH@IET2;mh!G>rwkBVk7`P7#cqP_c3X9d~CGa?f}&V(uFngzEM zHQQ}73l<8XLMpeN|V8NpQlHru*De8`rh%U|C* z?#!pY6H3X+Te8$g1k>2FIg1ANDZx!-xpAw-ab=~pxNP+3udG2eGidV9Mm<0_-ozth zE(JS;=;j|F-OAZ+p@4Bd1vSad9*~pB`NrVM`BeU!c6nGQtvsxd28n<@F33U}qTwQk zGEeH#yFL!>W9!{AW>3KNM4u zRHp;HI;3i_mZ>a6s8xEZL{3^1V$$vY0o;VO0I~?%2wNXpsDr>ATMbKJYsSWjyeL9^ zIyl&=faFP***2~*trx5ITl@dd0)X}o{nUKzCSbr9hu%QWb)1;BJ2?3&kB7(t6;dpc zl?=JtGf*1E_wzTgt@()l>V~Nz7|7W9M=dBu^#$8&oQ`!b=8dL7hiis<0!EnfG0N~^ zxVC%pdVwEwkkjttKdwin)J!j_i~S)$u@RZuysp&x{#Fr7_H%fb62j?|^~ZAuytKvgq|KplnVY_&`S|j-x!2nN=zc+kw)bI-lRL7gZvl0X1aE zs+#ms=U@MN$yw&EeQ~Sw#FQTxhwl*A7WTSkC)<{ygp^dz@L38r;BnV83dkRa;Uw3d zagY-Ck*27hW?tB45A(sNAo>%5(kIYCQKP#D0%2wi3MBwJ5nbdBZY;P2bYtgRMEb=f z7j&}E!guW2NCenLZ+tsT%4TZ&o*w9aAfXWuyJxKpYA92{xl+XYG0q3=xIh4QUUVN- zn!n2=aV|1vF79ma4LBDr?UF$s!k(}il9t( z+X$u@nC_Xk1p}(tP3hr&`XW2AU9$X8oL%ja2o-kK+OOC78rHsHJL&~--KdBtfQ(~> za0GJ5=@xL`CW%-!gK#5eWP28vT+$hWWbXk2@OtFt@(48&U7SdpSvKd21`|O2xb@oQ z#Vmh>G}!ntC(iKBq%bWybx=X<9w4(Dv1Ui$sY0e-=WbZX)s1l6oX)OJkuW0&4mo{@ zcK&p=v=2Z-krJvf2-DY-u7*|(s#BUcx0!PL(#k&73us~8IaKG5p(`7-ND-85^;Vi` zH=YKkPeJWfquCN`&S8-aGB@8WZxvz%1D7j^KM>84$KN5z!EoGEd3s!CxuCoYF|`Q+ z`Ma-ydggSgDtHUrCGBhcp=AEeJI2{pdmD8De;$#dg498yy%n>hp;T;u%#Tr#x1#JRoe8@byCk)q0VX&I_lI44s#@ggO^FSPh=N4u**(!!jb=G2yon!JY*_t zvWnHIGjYh6oC+8Y*xir5!JAe{mc5lh3ViUmyFvq{DD=}@98c;NA*4I&G1+gOuo7Mz zpR8}S9fQ`UUw&*mH9%Ax4Po!keO*%)Gb{=>a-27s=q&leN>map&-(R1epm}GMldBWczSCHLER$| zmW38s?W)m58nnp4O^lY+QY5vc)shZ>)1P@!Xiza~TZa5&Ozj|-gBD%Cd@ikQmIT&i z%55QF$MWt;VHN>1LC9WfqT!ndA#BJPv7f5I*A)G$EutWtOK%aL%%vE6T>l$DND1plndhbUXF889LRcQ=5mT{_F@{uf ziCpAMnC6G&5dh!3xI=+^9Y+)ib}!DHIUI6Y9d6f(KyfhB$mLZ-v8y@rx54{4jMdg1 zzkA)&u($0qte1)=z$Lo4_ws)!iRS7u5H#YvX1a`C>Woa^f4&8+k59xLj zU(;u{tA|`@q*-VrSoqfIVI%p7wyZQ)M-@X;p}g73FImnQ8`eux!PQD8R?o@pU)2P~ zq1SVJ$M-%&BGnTH{(j;ZuJ4qV!#aqMmP>0`W#L|iKch96& zuMP$Vr=_C1L*>-1wN z&i_#wI(8=8bC1cWw&nrlXYqh*V!2P`SKTrMHAqps8?Iz5Hw5WX`zlc_oT6ZE@fcG{ z22*fDW!PnHOVshClpHU8cs3k1{7=W?9w{6=3f_B4uAA3}x~$Rp%^i;2>M&k$ow6g1 zXUU#vbI|3>dpTUvgoc+*eCxZX)~9vcgwD(uQ_^c4K`2B1kcL0^#S;TVgosPQ#UZU8 zqOcvR2N0)z%bUWZfmg!Hhxh~fBF0rDKS8HF?gH#7~ z9KXXCGi3`r;dUT{%mS*;+sJ8rTaR!rqwkOFdrGwZ#DbDPOo`}kM~-JX-KTkbm4|@Y z*mP_qJ<;$YTRnyz~F2W)a(vuIN9 z=!QFdk%r|q3hjv3Of7xGoOw)~l&4(Quv2JSAUi5@7m4~d&7w`d@#XYw|-@&8oxYV3f7hn&g% z)>BuN;lP!a{t4Z%j$z={Vd-30a) z^hPTQk-y6!Ut;qO2=KLz%K=S%5Emotu=^`*x_>_f<#r%m6k#5;ADgD|+uS2DrfN+Z zNd3wb2NdW^*dAON*=5?F+w5p;Y&TB*D9KbR`Y$Uv!{|X5MZX~N(C_it`U0_nGm4LN zaU4BZe|6WXnI}uMmUZlY9KM{v?+*!;UjIvzTVq<2M4WqgOdbyZ9>M#niDPgt>egR+ zZBT3mCSYB;NH+aF7(jHS|8u0Cl__`RGkKoNH@(H*{OZQkG)H@}aI#Tn9C#gI-6Lqk zw59Ft^txhJ*9xFNG+BQ${fX{gQe}fKOmA?ukuohw<@0ulM=@FMvq%g%U-*-oa}RCX z_Ryh_i>jw#C>m?E1EC+h3awvn6xAr#u&L-FmC$-1eXUu{njdcJi6?Ife+}0hNsx~o zv-sjpvc2xjpt7!0Y-nrK`70QqD~oLM4D_Pu1P)-z12$AgriYG;%_@n{KhF1s!;#h1 z&8F|vv{7B&&;F+hpKqYx`!t(zYI4vn=}7Cs!Rf}@;4cMo1XU;I6hQtMcO@VpJvE992uI)5j(Isxb$%MPSkO}47DO(>cm4#Y^dotpTP+D*RoTA@zkl( zbq0dX&2g?J;ZZZx9da0ErlPOg7D!k?hbRx zGa4CJwP|`1(l3S~5s^27Zfs0TkK4Yw!P#j{s1KROv(-U&D|Afles`9 z_TW?a8XQnVZ+9#ftO~_~J(M9#HEVhxuKCZl`dhX{W+Ytnd8b)ew<>0(sO>Wi<8sOo zlV4Yiyb>oQ=9>s~(KHpiITKBo(>Yy=+nfvQw`J`j3tbbmd3&!xGRba6PAljiY_^%E zjcwsi^`ws%fyewARuF2!$$a}2qpdc3`|gWmod~Z>VOdEF-1yO*HjNn9O2y3=qQ8_2x2)`cB`?3{1oyg^I}@7Ra-m4o`4 z1k#k4knt4DJmx*t>5BO&ngwV#ZbFP39N@^E?!1Mm)cjhN8;wtibgK)aWj-LIJCn5u z)SlpjPOV*Y3oFGf*b5NRUB10i$|;&5q8v~6PiGd#$9qEzk=Ig3<$bR3S$P}j`}+e` z;TQFAfQ&&{JSq*a=z$%Bn+TDwFi@scO8sk3bBs+F6PIpJ-2ecFS_O_Yyf1nk;Ivce zLT`pzp7U^a8sT1UbGg*^uHQl0Mf)xfFC-^aX$=$NBdm`lRt> zX0>Yz`6cu9z<1Uj3Hq(1aKW+wITcTCmJX>dk|z~!fc!A4 zE%?Kyr#p<3Gv|La=l@Pj+~8G>JsuT~ymKdJyN>KvA~%(wpe31+Ib*iPsjLjd3E(Ps zsXPo#86>0a_^aYLy9P{{?oOuk2t)URe0eT_e3V0zn41VZq1tPS;vX+2{32Bl8BxdoeDmOFI8yIjq^6+{uIX z*QQvzO(WyapTy|6aBRPQz(DEot@oUX;Bde%l4r~S`uTLueAAnQRYNW7+Sq&LD-^=8 zP7D=ydU#~e)K}S;VbvN&+di>VH!1l6}o@$F* z8o;e9`<_Cq=lB}-*~V%LG61~DHO%Qm$#G*jlWubVVLVmY2(Vd_3yzf`hfsw_P=>9! zI^9bIoDA-xC^cd?hB3U|C;PfTKT)!CI&P5rC|`dxVdhQ0p!=wd(3%0dk=;y7ODXOU7*BwVI0!wyRn^YOLeCl_A4q@J15!KDioMhx>{1&WeLj7He zqjn)td?yIOq5NcuAJ&IyyD5fg<#{riJn>Bu4zNp>1y1TA;{o5_Hi0}eJf1_l_S=m> z5%Ge1D5PPW;-M}8hGQqsg@n&FA`1(Xn}fl=m+Sa?3l|y=_WUdfzUEgcs>YIc6YVxo zku$XdlMT#m%iwT-PWZApTeg}b!v8Df@7LD~!Zr4JAa(v2bmx?lOj|`Q>0j6dVA2ml zp6uMU#I`oAG@QW-?uN*FoM8f`Ih5b@GQhkh_QL(49R|paz4U0gnMdTgvcqM zGGF(?V@O-DvKqWefCeAVVND&KhHqX|I>%qv)(VTRZdj;H))66p$|)2t7w%7!KjvT_twWZ7qcUg13Z9|Ht=0;$?8Ib~LNIB3C}{cxc6uDBpj zc57{dqV0C*JC+}`WQ&iVFljCIDN{pDVhKDDM#2uzggWq-%5d84u*1U%e=C#QCU*~) zcw2;Y=nG*CLHmraF_BNL^6@u^X?1VPJZs_pZzq_of39)r_X4pD%){cz4=E~|;erZ{ z&YD3dVaLmeVgUdG=}xRrgroyoiUok}D|r-zuZf!n!cM;js(5w|WyD_zyp9Ly#oP6= z_|BiQT$dsPR2!!kuih$6T*FdACd0P$Kw7TO0{p;!ISc=Y#hWb;cz~n85R0-uMT2YU z+;ou9M>h!;Oet67z!|cuX<4V+#{7+e8HeS+)EL$Atq+g7C)s}dTS%&;T!^%lT?ahW z|Npl#voeb8NMvWv%F14mt;6AL=gf=~Q8pRbTiJV)mA$f)l}$qS3jdRD`X1kZ-|z3^ z@xHqc_k4a{@8|pZe!bpr$K585h~P@_zROsYW(;=v-uIaPdmnCBY=5Q`WPOdWgsIWw zJiyQ0Y29Wf%O82q6Dj}UQ>xH#y8RiQO7F^{x=h8=n|9G#3&*j0!Bh+4TIig!`b@Qio5b zRlTfR3)(N#w>dRj*5YTL2Md&|eRy@GIc(VmL?h=jX9;Zzu8!Aiv2=X!U`EE^V*uV#vhP~6{;*mN6#%o?Y-aEaU%(@HiS(mJYH0i$v5CGc`$(_D&lwK z#s)J>*byBD>N4tz}c{x9n0 z$MC)L2XKk=MA;d9>^9rfCgREUzS8Dnqad#lwWIT(7Roa4@GxL~xRyCGCu(s$C_tqhlB-5h zeXYQqfb%{vt+O1SpPjc~#|hYI152E|E19ARH$2E%N@AzC9goe0eOnFp5LnJ$SB77v z&`$?Qd0={wD@x(?Z4i=-tn>pJWwLsykdM6NK#8llHgAK$^{eNI`uBHz$;((W79T^$ z5v%QZiIwXyj$*z!sHGe`w0=rPY9*c@aP=Ym$bsYI`lS;^s{xCu&OY-|QGEf~*ztSI z7tBsYBIC)|LxM7IY1%({$+~qbVoIcj6`!SNks!<=IIuQ==H$>y#qo!mwWb!-q#?4v zN;*gH-k0+D{Uxq!QZLXO_tl|w$`2;w0T>_q<}nDy#EO%D#Gu+uX-(X7npF+smqDe^ zK2&L~D-rjr$FZO%B^?tJC(3HHcD`n@hr&vEGl;P!k;>pi;n*9?o#aGVm|Itx@r!iR z5U;p4zf7@S7AFD??INn4woje|m*clJlH$&?28;uDm5&j1+!2b4iLWKo!mjgiL?=Yp zZVXxV4k^S%cH&yS>gFv6bj3!+1_Mg7-*?ZdJnM5e9kbccojO5^B)f9U@1bqED+bRf zB9>YHG6h?))Zza4t?#YqgT;lSj z3&akqt8_qRm%{MxF+$`Hf^rWTa+?gfjHxZVThk2!y)$y#H*K%pdJu1!z?GZ-J=*rl z?eJ^g$P&M%%|2xlWL0m!p~CHCIjr}_7f2_ziFoTH*QXrAAByu8EQLeUHBkN`1GAEN zQ_-!dFJTTAc%+sFKhhw>47BH$RB{iq}$=F@Xyy!!k`=hQpl&y60#^p6)!G>wzt)4bp zI@n8%kJQ+zwIk__NAF5+zt!HqwS)C`75w^DCIX{z+7Yd}Y|aSg3%c|uX4tzleVm?K z>5OkVuxZ5QwidyfeETfmh$lu^|3!SYdVr)q+Ff4WzEs zeBeh&J=Bt+HK++;bp*ke0reAt^!&3@<;reqNm8}WFE~sNjxT&WYcOe;NAbbS>nmBh zG>g0&uQZOpKIuT+Ng?^eHQ0O9ukt*w63qUr5u{TnV$hq8dF)k2wtql{tzvTrXSp9l znIh&-b#i0BK?ipUC^ygWq7Svcl9am;rQJMCugLF_`STjO_pf#&Jv$!L^%%Ur+bo?M z@KuC<$#*IcPn>b*<24afBTvF=!ihO ztct=%V1dFE%5IZDsxJWuJ##OnX+n~ns#9? zm3PVjPUOr_V7~%-`Ku1i3D(sADg_?aaEL z_}nQs)Qvb=yYp?zB5wQajr1?vNK$ec!|!4bDqItG82xLa=*W^R2nmyPlAne|Ep;x; zqH$rozM_@BCiH1~Ul*}tpaq>iaKndT1S0_|=FCVGA0cV-c$;Pmh-)CJ`?}ar%eT0t ztf=$acHAS97Y!an+L?+1wL0P6eQ#}QX%=fAj+hb)GV&~&@&`!_OL(Ym**)`^WZ*>4 z_|ysJWn(A}qhV2R$q(a|C^S9PrmBT5MjH6FX_m>b8-41Y-p$UCV(Q5L_JEI)Fn8l2 zl@5*J)O%{TrX(}8Dg>dD(j_5E++rkbBJ2$!bh<&&q(<)8^7VkFGR`7p7w9|DyhsE} zMHei>7NH7VD+_dR$K8=OWzTZn$dh{dnc>{wyj&^5ETUago*3O8MiYwhl>pRbd73m) z_X<2czD-0g^!m|;HeS5Kc>j@HMsuj9Wa^AFh~aYyDqVrJP>E;!g5he!#|1+^8jR(4 zkC|%a==GTeku4=Do~UOuIldz4vsy19rspvD)Ir-Fo0k(lUW7_5qQWUyQj^LCp(Tqd zz(JXW#FaeNM@!dBf`VgP3KVr;o9r9%)A>3O>JZ?v1(H;NAK61=N++5y`{dOH?Yp|e zW^@(ncDI)jekh( zx|i3Vz=qj+)my|x&-` z(|2!nN`qq1Z><@+ugo*8ev^Mm6%2_SpE6cVga=~ls8^p+n$k7M_p?KG`$pMzqN+nlgWWT z$~UlsD^<%@wS7-T=<7~Khimt=Kh_dP4c=nnTgN<49V|PP>n|UKK^{P zc4CZ~T#tu*{eZ9I(kt5l@#MTX5QOBmSky;J@L|EKk4&?rv0Vy9K%OB!)2Ah`mp5c3 ztd@-;V!pglVJ(uG_sv4BKT%kE>!GOjebaAB5*Vbw*Pthmw)tb#ki^9YGGcnXEpGd8 zG)kcEc#1YEvp_t7l98+T>mCVpv+-4&<&~(XH9BEZG%+C_)9UH(Rz3;c6BP46Eg=qz z8h;l~cR-9EL^Lc>;MjRHh+Wo(ICuVGCC_0)cCB-tFKZy)&Q~yK@w?WdQp3K59rS9{ zhw-c^91l{ha-C?xM1oL-E}>|*JWf73qQm3(f)eCr&ps+1Z#$2#8Xn7*?5=?E*2*Yi1=Nuq9Yx1$*n-5Ec~{7y)?n+R>f zN!I;dPjUTC||Bc+vLma%1d-Kt90ww;FXAFs5}EWK9wAi-qe^||ufr?*&4a@S zuk@8#KSf$;7PjL;#FwZ6UTa?8K3A$e+AYfIqr>b1{}fh-yl6DA=T3clS*s!;$k6Md zjFkaczgTQHI%@D^-dN_AX2?UHpsy9POcVD844zPzZ6V#;(^%+H#-BptQD^px50f^> zW7=7+k6C%==B>O%V1^~20{b;z4;pHA?*Vmq(v`-&6>S9Q(1CjqLZ9R_&JmzIpXi-Y zRo4-g(2;jB54bDum*QcKGM0fxm=y)MA#F9dCKRvtGMv+`QSZP$9kdL^HMdYfh)pw2 zx74Zdnr<>?XmQ4z-pUUW0h&H!;-Z(s^g9TW?qRtnw}NDjxQ9$uJQOH5@8maC-xL<) z5p~2Y$W=VJ6KLEYbiBfa6#iv~uBmk6OWI7cCt2LvikDfb9Y~wm+8eHF_@hwO=*ojy z@4MSj2EZ1L$aqZ5bx+KANM-%RAMO*jAsLdhU+35W$W2m`Ue$u?q>1%cM@mvPTtKNx_V3~$IN{u&JSL$8W z!pK!uKMUPoJ_s$cn!4T=jjc*H`-T=Iao8m@gjf*;;vP4)bSd>;Yd>`5T@@@JT-cjW zDANkFAOS08yrbkpLJm1r{+hvgM#!^Kbyl+cIijVog5}A0|o$IA!SGnI@ z*I2f&;APZ{#FJIRHxgxH`4X!plzx-Hs3xW45ucUeFoW^fhw&6;t}agQzGNzUH%$io zqC<=@tD1_};ychni7l?l2=F4*1g#`3X0>c1Br!pkz02x7J1Jyd?la*7dI8jQanjZg zki@nmx>=^3kXz^>HKExH#>7;fmSQadW;SfGh&&7xPR0%gKZ>q26Zw26V5D;0Er0P= z(p7NPY~)9(_moueA&O=xE??3R-3Nsi-!pApY~4#5r6N+kJR8tvS(Jv0xmal-vqjs-terRJ*+}vZ1G0fytiFz=CKB;KTcb!y>twRku6`lCop`hZ zDZWQgj=V!n3R=p{Wa>fQboJd#8Zp?%JnRK;)=%s7E)G616lfV|&gqEhZ97?9B(&3JdfExeAx<+sOcV$7XDb zOIWmKz{#Swjd<-#M=|Izd~wHa&a7-ZRnE`z;7p87LW-IX1&PX($btpzEzvb>uXDAI zndrq?hZtuF7A-oD}@|omEu_+Fs)HMh(n<;IsrAHt%fWdm&!Z0l(+h)Ut_DepbxZM%CU_g7<=jOm8 zt~Z|t%f%Cl(ci)NOoySwA% z-}hwnu-f8?KKe0VhH@d!ZHPavzN#x_n1UN@N#XiD{Vvyfwf$Z&M?6bksuRMKS%;g` z4~?h!$=^h_N8L5*+QXNBtyW4JvR_noy;E8FzC2!07D~8$in2tU-%$W#t9)kF-ItEX zeJ6GnuwQsuTUUQjpW| zgGDFjpkCf{mD}Dg*L+dfmo}yNBd&`ORiN=%zvqv~&Cce(YKS3=GQPbClCjQ=WL6ro zl`ZQk+CtP^z#kP?P;I;tMw<+5pm9mYhBl54M}EdGe8?KVVN}d)zJD_PsWMgpRg5Hn@#<4qrs7kc%=R3#*X_9w|6bAL}GCvQATR{U9(2LUo>$^ zJRU~cCq-OsOKlwjE3|@uqC$>I+O2ns_Nc_>QrW#kdQR4JCWdUDFvrTIGn1?? zU}2*ARR5j&ecQJqjgeHX4QcukApZXBzNmb|k;|ruwbZDw#wdoOy+c!R+(6+Am398* zH^tvmT5h0M-odJI(sXP;CMJ^~SeM6JxjxOb3MhjcGIwnD8bY| z5pn_Xb1HXqnw#SZ!YU&=hg*BaCo0fS7?{O0_qP-x}MX7;#e++CT9^w{1OkI?+=KP%Kd``yB@z z^i*D_7oFBO{9DrT)=J)S)+q8v&G+5bUEyz9O{xQYRtUtuw;Udlk5LT=zR0pbAlZ=? zTYA=$B}vi?-05DcT_j4RR1k3|Eue9A$x6-}bsBw7sFF2hT*)f!Dw@9eS%x#V`H8`k z(kB7PNz!_H*a@x7c;9w2o?czGslhy%)oREhW&xGy9aS8;+-BO^j&YDwmw1E7HX1(i znCi7rY&-ZdGs%p-x0$uaUh<4NRo0a)dO@%~Fv;EY!XjjGjC;vSC;8dQdF+e}DV0|a zkPQudsKHUlnI|T8ou`i>RLvT8oLadOK*lGcYk<{l*t;kxp!cWoM(T z*iGH3r@)xzy@zX=bu!!JZVz_(x_GJ))aXPEZCrOd{2FKQBloa?LCpat>&o5pkpy69h zq9IyNU{os2uzuP3rW?$IzVOnM;5EW+Ld5%3TZ&>xXe|B{30hU?Ti-@nwuU2zFfaw0 zT6AMP5s1f>3!D|SDPKq`+;R8O2Sl@k;OQn_sRTv}2vW%7FV~#-Hg>-7!$k^KGxqia z4w!j(HQJyCq@|hl3%R`~cOKUp_>z^=a za2Q(HnK{4-2)6wr=n5Q2>J(&U{AUOT9K;-UW($NsK$iakgTK;i7|hNV2>x4e=s#6( zKS-Je!hYxoYgn-M>qzw|g*_Al+L}SEtXV*opx;uQ0gFs~y-ZGB1 zT|LL0j+ipiuMvY?5AbI_N#Kw!=SY2!r6EjJ11n2g2p9meg#4KXK7gWg8WSf&u+`sW zzHByl|2)nT)7j%x4}%MMbC4~B1>y+#JtfWGyqrw3_uX4Kh7soI40l!hw0yk1)itj0?%KvUQ+k0 z##J*fS>J@kaauBH&f_^1=ir}t46MLlp!rX;T~z9#-|)`)PL)zc|D}}qX-58e^LsvB zE`RW5^MprV>dn95i{SB>ta3S1z!%XOc>I4CmHJ$SQ&CA_OPw>j{Otc}!!GF*Neq4qw68vlFf_Ez_Y;|-d2wV>?b>!dND*Vqp|AVsdDK_ey z?^j7RFt@XX{M+L9cYZmweD@`iOZ~d+J9r92ShYUW=T{v6VTg#&J$D)f=Ov0?RKKU+ zS*ENCaejZA1Wt?OZ#hnVYjTO>XSu(a0WP`~-Yd1|BtMrL|DeU6@oVt-{~!c>2BL(m zx6ZWudHsJ~@4#mOIe7G6(O>GsWuwAp0Iz?f`GZd{X4MNzKN#I#o3cxLv$Ie_Jw&)T zVFM}#YxuDC>qzy$gl%fzuos8(;-%qphXo9NzE6X#cdhKe25{x~vbW*=5dU|AbEe;> zyo`sR8{KetkcHh@S^E2$`%HrNX6s0N*uHBS)_zl*`Wg|Y=J}ORYc~+KDZ01{J(WSB zSXSB+w#?Rn)qxwoB!u0kdWggJ59buH?E(-CFgFB10Ptd-1>&ba({&oasgS?d5vMFm zFlo+NYz=^x05Hf(-wtGM2n4gh=>DV%`FT92)14Pae$MoJSbjhHO?4I&=(7biVlM(h m#1`U(pltt{>TKr=GO$vVxdK~3At2m`eObfiTJG%W+5Z9aU}ud0 diff --git a/tests/test_resources.py b/tests/test_resources.py new file mode 100644 index 0000000000..2d401a3f99 --- /dev/null +++ b/tests/test_resources.py @@ -0,0 +1,87 @@ +import pathlib +import zipfile +from typing import Sequence + +import pytest + +# fmt: off +HERE = pathlib.Path(__file__).parent.resolve() +PROJECT_DIR = next(iter(p for p in HERE.parents if p.joinpath("antarest").exists())) +RESOURCES_DIR = PROJECT_DIR.joinpath("resources") +# fmt: on + +# All ZIP files have the same file tree structure because empty studies are similar. +# There are only real differences when the user sets up the study or runs simulations +# (e.g. the outputs are different). +STUDY_FILES = [ + "Desktop.ini", + "input/", + "input/areas/", + "input/areas/list.txt", + "input/areas/sets.ini", + "input/bindingconstraints/", + "input/bindingconstraints/bindingconstraints.ini", + "input/hydro/", + "input/hydro/allocation/", + "input/hydro/common/", + "input/hydro/common/capacity/", + "input/hydro/hydro.ini", + "input/hydro/prepro/", + "input/hydro/prepro/correlation.ini", + "input/hydro/series/", + "input/links/", + "input/load/", + "input/load/prepro/", + "input/load/prepro/correlation.ini", + "input/load/series/", + "input/misc-gen/", + "input/reserves/", + "input/solar/", + "input/solar/prepro/", + "input/solar/prepro/correlation.ini", + "input/solar/series/", + "input/thermal/", + "input/thermal/areas.ini", + "input/thermal/clusters/", + "input/thermal/prepro/", + "input/thermal/series/", + "input/wind/", + "input/wind/prepro/", + "input/wind/prepro/correlation.ini", + "input/wind/series/", + "layers/", + "layers/layers.ini", + "logs/", + "output/", + "settings/", + "settings/comments.txt", + "settings/generaldata.ini", + "settings/resources/", + "settings/resources/study.ico", + "settings/scenariobuilder.dat", + "settings/simulations/", + "study.antares", + "user/", +] + + +@pytest.mark.parametrize( + "filename, expected_list", + [ + ("empty_study_850.zip", STUDY_FILES), + ("empty_study_840.zip", STUDY_FILES), + ("empty_study_830.zip", STUDY_FILES), + ("empty_study_820.zip", STUDY_FILES), + ("empty_study_810.zip", STUDY_FILES), + ("empty_study_803.zip", STUDY_FILES), + ("empty_study_720.zip", STUDY_FILES), + ("empty_study_710.zip", STUDY_FILES), + ("empty_study_700.zip", STUDY_FILES), + ("empty_study_613.zip", STUDY_FILES), + ], +) +def test_empty_study_zip(filename: str, expected_list: Sequence[str]): + resource_path = RESOURCES_DIR.joinpath(filename) + with zipfile.ZipFile(resource_path) as myzip: + actual = sorted(myzip.namelist()) + assert actual == expected_list From 620b6daa917b20f312d9c74b0d4c63b1b3ddb3b5 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Fri, 3 Mar 2023 19:08:44 +0100 Subject: [PATCH 50/60] fix(ui-xpansion): validation issues in CreateCandidateDialog fix #1373 --- webapp/public/locales/en/main.json | 1 + webapp/public/locales/fr/main.json | 1 + .../Xpansion/Candidates/CreateCandidateDialog.tsx | 9 ++++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json index 36dea875b1..6c7bdc460c 100644 --- a/webapp/public/locales/en/main.json +++ b/webapp/public/locales/en/main.json @@ -107,6 +107,7 @@ "form.submit.inProgress": "The form is being submitted. Are you sure you want to leave the page?", "form.field.required": "Field required", "form.field.minLength": "{{0}} character(s) minimum", + "form.field.minValue": "The minimum value is {{0}}", "form.field.notAllowedValue": "Not allowed value", "matrix.graphSelector": "Columns", "matrix.message.importHint": "Click or drag and drop a matrix here", diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json index 4971c707c4..e0d3293c73 100644 --- a/webapp/public/locales/fr/main.json +++ b/webapp/public/locales/fr/main.json @@ -107,6 +107,7 @@ "form.submit.inProgress": "Le formulaire est en cours de soumission. Etes-vous sûr de vouloir quitter la page ?", "form.field.required": "Champ requis", "form.field.minLength": "{{0}} caractère(s) minimum", + "form.field.minValue": "La valeur minimum est {{0}}", "form.field.notAllowedValue": "Valeur non autorisée", "matrix.graphSelector": "Colonnes", "matrix.message.importHint": "Cliquer ou glisser une matrice ici", diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx index 445a50f1a5..9751c08867 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx @@ -70,20 +70,27 @@ function CreateCandidateDialog(props: PropType) { label={t("global.name")} name="name" control={control} + rules={{ required: t("form.field.required") }} sx={{ mx: 0 }} /> `${link.area1} - ${link.area2}`)} name="link" - required control={control} + rules={{ required: t("form.field.required") }} fullWidth /> From 49886530a98a7cc9bcbfb83d8fc74110c016c6e0 Mon Sep 17 00:00:00 2001 From: hatim dinia Date: Wed, 1 Mar 2023 16:49:41 +0100 Subject: [PATCH 51/60] feat(ui-hydro): update hydro matrices styles --- .../Areas/Hydro/ManagementOptions/Fields.tsx | 98 +++++++++---------- .../Areas/Hydro/ManagementOptions/index.tsx | 5 +- .../Modelization/Areas/Hydro/index.tsx | 7 +- 3 files changed, 53 insertions(+), 57 deletions(-) diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx index 03c4341887..fb8869a760 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx @@ -1,4 +1,3 @@ -import { Box } from "@mui/system"; import NumberFE from "../../../../../../../common/fieldEditors/NumberFE"; import SelectFE from "../../../../../../../common/fieldEditors/SelectFE"; import SwitchFE from "../../../../../../../common/fieldEditors/SwitchFE"; @@ -16,7 +15,7 @@ function Fields() { ] = watch(["reservoir", "useWater", "useHeuristic", "useLeeway"]); return ( - + <>
- - - - - - - - - - - + + + + + + +
@@ -119,7 +111,7 @@ function Fields() { disabled={!waterValuesDisabled || !leeWayDisabled} />
-
+ ); } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx index 18411c41e9..9769d83b2b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/index.tsx @@ -6,7 +6,6 @@ import DocLink from "../../../../../../../common/DocLink"; import Form from "../../../../../../../common/Form"; import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; import { ACTIVE_WINDOWS_DOC_PATH } from "../../../BindingConstraints/BindingConstView/utils"; -import { Root } from "../style"; import Fields from "./Fields"; import { getManagementOptionsFormFields, @@ -33,7 +32,7 @@ function ManagementOptions() { //////////////////////////////////////////////////////////////// return ( - + <>
-
+ ); } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx index c445ce7942..7ff71df67f 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx @@ -2,6 +2,7 @@ import { useMemo } from "react"; import { useOutletContext } from "react-router"; import { StudyMetadata } from "../../../../../../../common/types"; import TabWrapper from "../../../TabWrapper"; +import { Root } from "./style"; function Hydro() { const { study } = useOutletContext<{ study: StudyMetadata }>(); @@ -44,7 +45,11 @@ function Hydro() { // JSX //////////////////////////////////////////////////////////////// - return ; + return ( + + + + ); } export default Hydro; From b88d353152f332d5bf4d96525e7aea2f0a99c8a3 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Fri, 3 Mar 2023 11:07:34 +0100 Subject: [PATCH 52/60] build: change the `antares-launcher` submodule to point to the `main` branch --- antares-launcher | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antares-launcher b/antares-launcher index 142879530e..94d20b8a9b 160000 --- a/antares-launcher +++ b/antares-launcher @@ -1 +1 @@ -Subproject commit 142879530e1b181e9b20e26e2343b71ed3b604c2 +Subproject commit 94d20b8a9bb4829a8dbc248057f519f06e7f9d46 From 8137b3bb0f70151b1d4a9dd4e74327ee66fb2815 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Tue, 14 Feb 2023 06:21:29 +0100 Subject: [PATCH 53/60] fix: improve error handling when the application configuration is wrong (new commit). --- .../launcher/adapters/abstractlauncher.py | 20 ++++++++++++-- .../adapters/local_launcher/local_launcher.py | 27 +++++++++---------- .../adapters/slurm_launcher/slurm_launcher.py | 9 ++++++- tests/launcher/test_local_launcher.py | 18 +++++++++++-- tests/launcher/test_slurm_launcher.py | 15 +++++++++++ 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/antarest/launcher/adapters/abstractlauncher.py b/antarest/launcher/adapters/abstractlauncher.py index a9731a2358..2427db5b73 100644 --- a/antarest/launcher/adapters/abstractlauncher.py +++ b/antarest/launcher/adapters/abstractlauncher.py @@ -1,4 +1,4 @@ -import logging +import os from abc import ABC, abstractmethod from pathlib import Path from typing import Callable, Dict, List, NamedTuple, Optional @@ -18,7 +18,23 @@ class LauncherInitException(Exception): - pass + """ + Exception raised during local or SLURM launcher initialisation + when a required parameter is not set in the application configuration. + + In Docker environment, the configuration path is `/resources/application.yaml`. + """ + + def __init__(self, reason: str) -> None: + from antarest.core.utils import utils + + if config_path := ( + os.getenv("ANTAREST_CONF") or utils.get_default_config_path() + ): + msg = f"Invalid configuration '{config_path}': {reason}" + else: + msg = f"Invalid configuration: {reason}" + super().__init__(msg) class LauncherCallbacks(NamedTuple): diff --git a/antarest/launcher/adapters/local_launcher/local_launcher.py b/antarest/launcher/adapters/local_launcher/local_launcher.py index 84a9b6fff3..5b3a95ff5b 100644 --- a/antarest/launcher/adapters/local_launcher/local_launcher.py +++ b/antarest/launcher/adapters/local_launcher/local_launcher.py @@ -6,7 +6,7 @@ import threading import time from pathlib import Path -from typing import Dict, Optional, Tuple, Callable, cast, IO +from typing import IO, Callable, Dict, Optional, Tuple, cast from uuid import UUID from antarest.core.config import Config @@ -15,8 +15,8 @@ from antarest.core.requests import RequestParameters from antarest.launcher.adapters.abstractlauncher import ( AbstractLauncher, - LauncherInitException, LauncherCallbacks, + LauncherInitException, ) from antarest.launcher.adapters.log_manager import LogTailManager from antarest.launcher.model import JobStatus, LauncherParametersDTO, LogType @@ -37,6 +37,8 @@ def __init__( cache: ICache, ) -> None: super().__init__(config, callbacks, event_bus, cache) + if self.config.launcher.local is None: + raise LauncherInitException("Missing parameter 'launcher.local'") self.tmpdir = config.storage.tmp_dir self.job_id_to_study_id: Dict[ # type: ignore str, Tuple[str, Path, subprocess.Popen] @@ -44,19 +46,19 @@ def __init__( self.logs: Dict[str, str] = {} def _select_best_binary(self, version: str) -> Path: - if self.config.launcher.local is None: - raise LauncherInitException() - - if version in self.config.launcher.local.binaries: - antares_solver_path = self.config.launcher.local.binaries[version] + local = self.config.launcher.local + if local is None: + raise LauncherInitException("Missing parameter 'launcher.local'") + elif version in local.binaries: + antares_solver_path = local.binaries[version] else: + # sourcery skip: extract-method, max-min-default + # fixme: `version` must remain a string, consider using a `Version` class version_int = int(version) - keys = list(map(int, self.config.launcher.local.binaries.keys())) + keys = list(map(int, local.binaries.keys())) keys_sup = [k for k in keys if k > version_int] best_existing_version = min(keys_sup) if keys_sup else max(keys) - antares_solver_path = self.config.launcher.local.binaries[ - str(best_existing_version) - ] + antares_solver_path = local.binaries[str(best_existing_version)] logger.warning( f"Version {version} is not available. Version {best_existing_version} has been selected instead" ) @@ -70,9 +72,6 @@ def run_study( launcher_parameters: LauncherParametersDTO, params: RequestParameters, ) -> None: - if self.config.launcher.local is None: - raise LauncherInitException() - antares_solver_path = self._select_best_binary(version) job = threading.Thread( diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index 8cc2dc80bd..acc189c8ec 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -73,7 +73,7 @@ def __init__( ) -> None: super().__init__(config, callbacks, event_bus, cache) if config.launcher.slurm is None: - raise LauncherInitException() + raise LauncherInitException("Missing parameter 'launcher.slurm'") self.slurm_config: SlurmConfig = config.launcher.slurm self.check_state: bool = True @@ -85,6 +85,13 @@ def __init__( self.job_list: List[str] = [] self._check_config() self.antares_launcher_lock = threading.Lock() + + # fixme: use an absolute path instead of `LOCK_FILE_NAME`: + # local_workspace_dir = Path(self.slurm_config.local_workspace) + # with FileLock(local_workspace_dir.joinpath(LOCK_FILE_NAME)): + # self.local_workspace = self._init_workspace(use_private_workspace) + # self.log_tail_manager = LogTailManager(local_workspace_dir) + with FileLock(LOCK_FILE_NAME): self.local_workspace = self._init_workspace(use_private_workspace) diff --git a/tests/launcher/test_local_launcher.py b/tests/launcher/test_local_launcher.py index afc5708013..a63e79ea0c 100644 --- a/tests/launcher/test_local_launcher.py +++ b/tests/launcher/test_local_launcher.py @@ -3,15 +3,29 @@ from uuid import uuid4 import pytest -from sqlalchemy import create_engine - from antarest.core.config import Config, LauncherConfig, LocalConfig from antarest.core.persistence import Base from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware +from antarest.launcher.adapters.abstractlauncher import LauncherInitException from antarest.launcher.adapters.local_launcher.local_launcher import ( LocalLauncher, ) from antarest.launcher.model import JobStatus +from sqlalchemy import create_engine + + +@pytest.mark.unit_test +def test_local_launcher__launcher_init_exception(): + with pytest.raises( + LauncherInitException, + match="Missing parameter 'launcher.local'", + ): + LocalLauncher( + config=Config(launcher=LauncherConfig(local=None)), + callbacks=Mock(), + event_bus=Mock(), + cache=Mock(), + ) @pytest.mark.unit_test diff --git a/tests/launcher/test_slurm_launcher.py b/tests/launcher/test_slurm_launcher.py index e365e826dd..dc95d34502 100644 --- a/tests/launcher/test_slurm_launcher.py +++ b/tests/launcher/test_slurm_launcher.py @@ -14,6 +14,7 @@ from antarest.core.config import Config, LauncherConfig, SlurmConfig from antarest.core.persistence import Base from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware +from antarest.launcher.adapters.abstractlauncher import LauncherInitException from antarest.launcher.adapters.slurm_launcher.slurm_launcher import ( SlurmLauncher, WORKSPACE_LOCK_FILE_NAME, @@ -46,6 +47,20 @@ def launcher_config(tmp_path: Path) -> Config: return config +@pytest.mark.unit_test +def test_slurm_launcher__launcher_init_exception(): + with pytest.raises( + LauncherInitException, + match="Missing parameter 'launcher.slurm'", + ): + SlurmLauncher( + config=Config(launcher=LauncherConfig(slurm=None)), + callbacks=Mock(), + event_bus=Mock(), + cache=Mock(), + ) + + @pytest.mark.unit_test def test_init_slurm_launcher_arguments(tmp_path: Path): config = Config( From ebf3af442cca510a96c8cffa6f93477953cab9af Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Fri, 3 Mar 2023 19:14:31 +0100 Subject: [PATCH 54/60] feat: notify the end-user when an unhandled exception is raised during output fetching --- .../adapters/slurm_launcher/slurm_launcher.py | 57 +++++++++---------- tests/launcher/test_slurm_launcher.py | 56 ++++++++++-------- 2 files changed, 57 insertions(+), 56 deletions(-) diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index acc189c8ec..a4bc932903 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -6,12 +6,11 @@ import tempfile import threading import time +import traceback from copy import deepcopy from pathlib import Path from typing import Awaitable, Callable, Dict, List, Optional -from filelock import FileLock - from antareslauncher.data_repo.data_repo_tinydb import DataRepoTinydb from antareslauncher.main import MainParameters, run_with from antareslauncher.main_option_parser import ( @@ -39,6 +38,7 @@ ) from antarest.study.storage.rawstudy.io.reader import IniReader from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter +from filelock import FileLock logger = logging.getLogger(__name__) logging.getLogger("paramiko").setLevel("WARN") @@ -86,24 +86,17 @@ def __init__( self._check_config() self.antares_launcher_lock = threading.Lock() - # fixme: use an absolute path instead of `LOCK_FILE_NAME`: - # local_workspace_dir = Path(self.slurm_config.local_workspace) - # with FileLock(local_workspace_dir.joinpath(LOCK_FILE_NAME)): - # self.local_workspace = self._init_workspace(use_private_workspace) - # self.log_tail_manager = LogTailManager(local_workspace_dir) - - with FileLock(LOCK_FILE_NAME): + # use an absolute path instead of `LOCK_FILE_NAME`: + local_workspace_dir = Path(self.slurm_config.local_workspace) + with FileLock(local_workspace_dir.joinpath(LOCK_FILE_NAME)): self.local_workspace = self._init_workspace(use_private_workspace) + self.log_tail_manager = LogTailManager(local_workspace_dir) + + # fmt: off + self.launcher_args = self._init_launcher_arguments(self.local_workspace) + self.launcher_params = self._init_launcher_parameters(self.local_workspace) + # fmt: on - self.log_tail_manager = LogTailManager( - Path(self.slurm_config.local_workspace) - ) - self.launcher_args = self._init_launcher_arguments( - self.local_workspace - ) - self.launcher_params = self._init_launcher_parameters( - self.local_workspace - ) self.data_repo_tinydb = DataRepoTinydb( database_file_path=( self.launcher_params.json_dir @@ -121,6 +114,7 @@ def _check_config(self) -> None: ) # and check write permission def _init_workspace(self, use_private_workspace: bool) -> Path: + # sourcery skip: last-if-guard if use_private_workspace: for ( existing_workspace @@ -358,27 +352,27 @@ def _check_studies_state(self) -> None: self.log_tail_manager.stop_tracking( SlurmLauncher._get_log_path(study) ) - output_id: Optional[str] = None try: output_id = self._import_study_output( study.name, study.xpansion_mode, study.job_log_dir, ) - except Exception as e: + except Exception: + stack_trace = traceback.format_exc() self.callbacks.append_after_log( study.name, - f"Unexpected error when importing study output : {str(e)}", + f"An error occurred unexpectedly while importing the study output:" + f" {study.name=}, {study.xpansion_mode=}, {study.job_log_dir=}," + f" see stack trace below:\n{stack_trace}", ) - raise e - finally: self.callbacks.update_status( - study.name, - JobStatus.FAILED - if study.with_error or output_id is None - else JobStatus.SUCCESS, - None, - output_id, + study.name, JobStatus.FAILED, None, None + ) + raise + else: + self.callbacks.update_status( + study.name, JobStatus.SUCCESS, None, output_id ) except Exception as e: logger.error( @@ -391,8 +385,9 @@ def _check_studies_state(self) -> None: self.create_update_log(study.name), ) - # we refetch study list here because by the time the import_output is done, maybe some new studies has been added - # also we clean up the study after because it remove the study in the database + # Re-fetching the study list is necessary as new studies may have been added + # during the `import_output` process. Afterward, we clean up the list to ensure + # that any removed studies are removed from the database. with self.antares_launcher_lock: nb_studies = self.data_repo_tinydb.get_list_of_studies() for study_id in studies_to_cleanup: diff --git a/tests/launcher/test_slurm_launcher.py b/tests/launcher/test_slurm_launcher.py index dc95d34502..ba06dc29ae 100644 --- a/tests/launcher/test_slurm_launcher.py +++ b/tests/launcher/test_slurm_launcher.py @@ -1,13 +1,12 @@ import os import shutil +import textwrap import uuid from argparse import Namespace from pathlib import Path -from unittest.mock import Mock, ANY, patch +from unittest.mock import ANY, Mock, patch import pytest -from sqlalchemy import create_engine - from antareslauncher.data_repo.data_repo_tinydb import DataRepoTinydb from antareslauncher.main import MainParameters from antareslauncher.study_dto import StudyDTO @@ -16,19 +15,20 @@ from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware from antarest.launcher.adapters.abstractlauncher import LauncherInitException from antarest.launcher.adapters.slurm_launcher.slurm_launcher import ( - SlurmLauncher, - WORKSPACE_LOCK_FILE_NAME, LOG_DIR_NAME, MAX_TIME_LIMIT, MIN_TIME_LIMIT, + WORKSPACE_LOCK_FILE_NAME, + SlurmLauncher, ) from antarest.launcher.model import JobStatus, LauncherParametersDTO from antarest.tools.admin_lib import clean_locks_from_config +from sqlalchemy import create_engine @pytest.fixture def launcher_config(tmp_path: Path) -> Config: - config = Config( + return Config( launcher=LauncherConfig( slurm=SlurmConfig( local_workspace=tmp_path, @@ -44,7 +44,6 @@ def launcher_config(tmp_path: Path) -> Config: ) ) ) - return config @pytest.mark.unit_test @@ -236,6 +235,7 @@ def test_extra_parameters(launcher_config: Config): assert launcher_params.post_processing +# noinspection PyUnresolvedReferences @pytest.mark.parametrize( "version,job_status", [(42, JobStatus.RUNNING), (99, JobStatus.FAILED), (45, JobStatus.FAILED)], @@ -249,6 +249,7 @@ def test_run_study( ): engine = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(engine) + # noinspection PyTypeChecker DBSessionMiddleware( Mock(), custom_engine=engine, @@ -262,7 +263,6 @@ def test_run_study( ) study_uuid = "study_uuid" - params = Mock() argument = Mock() argument.studies_in = ( launcher_config.launcher.slurm.local_workspace / "studies_in" @@ -276,11 +276,15 @@ def test_run_study( study_dir = argument.studies_in / job_id study_dir.mkdir(parents=True) (study_dir / "study.antares").write_text( - """[antares] -version=1 - """ + textwrap.dedent( + """\ + [antares] + version=1 + """ + ) ) + # noinspection PyUnusedLocal def call_launcher_mock(arguments: Namespace, parameters: MainParameters): if version != 45: slurm_launcher.data_repo_tinydb.save_study(StudyDTO(job_id)) @@ -340,6 +344,7 @@ def test_check_state(tmp_path: Path, launcher_config: Config): slurm_launcher._check_studies_state() + # noinspection PyUnresolvedReferences assert slurm_launcher.callbacks.update_status.call_count == 2 assert slurm_launcher._import_study_output.call_count == 2 assert slurm_launcher._delete_workspace_file.call_count == 4 @@ -351,13 +356,13 @@ def test_check_state(tmp_path: Path, launcher_config: Config): def test_clean_local_workspace(tmp_path: Path, launcher_config: Config): engine = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(engine) + # noinspection PyTypeChecker DBSessionMiddleware( Mock(), custom_engine=engine, session_args={"autocommit": False, "autoflush": False}, ) - storage_service = Mock() slurm_launcher = SlurmLauncher( config=launcher_config, callbacks=Mock(), @@ -373,6 +378,7 @@ def test_clean_local_workspace(tmp_path: Path, launcher_config: Config): assert not os.listdir(launcher_config.launcher.slurm.local_workspace) +# noinspection PyUnresolvedReferences @pytest.mark.unit_test def test_import_study_output(launcher_config, tmp_path): slurm_launcher = SlurmLauncher( @@ -533,9 +539,9 @@ def test_launcher_workspace_init( retrieve_existing_jobs=True, cache=Mock(), ) - workspaces = list( - filter(lambda x: x.name != LOG_DIR_NAME, tmp_path.iterdir()) - ) + workspaces = [ + p for p in tmp_path.iterdir() if p.is_dir() and p.name != LOG_DIR_NAME + ] assert len(workspaces) == 1 assert (workspaces[0] / WORKSPACE_LOCK_FILE_NAME).exists() @@ -550,30 +556,30 @@ def test_launcher_workspace_init( run_with_mock.assert_not_called() # will use existing private workspace - slurm_launcher = SlurmLauncher( + SlurmLauncher( config=launcher_config, callbacks=callbacks, event_bus=Mock(), retrieve_existing_jobs=True, cache=Mock(), ) - assert ( - len(list(filter(lambda x: x.name != LOG_DIR_NAME, tmp_path.iterdir()))) - == 1 - ) + workspaces = [ + p for p in tmp_path.iterdir() if p.is_dir() and p.name != LOG_DIR_NAME + ] + assert len(workspaces) == 1 run_with_mock.assert_called() run_with_mock.reset_mock() # will create a new one since there is a lock on previous one - slurm_launcher = SlurmLauncher( + SlurmLauncher( config=launcher_config, callbacks=callbacks, event_bus=Mock(), retrieve_existing_jobs=True, cache=Mock(), ) - assert ( - len(list(filter(lambda x: x.name != LOG_DIR_NAME, tmp_path.iterdir()))) - == 2 - ) + workspaces = [ + p for p in tmp_path.iterdir() if p.is_dir() and p.name != LOG_DIR_NAME + ] + assert len(workspaces) == 2 run_with_mock.assert_not_called() From 2edecc647faf472076625c442aead5f582ecf6dc Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Mon, 6 Mar 2023 08:53:38 +0100 Subject: [PATCH 55/60] build: remove the link to `antareslauncher`, use `Antares-Launcher~=1.2.2` instead --- .github/workflows/deploy.yml | 5 ----- .github/workflows/main.yml | 5 ----- Dockerfile | 13 +++++++++---- antareslauncher | 1 - .../adapters/slurm_launcher/slurm_launcher.py | 5 +++-- docs/CHANGELOG.md | 4 ++++ requirements-dev.txt | 1 - requirements-test.txt | 3 ++- requirements.txt | 5 +---- setup.cfg | 2 +- 10 files changed, 20 insertions(+), 24 deletions(-) delete mode 120000 antareslauncher diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7b576bd17e..4f920c083e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -46,11 +46,6 @@ jobs: - name: Install Windows dependencies if: matrix.os == 'windows-latest' run: pip install -r requirements-windows.txt - - name: Fix symlink for windows - if: matrix.os == 'windows-latest' - run: | - rm antareslauncher - ln -s antares-launcher\antareslauncher antareslauncher - name: Generate Windows binary if: matrix.os == 'windows-latest' run: | diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index af2e0521b4..e5061506b1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -47,11 +47,6 @@ jobs: uses: actions/setup-python@v1 with: python-version: 3.8 - - name: Fix symlink for windows - if: matrix.os == 'windows-latest' - run: | - rm antareslauncher - ln -s antares-launcher\antareslauncher antareslauncher - name: Install dependencies run: | python -m pip install --upgrade pip diff --git a/Dockerfile b/Dockerfile index 2260427476..f99b8d7559 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,10 +13,15 @@ COPY ./scripts /scripts COPY ./alembic /alembic COPY ./alembic.ini /alembic.ini -COPY ./antares-launcher /antares-launcher -RUN ln -s /antares-launcher/antareslauncher /antareslauncher -RUN mkdir /conf/antares-launcher -RUN cp /antares-launcher/requirements.txt /conf/antares-launcher/requirements.txt +# > IMPORTANT: The `antares-launcher` project (source files) is no longer needed, +# > because the `Antares-Launcher` Python library is now declared as a dependency +# > in the `requirements.txt` file. +# > In other words, we can dispense with the creation of the symbolic link. + +# COPY ./antares-launcher /antares-launcher +# RUN ln -s /antares-launcher/antareslauncher /antareslauncher +# RUN mkdir /conf/antares-launcher +# RUN cp /antares-launcher/requirements.txt /conf/antares-launcher/requirements.txt RUN ./scripts/install-debug.sh diff --git a/antareslauncher b/antareslauncher deleted file mode 120000 index 700bb69b40..0000000000 --- a/antareslauncher +++ /dev/null @@ -1 +0,0 @@ -antares-launcher/antareslauncher \ No newline at end of file diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index a4bc932903..5e5957314a 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -9,7 +9,7 @@ import traceback from copy import deepcopy from pathlib import Path -from typing import Awaitable, Callable, Dict, List, Optional +from typing import Awaitable, Callable, Dict, List, Optional, cast from antareslauncher.data_repo.data_repo_tinydb import DataRepoTinydb from antareslauncher.main import MainParameters, run_with @@ -198,8 +198,8 @@ def _init_launcher_arguments( parser: MainOptionParser = MainOptionParser(main_options_parameters) parser.add_basic_arguments() parser.add_advanced_arguments() - arguments = parser.parse_args([]) + arguments = cast(argparse.Namespace, parser.parse_args([])) arguments.wait_mode = False arguments.check_queue = False arguments.json_ssh_config = None @@ -208,6 +208,7 @@ def _init_launcher_arguments( arguments.version = False arguments.post_processing = False arguments.other_options = None + return arguments def _init_launcher_parameters( diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2663119a37..6d50e6a72d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -43,6 +43,10 @@ v2.13.0 (unreleased) * remove redundant call to `mypy` in GitHub actions. ([96e2b82](https://github.com/AntaresSimulatorTeam/AntaREST/commit/96e2b824eb348d1a3fe5bacf89de35e9cb7fc0fa)) * upgrade Black version in `requirements-dev.txt` and `.github/workflows/main.yml`. ([464c7ff](https://github.com/AntaresSimulatorTeam/AntaREST/commit/464c7ff1ea877646815a3c70891e36b976b856d8)) +> IMPORTANT: The `antares-launcher` project (source files) is no longer needed, +> because the `Antares-Launcher` Python library is now declared as a dependency +> in the `requirements.txt` file. + ### Styles diff --git a/requirements-dev.txt b/requirements-dev.txt index fe90d80f30..12e17251b0 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,4 @@ -r requirements-test.txt -pytest~=6.2.5 # Version of Black should match the versions set in `.github/workflows/main.yml` black~=23.1.0 mypy~=0.931 diff --git a/requirements-test.txt b/requirements-test.txt index a51745b4d3..088f207160 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,2 +1,3 @@ -r requirements.txt -pytest-cov +pytest~=6.2.5 +pytest-cov~=4.0.0 diff --git a/requirements.txt b/requirements.txt index 9bf8eb4e4f..06f220802c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,4 @@ --r antares-launcher/requirements.txt -# freezed -mistune~=0.8.4 -m2r~=0.2.1 +Antares-Launcher~=1.2.2 aiofiles~=0.8.0 alembic~=1.7.5 diff --git a/setup.cfg b/setup.cfg index dc0780a6bb..2c39ba30ac 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,7 +3,7 @@ strict = True files = antarest/**/*.py [mypy-antareslauncher.*] -ignore_errors = True +ignore_missing_imports = True [mypy-jsonschema.*] ignore_missing_imports = True From 08b90c5478e59d58493b2d6176aa6fb9a1ad9a6c Mon Sep 17 00:00:00 2001 From: belthlemar Date: Tue, 7 Mar 2023 10:22:03 +0100 Subject: [PATCH 56/60] feat(storage): add 8.5 version to study_upgrader (#1314) Co-authored-by: Laurent LAPORTE --- antarest/study/repository.py | 6 + antarest/study/service.py | 158 ++++--- .../study/storage/antares_configparser.py | 71 +++ .../filesystem/root/settings/generaldata.py | 57 ++- .../study/storage/study_upgrader/__init__.py | 195 ++++++++ .../storage/study_upgrader/upgrader_710.py | 30 ++ .../storage/study_upgrader/upgrader_720.py | 6 + .../storage/study_upgrader/upgrader_800.py | 34 ++ .../storage/study_upgrader/upgrader_810.py | 28 ++ .../storage/study_upgrader/upgrader_820.py | 50 ++ .../storage/study_upgrader/upgrader_830.py | 42 ++ .../storage/study_upgrader/upgrader_840.py | 36 ++ .../storage/study_upgrader/upgrader_850.py | 34 ++ .../study/storage/study_version_upgrader.py | 440 ------------------ antarest/tools/cli.py | 6 +- .../business/test_antares_configparser.py | 52 +++ .../business/test_study_version_upgrader.py | 95 ++-- tests/storage/study_upgrader/conftest.py | 71 +++ .../study_upgrader/test_upgrade_710.py | 21 + .../study_upgrader/test_upgrade_720.py | 15 + .../study_upgrader/test_upgrade_800.py | 21 + .../study_upgrader/test_upgrade_810.py | 28 ++ .../study_upgrader/test_upgrade_820.py | 27 ++ .../study_upgrader/test_upgrade_830.py | 27 ++ .../study_upgrader/test_upgrade_840.py | 21 + .../study_upgrader/test_upgrade_850.py | 22 + .../nominal_case/empty_study_700.expected.zip | Bin 0 -> 62699 bytes .../nominal_case/empty_study_700.zip | Bin 0 -> 62679 bytes .../nominal_case/empty_study_710.expected.zip | Bin 0 -> 62699 bytes .../nominal_case/empty_study_710.zip | Bin 0 -> 62699 bytes .../nominal_case/empty_study_720.expected.zip | Bin 0 -> 62766 bytes .../nominal_case/empty_study_720.zip | Bin 0 -> 63723 bytes .../nominal_case/empty_study_800.expected.zip | Bin 0 -> 64628 bytes .../nominal_case/empty_study_800.zip | Bin 0 -> 62766 bytes .../little_study_810.expected.zip | Bin 0 -> 111554 bytes .../nominal_case/little_study_810.zip | Bin 0 -> 121244 bytes .../little_study_820.expected.zip | Bin 0 -> 104234 bytes .../nominal_case/little_study_820.zip | Bin 0 -> 104139 bytes .../nominal_case/empty_study_830.expected.zip | Bin 0 -> 67252 bytes .../nominal_case/empty_study_830.zip | Bin 0 -> 63805 bytes .../nominal_case/empty_study_840.expected.zip | Bin 0 -> 60085 bytes .../nominal_case/empty_study_840.zip | Bin 0 -> 63856 bytes tests/storage/test_service.py | 280 +++++++++-- .../storage/test_study_version_upgrader.py | 8 +- 44 files changed, 1269 insertions(+), 612 deletions(-) create mode 100644 antarest/study/storage/antares_configparser.py create mode 100644 antarest/study/storage/study_upgrader/__init__.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_710.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_720.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_800.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_810.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_820.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_830.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_840.py create mode 100644 antarest/study/storage/study_upgrader/upgrader_850.py create mode 100644 tests/storage/business/test_antares_configparser.py create mode 100644 tests/storage/study_upgrader/conftest.py create mode 100644 tests/storage/study_upgrader/test_upgrade_710.py create mode 100644 tests/storage/study_upgrader/test_upgrade_720.py create mode 100644 tests/storage/study_upgrader/test_upgrade_800.py create mode 100644 tests/storage/study_upgrader/test_upgrade_810.py create mode 100644 tests/storage/study_upgrader/test_upgrade_820.py create mode 100644 tests/storage/study_upgrader/test_upgrade_830.py create mode 100644 tests/storage/study_upgrader/test_upgrade_840.py create mode 100644 tests/storage/study_upgrader/test_upgrade_850.py create mode 100644 tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.zip create mode 100644 tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.zip create mode 100644 tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.zip create mode 100644 tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.zip create mode 100644 tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.zip create mode 100644 tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.zip create mode 100644 tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.zip create mode 100644 tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.expected.zip create mode 100644 tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.zip diff --git a/antarest/study/repository.py b/antarest/study/repository.py index 3d99e0d11a..b40c29ca83 100644 --- a/antarest/study/repository.py +++ b/antarest/study/repository.py @@ -45,9 +45,15 @@ def refresh(self, metadata: Study) -> None: db.session.refresh(metadata) def get(self, id: str) -> Optional[Study]: + """Get the study by ID or return `None` if not found in database.""" metadata: Study = db.session.query(Study).get(id) return metadata + def one(self, id: str) -> Study: + """Get the study by ID or raise `sqlalchemy.exc.NoResultFound` if not found in database.""" + study: Study = db.session.query(Study).filter_by(id=id).one() + return study + def get_list(self, study_id: List[str]) -> List[Study]: studies: List[Study] = ( db.session.query(Study).where(Study.id.in_(study_id)).all() diff --git a/antarest/study/service.py b/antarest/study/service.py index 55f028fa4c..d4bf5144cf 100644 --- a/antarest/study/service.py +++ b/antarest/study/service.py @@ -9,10 +9,6 @@ from typing import IO, Any, Callable, Dict, List, Optional, Tuple, Union, cast from uuid import uuid4 -from fastapi import HTTPException, UploadFile -from markupsafe import escape -from starlette.responses import FileResponse, Response - from antarest.core.config import Config from antarest.core.exceptions import ( CommandApplicationError, @@ -72,14 +68,13 @@ ) from antarest.study.business.config_management import ConfigManager from antarest.study.business.district_manager import DistrictManager -from antarest.study.business.renewable_management import RenewableManager -from antarest.study.business.thermal_management import ThermalManager from antarest.study.business.general_management import GeneralManager from antarest.study.business.hydro_management import HydroManager from antarest.study.business.link_management import LinkInfoDTO, LinkManager from antarest.study.business.matrix_management import MatrixManager from antarest.study.business.optimization_management import OptimizationManager from antarest.study.business.playlist_management import PlaylistManager +from antarest.study.business.renewable_management import RenewableManager from antarest.study.business.scenario_builder_management import ( ScenarioBuilderManager, ) @@ -87,6 +82,7 @@ from antarest.study.business.thematic_trimming_management import ( ThematicTrimmingManager, ) +from antarest.study.business.thermal_management import ThermalManager from antarest.study.business.timeseries_config_management import ( TimeSeriesConfigManager, ) @@ -143,7 +139,7 @@ StudyDownloader, get_output_variables_information, ) -from antarest.study.storage.study_version_upgrader import ( +from antarest.study.storage.study_upgrader import ( find_next_version, upgrade_study, ) @@ -175,12 +171,104 @@ ) from antarest.worker.archive_worker import ArchiveTaskArgs from antarest.worker.simulator_worker import GenerateTimeseriesTaskArgs +from fastapi import HTTPException, UploadFile +from markupsafe import escape +from starlette.responses import FileResponse, Response logger = logging.getLogger(__name__) MAX_MISSING_STUDY_TIMEOUT = 2 # days +class StudyUpgraderTask: + """ + Task to perform a study upgrade. + """ + + def __init__( + self, + study_id: str, + target_version: str, + *, + repository: StudyMetadataRepository, + storage_service: StudyStorageService, + cache_service: ICache, + event_bus: IEventBus, + ): + self._study_id = study_id + self._target_version = target_version + self.repository = repository + self.storage_service = storage_service + self.cache_service = cache_service + self.event_bus = event_bus + + def _upgrade_study(self) -> None: + """Run the task (lock the database).""" + study_id: str = self._study_id + target_version: str = self._target_version + with db(): + # TODO We want to verify that a study doesn't have children and if it does do we upgrade all of them ? + study_to_upgrade = self.repository.one(study_id) + is_variant = isinstance(study_to_upgrade, VariantStudy) + if is_managed(study_to_upgrade) and not is_variant: + file_study = self.storage_service.get_storage( + study_to_upgrade + ).get_raw(study_to_upgrade) + file_study.tree.denormalize() + try: + # sourcery skip: extract-method + if is_variant: + self.storage_service.variant_study_service.clear_snapshot( + study_to_upgrade + ) + else: + study_path = Path(study_to_upgrade.path) + upgrade_study(study_path, target_version) + remove_from_cache(self.cache_service, study_to_upgrade.id) + study_to_upgrade.version = target_version + self.repository.save(study_to_upgrade) + self.event_bus.push( + Event( + type=EventType.STUDY_EDITED, + payload=study_to_upgrade.to_json_summary(), + permissions=PermissionInfo.from_study( + study_to_upgrade + ), + ) + ) + finally: + if is_managed(study_to_upgrade) and not is_variant: + file_study = self.storage_service.get_storage( + study_to_upgrade + ).get_raw(study_to_upgrade) + file_study.tree.normalize() + + def run_task(self, notifier: TaskUpdateNotifier) -> TaskResult: + """ + Run the study upgrade task. + + Args: + notifier: function used to emit user messages. + + Returns: + The result of the task is always `success=True`. + """ + # The call to `_upgrade_study` may raise an exception, which will be + # handled in the task service (see: `TaskJobService._run_task`) + msg = f"Upgrade study '{self._study_id}' to version {self._target_version}" + notifier(msg) + self._upgrade_study() + msg = ( + f"Successfully upgraded study '{self._study_id}'" + f" to version {self._target_version}" + ) + notifier(msg) + return TaskResult(success=True, message=msg) + + # Make `StudyUpgraderTask` object is callable + __call__ = run_task + + class StudyService: """ Storage module facade service to handle studies management. @@ -2451,51 +2539,6 @@ def generate_timeseries( request_params=params, ) - def _upgrade_study(self, study_id: str, target_version: str) -> TaskResult: - with db(): - # TODO We want to verify that a study doesn't have children and if it does do we upgrade all of them ? - study_to_upgrade = self.get_study(study_id) - is_variant = isinstance(study_to_upgrade, VariantStudy) - if is_managed(study_to_upgrade) and not is_variant: - file_study = self.storage_service.get_storage( - study_to_upgrade - ).get_raw(study_to_upgrade) - file_study.tree.denormalize() - try: - # sourcery skip: extract-method - if is_variant: - self.storage_service.variant_study_service.clear_snapshot( - study_to_upgrade - ) - else: - study_path = Path(study_to_upgrade.path) - upgrade_study(study_path, target_version) - remove_from_cache(self.cache_service, study_to_upgrade.id) - study_to_upgrade.version = target_version - self.repository.save(study_to_upgrade) - self.event_bus.push( - Event( - type=EventType.STUDY_EDITED, - payload=study_to_upgrade.to_json_summary(), - permissions=PermissionInfo.from_study( - study_to_upgrade - ), - ) - ) - return TaskResult( - success=True, - message=( - f"Successfully upgraded study {study_to_upgrade.name}" - f" ({study_to_upgrade.id}) to {target_version}" - ), - ) - finally: - if is_managed(study_to_upgrade) and not is_variant: - file_study = self.storage_service.get_storage( - study_to_upgrade - ).get_raw(study_to_upgrade) - file_study.tree.normalize() - def upgrade_study( self, study_id: str, @@ -2522,8 +2565,17 @@ def upgrade_study( if len(study_tasks) > 0: raise TaskAlreadyRunning() + study_upgrader_task = StudyUpgraderTask( + study_id, + target_version, + repository=self.repository, + storage_service=self.storage_service, + cache_service=self.cache_service, + event_bus=self.event_bus, + ) + return self.task_service.add_task( - lambda _: self._upgrade_study(study_id, target_version), + study_upgrader_task, task_name, task_type=TaskType.UPGRADE_STUDY, ref_id=study.id, diff --git a/antarest/study/storage/antares_configparser.py b/antarest/study/storage/antares_configparser.py new file mode 100644 index 0000000000..723766d356 --- /dev/null +++ b/antarest/study/storage/antares_configparser.py @@ -0,0 +1,71 @@ +import configparser +from typing import Any, Dict, Union, Optional + + +def _convert_value(value: Any) -> str: + """ + Convert a value to a string using the specific format of Antares INI files. + + - strings are preserved, + - ``None`` is converted to an empty string, + - booleans are converted to "true"/"false" in lower case. + - numbers are converted to strings using the :class:`str` function. + """ + if value is None: + return "" + elif value is True or value is False: + return str(value).lower() + else: + return str(value) + + +class AntaresSectionProxy(configparser.SectionProxy): + """ + This class extends the :class:`configparser.SectionProxy` class in order + to store strings or other types of values by converting them according + to the rules of Antares INI files. + """ + + def __repr__(self) -> str: + """String representation of the section proxy used for debug.""" + cls = self.__class__.__name__ + return f"<{cls}: {self._name}>" + + def __setitem__(self, key: str, value: Any) -> None: + """ + Sets the value of the specified key in the section. + """ + super().__setitem__(key, _convert_value(value)) + + +class AntaresConfigParser(configparser.RawConfigParser): + """ + This class extends the :class:`configparser.RawConfigParser` class in order + to store strings or other types of values by converting them according + to the rules of Antares INI files. + """ + + _proxies: Dict[str, AntaresSectionProxy] + _sections: Dict[str, Optional[Union[bool, int, float, str]]] + + def __init__(self, *args, **kwargs) -> None: # type: ignore + super().__init__(*args, **kwargs) + self._proxies[self.default_section] = AntaresSectionProxy( + self, self.default_section + ) + + def add_section(self, section: str) -> None: + super().add_section(section) + self._proxies[section] = AntaresSectionProxy(self, section) + + def set(self, section: str, option: str, value: Any = None) -> None: + super().set(section, option, _convert_value(value)) + + def _read(self, fp, fpname): # type: ignore + # noinspection PyProtectedMember + super()._read(fp, fpname) # type: ignore + # cast section proxies to AntaresSectionProxy + proxies = self._proxies + for name, proxy in self._sections.items(): + if not isinstance(proxy, AntaresSectionProxy): + proxies[name] = AntaresSectionProxy(self, name) diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py index 0b88a9b2b6..eaadcec4f3 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py @@ -106,49 +106,48 @@ class GeneralData(IniFileNode): def __init__(self, context: ContextServer, config: FileStudyTreeConfig): types = deepcopy(GeneralData.TYPES) + general = types["general"] + optimization = types["optimization"] + other_preferences = types["other preferences"] if config.version >= 650: - types["other preferences"]["initial-reservoir-levels"] = str + other_preferences["initial-reservoir-levels"] = str if config.version >= 700: - types["optimization"]["link-type"] = str + optimization["link-type"] = str if config.version >= 710: - types["general"]["thematic-trimming"] = bool - types["general"]["geographic-trimming"] = bool - del types["general"]["filtering"] + general["thematic-trimming"] = bool + general["geographic-trimming"] = bool + del general["filtering"] if config.version >= 720: - types["other preferences"]["hydro-pricing-mode"] = str + other_preferences["hydro-pricing-mode"] = str if config.version >= 800: - types["other preferences"]["hydro-heuristic-policy"] = str - types["optimization"]["include-exportstructure"] = bool - types["optimization"]["include-unfeasible-problem-behavior"] = str - types["general"]["custom-scenario"] = bool - del types["general"]["custom-ts-numbers"] + other_preferences["hydro-heuristic-policy"] = str + optimization["include-exportstructure"] = bool + optimization["include-unfeasible-problem-behavior"] = str + general["custom-scenario"] = bool + del general["custom-ts-numbers"] if config.version >= 810: - types["other preferences"]["renewable-generation-modelling"] = str + other_preferences["renewable-generation-modelling"] = str if config.version >= 830: types["adequacy patch"] = { "include-adq-patch": bool, "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step": bool, "set-to-null-ntc-between-physical-out-for-first-step": bool, } - types["optimization"]["include-split-exported-mps"] = bool - types["optimization"][ - "include-exportmps" - ] = str # none, optim-1, optim-2, both-optims + optimization["include-split-exported-mps"] = bool + # include-exportmps: none, optim-1, optim-2, both-optims + optimization["include-exportmps"] = str if config.version >= 840: - del types["optimization"]["include-split-exported-mps"] + del optimization["include-split-exported-mps"] if config.version >= 850: - types["adequacy patch"]["price-taking-order"] = str - types["adequacy patch"]["include-hurdle-cost-csr"] = bool - types["adequacy patch"]["check-csr-cost-function"] = bool - types["adequacy patch"][ - "threshold-initiate-curtailment-sharing-rule" - ] = float - types["adequacy patch"][ - "threshold-display-local-matching-rule-violations" - ] = float - types["adequacy patch"][ - "threshold-csr-variable-bounds-relaxation" - ] = int + # fmt: off + adequacy = types["adequacy patch"] + adequacy["price-taking-order"] = str + adequacy["include-hurdle-cost-csr"] = bool + adequacy["check-csr-cost-function"] = bool + adequacy["threshold-initiate-curtailment-sharing-rule"] = float + adequacy["threshold-display-local-matching-rule-violations"] = float + adequacy["threshold-csr-variable-bounds-relaxation"] = int + # fmt: on IniFileNode.__init__( self, diff --git a/antarest/study/storage/study_upgrader/__init__.py b/antarest/study/storage/study_upgrader/__init__.py new file mode 100644 index 0000000000..fff88ee0d8 --- /dev/null +++ b/antarest/study/storage/study_upgrader/__init__.py @@ -0,0 +1,195 @@ +from http import HTTPStatus +from http.client import HTTPException +from pathlib import Path +from typing import NamedTuple, Callable +import logging +import re +import shutil +import tempfile +import time + +from antarest.core.exceptions import StudyValidationError + +from .upgrader_710 import upgrade_710 +from .upgrader_720 import upgrade_720 +from .upgrader_800 import upgrade_800 +from .upgrader_810 import upgrade_810 +from .upgrader_820 import upgrade_820 +from .upgrader_830 import upgrade_830 +from .upgrader_840 import upgrade_840 +from .upgrader_850 import upgrade_850 + + +logger = logging.getLogger(__name__) + + +class UpgradeMethod(NamedTuple): + """Raw study upgrade method (old version, new version, upgrade function).""" + + old: str + new: str + method: Callable[[Path], None] + + +UPGRADE_METHODS = [ + UpgradeMethod("700", "710", upgrade_710), + UpgradeMethod("710", "720", upgrade_720), + UpgradeMethod("720", "800", upgrade_800), + UpgradeMethod("800", "810", upgrade_810), + UpgradeMethod("810", "820", upgrade_820), + UpgradeMethod("820", "830", upgrade_830), + UpgradeMethod("830", "840", upgrade_840), + UpgradeMethod("840", "850", upgrade_850), +] + + +class InvalidUpgrade(HTTPException): + def __init__(self, message: str) -> None: + super().__init__(HTTPStatus.UNPROCESSABLE_ENTITY, message) + + +def find_next_version(from_version: str) -> str: + """ + Find the next study version from the given version. + + Args: + from_version: The current version as a string. + + Returns: + The next version as a string. + If no next version was found, returns an empty string. + """ + return next( + (meth.new for meth in UPGRADE_METHODS if from_version == meth.old), + "", + ) + + +def upgrade_study(study_path: Path, target_version: str) -> None: + tmp_dir = Path( + tempfile.mkdtemp( + suffix=".upgrade.tmp", prefix="~", dir=study_path.parent + ) + ) + shutil.copytree(study_path, tmp_dir, dirs_exist_ok=True) + try: + src_version = get_current_version(tmp_dir) + can_upgrade_version(src_version, target_version) + _do_upgrade(tmp_dir, src_version, target_version) + except (StudyValidationError, InvalidUpgrade) as e: + shutil.rmtree(tmp_dir) + logger.warning(str(e)) + raise + except Exception as e: + shutil.rmtree(tmp_dir) + logger.error(f"Unhandled exception : {e}", exc_info=True) + raise + else: + backup_dir = Path( + tempfile.mkdtemp( + suffix=".backup.tmp", prefix="~", dir=study_path.parent + ) + ) + backup_dir.rmdir() + study_path.rename(backup_dir) + tmp_dir.rename(study_path) + shutil.rmtree(backup_dir, ignore_errors=True) + + +def get_current_version(study_path: Path) -> str: + """ + Get the current version of a study. + + Args: + study_path: Path to the study. + + Returns: + The current version of the study. + + Raises: + StudyValidationError: If the version number is not found in the + `study.antares` file or does not match the expected format. + """ + + antares_path = study_path / "study.antares" + pattern = r"version\s*=\s*([\w.-]+)\s*" + with antares_path.open(encoding="utf-8") as lines: + for line in lines: + if match := re.fullmatch(pattern, line): + return match[1].rstrip() + raise StudyValidationError( + f"File parsing error: the version number is not found in '{antares_path}'" + f" or does not match the expected '{pattern}' format." + ) + + +def can_upgrade_version(from_version: str, to_version: str) -> None: + """ + Checks if upgrading from one version to another is possible. + + Args: + from_version: The current version of the study. + to_version: The target version of the study. + + Raises: + InvalidUpgrade: If the upgrade is not possible. + """ + if from_version == to_version: + raise InvalidUpgrade( + f"Your study is already in version '{to_version}'" + ) + + sources = [u.old for u in UPGRADE_METHODS] + if from_version not in sources: + raise InvalidUpgrade( + f"Version '{from_version}' unknown: possible versions are {', '.join(sources)}" + ) + + targets = [u.new for u in UPGRADE_METHODS] + if to_version not in targets: + raise InvalidUpgrade( + f"Version '{to_version}' unknown: possible versions are {', '.join(targets)}" + ) + + curr_version = from_version + for src, dst in zip(sources, targets): + if curr_version == src: + curr_version = dst + if curr_version == to_version: + return + + # This code must be unreachable! + raise InvalidUpgrade( + f"Impossible to upgrade from version '{from_version}'" + f" to version '{to_version}':" + f" missing value in `UPGRADE_METHODS`." + ) + + +def _update_study_antares_file(target_version: str, study_path: Path) -> None: + file = study_path / "study.antares" + content = file.read_text(encoding="utf-8") + content = re.sub( + r"^version\s*=.*$", + f"version = {target_version}", + content, + flags=re.MULTILINE, + ) + content = re.sub( + r"^lastsave\s*=.*$", + f"lastsave = {int(time.time())}", + content, + flags=re.MULTILINE, + ) + file.write_text(content, encoding="utf-8") + + +def _do_upgrade( + study_path: Path, src_version: str, target_version: str +) -> None: + _update_study_antares_file(target_version, study_path) + curr_version = src_version + for old, new, method in UPGRADE_METHODS: + if curr_version == old and curr_version != target_version: + method(study_path) + curr_version = new diff --git a/antarest/study/storage/study_upgrader/upgrader_710.py b/antarest/study/storage/study_upgrader/upgrader_710.py new file mode 100644 index 0000000000..2d3be91e39 --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_710.py @@ -0,0 +1,30 @@ +from pathlib import Path +from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader +from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter +from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( + DUPLICATE_KEYS, +) + +GENERAL_DATA_PATH = "settings/generaldata.ini" + + +def upgrade_710(study_path: Path) -> None: + """ + Upgrade the study configuration to version 710. + + NOTE: + The file `study.antares` is not upgraded here. + + Args: + study_path: path to the study directory. + """ + + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + data = reader.read(study_path / GENERAL_DATA_PATH) + data["general"]["geographic-trimming"] = data["general"]["filtering"] + data["general"]["thematic-trimming"] = False + data["optimization"]["link-type"] = "local" + data["other preferences"]["hydro-pricing-mode"] = "fast" + del data["general"]["filtering"] + writer = IniWriter(special_keys=DUPLICATE_KEYS) + writer.write(data, study_path / GENERAL_DATA_PATH) diff --git a/antarest/study/storage/study_upgrader/upgrader_720.py b/antarest/study/storage/study_upgrader/upgrader_720.py new file mode 100644 index 0000000000..25e740baed --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_720.py @@ -0,0 +1,6 @@ +from pathlib import Path + + +def upgrade_720(study_path: Path) -> None: + # There is no input modification between the 7.1.0 and the 7.2.0 version + pass diff --git a/antarest/study/storage/study_upgrader/upgrader_800.py b/antarest/study/storage/study_upgrader/upgrader_800.py new file mode 100644 index 0000000000..faf0074bb4 --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_800.py @@ -0,0 +1,34 @@ +from pathlib import Path +from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader +from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter +from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( + DUPLICATE_KEYS, +) + +GENERAL_DATA_PATH = "settings/generaldata.ini" + + +def upgrade_800(study_path: Path) -> None: + """ + Upgrade the study configuration to version 800. + + NOTE: + The file `study.antares` is not upgraded here. + + Args: + study_path: path to the study directory. + """ + + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + data = reader.read(study_path / GENERAL_DATA_PATH) + data["other preferences"][ + "hydro-heuristic-policy" + ] = "accommodate rule curves" + data["optimization"]["include-exportstructure"] = False + data["optimization"][ + "include-unfeasible-problem-behavior" + ] = "error-verbose" + data["general"]["custom-scenario"] = data["general"]["custom-ts-numbers"] + del data["general"]["custom-ts-numbers"] + writer = IniWriter(special_keys=DUPLICATE_KEYS) + writer.write(data, study_path / GENERAL_DATA_PATH) diff --git a/antarest/study/storage/study_upgrader/upgrader_810.py b/antarest/study/storage/study_upgrader/upgrader_810.py new file mode 100644 index 0000000000..a23d71922e --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_810.py @@ -0,0 +1,28 @@ +from pathlib import Path +from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader +from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter +from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( + DUPLICATE_KEYS, +) + +GENERAL_DATA_PATH = "settings/generaldata.ini" + + +def upgrade_810(study_path: Path) -> None: + """ + Upgrade the study configuration to version 810. + + NOTE: + The file `study.antares` is not upgraded here. + + Args: + study_path: path to the study directory. + """ + + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + data = reader.read(study_path / GENERAL_DATA_PATH) + data["other preferences"]["renewable-generation-modelling"] = "aggregated" + writer = IniWriter(special_keys=DUPLICATE_KEYS) + writer.write(data, study_path / GENERAL_DATA_PATH) + study_path.joinpath("input", "renewables", "clusters").mkdir(parents=True) + study_path.joinpath("input", "renewables", "series").mkdir(parents=True) diff --git a/antarest/study/storage/study_upgrader/upgrader_820.py b/antarest/study/storage/study_upgrader/upgrader_820.py new file mode 100644 index 0000000000..f65d054047 --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_820.py @@ -0,0 +1,50 @@ +import glob +from pathlib import Path + +import numpy +import pandas # type: ignore + + +def upgrade_820(study_path: Path) -> None: + """ + Upgrade the study configuration to version 820. + + NOTE: + The file `study.antares` is not upgraded here. + + Args: + study_path: path to the study directory. + """ + + links = glob.glob(str(study_path / "input" / "links" / "*")) + if len(links) > 0: + for folder in links: + folder_path = Path(folder) + all_txt = glob.glob(str(folder_path / "*.txt")) + if len(all_txt) > 0: + (folder_path / "capacities").mkdir() + for txt in all_txt: + df = pandas.read_csv(txt, sep="\t", header=None) + df_parameters = df.iloc[:, 2:8] + df_direct = df.iloc[:, 0] + df_indirect = df.iloc[:, 1] + name = Path(txt).stem + numpy.savetxt( + folder_path / f"{name}_parameters.txt", + df_parameters.values, + delimiter="\t", + fmt="%.6f", + ) + numpy.savetxt( + folder_path / "capacities" / f"{name}_direct.txt", + df_direct.values, + delimiter="\t", + fmt="%.6f", + ) + numpy.savetxt( + folder_path / "capacities" / f"{name}_indirect.txt", + df_indirect.values, + delimiter="\t", + fmt="%.6f", + ) + (folder_path / f"{name}.txt").unlink() diff --git a/antarest/study/storage/study_upgrader/upgrader_830.py b/antarest/study/storage/study_upgrader/upgrader_830.py new file mode 100644 index 0000000000..dbf75b1643 --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_830.py @@ -0,0 +1,42 @@ +import glob +from pathlib import Path + +from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader +from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter +from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( + DUPLICATE_KEYS, +) + +GENERAL_DATA_PATH = "settings/generaldata.ini" + + +def upgrade_830(study_path: Path) -> None: + """ + Upgrade the study configuration to version 830. + + NOTE: + The file `study.antares` is not upgraded here. + + Args: + study_path: path to the study directory. + """ + + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + data = reader.read(study_path / GENERAL_DATA_PATH) + data["adequacy patch"] = { + "include-adq-patch": False, + "set-to-null-ntc-between-physical-out-for-first-step": True, + "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step": True, + } + data["optimization"]["include-split-exported-mps"] = False + writer = IniWriter(special_keys=DUPLICATE_KEYS) + writer.write(data, study_path / GENERAL_DATA_PATH) + areas = glob.glob(str(study_path / "input" / "areas" / "*")) + for folder in areas: + folder_path = Path(folder) + if folder_path.is_dir(): + writer = IniWriter(special_keys=DUPLICATE_KEYS) + writer.write( + {"adequacy-patch": {"adequacy-patch-mode": "outside"}}, + folder_path / "adequacy_patch.ini", + ) diff --git a/antarest/study/storage/study_upgrader/upgrader_840.py b/antarest/study/storage/study_upgrader/upgrader_840.py new file mode 100644 index 0000000000..ed8a30be8a --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_840.py @@ -0,0 +1,36 @@ +from pathlib import Path +from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader +from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter +from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( + DUPLICATE_KEYS, +) + +GENERAL_DATA_PATH = "settings/generaldata.ini" +MAPPING_TRANSMISSION_CAPACITIES = { + True: "local-values", + False: "null-for-all-links", + "infinite": "infinite-for-all-links", +} + + +def upgrade_840(study_path: Path) -> None: + """ + Upgrade the study configuration to version 840. + + NOTE: + The file `study.antares` is not upgraded here. + + Args: + study_path: path to the study directory. + """ + + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + data = reader.read(study_path / GENERAL_DATA_PATH) + data["optimization"][ + "transmission-capacities" + ] = MAPPING_TRANSMISSION_CAPACITIES[ + data["optimization"]["transmission-capacities"] + ] + del data["optimization"]["include-split-exported-mps"] + writer = IniWriter(special_keys=DUPLICATE_KEYS) + writer.write(data, study_path / GENERAL_DATA_PATH) diff --git a/antarest/study/storage/study_upgrader/upgrader_850.py b/antarest/study/storage/study_upgrader/upgrader_850.py new file mode 100644 index 0000000000..c47b69ed58 --- /dev/null +++ b/antarest/study/storage/study_upgrader/upgrader_850.py @@ -0,0 +1,34 @@ +from pathlib import Path +from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader +from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter +from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( + DUPLICATE_KEYS, +) + +# noinspection SpellCheckingInspection +GENERAL_DATA_PATH = "settings/generaldata.ini" + + +def upgrade_850(study_path: Path) -> None: + """ + Upgrade the study configuration to version 850. + + NOTE: + The file `study.antares` is not upgraded here. + + Args: + study_path: path to the study directory. + """ + + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + data = reader.read(study_path / GENERAL_DATA_PATH) + # fmt: off + data["adequacy patch"]["price-taking-order"] = "DENS" + data["adequacy patch"]["include-hurdle-cost-csr"] = False + data["adequacy patch"]["check-csr-cost-function"] = False + data["adequacy patch"]["threshold-initiate-curtailment-sharing-rule"] = 0.0 + data["adequacy patch"]["threshold-display-local-matching-rule-violations"] = 0.0 + data["adequacy patch"]["threshold-csr-variable-bounds-relaxation"] = 3 + # fmt: on + writer = IniWriter(special_keys=DUPLICATE_KEYS) + writer.write(data, study_path / GENERAL_DATA_PATH) diff --git a/antarest/study/storage/study_version_upgrader.py b/antarest/study/storage/study_version_upgrader.py index ddd575a3e3..e69de29bb2 100644 --- a/antarest/study/storage/study_version_upgrader.py +++ b/antarest/study/storage/study_version_upgrader.py @@ -1,440 +0,0 @@ -import glob -import logging -import re -import shutil -import tempfile -import time -from http import HTTPStatus -from http.client import HTTPException -from pathlib import Path -from typing import Any, Callable, NamedTuple, Optional - -import numpy -import pandas # type: ignore - -from antarest.core.exceptions import ( - StudyValidationError, - UnsupportedStudyVersion, -) -from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader -from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter -from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( - DUPLICATE_KEYS, -) - -LOGGER = logging.getLogger(__name__) -OTHER_PREFERENCES = "other preferences" -GENERAL_DATA_PATH = Path("settings") / "generaldata.ini" -ADEQUACY_PATCH = "adequacy patch" -MAPPING_TRANSMISSION_CAPACITIES = { - True: "local-values", - False: "null-for-all-links", - "infinite": "infinite-for-all-links", -} - - -def modify_file( - study_path: Path, - file_path: Path, - key: str, - parameter_to_add: Optional[str], - value: Any, - parameter_to_delete: Optional[str], -) -> None: - reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) - file = study_path / file_path - data = reader.read(file) - if key in data: - if parameter_to_add is not None: - data[key][parameter_to_add] = value - if parameter_to_delete is not None: - del data[key][parameter_to_delete] - elif parameter_to_add is not None: - data[key] = {parameter_to_add: value} - writer = IniWriter(special_keys=DUPLICATE_KEYS) - writer.write(data, file) - - -def find_value_in_file( - study_path: Path, file_path: Path, key: str, parameter_to_check: str -) -> Any: - reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) - file = study_path / file_path - data = reader.read(file) - return data[key][parameter_to_check] - - -def upgrade_710(study_path: Path) -> None: - geographical_trimming = find_value_in_file( - study_path, GENERAL_DATA_PATH, "general", "filtering" - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "optimization", - "link-type", - "local", - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "general", - "geographic-trimming", - geographical_trimming, - "filtering", - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "general", - "thematic-trimming", - False, - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - OTHER_PREFERENCES, - "hydro-pricing-mode", - "fast", - None, - ) - - -def upgrade_720(study_path: Path) -> None: - # There is no input modification between the 7.1.0 and the 7.2.0 version - pass - - -def upgrade_800(study_path: Path) -> None: - custom_ts_numbers_value = find_value_in_file( - study_path, GENERAL_DATA_PATH, "general", "custom-ts-numbers" - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - OTHER_PREFERENCES, - "hydro-heuristic-policy", - "accommodate rule curves", - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "optimization", - "include-exportstructure", - False, - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "optimization", - "include-unfeasible-problem-behavior", - "error-verbose", - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "general", - "custom-scenario", - custom_ts_numbers_value, - "custom-ts-numbers", - ) - - -def upgrade_810(study_path: Path) -> None: - modify_file( - study_path, - GENERAL_DATA_PATH, - OTHER_PREFERENCES, - "renewable-generation-modelling", - "aggregated", - None, - ) - study_path.joinpath("input", "renewables", "clusters").mkdir(parents=True) - study_path.joinpath("input", "renewables", "series").mkdir(parents=True) - - # TODO Cannot update study with renewables clusters for the moment - - -def upgrade_820(study_path: Path) -> None: - links = glob.glob(str(study_path / "input" / "links" / "*")) - if len(links) > 0: - for folder in links: - folder_path = Path(folder) - all_txt = glob.glob(str(folder_path / "*.txt")) - if len(all_txt) > 0: - (folder_path / "capacities").mkdir() - for txt in all_txt: - df = pandas.read_csv(txt, sep="\t", header=None) - df_parameters = df.iloc[:, 2:8] - df_direct = df.iloc[:, 0] - df_indirect = df.iloc[:, 1] - name = Path(txt).stem - numpy.savetxt( - folder_path / f"{name}_parameters.txt", - df_parameters.values, - delimiter="\t", - fmt="%.6f", - ) - numpy.savetxt( - folder_path / "capacities" / f"{name}_direct.txt", - df_direct.values, - delimiter="\t", - fmt="%.6f", - ) - numpy.savetxt( - folder_path / "capacities" / f"{name}_indirect.txt", - df_indirect.values, - delimiter="\t", - fmt="%.6f", - ) - (folder_path / f"{name}.txt").unlink() - - -def upgrade_830(study_path: Path) -> None: - modify_file( - study_path, - GENERAL_DATA_PATH, - "optimization", - "include-split-exported-mps", - False, - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - ADEQUACY_PATCH, - "include-adq-patch", - False, - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - ADEQUACY_PATCH, - "set-to-null-ntc-between-physical-out-for-first-step", - True, - None, - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - ADEQUACY_PATCH, - "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step", - True, - None, - ) - areas = glob.glob(str(study_path / "input" / "areas" / "*")) - if len(areas) > 0: - for folder in areas: - folder_path = Path(folder) - if folder_path.is_dir(): - writer = IniWriter() - writer.write( - {"adequacy-patch": {"adequacy-patch-mode": "outside"}}, - folder_path / "adequacy_patch.ini", - ) - - -def upgrade_840(study_path: Path) -> None: - old_value = find_value_in_file( - study_path, - GENERAL_DATA_PATH, - "optimization", - "transmission-capacities", - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "optimization", - None, - None, - "include-split-exported-mps", - ) - modify_file( - study_path, - GENERAL_DATA_PATH, - "optimization", - "transmission-capacities", - MAPPING_TRANSMISSION_CAPACITIES[old_value], - None, - ) - - -class UpgradeMethod(NamedTuple): - """Raw study upgrade method (old version, new version, upgrade function).""" - - old: str - new: str - method: Callable[[Path], None] - - -UPGRADE_METHODS = [ - UpgradeMethod("700", "710", upgrade_710), - UpgradeMethod("710", "720", upgrade_720), - UpgradeMethod("720", "800", upgrade_800), - UpgradeMethod("800", "810", upgrade_810), - UpgradeMethod("810", "820", upgrade_820), - UpgradeMethod("820", "830", upgrade_830), - UpgradeMethod("830", "840", upgrade_840), -] - - -def find_next_version(from_version: str) -> str: - """ - Find the next study version from the given version. - - Args: - from_version: The current version as a string. - - Returns: - The next version as a string. - If no next version was found, returns an empty string. - """ - return next( - (meth.new for meth in UPGRADE_METHODS if from_version == meth.old), - "", - ) - - -class InvalidUpgrade(HTTPException): - def __init__(self, message: str) -> None: - super().__init__(HTTPStatus.UNPROCESSABLE_ENTITY, message) - - -def upgrade_study(study_path: Path, target_version: str) -> None: - tmp_dir = Path( - tempfile.mkdtemp( - suffix=".upgrade.tmp", prefix="~", dir=study_path.parent - ) - ) - shutil.copytree(study_path, tmp_dir, dirs_exist_ok=True) - try: - src_version = get_current_version(tmp_dir) - can_upgrade_version(src_version, target_version) - do_upgrade(tmp_dir, src_version, target_version) - except (StudyValidationError, InvalidUpgrade) as e: - shutil.rmtree(tmp_dir) - LOGGER.warning(str(e)) - raise - except UnsupportedStudyVersion as e: - shutil.rmtree(tmp_dir) - LOGGER.warning(str(e.detail)) - raise - except Exception as e: - shutil.rmtree(tmp_dir) - LOGGER.error(f"Unhandled exception : {e}", exc_info=True) - raise - else: - backup_dir = Path( - tempfile.mkdtemp( - suffix=".backup.tmp", prefix="~", dir=study_path.parent - ) - ) - backup_dir.rmdir() - study_path.rename(backup_dir) - tmp_dir.rename(study_path) - shutil.rmtree(backup_dir, ignore_errors=True) - - -def get_current_version(study_path: Path) -> str: - """ - Get the current version of a study. - - Args: - study_path: Path to the study. - - Returns: - The current version of the study. - - Raises: - StudyValidationError: If the version number is not found in the - `study.antares` file or does not match the expected format. - """ - - antares_path = study_path / "study.antares" - pattern = r"version\s*=\s*([\w.-]+)\s*" - with antares_path.open(encoding="utf-8") as lines: - for line in lines: - if match := re.fullmatch(pattern, line): - return match[1].rstrip() - raise StudyValidationError( - f"File parsing error: the version number is not found in '{antares_path}'" - f" or does not match the expected '{pattern}' format." - ) - - -def can_upgrade_version(from_version: str, to_version: str) -> None: - """ - Checks if upgrading from one version to another is possible. - - Args: - from_version: The current version of the study. - to_version: The target version of the study. - - Raises: - InvalidUpgrade: If the upgrade is not possible. - """ - if from_version == to_version: - raise InvalidUpgrade( - f"Your study is already in version '{to_version}'" - ) - - sources = [u.old for u in UPGRADE_METHODS] - if from_version not in sources: - raise InvalidUpgrade( - f"Version '{from_version}' unknown: possible versions are {', '.join(sources)}" - ) - - targets = [u.new for u in UPGRADE_METHODS] - if to_version not in targets: - raise InvalidUpgrade( - f"Version '{to_version}' unknown: possible versions are {', '.join(targets)}" - ) - - curr_version = from_version - for src, dst in zip(sources, targets): - if curr_version == src: - curr_version = dst - if curr_version == to_version: - return - - # This code must be unreachable! - raise InvalidUpgrade( - f"Impossible to upgrade from version '{from_version}'" - f" to version '{to_version}':" - f" missing value in `UPGRADE_METHODS`." - ) - - -def update_study_antares_file(target_version: str, study_path: Path) -> None: - file = study_path / "study.antares" - content = file.read_text(encoding="utf-8") - content = re.sub( - r"^version\s*=.*$", - f"version = {target_version}", - content, - flags=re.MULTILINE, - ) - content = re.sub( - r"^lastsave\s*=.*$", - f"lastsave = {int(time.time())}", - content, - flags=re.MULTILINE, - ) - file.write_text(content, encoding="utf-8") - - -def do_upgrade( - study_path: Path, src_version: str, target_version: str -) -> None: - update_study_antares_file(target_version, study_path) - curr_version = src_version - for old, new, method in UPGRADE_METHODS: - if curr_version == old and curr_version != target_version: - method(study_path) - curr_version = new diff --git a/antarest/tools/cli.py b/antarest/tools/cli.py index 9a5d1e96ef..eb6edd31b9 100644 --- a/antarest/tools/cli.py +++ b/antarest/tools/cli.py @@ -10,7 +10,7 @@ extract_commands, generate_study, ) -from antarest.study.storage import study_version_upgrader +from antarest.study.storage.study_upgrader import upgrade_study logging.basicConfig(level=logging.INFO) @@ -162,9 +162,7 @@ def update_study(study_path: Path, target_version: str) -> None: TARGET_VERSION is the version you want your study to be at (example 8.4.0 or 840) """ - study_version_upgrader.upgrade_study( - Path(study_path), target_version.replace(".", "") - ) + upgrade_study(Path(study_path), target_version.replace(".", "")) if __name__ == "__main__": diff --git a/tests/storage/business/test_antares_configparser.py b/tests/storage/business/test_antares_configparser.py new file mode 100644 index 0000000000..8e0d7e0597 --- /dev/null +++ b/tests/storage/business/test_antares_configparser.py @@ -0,0 +1,52 @@ +import textwrap +from pathlib import Path +from typing import cast + +from antarest.study.storage.antares_configparser import ( + AntaresConfigParser, + AntaresSectionProxy, +) + + +def test_configparser(tmp_path: Path): + config = AntaresConfigParser() + config["general"] = {} + general_section = cast(AntaresSectionProxy, config["general"]) + general_section["mode"] = "Economy" + general_section["horizon"] = None # converted to "" + general_section["nbyears"] = 2 # converted to str + general_section["leapyear"] = False # converted to "false" + general_section["pi"] = 3.1415926535_8979323846 # converted to str + + config.add_section("output") + config.set("output", "synthesis", True) + + config_path = tmp_path.joinpath("config.ini") + with config_path.open(mode="w", encoding="utf-8") as f: + config.write(f) + + actual = config_path.read_text(encoding="utf-8") + expected = textwrap.dedent( + """\ + [general] + mode = Economy + horizon = + nbyears = 2 + leapyear = false + pi = 3.141592653589793 + + [output] + synthesis = true + """ + ) + assert actual.strip() == expected.strip() + + config = AntaresConfigParser() + config.read(config_path) + general_section = cast(AntaresSectionProxy, config["general"]) + assert general_section["mode"] == "Economy" + assert general_section["horizon"] == "" + assert general_section.getint("nbyears") == 2 + assert general_section.getboolean("leapyear") is False + assert general_section.getfloat("pi") == 3.1415926535_8979323846 + assert config.getboolean("output", "synthesis") is True diff --git a/tests/storage/business/test_study_version_upgrader.py b/tests/storage/business/test_study_version_upgrader.py index 7083cd837d..9f14f57789 100644 --- a/tests/storage/business/test_study_version_upgrader.py +++ b/tests/storage/business/test_study_version_upgrader.py @@ -10,16 +10,17 @@ import pandas import pytest -from antarest.study.storage import study_version_upgrader + from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import ( DUPLICATE_KEYS, ) -from antarest.study.storage.study_version_upgrader import ( +from antarest.study.storage.study_upgrader import ( + upgrade_study, InvalidUpgrade, UPGRADE_METHODS, ) -from antarest.study.storage.study_version_upgrader import ( +from antarest.study.storage.study_upgrader.upgrader_840 import ( MAPPING_TRANSMISSION_CAPACITIES, ) @@ -36,8 +37,10 @@ def test_end_to_end_upgrades(tmp_path: Path): old_values = get_old_settings_values(tmp_path) old_areas_values = get_old_area_values(tmp_path) # Only checks if the study_upgrader can go from the first supported version to the last one - target_version = "840" - study_version_upgrader.upgrade_study(tmp_path, target_version) + target_version = "850" + upgrade_study(tmp_path, target_version) + with open(tmp_path / "settings" / "generaldata.ini", "r") as f: + print(f.readlines()) assert_study_antares_file_is_updated(tmp_path, target_version) assert_settings_are_updated(tmp_path, old_values) assert_inputs_are_updated(tmp_path, old_areas_values) @@ -54,21 +57,21 @@ def test_fails_because_of_versions_asked(tmp_path: Path): InvalidUpgrade, match=f"Version '600' unknown: possible versions are {', '.join([u[1] for u in UPGRADE_METHODS])}", ): - study_version_upgrader.upgrade_study(tmp_path, "600") + upgrade_study(tmp_path, "600") with pytest.raises( InvalidUpgrade, match="Your study is already in version '720'" ): - study_version_upgrader.upgrade_study(tmp_path, "720") + upgrade_study(tmp_path, "720") with pytest.raises( InvalidUpgrade, match="Impossible to upgrade from version '720' to version '710'", ): - study_version_upgrader.upgrade_study(tmp_path, "710") + upgrade_study(tmp_path, "710") with pytest.raises( InvalidUpgrade, match=f"Version '820.rc' unknown: possible versions are {', '.join([u[1] for u in UPGRADE_METHODS])}", ): - study_version_upgrader.upgrade_study(tmp_path, "820.rc") + upgrade_study(tmp_path, "820.rc") def test_fallback_if_study_input_broken(tmp_path): @@ -84,7 +87,7 @@ def test_fallback_if_study_input_broken(tmp_path): expected_exception=pandas.errors.EmptyDataError, match="No columns to parse from file", ): - study_version_upgrader.upgrade_study(tmp_path, "840") + upgrade_study(tmp_path, "850") assert are_same_dir(tmp_path, tmp_dir_before_upgrade) shutil.rmtree(tmp_dir_before_upgrade) @@ -99,15 +102,15 @@ def assert_study_antares_file_is_updated( def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None: general_data_path = tmp_path / "settings" / "generaldata.ini" reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) - data = reader.read(Path(general_data_path)) + data = reader.read(general_data_path) general = data["general"] optimization = data["optimization"] adequacy_patch = data["adequacy patch"] other_preferences = data["other preferences"] assert general["geographic-trimming"] == old_values[0] assert general["custom-scenario"] == old_values[1] - assert not general["thematic-trimming"] - assert not optimization["include-exportstructure"] + assert general["geographic-trimming"] is False + assert optimization["include-exportstructure"] is False assert ( optimization["include-unfeasible-problem-behavior"] == "error-verbose" ) @@ -116,7 +119,7 @@ def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None: == "accommodate rule curves" ) assert other_preferences["renewable-generation-modelling"] == "aggregated" - assert not adequacy_patch["include-adq-patch"] + assert adequacy_patch["include-adq-patch"] is False assert adequacy_patch[ "set-to-null-ntc-between-physical-out-for-first-step" ] @@ -128,12 +131,21 @@ def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None: == MAPPING_TRANSMISSION_CAPACITIES[old_values[2]] ) assert "include-split-exported-mps" not in optimization + assert adequacy_patch["price-taking-order"] == "DENS" + assert adequacy_patch["include-hurdle-cost-csr"] is False + assert adequacy_patch["check-csr-cost-function"] is False + assert adequacy_patch["threshold-initiate-curtailment-sharing-rule"] == 0.0 + assert ( + adequacy_patch["threshold-display-local-matching-rule-violations"] + == 0.0 + ) + assert adequacy_patch["threshold-csr-variable-bounds-relaxation"] == 3 def get_old_settings_values(tmp_path: Path) -> List[str]: general_data_path = tmp_path / "settings" / "generaldata.ini" reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) - data = reader.read(Path(general_data_path)) + data = reader.read(general_data_path) filtering_value = data["general"]["filtering"] custom_ts_value = data["general"]["custom-ts-numbers"] transmission_capa_value = data["optimization"]["transmission-capacities"] @@ -174,29 +186,35 @@ def assert_inputs_are_updated(tmp_path: Path, dico: dict) -> None: df.values.all() == dico[old_txt].iloc[:, 2:8].values.all() ) capacities = glob.glob(str(folder_path / "capacities" / "*")) - if len(capacities) > 0: - for direction_txt in capacities: - df_capacities = pandas.read_csv( - direction_txt, sep="\t", header=None + for direction_txt in capacities: + df_capacities = pandas.read_csv( + direction_txt, sep="\t", header=None + ) + direction_path = Path(direction_txt) + old_txt = str( + Path(direction_path.parent.parent.name).joinpath( + direction_path.name ) - direction_path = Path(direction_txt) - old_txt = str( - Path(direction_path.parent.parent.name).joinpath( - direction_path.name - ) + ) + if "indirect" in old_txt: + new_txt = old_txt.replace("_indirect.txt", "") + assert ( + df_capacities[0].values.all() + == dico[new_txt].iloc[:, 0].values.all() ) - if "indirect" in old_txt: - new_txt = old_txt.replace("_indirect.txt", "") - assert ( - df_capacities[0].values.all() - == dico[new_txt].iloc[:, 0].values.all() - ) - else: - new_txt = old_txt.replace("_direct.txt", "") - assert ( - df_capacities[0].values.all() - == dico[new_txt].iloc[:, 1].values.all() - ) + else: + new_txt = old_txt.replace("_direct.txt", "") + assert ( + df_capacities[0].values.all() + == dico[new_txt].iloc[:, 1].values.all() + ) + areas = glob.glob(str(tmp_path / "input" / "areas" / "*")) + for folder in areas: + folder_path = Path(folder) + if folder_path.is_dir(): + reader = MultipleSameKeysIniReader(DUPLICATE_KEYS) + data = reader.read(folder_path / "adequacy_patch.ini") + assert data["adequacy-patch"]["adequacy-patch-mode"] == "outside" def are_same_dir(dir1, dir2) -> bool: @@ -207,11 +225,6 @@ def are_same_dir(dir1, dir2) -> bool: or len(dirs_cmp.funny_files) > 0 ): return False - (_, mismatch, errors) = filecmp.cmpfiles( - dir1, dir2, dirs_cmp.common_files, shallow=False - ) - if len(mismatch) > 0 or len(errors) > 0: - return False for common_dir in dirs_cmp.common_dirs: path_dir1 = Path(dir1) path_dir2 = Path(dir2) diff --git a/tests/storage/study_upgrader/conftest.py b/tests/storage/study_upgrader/conftest.py new file mode 100644 index 0000000000..6b0f28147d --- /dev/null +++ b/tests/storage/study_upgrader/conftest.py @@ -0,0 +1,71 @@ +import typing +import zipfile +from pathlib import Path + +import pytest + + +class AssetNotFoundError(FileNotFoundError): + def __init__(self, asset_dir: Path, reason: str): + msg = ( + f"Asset not found in '{asset_dir}': {reason}." + f"\nMake sure that the resource files are available in the unit tests" + f" and that you have named them correctly according to the module" + f" name and the test function name (without the `test_` prefix)." + ) + super().__init__(msg) + + +class StudyAssets(typing.NamedTuple): + study_dir: Path + expected_dir: Path + + +@pytest.fixture(name="study_assets", scope="function") +def study_assets( + request: pytest.FixtureRequest, + tmp_path: Path, +) -> StudyAssets: + """ + Fixture that provides study assets for a test function. + Extract `{study}.zip` and `{study}.expected.zip` assets in the temporary path. + + Args: + request: Fixture request object for the test function. + tmp_path: Path to a temporary directory for the test session. + + Returns: + StudyAssets: An object that contains the paths to directories + for the study and expected study assets. + + Raises: + AssetNotFoundError: If the study or expected study assets are not found + in the resource directory. + """ + module_path = Path(request.fspath) + assets_dir = module_path.parent.joinpath( + module_path.stem.replace("test_", "") + ) + asset_dir = assets_dir.joinpath(request.node.name.replace("test_", "")) + zip_files = list(asset_dir.glob("*.zip")) + # find the study ZIP and uncompress it + try: + zip_path = next(iter(p for p in zip_files if p.suffixes == [".zip"])) + except StopIteration: + raise AssetNotFoundError(asset_dir, "no '{study}.zip' file") from None + study_dir = tmp_path.joinpath(zip_path.stem) + with zipfile.ZipFile(zip_path) as zf: + zf.extractall(study_dir) + # find the expected study ZIP and uncompress it + try: + zip_path = next( + iter(p for p in zip_files if p.suffixes == [".expected", ".zip"]) + ) + except StopIteration: + raise AssetNotFoundError( + asset_dir, "no '{study}.expected.zip' file" + ) from None + expected_dir = tmp_path.joinpath(zip_path.stem) + with zipfile.ZipFile(zip_path) as zf: + zf.extractall(expected_dir) + return StudyAssets(study_dir, expected_dir) diff --git a/tests/storage/study_upgrader/test_upgrade_710.py b/tests/storage/study_upgrader/test_upgrade_710.py new file mode 100644 index 0000000000..752e277432 --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_710.py @@ -0,0 +1,21 @@ +from antarest.study.storage.rawstudy.io.reader import IniReader +from antarest.study.storage.study_upgrader import upgrade_710 +from tests.storage.study_upgrader.conftest import StudyAssets + + +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 710. + """ + + # upgrade the study + upgrade_710(study_assets.study_dir) + + # compare generaldata.ini + actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini") + actual = IniReader().read(actual_path) + expected_path = study_assets.expected_dir.joinpath( + "settings/generaldata.ini" + ) + expected = IniReader().read(expected_path) + assert actual == expected diff --git a/tests/storage/study_upgrader/test_upgrade_720.py b/tests/storage/study_upgrader/test_upgrade_720.py new file mode 100644 index 0000000000..43eb2009f1 --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_720.py @@ -0,0 +1,15 @@ +from antarest.study.storage.study_upgrader import upgrade_720 +from tests.storage.business.test_study_version_upgrader import are_same_dir +from tests.storage.study_upgrader.conftest import StudyAssets + + +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 720. + """ + + # upgrade the study + upgrade_720(study_assets.study_dir) + + # compare folder + assert are_same_dir(study_assets.study_dir, study_assets.expected_dir) diff --git a/tests/storage/study_upgrader/test_upgrade_800.py b/tests/storage/study_upgrader/test_upgrade_800.py new file mode 100644 index 0000000000..08399dcb0f --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_800.py @@ -0,0 +1,21 @@ +from antarest.study.storage.rawstudy.io.reader import IniReader +from antarest.study.storage.study_upgrader import upgrade_800 +from tests.storage.study_upgrader.conftest import StudyAssets + + +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 800. + """ + + # upgrade the study + upgrade_800(study_assets.study_dir) + + # compare generaldata.ini + actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini") + actual = IniReader().read(actual_path) + expected_path = study_assets.expected_dir.joinpath( + "settings/generaldata.ini" + ) + expected = IniReader().read(expected_path) + assert actual == expected diff --git a/tests/storage/study_upgrader/test_upgrade_810.py b/tests/storage/study_upgrader/test_upgrade_810.py new file mode 100644 index 0000000000..69156ca2e7 --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_810.py @@ -0,0 +1,28 @@ +from antarest.study.storage.rawstudy.io.reader import IniReader +from antarest.study.storage.study_upgrader import upgrade_810 +from tests.storage.business.test_study_version_upgrader import are_same_dir +from tests.storage.study_upgrader.conftest import StudyAssets + + +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 810. + """ + + # upgrade the study + upgrade_810(study_assets.study_dir) + + # compare generaldata.ini + actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini") + actual = IniReader().read(actual_path) + expected_path = study_assets.expected_dir.joinpath( + "settings/generaldata.ini" + ) + expected = IniReader().read(expected_path) + assert actual == expected + + # compare folders (because the upgrade should create empty "renewables" folder) + assert are_same_dir( + study_assets.study_dir.joinpath("input"), + study_assets.expected_dir.joinpath("input"), + ) diff --git a/tests/storage/study_upgrader/test_upgrade_820.py b/tests/storage/study_upgrader/test_upgrade_820.py new file mode 100644 index 0000000000..6098ca7ea6 --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_820.py @@ -0,0 +1,27 @@ +from antarest.study.storage.rawstudy.io.reader import IniReader +from antarest.study.storage.study_upgrader import upgrade_820 +from tests.storage.business.test_study_version_upgrader import are_same_dir +from tests.storage.study_upgrader.conftest import StudyAssets + + +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 820. + """ + + # upgrade the study + upgrade_820(study_assets.study_dir) + + # compare generaldata.ini + actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini") + actual = IniReader().read(actual_path) + expected_path = study_assets.expected_dir.joinpath( + "settings/generaldata.ini" + ) + expected = IniReader().read(expected_path) + assert actual == expected + + # compare links + actual_link_path = study_assets.study_dir.joinpath("input/links") + expected_link_path = study_assets.expected_dir.joinpath("input/links") + assert are_same_dir(actual_link_path, expected_link_path) diff --git a/tests/storage/study_upgrader/test_upgrade_830.py b/tests/storage/study_upgrader/test_upgrade_830.py new file mode 100644 index 0000000000..5e444b94b9 --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_830.py @@ -0,0 +1,27 @@ +from antarest.study.storage.rawstudy.io.reader import IniReader +from antarest.study.storage.study_upgrader import upgrade_830 +from tests.storage.business.test_study_version_upgrader import are_same_dir +from tests.storage.study_upgrader.conftest import StudyAssets + + +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 830. + """ + + # upgrade the study + upgrade_830(study_assets.study_dir) + + # compare generaldata.ini + actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini") + actual = IniReader().read(actual_path) + expected_path = study_assets.expected_dir.joinpath( + "settings/generaldata.ini" + ) + expected = IniReader().read(expected_path) + assert actual == expected + + # compare areas + actual_area_path = study_assets.study_dir.joinpath("input/areas") + expected_area_path = study_assets.expected_dir.joinpath("input/areas") + assert are_same_dir(actual_area_path, expected_area_path) diff --git a/tests/storage/study_upgrader/test_upgrade_840.py b/tests/storage/study_upgrader/test_upgrade_840.py new file mode 100644 index 0000000000..2225dbd20c --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_840.py @@ -0,0 +1,21 @@ +from antarest.study.storage.rawstudy.io.reader import IniReader +from antarest.study.storage.study_upgrader import upgrade_840 +from tests.storage.study_upgrader.conftest import StudyAssets + + +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 840. + """ + + # upgrade the study + upgrade_840(study_assets.study_dir) + + # compare generaldata.ini + actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini") + actual = IniReader().read(actual_path) + expected_path = study_assets.expected_dir.joinpath( + "settings/generaldata.ini" + ) + expected = IniReader().read(expected_path) + assert actual == expected diff --git a/tests/storage/study_upgrader/test_upgrade_850.py b/tests/storage/study_upgrader/test_upgrade_850.py new file mode 100644 index 0000000000..6e626450a6 --- /dev/null +++ b/tests/storage/study_upgrader/test_upgrade_850.py @@ -0,0 +1,22 @@ +from antarest.study.storage.rawstudy.io.reader import IniReader +from antarest.study.storage.study_upgrader import upgrade_850 +from tests.storage.study_upgrader.conftest import StudyAssets + + +# noinspection SpellCheckingInspection +def test_nominal_case(study_assets: StudyAssets): + """ + Check that `settings/generaldata.ini` is upgraded to version 850. + """ + + # upgrade the study + upgrade_850(study_assets.study_dir) + + # compare generaldata.ini + actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini") + actual = IniReader().read(actual_path) + expected_path = study_assets.expected_dir.joinpath( + "settings/generaldata.ini" + ) + expected = IniReader().read(expected_path) + assert actual == expected diff --git a/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.expected.zip b/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..6ee11415f433984103a7f0f73e476843be7758dc GIT binary patch literal 62699 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 y3hZfJ`f+TeIEd1B!EL-rF?VX?xg-AJ5e{U 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

r(UWX2HDY`b!HU^tG`=;7ey* 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 literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.zip b/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.zip new file mode 100644 index 0000000000000000000000000000000000000000..483bbcb1dba34c09bde2b3db77f1db2dd9513efb GIT binary patch literal 62679 zcmcG!1yq~cwlK5Ndo<{M=N5DF&Xw-5B~Gu7X}{M!Q!Kmo9JaB_2H zQ&+))_U9i5%c?TlTm9UcD30apLf0lJpv z4(86rcKVq1j%MaGP#R+g2RCCoOw9jURev|A2U1mkQJQ}@!tWseXwZLI=6}NaM}z*a zu>Ny{{?6;aG3am5|2GE3{=%W%IpLyC@ySTEt zdb<9o5A9_)n9nc{~rnIZ+ref64F0`{r{VD2>)c?-TT&>KV?TzjJ=B58tw)jV7{@v~Wj$>-)=HhDZ{BJ@0Uk3d9KK~u?A07XH z0QZls|8L;_o?;AUcKjbB_sonO|8cv&C#*mG@EhQNk`mvs4luuBVNzg`mm5Gn$`l9L zSR>b#qgYvc`hUtvumA&2x4dLVEeD+#@Dw7(`HE0uE_CQ$s%R$V(aSY^at7B zBHVvM_DLTHCNd?yUD7{|?H`kCdP z%d^C;A#KYv*gvFNuFlTKz9|3d`Lm$IAMf9(5GbgqiuI?$mftVKD%J3WDyr$}TF`qi z2l@v4*oIb?AN)6#2P3K28GHS2wETCqybluP;YRM`xBcM%9pG;`f0+Ki(#fD)u_6mo z>>8(Xxw=#T&!wnWimX4ME1Ur_x}9m?2FDNc z`tNt2|5XIBp0=lT90CA7p8}Ck|0&qtByVl%_{Tl>H{?IbeOJ%RRZY6SMb1)*VQUu) z0|kGHqj#Hgn?FpN7avs{^&_R(OIZmT9|;Z66gu!hC`<7J;{}g5dSY)}Q(t#`z0NqH z7!o?*-$?V?7@&5UKi@8@cRTmFcF%uv=jHb*?deO+fOE~W@$Wa=MGsL#X_cMoP>$1C zpX1<#S_jkQ=2x}gei$nIFvQ6TU$~V)Z(sHlf5v7S5a)b}aW;y2)!uSo_b5~;@dD%a z=K|{u<&jI3=Af+cVf~1N=8?h!wU_vr{_HUKX z_%%sEiStq6wr6ts-@o`^8}Pl@WNK?x)n1r*8`Uh((OR%CKDced9c|Vnu4t~y(OSUy09ulIjgrdhAwF>kuu9no z-NBJ7cai2!osY-%=xolQ-0Z$8Jq-Db3ejIUQLj+uc=CvsEh4mIXJru^G56&Bwqpc1 z{OW4I4?8gU2y)zi=aijv2Gu45brMK!I+otK;c*Xnh|eb}UwI7lKl^n~eCW1eT7A$q zYov9SD%wxE3JyPc{8OvDwbu|;>~;tLGbhUb6sKC<2;7 z{h}P)8f8hDi`rUW(N=vR#PZFlN&sj6#vI^VS;ls=ZxnE`yk{uu*V1yq-{|2aw9+{7%=k;^h4YzTOF0M;r&>-zgxQn!#BQo5e&Dw68$Dcx-g=Y7U~r#X9#?Y9Camm7YD6!#GiA@-)2gH*X#pNXf5d^{->7{AridPL9f2r zRZlq%sP#GM7Jj4zTu+kpu&VTl7!pcOmR0O>KW!)>t~uMZ{IOe~+`o|Yvov`Q1RRedyPkv>$w9CY1Q=2X+8(Zd+1E=9{J8oP#M@n<_d^a)%$aiIS zbx}UdWhOMeWNg5lT{tP1M_7QSX3vkp?yB5h;JKQGcgS(B=lALLCqi&@e|VHeJig<3 zByWhp^C_kl&yRBY$ydA6s32nb%%{dxZ`D^CO|>IlA*Q0N;7x+>{TY0u;_1Jvh^VKd>=l`Q z!^yAoC^FB1^1W}e^#U|<3^&e7Y`A`asNV#)-ItU{>^R~mwj-tl4BlT z)hoUd7WEUd!ofD)QyP;~AGXj(N{ZrBWfBn(9okiw;8e_>08dpTn@sxoA|UtET*cFf z3u^(5oXU4G<_Eef!B3O~u_x&q9Ytc^U~T7o*z`60v|FYmocE!Lk4tM?SCj#!j5x|B zA>*q&>pC^N!wWc8WHjsdX#)%WTJm+ng=eIRnV&2)D9>Ou(;Q7{KKlZ*+I;t93ijEw zzsB4+{`B_dC`iiv(I>ys;L8L_FV_05*Zb>l6P$_!-WGo_BExc?A{njVI8d0F=}_in ze9+4v6R%a$^2~?k)9pZV8!Vu=5_jXR#7;Ke_{E;i(nnvC6XX;_n zEj|rj^W_naLR485O9wxbRA;+CRfe~EY=jq@nKsthW004v4e=Wt5!|U!b(JLAtZXIG zIefJnJLz+ST4glZE-#rrCO7@1WZ%=JrOHU|rzHcaVz3$&bbkEJH(K=EQf72WcQfhS zs4|izz)^_YB^sxSGx)4>fj2RRgXF~6*kl$DnBU`@qgb8KzwYaIRBP&0O;5hEiR*Ei zSHZnac6UEj$n7#^IbO-J|Izd_I->zoO6vq5R-g+m+xM1IB(#a8LcJlJp zGT;J4>eAnNCu=9LZpy!INI{O?P^GdcE3Tw4B|P-O%y#98bg_HobLsYKAGhFdc7hAU zVcM~EmC3!l5#vsNSvP~f)SiBUJAc}BN&mU-RVZKk#d9kM8Yg@A;V0EX`mX`E#lPUYGe&!4gg(x=xxkI7x$3_?AJt*GS9hQ2nFn>R!z z7VN4jB0T0kKsA#=1XH9ij|JtQA_a*9D`;{E^Eh)4=h=&TM)X*fTy+0+;$Eq#9#ymQ z7W<<|)05N0p|0;+EK8~BW@YxX52d?kKfW@fc+qLr^<+%Z)XQzoHhQSF5hQ>Ueb3R- z%};S+7ag8p+NuW-fb@goH{c2;QmcYickeh4iEF~NR^pjy$2W*ff47Y(>~)|Yr%Az2HivCLiUrF_Co<0w%cf_dH71?O|# zEt~0X)`Z2TN`^nY*71PT?HMy55{>fTK&B-gI&$NES#=KaV{e=9tRS|kP~z+|a0Fjt zhEbk8fHe>4?tV2ewiGZkbtbO(8Ag#Aam(-o@mQ&RsHUrVW&@sc2Dgo=STKSw5nbi1 zQ;8<<>++!0DQ+}W!xcWl4SBleF9cUU@ec8I%{xRvBaDY?f|_8I2!6@k$r?Cc)lC>I zt%pv*)|jRAe8hX#Tz*$|pyE3X;;qeYkM(pnl}&UL++~-q0xzSLk+mI1$Y0#`&oaexCiB%!-rTT{(j@+nX%Z!ZqP(A5UsR zZnGn9D@on64;;!(^}^r>s=EZI@FD?3@&r6#W>q+Y5n-oPAwz1C=-0piA030wkbD<+ z##7j>p}2nTSPo|2we=05JdyhjCx^Db5@3n)%RYyH{n3ST9cv!6$~SfQU_&%!I-B8U zE8T9+mbRR)@296+{}Qu_Zv<5TEu|Mx)GZ;@ef5BEz~uTVmFW;B%}$qb`jC|>~k+_llZhjd~Pd(`YV5TWzctC+!vxvt{M^px`m`);14`s>n9oAo$4OAYt%K4nA3 zs{Fh>hSDoBPMQi(K}W0%9Uu{kTZ^fmHbuIO>u~pJVjGpt6)m%fEmhBpb0iGp9s~VU+05*N#EAyI;C;$ZQeKi{VqmfoO0jrvsaZrFB;c?ml+Rnw1%^9dAJ} z+=+~lH9QU&Ag3(Yj&oB^?3_k>;{J8eG);9+F(32#`my_Li?Z>8X*A`zYGd1=ZA-My zNGO1#v?83+RIr(?LwD^XyTY#Te8qYp9bfG67ZYLIz*}S0-5x*hUd<({+T;L9zw@v% zK@F0U%9D-4W%b6lkcP*fyZt<88ODqk_NavRExmfjKPAB%j^%>pmbWhs#s)CI!%7ED zvDcgCuzf^HuZ_bfFAbG`)YpCmhQX_3`0EEW(_PgQH6)Ogn`t#ZTwFc*!_tPWx&6u_^ z4IikDVh&>o-zgP2)w~X7aeto>%lut;S4THZ@(bA zuWadd1JsPVp`t?Yb92-kf9jo6=vt9`X@pv59sIM%T43sH@xq~AhVY#VTTiU!`2|NG z^z8+wt@MM#t4H;Tu{;t#67N6#7>Yd8rV!fam|5EXSfkr$e7B8Z_;%yL$J<1_S*@1A zlS!6$*{gMigr>ck-|Y1bZFc6Zw^+ubjXJzzu6?daji?LSW3QXsf7IvIdEdZmpJR_2 z^DP%e@mv}3u%!B?7xd1RIlSLt=WQf&=+(5YFl8Z|h@Q3H1Nm?gSW`CZ?`n-^byF3u zFdjvRKVu5%Oqwqb`Odo*P2@W)5kw2 znd0Wugg6r1htcdfftQAHR;7Lo@u8OdGdlzdX~_ zhtYTKG~ug0MSq!WgW+FNGP>@B^m|^X!+_>lmRGd!M8aIFh+6n97+Pmcr z-NX4=j^`iCbVOevgnTCHr@CU@wiawFzKl70w`-=&<1wf8eM=?FD`BC#ikF&f&@TSr z?u!2N`h&fT+a$S9k#h>Jhsfh2qDR+^Jct8fSnR;)bY;mqy01J=Sx?1vbzcn09a--8 z#N_*aa;J!|63~vdjPm}#u_x|pNUe%I!S`M*y9u<1Q*FS9?$s{(CRC;ow^7$*297p; zl`?2@Z_;YJtTuW{w!Gp9pQxmDpO|#Ay-nUmT`$$-JL6m{I>df(zuz@AQcv+J{I(Lh z3*S9f@13s1;)&$WXmhV))mAqRt&J6BKK@8u{ZoJ zRuHiKMq2>{&kb}k z?}VSEU0XibYC_%b>L{3V*xKN6x0@?r>42kkXZooZ!!(x~Pc}NZUJA~eh_0}R(DA01 zdGwneQmlNfcl92$J!$6`+;~e+eECK=e3ixBuDPJB-9^na4EtcNRd{_^P{7|_`;lqS zl&?jXuGXQtAr-moF^j8ht+b>S74m9^3H+7iAuJe(WCaoy)E?@W{8PJo8e_H)t) zlMS_(^|ja)jwu9BmNsw>h_{Fg-3FhBpHK<$O74mju#A?fMw|P!XwmDPU1O zK7t<>*E&{s;PN?6z?;fggyO%@#{iK<-P$<3X{E?FlJZM!bMK=D;u`ZG^IvD@zRofLn3OJ=s;-zED|FxR zirAg%(YMVTsp(oo%~||yCYMepo-S^ix6sxbD;~r%LpW;$oBy z`0BwcI3+I%j8YG&->$s9@4QAm#D1J!)m`QJby*wce59xI)>EWNUN~QkE`74?&ADP+QJ_eI1NSms@xKM4H7fvVD*LuCj&#gBh!us*Q^uW#wCxM z$|T-cN`uQXmfTFEyfOVt(a}5aosG3)tV<#x zhYIw;LRprF%S6}h5+-=E zndZh4W4=MrCMGgqp@9`Kar0&gYbE=JE&u{0NqUTJcwFpM;z{x4{HEeK4FrRfH}Jw-;A&t4 ziw)-|l%C^y;BDB+)+~g(KVgIVVC}FMQXD_TUrDC@79x8xv~Aur5#+1kA+gi{NYE); zwp4o2=h!tPb~5D{%3K0b)7cbbS^2(YK()|Ezo%jP*mpPuJD-{0uG%WtMceF0z+%X7 zh-W??mrK&HMuf|&X~CoB7~dGkBke7~bP%J#cB`=AW}u`wcy?Q?^b;iX+n!iZ1?BK| ztDGcd1VRkF>?SC-!_WIvh3Zhl^x^E>=La(K%K;}v-4f}?U#Wyso(q5A(YvUO=;xak zF!>6)DP{ZwQAFs0$$WD`doSEumBGQnlR>`Zg38N-kc(H~c-*h4&#Vt>={tN%81Jhr zY{r-Z?)P_qk)S-{X#Be{q{eWPw*cp;d4e?a116f_O>O_9;+#28z)+WLMWBp(D*+{X zO&Q3+5BMeEyP)z)5QMwO65o;MNk>yHRk@ejtVQCe9{KE6+c3AW#vRELHUGK0tJntC zQ{C=R4Z-2nZ;R&UFrxX%M|)j##jo zV0q+DU=8J>kBslap}&uk7S~)&Z!A?P8YXRDI>A0+G{|&{7jmt3VP!egB6_X0 z$?oCJ?hvRPH5-@D{84qCxY|3Oh~<>_Zqae)g-0Q znAd)_uAuVzE3k>8+hXM)@sA3S+1=hIV86ul+Bd*a>q>s?As001EOb~y*dPbAtPc}y zfINTiW)wati1%#nyzjtYeUGqU88}6(wH>%+5EKN_f`t+nRtp4u7c}aCRQJ|=fbZ{b zqH2eT#@d@#i)ylgIV9$OI6^uy5U`Cio;$TK;mD6An?aC7{qho3TD)^ok zRGb@_@O7mpC0UtZoHuO@4svn{RdH1{z*cX=H;E9h&KT zL2Dy1lL03pr6yTkP@{kZ4))8}x+_G%G_(VzhqH%I0- z3)#sS9$2Uy+QqS?BAVy1WH7c>1em`9Kn=>>=;LH_^*0~*9(2aCJwkE8PtM)yzjz+$ zi~Y=JT*27LeJCn@A~eX!?;@z>12EFf6lWUfAbdzmve*Uk#SWafa&G1$o9{5D9}sWw zMytrAUNjfWrXFSnNp{wNB(Tx9WkgUwKgmdjKQc^M7}9(I4%4L@ZpCQ8H0NYphReQ+ z)4~AWx>&AeG`bH#ghzmY^rRBnV69B2V1e2i)LI@rc2!)%56>$~O4Nw$131u7YCw;# z@cr1Gl-+7G$qt&8F+pRg>Wh|uwL)gfy&lk&yRqE*G_1f7B>8CHG0=P5+|X&FSP3xx z1?XKR9`I_DLzJ(df+eo9{kbt~-jwl7`>gsJS!N#XdpulOv%oKOW4*WqB!?=NG!4sk zP(3C{lD`-jCxHy~DUTHlM+`es?v^mzqMNedSq6&A6i|Z3E>%-N z258k|5H((q7aX@ZGK8n~k-1b-CdOXO&nif5p8cSutv>5h^275aji*)y{IJjN@UB;@ zzqBP`T3A1@DTawb+S}Od0>j_^r68d9JW{Z`MJ&amc^HW_nCziXh+pfgtLlclcm6|o zhM>wpF~_?b4tIF-;OZ}RN!U0<_88RbsVoSZXF^-tg$x84@JMmGuBq@y6?H4y0{e$A zYm>9K>+T!u$|5nQWncl3=TA-d%Hup}Q=H$Rt-?aD%v!@c0UtmqL0dZPt>btj{$kW* z*^RHC^6zuCy#d$k?~LBL3X7F7ARnwZ#o+7XGB(##T9~8?u}fpVQ#-HQ6XB1&<9J{D z%*BjYdQ{@TuSWe`NH>U=vIUINScWBJJ`Wnve6SFc!NI=>TzmcW*?z#-blHd7oytki zi$+I38%Mm8ZyZtA?I=%N+ppi1TEMB9dOpocir&^LQ4dD~)th7=fcmVd#nMzKVSv=NTmd6%jI&JI_k)2*pBI_L9EsqWxNPRg zPrcHe8TCOc$A!D<2@!A$DF%IpRKRQn)g`AtnkgVcb@NyJj4Pqj9H1+bnGa23Y6_-= z0j(Xac`pjAvY~YvF!+1_c#O11R#sSr43F8xuAh4@yxAkPI#IK<8!Z&vkxAl_l(Pj= zgX$E~3jEa+A*Y>y5j>nli0W0l9A1! zfu3_9!CX^Tz*l@7fnUIx>OxMU;m<&fqd*&$!_TYWO_w=t@Rdnme=K=1B?vVq=4diG z(>Q~qa6-p^7q^Zk=_hKPL;<0leB}#r0_Ibg$|;?YrC?@%o5r(`M=q_llGK~flhko; zDLkzGw1cQU`ODkv$k+>8mJym=(dMJMQ5MYI8;7_EA#xEaI z@<>gWqPDhXi;p#O)a?N5@7peXEW^Y^Mjp;gV$P7+piWyy(8!>;U>e`%FM$0^*Ix5J z0+YF#;o*K>N?J4uBVX_Q1gE|VcRvdBV)zVSSLeVzb~Ur9d4L9D*qqnXxd7H@;0ypM z2?j?%puW}3om}WGKM7oKc5sA{b6>S61`ciAkLq4xLQsf1aBh zdLB$+ZrljfCdl3H=~bC4hZen`UmEq%dhcf9>*Lbin$>TUEy(F0oN2&}XH27+3f!EO zb;;DhI?bYeU&t7nwcJ*H*HtK7u7It zjhd&@y`pd86>obII@yW8F>QSjDNPH8Q`xcRG7uJ#?}Pw1broDP`B-Q({6oWoZeEXJ z_eOO6x&^?$TG|gQk>!lPAqoZhZTA?(0qz2K3B61n9bzngpHOm!)s7iRq98;ne+b5k z7LSZMKCeh)UIvJxeb%4?C6Z7S3?^=7Qfsp&01F7#x{~6jj#W%0j8G9KE**-I?x7ce zDX10qj$GC&HO?s@j+NcB&5XqjEuLPg87)2>d>C4HqE}`$y3ohivXwrlCr@WK_Td;N z3Te-ZCBQpygkp0W>`A&ff;S?NU19(A04Inr0+l$RNcj?QyVLtE<><3@tmgp7^4aTC z!Pg`Q5%&7hmXxFyZwcUc3Ss=24gZ60andOPnh>hW;9O zA(%Azg=UVC;J{w;zBV zFtpyQNL9`aW@0fmKg(?60K&pJGUVT3Sczs1 z2L8xP>TAtoOl<}|hFbNi=ndb9Xwb7MmVsNv+epCg$qTV@@P+TgIiZK=V>Gpix_m?y ztxBOm-nknB13@+{1@t)h#o#K5=qDV2AzB!SISd)ln~2Asii^?|)6INuMJ>}OD%5+- z#TwWcf2Bi%Ou2bagkN0)NU>7~%s0Y~?rb`BXkvhyxJb2~>99wOJ~i8xYr|c|=6f>D zQ6UVx34jxqn@A*xNO6P6$DBiTPIKufeq^sw*+CX9bwqzgI<@9gk9-2!b4yvC!T|mL znF8@0f%1~MM7W3N*~sJk=!rY;=W0D(H07$ad(F1G6*BJPx#V>CJ}g+6rTYces3Z3CEFjT(^PU1#aU{$Ch$8rX0OnDcPFZ=aI;l;@K}^6JxG}i?N-^2 z9MO#L+{+$PWtGiUTOu@qH|!-|KuD>tLOD|-SZj^*o+0!`xpVE?G*}F?u<`_-TOS%;CSw<-HiKJN7x~#KgQFqrdhn1Fkr{sWB=PvTR)?TWMw9_%6=JNI=1fl36vlQ`tDVCX zZaS2E^8EJM>J%&Mj|B1;y_hivMv+9PZerIeP313l*tez0ZUS`_Nm}~={i@jl!yb;k zHKv5m@(2UwVz;owl+XoLrfz%kFu7B}-E!vR z4gk&p55G!nUNpd6Yr-?E#T}{MZ#`Gu`I@lJv*af>O0@47I?<^qJ^60i1_632FRCmx z0DFS4?2pUYHRRy>ur6kc=IK2wb`V6^F%U5*ySbp)jhe}*FDj>ihT=19wJ(k8^|*l8 z0;fuK56dd8K@CkT?%_-q_Dh(ppL01+%0f4hId-+oyXLojK$a+1F)Z-RiX|K(y1+~S zGy;c{Zb+yRZ2-f|FumzfQ>@bgNMY$NjDNj2(q2z<3|H0|V1c}9^;ibB;NqX=Jx|RP zWAu9|?I+%@nI~_UsmsRX5TL>eI@JLTiLl3$+s3VktBxmo)-_Y4kL0p`Hd8{sO8B5n z#ou)fJ4z#tJ!o|D)gd#%dfW={$0beJF(0jpjOwVyUpG z7vw66Jj>o9*LP}~)wDk`L|fJiPojNA6O#-xujz`BO%nd$Tsonykq_zZ*Bzq*^P98s z)D$b1*$Vtb!tX>EGS(x{)6@?S`Z3QOpOp?|4$5iceF?d}B>C}l1Q!6(gU}-n4gAad zZShAlFD@29?j(rF1SY=Rl32w8C5}4_UOqjeuRO(nY_vwegxGThE+tb9UTaMTb@5vz{gB2++fuKy(nh z%lmb)T53Eaz!hEzmFcT$kc0@tKk>*gW!ZD#g)2*ZHtoY>kTT!w=iTV1?rMiudee7! zaRb}dZ%ti^vl&>UJ)YW%^5unWI5{|y+bJn!(>)Z`r7=|UZYqFG3pdrjfYdL!886W= zxcZm|I$+yr41O_pqRFLwKN^S4dWb5(u};P#<3yca*Z5jvH9Ct`kdqdT1_EdTSVdg; z=bxU47UlE!$1rX7JT82JeHPsD?wj6G}Xu9^be9vvuu5ZYfSu z*|%E5vBw9gByVA8hx3#JM?T_n=r)r3Hq*f2PY3C`pNgMUQwL3wjcSOGqmOM%n_$b1 z;* zah>AQ0V?|IT0vn}4s2XM$zV$*(Q@~|>AT>1XT~dhBbsRq`-7L~c_b&IsQxU4?u~{L zaXN6^e)I~966RKo*Aj#(%!SA@Q<_t$88W{!-cfrh^L=reMC`cz%3^W8_9+vDeyHYA zvOOk`WDmYP^b5cc+_af_9*Xb}?8Paeu$FOtu7|b=eea|7@Fi(6(0Pz(HQLE!kJ8BR z6}gejF=(0-S!bJV^>FWEc^<=3NUdNdiz4qpYdSPNfz<+&t-#YXygo{HQ}>>Y^|)Hv z4TTzG00OlWBbI)D!)Bmu16dV|hZCvzZS(B(PF>;iYnJ<2sB1Kn-s!*Lf5D$Dy@m=S zQ67bCDoEzG;m)dXDp#)g_QF`N^3vC*2F2aT~9(kskXko$qBtg?VBw5gtqLo|2 zmoa47qs~YjxtV3#0>gtE6wzuKN#UU}(FChM?Lh z^Q{gx*!Hj=&&7FOYdh7pUW5INeDIRaT(~^54CfmiCMS)!Dt6tnmuFdzub=1Mtd^y# z|ED-7>c@UtJ=I2mJ75@zXX~Pv5ZV||r!rd-Vd3Ih;5M6Cu=`-O41r)$<%GUqZ6BG1 zG>)~YO&Y?EgcIKSJYMreiY1HaYG;h+=;J!02Rqciw=P~DRAADnRH)sgjj7U+twKL9P(u1 zfY356E8@e@PbE*!)7)y;TTqyJ4L@f`HOlZpQ~+gB_=}| zcgfHop@$O>Qi7;GIQWO1=b@UCC=}1*DpyNbS_Rol8j!05?P9nOIKwJJ>vZOc?;y~3 zOS>E}pdMPLKX!^qgh28EXd#hfn21t)wKS(RHH|Jfg(FoQXYGQr=Qh~kFj@}{lYUbs zmpv0%z+M0`u!W!7=Pd_n^H~gWb0_kQ;%%dP<&-Ed0M4!+479Pf1KlP(g_>Uklr|5A zmZcHe$PJPO?^+0-q(l1@1A+5*x$6LuE538Be@&&i$-!OXP%q=n9PD`L-cQS##NFUG{>?^aXys{>1!I za8jj!@5y)K@k?RqkG!qvHI9L)0rH|gDqIs_P_Q7U0JhzlX&@zmGpT3w^$I3r%p$F5 zsP6MGp9kA0!$sV+F;`O-p6mIp>IHi^9z$*tsBhd096_~RO^KCk4(mqb%OEjTZ<;wA zme^|Zk|&2EbfR2z?upzB8b+mG7lkEggqC*&DlJB{`e{`;u6S% zCLdY@s^@H76|-+Hfw-`IXPC*#E#3B!@ooW7lygg6ObacL9*~aPf?P#ijg}hTI?%K6 z=anSuWQ?wjAadP{_v}p^B}t=flYNj=sH+vb;vdWug%bE{Cd~wF2@*T^&*Jw z0XD@3XXYwk@X@0uYUW2TZOk)L5>kM0gJ|UaWH^J53Yk__EHfkN(Wu^#csAzOMS=V- zfI153etnv8HMA)PdC+fKgD5j;zX)91%&PrSywzRYf)&&F6Y=4FWoe6w)l&8641^PS zX#-zR>F9_0jes|jZCZSGeS(~%cv@JN}2pAN29f&h7?FQb6p zv#q9C@`VfPI?I`c_hv;2V3HI^?mI7;Ano0R{#y+O&EWJCA&ntGrT}C;?;G3BI z)EcNYpd3PtXN(MSRQonhdjW}{sS|rIlFT!@#cR!&>a}sS5DUAw%2z$<9)=@d9$w*! z>;1@#tD%31HJ4+w`KJ8PU~JKnSxfE{3S-Ba4;U!fDuk;@7TF!A+Tq z6G=tUR%0VRQIH~J^)&n8mp9mMraCg{wje&-#OZ}7Sf~W{@NJKg2GFV}H=QSFa*%o@ zS5PzaKtu}Z4HLix#j@mQr9)mZg&e&I_X1}USijhI)%etozG{P!2KM2rk#=R?NG#_HmV z*ca^$6Tb)=qEJ2KfESd237_Hjk|ps1ebHqyEdAU%&_OvJ>izmLfwo|NOFJQXp#oju z%=z$$sYE;z@x$9p#`SfAMT*{-hxbu8@tac*+|c$9Ia&t@PP#&mNsXK{>xe(a^d!41 z2~4s#m~Hc|7tfnIl~5jtojsdiAH_TFh$luCofx(md5kYMbr&Kw!C9hP);bDIut1{# z6^>i<&bG7VdaDgP+(%s{$ye=l-?!nhXKugZHYt#ud9fG}lnZbzk)*G}Jra~kniZhA zDvUl)+@3CGm$$T}=ux?@kTwJM2dDoeX>=#<(##r6FD+nv2Q1A?iUZbLpnEUZHSPVJ zday1+bUa|`%otObTNCKgES2J($yj6|yN15Tg*^4e3~BC71*z&@?ce5@w)@Is`PL9R{c$C7w#60w1fyf4s)lBK=#9;Z^yaTJl&G9){)iA<`*`lA>+A#T)O*+06h zh@2L2*749q)~9}-Zc%wUQ(Vn{f2ESy1!T`GyQ9Nqq20yjdn%An$4mc8xdbPc(2r5t zf-Jo^tO{kjo`Bymi6j13k&7GlY290qJ174Eq88k-2tU~YSu)VC>d^1JS2@da<74yG zT0L<^QG1ihLbp8&Fk}OD3cAH@9p%L>r7RTIhYzKWOVd>CAsyTa(yAzmk#B?_{n3|!5m<}D4>JNXhZ^71u(1d5RJ`Mv z!tym#Tti_~7)uDcAEMmq(xF}qHsE#f7BHIOeG%uu*M<`Q~3G;MLgO8lM;^~5Y1AFhHZ}4D%!_*~E*rAP(qkN0hKpas_cheZJ)W8=c~|22=rB5%$kPy$XW^rgsD!P| zk6ZN2jJCUKGBXyu9dXHXTET?1kcnsy$%N=CMlu&w|6Zzsd9=a{6qAvWj4#L=ul;MC zP=ek_w~lBvnHdZ3rHxtgYc^2|W>3>FMU-n$(8AVsr1qx8y9}>hM1ZC+O%Je2rUV@WAsW2WOKS$o-89ZrPR zODVNa`k*0_jma)D&#H36pXL~1%;6^N7oq52_2fjoLAy_HVyqb+^&3D3-CQMD5b{Vu ze~V>};21H*fqrfc2FoUzA7lO+RX|$Jq64dgWGCi7nVSeHWCx)8(S6yOYSCIvo zA`z+4dfg&l?zyT*uA{C)XZ!NhH0rpLE|0$+aQd}fTdsI6UEal^@<@HEAUb@byoFtG z1u4j237i$1x3a8U2wo7_#mZ!Rf-Hmug7>&))mv=610YrJw_L(hHl|*aaWb)$+qe=w zy8lW@c9txVLTVEpV6YjYO>UpOAH><>_Ot?63_47AZOJw=&(KT3{l>e|P){%yOun8e z&=Onxp48|~YqCAlM7Zn+|4_%z$;$Wm-lc08yC9=j;274@d4qc+*4E43Vsc3e^o^)Y zkETLuU~-2;sNq6Ls_5sjcTpUZ548X#tu+!hqUb)ri|ez;Ofu*KLF7+>^fGFn*JF^~ ztd5F2F8OVnkQe?IuWryT?$TYcmn8S_8+}4pg>iqcwd7$@5szIthipW^9>ZVd*pWP_)104xCF#zjy9^j1P z@m-lG*FE z7bY6FTw`pdfJjz79031n`nVBQoo3IJFT)}!nk^@p+m8!v8@ft(;x>HKJZR+$W~Oj~ zXPWar{n1$32DS|B3-Twyiv;KP*XXIdW`>JYkwxLC#5b?{tgE`2ZVIro&BoU71}Y^@ z%%Sb2=t}amNLjJOmoO(f)r!eV!p0s3FN8NOb^MC!5y4vyV(<~YGeW*g1?zBS8rObH z6_JuS*`=|>_5ma*aAwDl_LA)v_Y!gqeII#_w(zjmZGbb6Z;N zxvb$;8R2GE(0V;bB9H?oLB#S)us`}uYunrO+*p3DF*N)1?bz%G<0nC`Y0sK-p7h;S zB17JmLcyol;^Q6ZdS{yOAZW0F1dI1@Pm(?6C4k=+(=9l+RD*1Yr#0m@_effbAze0Q zd=c~HSKNeh|J4qT)-^FU>`i#ci(Wg`0(|=Oa^v&f73aY7-IMk`xjC&w1GV2;LxU&J7Zqd+@KZR@r1cdqMV zD#A2vxU#X})oY-j3h(;KHB_rkr%}mJq+ea2qu`ii5o&mh>}!T1TaC02qcOgo zW~+>2^PJME?1*O9i85Yp^|bjxhJ=k5uTR4amw z_!pks$fv$7Xxkac25LorTF_KE5!YXfdBR0s0f1An9^yB#Q+IxtjVx9CE+Qp(n*A%2 z_A0*^)t6#7ZR4u?^#21#K)AneU_i7Fk%SpWbbjb+VI8z%mIs>J&6b=!9{#BUB?sH0 zJqx^ue)xki@Hgs5^mLW0&aq5!Ik9&hcP*$~2848EQW&6f#a9dKk~2l;p>B{*)egTe zuBR3caC^{P*MG~1TKE(p@fMf=8G%%o6GxSr|3#oXJ zch0rUxt4Mn5Y-TUcw6&cKkaXU&aZ2HmgXSrbE~j}aK=oK0S$hD)00lWv&`i5rqoj( zBAGpCK9q(?AJ@ynEm7f|IxA=nYS%EWwqv&I)3TJxWqG6%#y=e{%4Gj#^hBG~0&{-iqfAJMWW-G|Z;>3Tgc zYmR;_{rH7%4Rbe|1NaF2%&O<9rPAkE>7^Hyl$cP1hDdLHi1gH#@ZZ7!T)!UMh7eu zMuvPGINKRp@0wTj=HX199<@pa^tUh2G9J*AhDbOj6pIJ`-3&b4hvUPefhe@SOKaNh zTn^wP{0p1T=dx>Pp&`=U#xrCv7E=6oC& zV^=Xh+IiU-%z{4jBbw%1SI%6^O41PhL$w2Pu3rweK=*evyH&TQrGpp;@Zn@@Y_(;U z`-xM_wd_&L!+@+lM0(Z`3HgElOAJ8n5U&TXgTHWY$+fo-2k_C*SK(QfR{ho~x&28s z%{G<8fSMoBQbV*+Pa2|s@mc^3{C=e6`+?t73E{J~CJx}Ek*~t9EWP^8vn%NSr1CXH zLJV-{-B$(!V!HBwvxZ1M18%*A>@3CsVWF17Yx~^lM=!4O5@kU8d|M5*0v#FnzoZ`# zyI_C#%Xck*9`ub{S4}pS!U24^Iv880ji|EpN`6gprifWH6zxqZd#)uXCj3uBB>Q?+ z)&jjb@d>(6*yLEyM|KUx>?@T6_<$P3fR1+E4lMM%dbPkComo-QpHwS9AZ50xgqeo2 zbmjjaX^8mk-yFR<8i;;A(BfsrIG-eEdsA~Mww1#H{ZYly#3nYxG44R7=dJ5&ebJ?S zAL{I(4E>0%3{<|3?B5d)Kwjtt-VZ{a82f>j+cNx@wrXTsM~+Rk;eg3Q|Bm)y*%RE? zA6e@C_!8++3ONBfCX~Z~Ks@lDhDf9B@!Ai6|Mkq8#s^czc#mo1XXT}hEp_35`Qcwv z;W40-eOSh*s*Cq$);w_`uhtW6|8lAN5zR3n&wShe!wfvz*W%^99nCIoOZQ(lE5<9P zeV{`_M_Ut}>_>C(-}T>xSni+=+7EoZXWmm#_kLmCGo6wwe$QaP@)Eljgs-Ik?)`V~zkC1P`|sX=_x`*0 zkGQvA!oB?h_wI_{BQXPCyz!^_Jrb+%#WbAQhr~mi7^w}pm&Ce9#Zv4akS8`X=856# zsC%pzOjO=uf55%jT|2k8v2?e@pW1xcp=~$(YcPPz+zkH_K5Ff^1_oXRU$*_M$M~%0 zdnatIb##K~>!PPW-hTIb@N3hi#-|QeeeP!cI=N?uDXThk%>U|}Io_Xaj%eArbJn$% zCuR>i8o1r1R$yRY=Y$1u5ywMZ>o5BJ{8ry?28I#+%#+-Vn*MLtmI1H-`su~Ki6a_j zwkcd(`1I-1pC`VkW}O_`V#(FGch7!)5&CLUS>fBl(q(tuJ04nh;MT@hrQdI_Hg0#d zlCoXfho6m!9x|r=q>BsU<|P*y&NK2d2r_qQ@BrD@^7OQd92E9uYKM?BeishbH!%A3 z*ND~2inE$OEj*l=7wr=EMd%a1j1vFj3m?uJ++|zCtkzd|#Xh}uVV%#5W+`Rk`ro^? z<92j*;HXPEIRj3<`DORdrB)lt%H!)^Pubfp`szQ^xYP@m(RrlPbCW{ViDvf(Suf(&dMTZ?PY_4`Z(PetCq`^~?k~TH6?tS{n znM|vry&@NsHT&a?f5X#zUmc7-o!6$7$Jp;DP5QZ67lWVUc7JSpyZo0FJN%!;(Y?ps z>7=l*W>ixr0)y_^H{j^}jUx#nn^$q+!7gzyYAjoUheGCC$z)eWu2xc1vZ$~Tk&k`a;q0F z5+7dJfga!KGx>G3JFg?xypI_%@oNWzbxnO7ZojebX>es|WY)g2 zKF=TIRF6EK)~w~+-`7-$+_lU%w%N$_`70c2=57m|H8^il`K9tsUCMtgYl-IHL3w8m zH(g)2qqMep(ly%|o^RLrwQKX+=(2}>cl>7faNPbqwoTgA8nn57cROFNtPKwW3I>@T zbf;jXFkn)GZ`W&1 zJ!?)WN}u&p(iQh19uxm~a}kv{PyFd+(|(EDPQ`gvGdwqCK$G$x(Ob{?tzI`p&X?Q= z|5UKA>fOsehM(Oi8{q5pL%j=e$tES4ZKLDtquwoE@jfFl?*5(k7yG>kZ@ptk`i9R9 zwl;J(TH7b_;_FvsZxvk@wEESm>~zA2h1-_DH<^nX)wOGMujiSjjglIF8FHfI=DVBk zXCG?S$@9d*g!tvfF@pye-MjFt-rS~n!-j@;Y(3Zi^4G!5(=Oeu(_7)cF0t;g9rjyY zf4ZE5-k^IA?@WCCV{p!!-hcf5?DnLZN%z{9z0G(w`Nu!{j{SHz8n&~AmFtXx?8A?* zr5_G%8gzV9{MbcLeY+-aOs#3yv_V({MU@kGJI0+nyzO(NtL-AJ4;&1*8T@R-jW-R; zUqo(r_YOTTtGWH+Z^I{g8$^84^HnEwKhzJsZu2H(X4E;{ClB zrA1eE@4dMp+9-Eg-s{4C<);%r`Tdv0i9X@IOsw`?SRY-orOulk`4b%*joajMYwLu) z&o^fn44hM9x-&JUDA3|q=_(_OL#6BU2Y)s1K+f_b4}AK)eK)cEkFxjQ4*x6ehg-J` z{f#z;t{+kSSLU5}8B-?ZylMDda#)?eZVmHa_+aTT?FS~!4)Ai%Tw${0iotI+I&JRy z#n;&-tNKQD3Gxm2dhWXWg~df#iw7_D_IF&=IkZmciPE8826b0tnap__6mZnVvFFbZ z&Ytam_wA=SH~zYDXZ+^v<)zzh-OOuZcrD}Ev*_}BW#uz=Pk7X2=4sQlXT0BSdD`>f zh?ZvS!Uua9K5);yz3D-xP8kNB&MvN19MIs^o4u(?qXyQ_ENvHR+@Qx{moFdPPv6vN zWtA=Ii+mhRPPeoUFMCvStL(4&BQ9U*vttGdpWJS>qv5$Dse9j+{S}({c-WqMvo~%t z2znIo)lgF#UxNeVFNc_qYVFcEE$D4(!qJG9n*;lNy`a{R{1$CPcQ)C(w$L~CY3`G4 zz9~=qEY|MKw|ezzWBS`A5sugPj{D<9!VeoBKPa`h-Dq*A0*j;;4QiL4LGO2;dDy3) z#o`A;k3~eD$FI6&-;Jyn0oOy;T3S4w->ggM=x5739#{7t*CKah@zb4y`n+mt5#Q&V zG?Ouhme(?@)p_IRMxl-Izhr{-up3)m%)rk{n;JJuw}h0RNFRE??9W&IYQ#T2S?2KZ zqYG9)2G{!Ltk3SA1zoRf?P?m4GNaCpP}d^+Zj)D9I=KF7{wS{W+rhuZWeyrW@{6*# ze$hX1hzF`4dPtC3wtJpa5=Tn~Ve>(H7%Oj|j#?B(Iv z{r>d3W8HhM$-Luc=5;cQZ(ix2RJyo_4iwv*b zXB&2w6MZ9`EY_Bm-QJR-uq9#=k?Kx zC+M`_l)k;L7VdoTsLx#AbDrUIO8nPtnEj?k@$Em3<#qCFolr92`K^rFVFRs`E-BXk zTK3!7$tgSM2M7F;Xm^!91;7}pdoy;$q^L33!ew&9ajjfA+w({CX?Bj<=-e^;v-Dd5GJ(ExQM)@Y4Z&u1(e68M?*zTP)oPr1*Bfz{Qa?XNAGQ zt{so9xjuR9@}iXXi$@qQs2=82GWp5(ityy`rnJ7FUKBgHMQk(2-vZrkPB?k{_4OYb zHuPv68}64^V0Qmfqn8Ef>5ibsT`%1CuV41n?;X43c6(N@`ofsx-@6YD3(M{1f9R4& z=fbwDo2OnZJ+b5YxVhJjOR@sb{gD1!)T9UZFI)+Y?;Gjq|LK$;zb@W8{dD3Vp@~PA z_RO0U8Fa(gZO;pD0XUke+#&*>Qr^_X4>OQGUqrGQSXJJ%nVuCefdN;cG3N<}n zJv#wX=$;r-@;r!;ywku}*mc96;_VcH(XI z=hC;^i-IeQ4ssl*PQ%GHl>A!VnRvHAL%!1(IrBB2R7(Ro{@j1~8KNH72KQK_Eg(u= z7IZe*Tygd?I?6mGF>4s`kSV{3wLq3buMBS6PfTvn! zRtA(t$>v|UqC=YcnPqfRSs%5zxPc2lW1uf>hKM@}i8hD%91#|6-Og)&iA&rs1MWQ= zM^NCj$La;L?Iiq8hsoi=*E791bfTnYCoWo2yeKJ6eK!nT-8?v|2F*C`^wak-P+B(~ ztSJXUcI-Ypcg%OD?GcNg-hQ5YnC5!mIJrs%VDxrM8{JqCqfHPEE{86>n~qql1R30JGN>p@jci`a(-KRGEp)2Gc>*#Ry0 z(!otl8PG#_{zP3Sc$1e)2}HK6siw?wzG!W?Q0M4&)Z_W9g8{74vHQq1zSzku)xOek z>Q!5~aT?2-ltwC7onQV1)hBmwZ_wO|#fg2THyugtRMcFpu1Cv75U!|=S?-{KFz!{? zEJrEO|2#t!U0&^=`+Of!rM&Q=jluL2#XTM#B%ahSn%nNNUlPusEW*0a|DHY&AFq8M z0AwV9LtmwQbKvfz{vtb3H?LD$+0w~iT>?$dQ_g6Ng&WWEvz6>EvT^o`6RP#6mjLG! z_gGO68DbCpcd#zU3$bLt#uZD=qbs#%E8}N$RmE@^sfL6Ca!Y0+=us#p39N3=;`!W! zB=yQ_`h}Y5f+nBk+udA?JfqOwNFGtoQLv$_kVbGOHa+XuWO6-w=YT>7a%x!h;3~q! zpp#;-k!F2TEvn}3e-V{S3-K8=Gow{drKVLflPJCThw%}ItvdJM-eREz$1?`#}b-06#6yx~nZ0Dw~&fZxXWS#RY0 zVvCB@zt*J2KsNV3$?to=jzNibuyBTaB6B06dH)R@{gvTX_QZFcQ%Ao*WT#**XOK7% z@r{G%j~cs07?_n2O^QQpwegVAreetlD?2?+%NhBrDyyPVQBGqTQ-cl|QmzXf?>FSP zQZvpoCH&iZBF!kYE)c@}g;Hv1Nm6w}YEG@j{RFlrTi8@DwGN$s^6KK7wTo zGH^5UYU^=sr9mQky0k$yQ8(gydLAprDP1RrZ+;(U0AbkJ;85Ddq97V>;-dw;uf}T} z+CGWDLwQVcqj$Q`J=mA;gLt@|V|Y{rPBOKLjYIQ4>yo;qxy7976T_m)c_4{|8OV?z zNcBx4SVK*xtQ=4@gU8NpyncwHE#w0JI;7QjMu6$-g%LOMnaAai17Gri7Kat|786Qf&7k?GvaTj8jY|Ym9l4xC6PazmfwNF< zt}zu?NXg(oshelmsObJD)zqAxII{**G)%B%D2mc17ReZ+p)U#CFZzIt1)`49ZCXg* z;4=m3>rX@lBmx++(&J*3#o~4|41w&J^8zjeW{8p(o)5Zqw@u$A{U2^^Q@~jjC^wbO z-Xk zJ+HYhHii&wnq?X;23~);*1C-(Q1Qh7l^tjkxuxZ~V$#wNohram1b0}CX6YfM7`6-w z1KA>0CXquU=IS@_&a4V%1Gd!Dw@GH6N~Ai=gQRJ%u0{!U(&^due_;U6{Pn$e)0i{o zWHV|F`+j#xTT?$_@a+k!(>;fg*^PMjD}cacGZCTN(A&)D$*ce((@V}OPecs-v@Wmd zM1WjIh;h+>DyI9rey^HCRb-%Ah&JG2esg1}&}pZRwjfVps;4dDi=)J(42lmahteYd zn*3X%J?3h~Sk&sucW0;K?A7ss2eCF=Ds-~z<+p35L%i5&Q zSU3pJ+OcsZI-XV&S%#(meN#qBIX}Bq^+FC5tXh<&9|ay}DfLxiM+qa?FIg&CUlAkMgQ9Stq{tT#ExUphX~5SfmC_xC~I z>7^@0Q1=Mwcc;lgOPbRDg633u;N$(`C;ql8KrmpmAEPt~O`Ftm9|0FCt2vJxA|${Y zWs@cU%DPYz>yTTQklbu(ufX(KJdlB#85?-|YvEq#hDkhan;wPTaGaK01K)&DG`+Z_ z)H1$2dQrt`=SzMxFuEB!1gheg)-2n=3iRQrhjn(&mcimvOo@i{#~J>FqUnEZ1!hc$ zn}%&H5iO`08gqNwRlqy3tE&UPyFs%Sx)Wc$Es8yF9j$UvKn(n-wvlD2f%sG46gF>@ z!U!ygmIv2B07Xe#&fqXv{eZm>`qx8_U1T&z-vHfs=EeZ}h865>bWEK5VftkYeRh(J z_V#o4&YEZ@qGUuo2jtemZDu`~^)tptGf-0_GIlvoDhhc8$m<3~Q;EJN7M4TJ&q=;h zMBk(O8NrSM!5Ety#2kwmgqf-5urp*iypSx38yXW&An3RYG(9<1Exoz_Te)s)6voeu zy#9=prq&X7(sGsE9zZ3vI<~_)lR%syrxgZvvxQX$O@Fy%CC91!=f?3CB-{x7K+l;y zns(2`uz)=gL!dgYD7+a(>yMfW-0-c?7Z~ijU>J}SL~grpoMY$BMNLiN5h+^G?hKCM ze=Sv*+Z4v$-7hLG&3bbhF;GE30NQANE`Z_I3$ZtC=a_4EnO^5pq|3hO>>SBZV7?ybuwt|2A?HM` za-;cjBWv-=)5tpkfW0iwuT8N}TB}#h@>Nhc_f@}^kN})jk z9qpm27Y$6X{ZF;*RXN0{&iZbg`km7;T-n}hu$_Kp&A`JF(xw|mWEh4X$D`kB-+eX> zNc|SiRUnLZ`~(owZO}$;cJ({1s;%Md{kM$S5TMo(JZtdR1uPkm{5Lnx43fIoQZ6M} zMFU5IZ<$iSISoqD@&H6sbn%`x6oN2vX3T}|i-}wPHh6w;b?#0fWh#>FBeUBrE$*{D zTjQ5C*1!D-G$l^RR`wc1Bj0|T7tpmD%XZ(6y&+oT4i)2#P119a^#6m#SFexmYYfQ# zOH1`Wrny?4W3s~_MKJ}TTOQ@MFw6fVsegt@>TBAhMj;nD8zN`*qB&sFlSHv>QXZt* zm9i17$VMjrm1$p|42s9vq&SrG3mj{p`n3kJvt{kv`{Px8d{jmUNrjiHztzzCDbBG@M~v!D1qiM9WKO$kHQ@o^4*iBs9L@%Z!S(DVT@?U| zCg#|9m=L(cV48j~IQeY(-%AW)3w{nuIe~v$o1(Y9WSCs3|01#IOf2I0IgahiJvj)^huw(Su?8J;4FVz0I+?@4>i zWC+?MPBM#W%$tuL&jrO48n;IhGixIwW)4qFnG$~B!yzp^ zG+?29Zo3arxaYs0J8|EGU-JDN(AZt~Q&Z?1t@PxACq8B>fdJrK-Yc-rq8(vxJja04 z5xZs?n&Td3`Kt#5b}DgDDD7{1y{c^{aa_-fJ?l~$+ixogy2QlFUqU^16`MaNaNbap zw|I0?eFwyJjH(+WMf5GLislLMBDKp5%=W)c)WH~4lEJ**l3Jz^o)ZN{sdlIW%_LKcY0ixD+w35 zKfa28YI(xK>WeqopKHf7olt&ma!Ey}@fO%w5buwy>bX$+**75O56H!IR1vEnViHop zORv9QcS#Jp4{TSJ%)_r%f(H6%P%tFtPmr&yXbDYfqVf~OdC{MO0khYnXwT)aebdx9 zNyqWpL4Ht^0Vp44WW#m@f+Ba=RT-7F64_4}t5X3mN?agDw!Zk_nJuIv-bu;?Tj=uX zk*B~Y;038Qq3DmEE3?+~<-eT({iibtEaLEB9vSi?xN+x2?ze+!TclzcTg)R11p(p{ z*8x8>Jn@6UnHvW;;!yolaEuU6@GP{T{S5olQ9G`X0A4t0)05$wSLb+mU}KZSodQ?l zd176w(asiLd+MhdckQiTVwLBNz$#r22DE(48Y6Bxwgn7hak#BLMt&4g{Y>l<8eU5;TU4Lj~jINy|Uml ztmEzN=c?-Y{5hnf5~E{5rgC0p-huvD1VfZM^XQCN1l!xcH?UXT^=wFx3m>FSJSu)c z6}#$zRr*QqmFTfxD!5iD$h%%Y=3| zO{rwAEQowStyE}L%z@4sL2FuF3Hboc8+OcmvzkQF)TviRihXTA+mC69feDw%XA|R2owy78nSZ|+^ zhfRnnYXPR+C+?5A%kM8zj1L7?TRNt?`u(p=4}$LUQH5oJe2OfsMIYQajW~B6?+P6k zF?_8tvbjpno{7!Yg}}*H0g0y_kAgRtK~{t3WT!F&!s@n`lVSu)F&pc_@HuDyWw~0A z9}Z=Vi+EBi{TGCcrUSM@%5svgS8co~N6N<;l?v%M{>{#-B(e1MHG z86K$7$-VXZZ*eQH5m}hS*Jxc9-b>RSQ}m;~r{#0~i`pg9MPKw^)P8{MzOT91oZNu) zu-S#0XISvVNXj7PuC%AX4Ji8KCtJw`Mbr-$=}FJ;8vh$_8MuOcqr$hHb+Hzn zN^gP$cRY~kNxGoEuGHUqRQ9i8G22B`)?dXUMyClqFTEauEe!PDIVh&)xSv3~ukT{M zBcPGD>d`gK9M-diKdbk?ffIM5w?zfs7)(_608vSt4Td{h0aMC>8AH0n{)5>`ZpweQN6Bh5=OsUC?b5yE^u~8# z*DwDX#GZr*fS@sym_H&6K1RF{*sh7>A9@K)g->XF!b8mQZ4)_5 zj%)0izK2;ijEj4&+@C7rbs97fk6x1+-JtJKiM~vgywQ~3D>@0ZZVTUSxct){c&j9i zGq#(}{fqnT_H*XbF?Z%)T7B&`Cia-8z_Nw|3j!4OIUp^VmcYl*CIn=Cz@2VUy)6C8 z`;cjn6xyfsh2bU&@;4`4_DyUMi?@zuYo=(4lj|1mOmtS+3$NUowYDyu=Fhn0@t#D>Xgq2yoX&o_JdqbbajY zP35(MmcI$rPt1RIueb?o_kvHsxbAOy2&9moVvGZV0%Ni?|2!>SCfI3deeTAqn<mDZok1NgsY?8!_jS1L=fcq<|+|@*1Fy-{?Qz47y4bqMOSaqRuxLJwrzyts;U)OhaP)xmNM3J5=OXM@`Kz|h?v-?qz)?S50?_S{{X z8vl*o*%z%o%~wDIzG9IKa{$a>7b3s;OT3SZ*z}nhfhO8=6ff8*#e+vbzVr+K^XE;K zG&*q2`~K~K2ZeRr_0u8FDhcf(AWWOMa6fo4OKTnCZ1Y=7%5MAQ`wz+G;Ni20CN~8y5`&arz-6&UWyI?oqOc8)lC=%Y&3}Oimcl>C zFxvEY-+m77I~p#}>d(2n$D9|iE<-DsK#B=r*jnR_j^iChVmZzr=dGpaKcIOZ+;{ju0EwGeXq zHIr9Nvwo7#FC+}yjT9BFLw>^YH3$EjC;c7e+*rb>`Z*K%QUJ}@3*!=jGF^6Zb(Ndn z1(w-4=`G_>GF%kC`C;_>?%vz=K1W3hFv9Rg{2ZXU>Wdq!NfAY0YsdD{pEn7qhMv4E zO_0?Vp8S29u#;} zZTG4@VIBQnM2!cB5g>F!afAsNY#adWGM)O3VvPOo6aU10V6?CqlHEshKog@L#YSgG zzbW`8MB?Y~F6rl)-u#i9VSJmu!Rbfpl2baj{wB8P+3dt!?5h~H5dSOIaQY=@JVTKc zk0O=J|76mCh~(k^m7Gz$ks6ir9y3Pe%l%Y^*<+_<*2IpX<0|?qTmsycg#Gr*saEt~ zaa7*$L}LG_Z^&)2Pn+-Nm?86w$ldDx%ru3jZti5{N|mb-9n=RcKLRC+9azOaEdB&q z>`NG$(t1|DGfV7cAFM!pbRJF&qWq(kd@5of2}A1zNd!r=xsDSfQ*M)0(s<5CurrHO zR5`Od6%wy@^tlB;(ilIsUEz<8xKjCiV42yxo2X?*rJ_XGU$9OKI&^jxye%v&}zeJ0nqN9n7|G{&p== zJ-!S4(v9b4jnU)l_}6hg%H4zx2>3XY_?(njpzAZ&?dTWM^C2NwA}scSiG9zyVbRy!?^J+X&-+C_9UX3oB#RrNzJnmX$v-eJWaX#RPTivZQHRGo_f z|14TVvckEW8GtYrzqXpfP$1q?_W@f)r-Y~YKIONFF8@2@xCEx~iHCnuN$kMPBYJIZ zaAbBqrnGjCG}3~}V2hN*B{q5yCsKAo#1-vjMO#oWuEZPq+vRs*Y5eV$1oWPVJv$tN zKlbT=u4ttSwvo^ZE8Tk$K=9hJ#y>jVGu0}8LnFU1WtT+889lK6a%e-9bd55L@v)ff ztd1_1qRNYVS@xD@_=XBU-6up`2$j%rE%f4HNPhA7 zpwEt*F>jOeCenQK>T}eguu#~JTVo2T6#!ss%^dRHN)DDDz>3LR;uuT3p}x z%fArcfKC+C2|1=Lb!9qg-0Qf57J~iu;~Qq5?}V)g(1(@tf*;O8cw2u&D)-#={Vs)v z1D?uE|Dq#3C~O1oA*Jn4)ZmHw0}DY4{yo-2N-#_&!Cafo72>l^lm$c*388xLlBcV>%*{lJl9~BM&2)0@|Bho zPRRb0wOV95KM2JB_FzNvJb3Qf0OIh%3ZsMx(W@NyZS4D9vdY9D5u9f}QC+PCdgONf z-N`Ml<$GW$4?>QLXO+=Br_WGuMNO)*UyiKOp#b?(MPEV1y?U*^cCpp1Ul=&C zuB_Y#MCTg=2Vlg>0U?BZ+*)jq&%u~**yf!y=+id$YRU<1cc zispE{hDJ!+9z6K!?a-?1+ZQY;uK>olIHq1>)Ua}NscW}yM`v4Ad-t{m_o+lbI(qXm($e* zASK8OQYm9n2{6NFKCp)arMg7y*;^mwF2wN^2%Td*{a1gtEg4zr#e>1g17Med9*>aW#Z<3r_p zAvuS|5aSOlMstnBFW@TVBmnontYlic@e(#-LFO1)zC5pSe5}8qCdMkF9*a}xuiHm9$ybOOSUe#az<9w9}WqL03RZ=Gb{DgKbANC8V3`aL3ELV~sT6B72iu_)&qS0}4X>bFYn7 zRo&l`R)RS5!li^DVKGYE$?*={56f0Jso##eI-HXB_49Lb*QlKhun*f%ay<{F?MFWK zpX4g1Z3%mXgF|__Btgx7-)dl1We8R*?K+Wym3#5+6=9Ww`){~b7jS`x>5S_O@u9jh zQz#;*gqno686@*dLk1KHL5b#&^)#IKc9H<@$PG0erFL%q*zev2f;Sgi(3)r zB7d}8y`HKygVxa52%7EJaUp<Rp?P71CSHeScC{RH`|HJhF2$sx-~=GXNz$44B}9F}gHrg$ye-^5SIiyt z*?uqH-_{;~d0})*_a!PSawoAjj8czvJWcl9cV+E?1YS-8h&(xq2kwXyfsR3)#mZmv zeSn1m!s6#Yc|?X_G9q=13p;o_$a4~v*Txjv$zZzP0T`?@)e}{#OsyIO#y}K?Eo2z} z>ZV9K%UE{G-79I5>=cA9H{$=fT8#;!S^~&oD{CKdY{_u)oZSqEr>codM39f98 z8r4x43H1KCPr{E~b`=bFY)Ny3Z+Itef9-P4HfK|h2g8J7_Oy#@)aik`o;+78cbUsi zAsdD&ebW9z?%H=B`%)@ik~v?z0lDbq#~BqiM*D!smlX3{|L_)--#dBB!%ip-WIukD zef^)iAS7j10QLVS8TfrSi5uA8((8Tq`e!ia8`;o%@DTd8E)LLCf$5hz*t8mEk z)UI(nxd?R}p@bSA*Xwb6tol1KG2;19g?{xYF45)oE=vse(n%dVuuJ*F{xM5k78=<% z8mb0XQfj>ZY6VA`E8qq@+m$|T{LLM!@>Ea3!1>II z-3@R#5s;@D`ST_e4B+1ZGAl7N^rf?Ler0^4$6%^+%xNTdmz%ID_`thk*GM6F+Vqb! zF$(O`H%i9|s>C~UY#mU@|NhzGXQn8XknNo5eKtBzrJ1NUDV=r3d;<>R)zdc~))(b@ zZ`7d(4_b8>Yz%KI2x6bTs&uQl@qSrrT-?36asOGIPEY!{YahZ3_l?S9zA8C1HRc3@ zzx2ZKG{S9^R4h^`Fj$F`050xtG0K(U##YoSL14a-_IlqBhQvilVSsmZLCnf5x<`SX zo~a|Qov=`T5vcoi?59SE0F zN&{4OvfRn_L096stAdgceJJt(U>x}|Mq5CagwuF0O$+b?DI|tlH}bjaHYvhuh-M!( z>^Hz$j>#gl5PQ;(U%&fJ3NeXVu+ku`sE}F#W;Cas_LztuuZvy~6Ml2ns;}enrI`J1 z*Q7+ZBrC@zYEdbB3YcJ-6rd7q?2+zxVu4u@20WN4k+gM3cwHH`S5RlL4}o<6safv# zxy*E{9p$8?C{^~Qj~gW1C-b?m_>^JyA2!y5uU^l|=!*22F9hEv4JwtQ++@257dK;) z;16}@|22}~798skPRyW7Ho9vX>$c&`X}c@lXDzIbZ6v%)+(Q@{Y50Zmv^l()sT-2n z`s@B0)HJFFR%td6hQjLOF00IpV`9QoJ*}2SoD?l~-z#oFsad|jj3tqyy)i>Iy#i*H zeR5qOqXphKuMWb%IY#L*;7mg;G^7X)aRT+0>!WN?hX;k3=StAJK?`2(Vzqy2H^YAY z{bsr}2+!OX2HgE2o&wl1qb~?VaE+P*3SV~WLsgE$%7_fmK6_12ss-DJodsHKYk7d z%>D$=zPiPD5-Q0vC2~n|--l@7LztT_ATcasNAckEMnVHNM%KMt|4!aSr2aLwv&4@` z?q>@j>WkAgo%#{bjW;`vw{skM8YfXx9u_YP*!J$Nc<}h#jVD<`G!oG7o@k2ZmL6z#lA1 ztk@uJ!k^X6oK9xZmO{`rMUSdpKRPVo@A9AbN?0NCz0Z+NrL(JZ-pbbs1!%q7^D1;) zimnnpLX3aFN;n$TfgALSUVH>YtJK_8R$iC?azgF_266F>F>boMJCr^3s<9A(WZ7A*_rOu%|$D; zO#M23>&xBh+Hx$AyE0L{k<7;@G&DmGG-wBN%2u*-zRy{ViT)xBbfm<|#FTD~`UnPq zfvqV_syp7QfN^rNfq-|-cp0U(bRz&M4rExS|2CQ1yRUmkKk5PPvw_b&hMs<)IjpoC zlp1gWRuop61q>wuoT(n8s$KtL71&89`k<6h2jH2U_U1jV7jLkqg`+ehf4FJOY8C7Z z!uFeA!4m_h^-;LzbYz?cYKBCKhk&U{Al0kY4mYyOm{rQ$I`U_TB8>^*BXVLPLI+eb zXC9et7yX#HUF&%i4Lm>YTK*pGBj}BjMQ;0~fUq);vcrc&Hqe8+HlPJYfw?mKM<(a- zdaA39N$5H+n>m>{3k|;?Lb%iEmmHz;s2c7B3v|##brwdT?oSs>D}`4DU=x7uF@roH z9rdUimD>WH)ZX-dU-YMY{<4Eo3No1~HIU!ycK64GxEfvb^4rr_LKK2IRsNzFqRUh`A)7NniDRT1;b3^okO(m?#*+P;jvLLQ*}#MN zrS)>1l&_cX-HEC$s7R_ulWBt}b<)3cm6XIP&1lfu(g9I39K_y!nM_0aGXU$3N2=wJ z&qc*?qU@V-55=LP9B%J~uIjv36)`Z;!FWI>+$3;)KcmOszC8{pv|sr-M-sXB0h?Fj zz3GU&X0f}q-teY?m`IFUvcjko6*|^YAaZn}hC%nqB=)d{Ap3}DpY=b5zhq>A8P0>J$aCA@L)yGWymB$d{9Xn$Akob-qvK-!64aKAC!Meuahy_dKnl0FdC%qcN9g3l<+)Dm_!0s`X9rTYbe}}8f^Sad zJ1{vV^-vvz^^5n~5&`es(sDo#^gsqKg$y{5NUK?mF~h=b*o0d2IYI%HKTOd8#AwG{ z2CN1yLX9H@h#0CE651TWyBo2??};Sqi7YsZx2;q5-p&DQtswXdE9?-L7tN`cR? zj3rCI{sO#pSDDq3`Saf5BQu+LhaPlIDbwn*V}#^1bFcJ|$!7ZJwen9gJ6Nk9N<)># zHM=HA^wWGn)l);&A_hYninu-uK%$KCAG3tvZf)3{bA{8b*~eIr5S7Y&;^2h^m*v1; zjbHRa;x95Ull$c{0*(AnMvlyO$Fn!CX8ug?X4U(P{-O>f99`rm_1*!-`u~HlWc_$s zAD7<~fzQqkd-#O+-fbiqp@T9^ALOTlQLQgxhD3!U*s%`JNG4vn{A}Ih!j?os=dSnU zdQyp*(5`7#tWR}jm!wa>DH19FCf`XY!`_)@ZQGqs3q*bWt(<)if9il#>QEqNj){SK zRd)8R4>DK?Jxia?bp0g~8tUrmcU!S}{au?l(u@dwJntLed%X>{Na*(CL+ie7LC?hY zsKo7cE+F5S3U_@H`egv}On#?=tEbR>3`@pPf>M=wMJ%1x$$3LQtw&!ih7>{C0G zR)6h5Y^pj;^-BGf!M-=??KJ1~Yb!3``q=jv3ycq$X!AVIUsN1(xsd=WjA zmur1tA~qSUt1itcNjy@}I?+jUN}D3W(*lvVh>)kNvMOph@0w)5I{|?{Xd2LL!q7-A z;k~a6Ne%X1e@9K$do!+^sz(ERUXc19s6Iwjc=fH5BLC)kEE6YY)1E0w*T;?SzTEjD zhP5$YXsRB@6BH~`Cci^ zXAEkGY7*&hx##QjrH7gS_YVI6<ZLZ-s-ZCEkY%v*I>L^_1ddJB2hwMuoEwwwshTOxHeovV1-&g5IdYXVa7)I4EDK2O}VI4jplGNg}@q9qi+U-T!Jga|X~YV?khS zOSs*Gv))h66T`A{&_tj`T(Lw?(9c2<`_K`~x@Auc1;J?*XCB$nGw!GE7>vK$(W^Xw z#xuuxh9q+>ee?`bgvohzrUBhWG=wG2M) zqlA=N>0?hSb_U1fu&L?vR%!ehsSMp?|J02K2*v}CSe{V3G^b8z{F1dpS3<|le&~wW z(!9A5-#O-%qxQvib5bE~DbSv-#E?SMCPuqF(8M%Kp(H6Y>l+twmfAs;SxjdD5}26p z{pi#o)SrB>0fiAt)gKdXuxh zu;j~FNrk>XxxssV;pSpfu|z;-C6jSlj2l{EW&yr&Iya#XvJXH^5<@b*$@s#AM|^os z+#hqKVTJWd*AWjnZA0pPpgK=L;Mdk(SQg24BPjBWuJ+3y-;upwLjd3x_tW-g<92j! zoN7hoEMp;+4_`R+Kfr*dOV(dsy?7cVa>efb+tqPRu$}e=wYdDvgvO)<9>L zn}RcywZ+>|4Yj#VnQx`)ggW}_tqLEY$m5hMrbI$3w8SLt90`+}sFmb5+CQuDhR1Sm z21~wZE4J!lOL3pCg*eTY#fWpIZ;Wq11I@92I`cRUjgWrkG?E1K{qYl)gK_cqZ12)K}%*4y;EhiuVBTPaf zVf!`B$B;rvfUgTQu1xQydKKC@`I=;(m4*`q5_zE$1y#N*0;NN9=Jf8fq|IOprIsw?R>*{M;;VQ8u<5h3q zi6yqO`i0R$GTQ9;d;@Aa2?(-!4I;A51>z*=G?ezemE$jF=#m*78K(0CF)w%9RX zHP`54xuQvWAJGx~mD^v#b`6~~j@6=YRDk9%Ae;dY_|-XKZ}uf!DzJTWeZl^fmQ36{LTsW;AEh%z!lsnJ9P@`EHJ# zGo4K@3e4LGws%!PTIDH+FqHX1kYS;!G9dEYzNYX|3<- zy$`%*`?t_RbH86Y>iW9>o%zq&(?!dWn^S8%Z=Q7EOoq2G z08ex(Xk%>CO^3rnkwbTRIaU(ccU_5X;33227 z*KQ|Y-ITUFp8?M%`(jkI7vBb%aQFH(kJpuf6hh5WU4(A9pWG?z|GmKf?W5$3zynaC z$2?DV*u$M<&RfM(`A%!3cPP>KjA`{a#V!-oS}y%iiI?x?0de+vVUBzS&1v*OHt{n{ z;Vk!v^tf*oNr&i=ol_qJ4Sf*kN2;3S9RJ}uA z*`3;<6xMBBOyEJPVE=X%TzxCFS8U@Rx2cokkpW-3BmLcy(ZQr50}4IPT6<=2?;X5I zy%0C6d^HAC7pf9gNPiRw6lG0_biV$DN#Tu@D+82Sf|9$T9Fuc%zOC5S z$9}BcVi)IYExu3VJB%~o=KWR4JP-SM0KT9x<)^;vWGkRznqb@ zUeB6%7*zA&eTL}SpbxooFF)RC9k2&i3}e!o(2-6N1A$@r-IrSFr~}sq7W5A#gq3sm z*9SlXUg)=o*@5@lYeuA<)HHwZp5s_tW}`$7n%dQs2Q^ir>9b3Ge+|mV=m}N&QIf1R zQyR-AtWjDLz~V%POg!5SsgavWvok+WOR?yZ@GSQ-!vq}rYunD{1PpN~{FIoiPA&KL z7ULYi?DWIEEY=_mSPKeej%9JFUpNwv*={+KgX8sqGxd#-Pqc;koK-u-(j^f>=Jz|gz)e!VnsW^#swMXs72?(A+>yDK`{ z<%%jNHG)N()O5RL%=Dxah}SpZf3aY#{@lmdhZ@pgMX!SxClpHu_}O?5jFT3 z?7E-8)zyeoC5S;yqcNPFgR_6`Qd(=^2mj-nm&0AKm!?MYS@N2w^A>W$7+0m&@G?0_*-5 z1r)bt{_km$x{LkXe;s~p0s+8HAx&BR#b2-a1^fYJT2SMOK+A64wPHeoopA7`EB55y zE_aeNrXbT?Q_M~fw37JX4QnzfRScq=O=x}6*})7gb)~OLe}jM0tFox z_TZSeczrWFgU<-AI&O>%ReR2oV=K#%lQeFG{~xp!QOUwr!7PD;NeIo^QZ|Cq-7Vr}tp0mM#j&;tWA{$(;*j(`V#+57BC#kqLihB^4%B2NR6MtHsqej%O{qUHI z8zlLlxHEX_Rwf0SBx@Q5R>q^-x`n26?pO;$0f4zMiI*Wo9oI_3flnMOzSW1=<*#xl zlL2m{pxUwTf^!O_!8k9vbm|lzHG?`H+7|J~kalf_Rm z?Jil!u%goFh|f8bt{ra&kp6OcvV9daj$Vy)#OrTcFe=_8uFdo4H#q^NJy+wp zK3^WMib>Es+m~+^S*hJd+G|6BZ^50UHnwxY^B#Qah+wu~5WIE#4^+nzio)B|k}Nv! zKfZ2^EWk-D97v;^1~GRXh@$g6+)`+ZxTc%M{CS;<#KAUp+9!VV+Y>k3;~&6J!uy5( zB#{EGl{2mK9A=}-y>PWQgoM;MsU`4q&MY4+80!{=86qzsS3N1|(q76wq0jaxV@I)` z#)iRVz}n!S!NP;45*_6G4@gD+#*lXpC!^Rlh+QEs&+pSnx-bw415?>$)w{E`vc1Rn z@na|>#3JZMe6cUStHlZb@|yIZiYL*_Js+v}!?rluX|jI(YX`D71RV>6qzyl6Mfq2( zQ0es@fuB({oG;QT#KR)U=##mL?PwzVc0LD5PpWl9Y%$4Z6$6eW$W}TZ^g6H46o~DQWcfO=Z z;?A`)G4LgANJ;0vGxrh5=$`r8NA`Q^mL~aey+Nirwj@Mdw31(i(Q|Idw*ft`eq3Y8 z8LUUwauf?G2a$9MOP=jyeFe0hfqK&6qx86*3>`|U zqi*vC9U6d&bjP2u^EuibKsUEkN8)7K($hvv1q4H5H9Tuu1BxL9!{&CIGkEs4Jc+tx z_t?PBxJh?>PIl9OVIJ+vFQ&KLOxQs_R6pHg=Dz;T=LVCJ z2iKVS@*Xn%{M_8#8^_AU&HM+H1^(nk_G3(W=vBFpfl4&M@ALUPii@wJ#t8{#&-cIf zU1E%?+HOIcuu}he>SdW0Ps)u@n<9M+!b7n zwk`0`&qd!J%L>6lY4IIioR&4yrkeCO{OZ0+Z96QWl3#fk6YtCPsyUqTM51=(vjW z-x9Juf^w7nYfk=8lbWc@lRw%bK7?HxbUSOX(rlB*q9f0huJaV-t`1UElU%B(=zseL z?I2UpLdV~LUz=24V;fU>=N6KMxtR?LtGN9A^Am{wnJyjwuyWdM`pb}9{slvFT)%tX zz5yxsx#bd73$nz@fOSp0aMf!xCW26as+>N+fC{tqc!urRntT_j85qDt`|&Dg?UWRS zeMZ)bmz{fw|X_tWD3@9QChOi)O~>Ygv{x7LZEf`i4;MK{d?1=1P5%nAh>9kB2B* z?c`rGa@q*wE)T**1qLHr9=a{68P@#@^euG0J7&$2gZE4r;GJG`9qvlOR_W?zq< zoKRKA@cxhzxXt%vzrmvUb1NG;Q2>zhk!i_d=yUG&f;=~;NEHR~S1V`Pv@f~wF}Nmx zS%_-OqmPj7tntZ+VAc5}deM}o!o)3*7_9AcRLabJ>-Yw6Ax-+kw{(=T%eGKfXhNel(IVsk>P{ zRyGb}P+a!@Y zk%|IT4@L(Yxc}!G@d)rpus_Jd7?$L-g*dZButF8%6|$#*_I%u@yUMxs_7ub`UMXCZ z(Xq{H(T3c6!m5~|;sxIWfpstTO=k8doM1E=&CIN68u9@70hKz2pA9^T03b%bpJm7~ zmx`eB*Iyg!J=(8au)oHT+_1;|Ik)sw^TufI+oM%-u%ww-D}Dp&?_Zph4T~MlK`U$Q zEqw>#MF9LrmY;7`H!kp7$>%CkT0{xz(=b`1?&qonP@Z=08-wv)xvOOW9Ty~ zwvh8`X_li9UmF91S}d>_XDeQxjnne23U^AB>oUmCkC`uFl)o`~?39dM4x|}(V2kGf zqoL}n3{lcSWKKVc;OiUIGbjQSCE2k;Rk&9p1Vv*m7hJ6a+(1f9?@pKF{3PPs)ej}N z7=9u2NiN4>-PgU$z=%+#n&f&u2u9oRMkfrG-t@Ie-q_s#N^-`XOab<+K`+d`NJ}$_ zf>OIB+%ZSv4=G88dNjhoZel_GJTbbosW4#V4|Scd0w=>S2-R%FRUNe?AfWr zhv`o>ew{uj*2it%(HNT_QTbWIR@@clno**}ECydCh53nX@WKG7T=X_U+Nm@VwB7OO zj+VrSN*UwgzBpwst;U<&$V~2cZyJB7mt4>U;&p!f5-KV{?GL4@US@&=fE|%ai56=e zm^W^63iV~IJwd5^#j&(%L>b?~g{ZvZIQp&g1`L2#8)E!nYa0yn`*W}Nfo_fGVUGVG z%<*Nv%WR?JIOu>A$%SmJ@9n0CI0s24v9E4F@Od2l+E{YTeVBONn%443##rwe-p56} zF)ujgPRbiBUN5!L*8RDLp%I(BSvy7IAuupdF>;KVfLuSg!DoKghs42Qvez$b{ySYT zx;1pnX%r+V*!Ls3ha2K|X;Jt-)sIHH#pA#CarJshROYKy1K6&$@XoC*Pf((*p2fq0 zW?z;ITk6rgw`)^1JG3u+qAKU}PVv z7;yP4oL!RIAt+gKXx4ER7g^;fQf1b5)IE{sSfEO7nVlQsZ|JiQwAwbb)<K0_$AE z^!oat9rH5tHYe1|_f-8QyT_)Opz(E+*rO#ZVi{XHUa>EmeawdJSFANblAPZcGwk%D z5*Tt&;Q$kiEQX+I>2o;1;?<`lqSVmxrD7)FfKD*L+>J0#72Vd83>^Sil5+Y-8N5q2 zUZuKQW7dp#|E(PFD|beaFH=yhFVkFtgOKr_K+oS*1vf#v&=zNu)-#gv`}L>Qm5jdm zq%T(w#VxBmj+R2wE|!h@F1X3Qi9<6@x(aMd$s9_yI#-}a`k)|y0)PTy2X;aV$(wo~ z>WAYmIU7r&Q8I}Wb|u?;+4rTF_N>e_wWOx|o*$!#e~$nm^nw{92`ka;2aVV@sxQ`TjELtfb!8}PVegX083 zQwzYVA*I4V^)tg~r4AWg(lz9~F$$nK*9#_ToGmS;!0FR<11(ia}Nbhoe{Ub=pe?uy<73=8n`PeO1)!x0q`2YWN?m z<>hq0>#*{cIY(-G*DaHgLLEhLSbmxv8R{hVx)*v`%fIeybCO-6G>}>6el<(f|4H$UAfq7Qsi}Tql87Z396PD?6f?*F4)Lo`^0cTE2{%^!%sN`nXw9=SYXBkfg*@cvt| zes{#5%!}JNjFBdt+Ux01HOx;1@+}6L)T?M&oZ}+gY76O!Pj-w!rr~P}pi6uJ#!I0N zjI9@gKY7Cqt%cApR)`Mj2Y=(_jSviCJ|bwN6TkSQPJ9!?C@7eBy%2y_-pFRpvl7?a zCL=d&bTm5}Z0UnUe(L#Da}FUy%&b>^ac94IUml?YH$5pPW0fg@eB>BE>a+L-BQDDg ztdCa0W`DDHzl%t-{Z#!xS8}O5jAZ}Q6NvZ_Gjk+DXcKpVD!rt(m>h~l0AU`RN|gsN zbWqv?ZZufN-g+@20z29ok+IqlA@3^X8GcqfIaU*zyMVgt?d^D+GUXI8#*b*l11JwY zJ6amiOOgShuTSmSGK_jnsGw_GSl%LlB7GL7w{^qza2Su>M{pkR+&=Ob+_^JMJ#+)^|?)EIAu-3eDw~}LK8p; zsQ!c1CptC{L&nh+4cZ_n%_D;n`OfKdnZ^3>_X;5Wup}^H$0l!uK1w36EQD%n)j+JE zh}+zrxRN;y9}nE(LF;>=p*MAm8;3TDMUuGUP7?f8bYUaGL~;bj&ZAT-wZbT0Zp+v) z{d`sXXWgI5nF@AkA)crx&kiiX_S2c$3gV%l5a+!%iBMxZ?2}X8$r+8jl9K*e!Nd!n ztOs#D24yJlcg}tds@kiighVku!dhL7MSGb)ezpuW01|3ORZjx$ z1bnx!W9HhO-tUY76D~Bv0gXX#oBX$!RLY*^$HdxJKyTR=5RTe)FDM5;JxZiJhX+Xw zr+||QyM9ylUkmxxy3XItrsf20Vl39wbaRnZ)(uud!+#i62tuMC`I|q8(+3;k>PT>I&!wUe8Xv~+k;8z%C~{aF zTCinEU}|n$*7Aljz5u=q{!&=R@#!cp(lRSmjC_P}J899Zxq<3$a9Xu=G5~P36!Z-a zEB|Lv;tO7*1LlTQSJ2Y|G0>BMd1B#fmrF?jPj@{8h<*XeDCKYFj+n%__S4>TCPE#1 zDah1PT~a|4`1PdLTQ8F zp|4*z@-n~@MF>|uZrUfvcWm7)5xr+nlw^@jhr=M#_f4PfJ15Lov8+Y32{#0|HlyjN z62UM7rK%SeIwTO%#q=32Mf?qWnt)b5nwsAD)yRPMLUf&Xrbe_`ROGDhq7fMKC1D4X z`A{J=%uu9ZOZZy-(mdzSoBQM?y8B6cjysc#=RcoDd3V`zq11cI1!A*md%RAYe=Bjn z;)UTubMv;nRf0L(zXsWfBYS{gJi( z?_W`u&Sd!PI4J!>Z;jL?kB;1kYzr8y-WEA-aG$#0SVc`F(XexVw|OfZ@Fr;Ts21Mm z>!N`W%}Xx*ga*ii^ry3cT}Aio6YQ}h0gLVSL3Nflz05EVd|foI&mg$rgWk1foNsUI^lj+i4{4Q1?;Z1K$&vZ`G%;8eOfc|--u z$JqU30P}wD%ib)PEW4?gSp&~%b4m(|tN||P4;e;bk~mP6q2D_sL;*x|8B00n+ScVV zN%@~j^Ow(RO+Sxt^=jUHSxGNk;A$ddy?2QPIAO@WAxQjq2z&W5 zmkbqvAf*#`0WX|ZuM=y(fL8Lc=CZR_qg6&ux+23K0EZ+sr6drfzf{{aTLz(PQ)z*b z%ZTP({->fP);SnEE^`73BE6E?3lRoEeXe)C0VVRIxu=xy&z*YFEvbKw2N=pp0 zJ{e7~XN*gzK@&$?6ab&fRP6khlaLc!19W5c44?mXpus4tK&=A5&r$19X=mVxc^DoC z#<@synOr2ZRDC7#IzI#P)(FmeQO?Vs8h|pjMI-bfM@XZiJlP{hEZCLSDjq;7*uv}7ZkQP^|%Ev89jLCE{Uw}?z_=Zwk*lu-%c$~0m^*nFiUoMtASwg4U%{(QqaFQQ-PLx5^MtP|3p zXUXXe1w=_J^?pc`j0<2v*VlZj6)bC;xR>t^9j7qyo$vQP0b(L@h^ znBkhy+&@%S&73T%HY%vk(>D@vWOXHI+M4u$j@!>z)D`S2fe4e!RO~f4&6t8d(F2Th z3aN#$de*btRyJYGh$*o7k|x-5MYvfM1VDKhbU(+XGW7}RoG%P#0P=s10iVms#gLb$ z6Or(wAbT|x7w%W~P1r;#jR18hh?=_8X^ZvCAyne!=U6b5+^Et4W6F9tWLX@a*~ze@ zFfJ+CKKM5pDe$`A0S&TaI+^fca26y&btTQ_E}a{6Fi3R%-52MEzQhtb&h}3HoIXgc zS*REwz$%Zxr$T~@LHI{KA*m1Zl+gKM4Y!%+K|;XR3bX$*cnlW)y;cCd@u_S9M4#%( zf|^T(vOb{2y5p_*9$7;G#*Qz(iN##^k}RA7<)GY4tT-hKS(_w86Dn}y4^9DaL@$;= zIfCWsxS0F3_&g!h=|)!dbjTN2mU)RS2eMdb4*0kTow?5;epa-4UYcW0WTSRj>;1eO zXr?VO1e^@s92J$^-j-{DVN{BuFuj8b`=r|E9>RbU#tRBrqi%>kWIsP0G|RZ*iWLL7 zt>->u@eFG{$lfN#tO3oCFaV!f1xpBG!khtkW{^-_y2NEuo%YE-U*++|TM++ifOnY! z>U%*hiTW2YtX*oKD7K^s0g~69&mk`&-eHy^r3<*RfcGT?$-IyR_ZncaozCUf80gRvsPB9pSu>GdLxl;<`7AwYPsobQb zYFO+6TF`h8mD_pyffQOO3`*3^5cxLHyC zi>od4`X?mO51zG9o*I*0&M0VIo!rU=IX;upbTEGuV`KpL^SUX2EnbQGi1*v;bidJi zN2fl_R}wTmRPnohA{pt;_bXcFZHipzzc4IpyhDLaG3?Zmz52m+=Dyl`qp(|DILxdv z7`$1}bi=8 zM(xH$tRYzoGDqDEKZk~_|Fyn-WA(Hu6JXvl3OT6S>Q~_w=^N;U&Mb#3(@`TwPmB^Xg*E|7hfF)nVkY4rMD0P1a(+&ufmUCn%V&W*fA_<6fK+$%K zLZ_z0XGzd$cHi^t$Yl5LeK^W2zTwCP)o~vfJCD}9!~_Go8(L9GX=on42EF1V?@v!3 z_uXU3%cwx|eX=8J6M(3^)vORYd-ZNYKjIl*GRO^n)BO9xb~D=U7qM~+HwMIva4BkB z;B?662HBaRoCV(hfW`B*3Smns-}*sHwtVZpe5HiQ38mi$GYprh#{R$y@HT+i@piD8-R zR-^Q^84-ofDK1gSPW@!gaBQ`YKXdhlUy*;O9UJTjLmgs1qD{au%?LzU+xk|R49**L zNl$Pk z!gKre{8?b@zR^IZ3lgdJFh(sSzCFXre9Gm585r~)n0-f#JJfuQh{5)0Nl8^5DytK>BQ=9l2j)Z=>Kh0KQz5>3tz(`W`dlXB`&w%QwqVvb?V51 zR&kWZzP~;iU`jGymv%P(Hb_5o1XtA$kdH*S=$(F=7 zt6;iC^Co|(_*S)#3$ya`%Q9ktcVB;XlRT2{?y*`@-+{@O>Q5XIUcs`0ckXhao`bY3 zadZ_0Q1UP$Ypz_Qxn44zrlpH+RM@el7ZU7$C-7H6QjCv0tE6Nna9=MHmqw1bZwuXq zGC)JHn6-QDiLF!WZFOo+TVUXW7;!ar-tw>cAe5|+Wu9fHO7q2dK|tl`(hZWO;x96^ z4zKRmiN9aFKAW`qzzs9&!^QmJJKH2=+3?KEXrtoH&tS!v5Pk(jnPG!blUpRZ#I+Eh zC}L28H7hVN|QSC!T|N|Ytey8d#B!yHo{na;jVwTw_0665k_18a2+w;^dxTHMxDXdKr-_trmP&- zeWzYCwP{_NN@`KMzIs{f8Z{XHGla&gm3;g(jNuqZ78IQp;JqhW$e;QJ45&84*}0O; zNEf(roxjhfT|A^~^TJ&|@zSz>>_ak4RQp}tv36M7fKD==Hv$WbZIM)$m=T2l@UwJWsYkI$i((faN zrF}ot`U(6yfM_x#85vWl7~q|RfNliQ`2VJfZQ90EbK3I~OGGA)7?I};4FMpvAR6bj zTp%1$&8C%T*oMhRj!|!CQZadoAM|XcgcP3v6+Z2f2e1zR6;CCvrJ30#kh2M%ZU0N{ zK~cHsOH^6%kUY$G4^st0!Sh1yWsjEcZEY-ozq1| zCtKC2!RCnLwU7fyRSHv#L7)KtGhT!H%Z*+?iLOfW3P$|$zoPx!l=7BjGBhxqJbLV4 zd_(KxW!QBdAEq#E@|;#cbfD@it=g(gQtk+4 zpMNK75_-L-Q5taNyYo%lU|v%9?Hh?(NwR7V^2mZw&=H^B=Jmx_xqfaE%0yrJYSaHNDRYs1#Qt92`}Om!?V0g zLNcSkp5RTVQ7%zn6+YHFAXEjG|2$RB84%j62k}V?LA-a$HC@v7m8lPtkdRP(U;O<= z-dRI0e2PBh$|nCB;7^|5D2Uy|ctW=SU#fl|gY;DtcJ=SUyKq1qj`20SpBNMgwiAUA z*6k{QC|7a}6%P%oi4br$r#`iy0kMFs!mb=Fyv?L5LiheiK@kc_WDhHJO*I*LuoO|b zEO)yRbFdsVVo1`D61dA~komfqJHdEKK*skH_PY(Mi*$9TcHY&olKQ;^k`byxLB!;R zXDCb7ed3%b7vlKH!p|*iPL^ytH_^IZzQLsVllOx(Dwawu?K%mj-a<6TdJ8vjU;{dv zK-v3iASG*mACcSDxq3wZ>2uF4jW1!`N3w}CQQzTK`V3ky_ zs>(+RXms7DQ3~B>>Rw^$@>7nL?``~l*_}ADI9wtl{spn!-<-r?_HMXKT7L{p*;p8 z#NpM%Vgt$4QJ_Td366C~1f`H%hax?&_&V%?5f4w~hjkn+=i6QvwcdH}3`K9|E>6PQTIeZ$i z=<8{g(3dYG|23kl$5UZ2GHRo|dyn@?+gS9m%KP!fwjnC0|M4=8=uBb)sv3vLp@Mp?xEM%83U>UYf-}V0Jj5 zLP#SUE8j8!dDyo_hTil3>y=l4K}iZhe8X!QXX^2Ec0ZFp_Yt^9%HU|&f)-V#-+>_G z|6qRCCg#sxOVl-dtA%JE+K`QjGPufue3&;Z@-n%YlwbbzJkGhu;DyF=Pl5*q-G63OJjeXi z#T1 zqnxBLM<>VMOn)(drWK1(It6Uwri3H;P$3w>A?QK7AIx9J18&C8G|{D^_a_5r25!#e zN57+!QJC$cx{5yEbmdai2&3&ZpIN)*+LkCBq7v<7S?@xN_dvQk3C%fNTEGbV``mG4 zLXarpvh`I#o44-gM*c)6TWs>_>GOCrcs+i?Dwscc$QxGUIgWg}$VDv|=wQPET?Fg_ zoz#}oiE};NaDZ_lKX6_F5exX4*$T3gvU7s=pLM?jg~T$RY9ijo2w%tpU|D3S*^uDn z7DPcoVw)e>?QyTHNy8e8oGdScleWz(NlckrJl=R;Gjyqee!iKgYZDyoK>^=K#_eVk#HIG0GM}&pe9=MZ;v!IhNcNl23P zJL2u^<2ahpfNV>0J*A(9+^Bs-8L0!%gA0L+BS$B9ob^QkRe1n`wSPQkICfe5K_c)@ zeO5bJllDUT&qiUTxRAA~r~dmpNW^TUq$%Itfdcf93a~OZ6rj=qn*^{!|Nltko2PNh^*2b=Tcn5w;d~g7;sFi-__O z5^{W^Ap=*hg0~Gkg9;$NHyFB0!TMz~G1Gi!N*C`nek6an3!;r+S1m8E^UO~Zw$~^L z!)7j-Z2HvL54+yvDxwE)A#AHFgdwTG zjv{(s_f{@iWqbU=Ig9zh=7Ji$QnV1IyG<_=&w<_Q#ihxO7#LVtwT_$L74P}3S2^YTI4rp zQl@M1NxLXtm%x)O>(sg$m?!;pxtdUgz8Y%m5`1yn%a?QAm)!6PjP~^}g}uK)V&`*6 zs67(^sX`e=3Yc;RL~!nBOu83Pg94DuU?75oIPshKi{{2opPE2Y{6=YIH4Q4K!Lus1pyo2-1-;iG3NTHepQ{`|aplum1<_xTK~z0iY{eO2 z*3q}5rx%@u`ym9?V-RY-z(FDHI&GDM=QPPeMcy0 zR%Go5Yz`QMZ5*VJ$~zy9GTUhjN~=b>wWzDxe4fz0KxbqN;M)mIUv8eD?Ugp`)j*o=GCfJ5<1$+T zB(RjYlGLI%h)Y}1kE0kO-((?F`e^`{(a=(S_(jT}UH2M8u0us&D}+x{jN=`mbog_ErQI~qJKvi8AQ zTNbood=BrNjD}QDK#vpM@9HFvCzLfRfTTg@11~WF9kX!QSBiA7Has5!?8XRH8=v`{ zb#^9SVTju1@nX%fniiusf`65nHt-t~_m9Gl5NijVIME}7+241efBqb>%)aqU>GEca z`!Ula(%GH{&l+4=+(k-22q)>58LoG@rW>(TfZ7I@gm4wMit-*Q%z{jsJ3+)#m?Uu; z1#IBE|Jd`08sojP=2%!+a}_ltrjw}&*uir&w4~HxIE;*VBcpW94<39T!?dI{=orAQ zio;p7m{j5j_fB2_gqhI>zP1P7>u4aA*9w!-T1G|U=q2uOuRXmQUhzL4t zig|{=Y@Ofx9*MLV*p^IfkZKl$=7=Ce5;qIfg;U<0I@>Hk$KXq!4Kv2j!obf|Zj}Vx zfYn{ta}Ss}z|Q%o1D=|~Sma2L2x-?x8w}D#>&3-^j!$B0yDcQ8AUR8xbR)RkWRVw5 zAQA|3(vW7`Fc7>>*Y#S$oj7&n5UqOax4eATyKl{TD$+mX2p{2Dd=k>V0|J>88VUj! z*GeK_`IqAX32}H1zX1k1Km$D#10#~Wti#Sfa1pUh+=c$C`}+XAO2HRrBrydA&zws? zFA`^L3Y9ED1%u(aemu$nrStd3BL&GwlFA5LV2Dv2@-VS%BK=+-(V+2#UJ_|{xZQ-Y z&!#oL;L_l01n6mMz5}Hi9@Xuro1?{<9B0#|8-=;svF98?_kU~W;k|4Hu^ysoC6Dl; zF>*?gzfJr|X6%sOl%fjzSCf!X?uc|a?l8>Y;Qht31fy42Fbr-I&(}eg@rT}{W^G;V>OTflW{Tg7Vf@1C37pF0jj+uO~dMk z0d0~H---ZKzrE2GaA9Mbd_O;lq{>~8ry$vtUc#~`w=hs_YaqP*z5WdPOix4ApzBae zwWiHpY3V)b#hyn~76j{W-p`;fH4qIaW92*myKwffjYNP;#klVye+ox)?@r5GjjN(o zWOg-Bkq|{lSr9?8rrC5XUIuX75d5w#3#}9bp3*V}RT6pkBvHWULzHyT5~n#u0ov2{ zeX{g~|KvN%l|YI6N~yw0lOE8*mo|;=aD+F?*|N5bBbPWF(T#CZ@^=*6c(NChbx$?X zYVqD7?AvGsirCx3DmvR3Dv{Ktq92@F^Gpe}>G7@^L?1U)M3h`fW84A^&2y7WT{_>p zG{=`#rfrjK<^nFg>=|dVs$D%3uT+HowPA#PF|dMf@~;Fo=mFKowvsCL@5My9d7PCTz5TCT$R4NWYf zl@s;=rISyhQN084EJ)V9x^=htx#(CBO_0G7BKyuaM7CH+BR$=M*4!Pc62uSIPCZpW zr2bg})m98(iJztm5;11E0kIBN30akgNYxB+De_-LPleaZ@OKo-&i>0#i&r$SPb*;Y zsh|{t8oQsoYA&&gSr5T!hmzK<+EpDi*7aRY?@j}2a2ij2exgZLCL`0!;lPCG60{gU zxwj?NGxfS%Ir)OCTq6Rckr{i&Ny@nYGU)8<>f%e&s|GbK&I`6_Adr4mlwdc1_oBev z^AmuAMAzb}tDTV$76ul=3#7?2h$crm8Nc5{_?NAnc|4SR`^N{__kG_Zkv&@?Le}j2 zmSKh_V}>y!yQDSX9i!nTL^YT|}ONCOZ z{p$)XoLq#tYn`@1eAs6$M2wPJmgTP(rQwR0Z138sw_$T8>IQ{6-fR>ZH}y&tZV#v) zI`i5(lfy-R>XvOTDeB@@8&g?ULTHBg)aOA`?EvOSjWmYMqjGp!d~W5_E{4>&k+Fzj zv-1(g+veoAniL&N#k`fh9F09PFNsa4ejO{r<75W%raA76Q)C;E2^5(p`PMPPY zE%)+_pann?@7X;g_koKH#m>r$Ou12hBXX6=G3Z0a^&KpWk$-}ZM7 zf<5&Rk+ImmDDrmaEqH9CN2O<;$l_$IG8xRqHB2mf z;=}pSs#O!h|5{EsqK5?pmOkIc&~J}w7v%1Pe3A}6(apQ~Ci3jYSP;{Bk$m>E?Al8kb`Em&8SxLT|Q2IFf!gB95ooaKKO7f+u2Zh&^AvbETjyqSk z7szcqRsK>Nigh{peO{;rX%T%}FBTR=DH)$pGE{s*Nx5&@f<1#@&P}5x0ypYLG8->S zV-4OMP}gqoWPhD9!cWG9~(X+OlM4qAI09AA?)JR(OB4TXrZi*}pCjZ&K|( zQTMD~+-90tJ@NfU&^p8os*s6Cy1I(ho=2KQW?Y#^E;v_+rROG&rNU^2BCk?PW$U?g zZ4w2s;}57}lj0Tf#4h->kZ=;qn=k2;j%M{LD$w~e4Vwb{N%H7x=hjf_w)$ert&U*1 zZh$N@b51SFh~&-=d8K?K$bB%$)08R6Q#^mZ@jZh0zUOcVOX+O~q$lc<7s>5?lDfTp zx`2-}B_&8>9(616`AR=?9rHCTVO6k0oLOi+Oi&{Xn|>$8kS(k6tS@46{uIt?b;F11 zGJC#@#Q~2Y{wG&??#y2_PGeZ}wzUfab>ed(NcofT9=X}YVfCG~>gs6*acd^WiJ=;J zh_A~9Xb)HJM~ees^$b&RLD z(>+fPTwT54db@e zDNzO4K7M1aO+DzRNhyBH*NBTV`J#DkW00j8O)$Ci7FkQTtaOWlo@#*|ah4nnDU01~ zLr>|w#nY+Ftf)|E$jmE)nbu?}zFTiM!Uc;YA3bYTq{a!+3%-0YtK3v4L_BHXtbzuP zW%XvqgpC+!zP{GiWzdqmD)*=oUA(NT@2-w)pcqR#yuXeWe}o4+`*T=rfaK*JxX8GG z9sLgEWV08vI-E~ep7@2;^H}2YSiigUInTmAO>HtPl%z{?J4ubNrjSHm?yYn&3Dsz* zs;?oNEFK78T0kh6Z#K!w?UA*dw(*>1&%^b<@Vt)y5<+v%K=G+3#mi5_gIW!r)kkys z8+!^wf{BgMzqFDTXo6lwzjeG2^`TFX)tH%k_l!p5_Im^NZ$uff6FJi_v_fuPX$@E} z@}Ij~pAFiXs2&y;z)uAR!qo5QD|HTd_=u+nd&BiS98b;9WRh!?^Uipx58Vo!MhlJ0sGnz&MRmzBl}ebDCF;u@G;+=)x!h5h1Z zmGX@%B^QcE1B!8&tHn$N$Z*Ecmuy1p_pK}>Ggo&P=4BieKjp}V`98PqvgAI^Kh)tt zJ*w1E*gHF(_1V8XzQ97(B@2ReBN?$T}gS~B1YkI)oY+P;3NTLQrywj`5qXT)$EH^sB$ z{sYe~?~eGdJu*-CzHELAY$jeEpik#_vNOBAphYoD&(BWhgNQy|^nUGY&8tFvjWVS! z)jNSN>l?PRW9J%;(xOz_Gaw;c5!cZVM177!+Y3hW?4x!}zBrhO(r=urRbhU6!PgH_ zk?7YP3pUFp0ldSPkw#qPi$xwmAlI||uZO6kINnCb$v3#Pvv3eph^>yrA)y9f& zP_pXnCymX;AHK}>qEKG3n*xLa;~QLb&tEl%2lno)i!WQP^UPdAoXa2&kZ31==V{DH zYa7RG24ESkF6+#Tq1?1liSB#uIaR2A@AG@#byTK>sAIgzm(a(LhM~Pnxiz02Jwr*Y zH$2iA$LeiK2#1tmUV^$o}puhqmNSeBmPV46N*V?tbCx zpoJBRcy*_1>f;2K!77M*Rd0spU)`hJ81owa!oPHth&G#?HU3-=WofK}NLc31%n2=@ zGMiPAQ^?Ev%JmK*BuTx3y*+a%DZf`ZIN22=VMQ{Jt3PKqjfPSR_@N5g6IO_>+am5; z4e;fycJskN6};-!=6t*yH)k$lqNT3UOlocw^L*MC#A5Z4>)c-2E9v*=w|R0~q}Hy9 zGZ6PSgBQkDLOoTUU|%P3gWNTk^X#X)?bkF*k6(LYXfd#`Y;#ACO!^T}q(b{!zM*_z z2$Ky7`ewo4U7>A*Dj^q>i?DF)W}`y9MO|M)x!Y=OaB$QESjx+)U9FL8vCngSUI-+Y zsehQM>k(2;uI+!A?H#=#k8SxOwhk_hzkOD>@M>G}6QFg8s#sm?!$<4@QT{fObLE2N zJgq12?U3zta6bl*gcJh#^{#k^kI#hL2?p=KbzQ+qxIA~gx%ML}BF_o+VI@g+^Io?8 z>K+V$KPQQ>exp{%GeMU|o~T0K$>y8Vn!=x?8J>1pCJATow97atT>(#*fdbciiBU64 zv&!D~OAU7#M6+HS&do?LRYmtfFP(BFe??SmQ_0)%(4poPQ6ZfC#+0ZMMJ)rRV5u=# zfwo)i>`1uxhCThpd7F6dSOaW#DeDo3q$GAZtl_N-raZ~a>Jv525o7ljqxXVKB;ROx zqaKrS6>r{+QjoikdaK5++p>YsuAvSX;D{?vYTF3&=LI!N%U00PzO#&j#u(@6>Ez!q z)F8kU=+ohiH&ZCa#*PAbv?>fw48AE~Ewk9VguWtZ&N^8$Vl`xcB9D8##lv~XzJ4Tl zWJ+QIAV^t?+)^&z9Hv*KK;P1-G45&R{=qPl<05}t$0ETkUC#)!PVA@l!t%Wz z80Cj*pyzRI9PecLG)*LFIs*9vl8uVvtWuNL^!?>m^W}GO(l}C0ReZ@jr!!Py5>36g z(j(y+wNoJ4q6V*aUD5M4OC1>}(-d2*)FNky(;Tg>$SI$|THZ5it>|V{zh6Tes zCuX~zVe4Ogr*(mDU6vxH;T*T~sG2^TKb4(lz}%Gv}2-Cw~f14L;ovB)J_jamDN`3D1u8_v*W|hwnvjof z_u}sil&Ko$mN-rXk?-kFgrquFeF%P4-xZDi(pye(PU$UPYTI2|1${BK$BWGU+*apo zz=HYfkb(UZ30U@fpAd`NgVBJy4!G`KSWA(;Eg!m#Z`|Mj1aom*18_9KtYsf0Nw1DC z5bNx!?`Oj067ojWoQdo5xNn@#@EM(1%5quT?7kYhD+{fhogZ*}6Jh%;Wh1?MT(RVw ztm0;uvi!L;K%@u2RC_|~S@aETPqiX8W&IP({?fMo;hv+ymsp*n00Kk_B3dWY60XFb zsPZzQabpH+mg@VO0|`T(+6(ALrV0}R^6>*nik?vvzyz@SDx(1eT-JW4ufpv_tG8P^ zH(v+C8y&9f4Q=*}IdnOim@F~fw$K3}f~2-_87Y=iJBN!%4a!CW-mV7RPx1m#i+fQ% zcjLYWQ}se%r`e^QEQ$c=;(1`%#P|t^F{SyFxv{EbW5Zx6F@bv)VbY6FHsN#c0CZ`e zo+!42wBbQp{J0uq9!IMcJ-eByjLl<{-qm*#?=E7+ok{;H3nw8!Op*5Fnb;S~*r#u% zX;$XuP7k)Akp03Ln(zC~GGp^N8^< z=n2IcG0P(5I#I5DvHe30ulmS_%Z1g)Jxx|x)=F%I_nx;1%o|x)NOUDM#27{L2#;|l z(+AyUDFd-wpJ3*hqt}1ZIH32swV`wAYSvK5T<27x-`e}wsXP}`4YdM76~0Y{%Y5OB z95E7u5>pp@>6E9QIvP<9=khnc>yWgnqc;BH@-|Ul80jL>;`mvTE|+3$XESEuy3|yB z>7MT6b#_@waS5sOVUBXoRPe>Z&U8d=nVxS>hVaC5-hpf8@5iZLI8c}9K<+=(4YB>) zPL2M2&{&SE>uLvv0TB?mEeZk!fe}I=;17`xg#MGr7Rq3IAPS1)&__YR=nz>E5n+aL zzqWyt^2ZpN78Hc{>vId`m=5qDpL73NAWuEfaC)v zgT4-7aZ>sX6N=@VHt}vUw?r zE19V~NTaX*+DY4PODWO`&MFk>xk;}MJVsF##DYFB$L8RZ<(|LW=v6vP@2u6h^k5si zA>tefJw!B1_s$0uHlbw_8mf-AVua1OyQYXb`k}~qX8fifpVM-fcOx7^S~A-+KPFPh zx=ofasOd(SyH;m4=BQ-fsXwFURSc@P2}^X&m*c96=CdT$X_AR%-L6m`tQo`ti`F)cmzx=a1^8I(%LCk;6Yj96o`pLZH4BCN+-#VUt?R8bp^Y;UK!q0i&b1X|Nq zBYfkV!>IT zIgH-cH}f7adYWC_7iDV|qiVQ<+5HZ>;r9chxVb`{P*5Ne0*AQ@A9V?bzZN%LO)P9S zoFD!9JM7>c58crY4+_A%;=v~f%o&A5^KcJ~<)8ZSKd~4wSPDlhTL=t0t}_DcjDY{Lzg2?M&WvdN4jSiw{6z!N zq2xlB{9^+AhieB%Ai#&|{ky@#)H&|R%yo1^{#J%#>M?`~Jg)Ok2Bv>XZA|VdobP)4 z;plOle}Vh=I=lXq`!k(?!3;WbM+XT;`b{300V2S_|JFl(OyZ)`yIsuDOa!{oU?hm( ziSL3O647%9*Wb;F@8kpL=ly&CM213Kk%x1||8J?_#{KTI6U5a{5IuwW<(_ij+V=xf zTIdnf6%GX=ev3$r5v-y=5sxSFzbuuQ;Qc>=k7w~OfRAS}7e+E@p(lrj)#6Zt|6RGj z)cVztovR+8e^KYYNABPqQxbgq@17qL4;Clz-%AS?j365R9Bc{K?COYwJ0H3Dw;6nR{!h^RFM9bV zjml`47P^uCC(RCl%V?l05(V-Q0>Y5!Q+NGiVd4Al7Ag1`nd?IW06>8r|2?aI#3#!C zg2Y+0ZwEe7V)$3{19r$fI_-ZM8B8DLNC5yi3i-P$Da4(ZS>|D)aL51v6uKw=7K#wVtBYvV(azoPc!oKw+&+#&XC54du=~Ca`rF|C$Qj6> z6DPa_0Ek<~LT^QVUnL(@<*uKD57QiC2mfc+e^|iWwLG+N*lXg4k12tPiT?ANhdB%&KOduG?tuIq8W%m20{}$P Oe|r=FKph$Y0Q?`d9!*sM literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.expected.zip b/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..6ee11415f433984103a7f0f73e476843be7758dc GIT binary patch literal 62699 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 y3hZfJ`f+TeIEd1B!EL-rF?VX?xg-AJ5e{U zQ(M{6$zWXqP0v%#XpDs$&+@aC>@Bi!_KFj#^{1Br=M?u?Q4bkn5B+zrF2@V8WWdH1 zOU)2#+J$vVXLI-kcSoPp4!o{Iq7^CS=M(V46Y}Uqs;*DnT zcWwypJr7YlK>@8QS~x%cw^G9<5?oi)dazHc5>wpoy%)Z84h9 z`Hp7BF-H_OQFRVC9@mJf&TwI8T<%=co^bSTbn5{!aP8`bRp#BLG6kKwXLUbcI{;36 zU0Al@R`asSAy&6Uz#%WUq`n5mEvj_>`Z-Zh%r^{%iI@gJy>Jyi%EVV1Jgi^KyAR{a z5`$v~8n1UL4J<;p6af7b8oj75ICGgkP?hkSFi2FEmPUbdUYpx1l%b?6Y2T~#HYE?j ziNTe9T4hv={&(+e99P`wi(b6pO*a65QyGBY#`sxpq{cut_dm(+d%uoB ziFUAXhI}G(Bcgf#4IKTI;a2v=L1BPfaR2Z zdo&Q4F}BpQXr)>EFmSUx`_In$W#7V@_3-5Z%kQeaL?Y=b4Q*sIE^-rL1aF#u#$xfb zo;LELX=kxzgKM{gn>q19kM)!=M5*u;C6~z~&8|LzWehTKGxBQdac-qSB6_;CK{io0 z;(K}?E5<2ZCx>r-A7%hy*x2Au+Qp(E8gAmF1-!4uYaH4>iN8a6Omd@ly3ak>m+ymk zxSeBoR0U2lwTX>G^FQm7x}~|roaz(9qRM$7iG&%*kRV9)O(R%CO{c6JP&9+b&ThPZ zh@vgz0{%Lr)p$mL>Fb3NH}aXs<&Ohj`4Tp9C<1Tu&)$DMd~gPs%-dfSa=yEL%i4)5 zr-uJ*Gg$#@JbkhqUXy;~KP-JOTaVj(X-o1=UQ3E4 z(%$Uy(9`LriDb>7`KPk3CM%6g1XCTkoI?|tZNP!EP;Ra<6<0{f;6JIGXV|Fd{wLMc zoSrzd22(Uluw^KU(k2$k7^9&t3EVIGfQ$vAj?!&fNZ;Ty1?lTgLAFW;4+I3}&S2p_le8 z{a-8#rFfn+3fYA(JeC#<=PWloK%$JC5SjQUetVj9S@O|tpP;_&J1tdW^xM+$_-^Uo*)|*?0rIP8F%8k zjcb|#Of?;Ii|nGp*qTjs%CXDuV9XcXT3WkrETCECF}*#nxi2<`5N(=e8ZHK2f4SDW zjU-U<#Q&8YXcM`m<+)~z)}QvSdC`sA*2|#3~W}Zr%&MHqt4E(e%ujxd9TtdJR#r{e6@ z@qq`iHd`umvg_ryYo_Du6Yz^*VZ&hqtY@QY>$a>q@12Vx^;Pq!M3d6Wey~BAx7gp% zvZp%}OEIUv`;I2^bp@nWAGbX)g|TFRe4LI5e=hu+Zwd(AitI#WLA#6l%)F+i<}|;p zUN1#VzmR6~m(aJ8&&H-qNTE5^ObZVD<3$)HX&KAfq|R742+!KFaZ8U)8qjgH!4zXs zT<2nkY1;&=(CvEgD^_mY-=gz2q6Cbul#tH$CP}v3jsZHJ zRufrecj~pT-z#C}_;Rocv+>Wea_Fl8pBDbN9}gXeOd$L_7!N*1~OO zJ(%?~#z!+yQzJ5VIZ!GJc?HPp21HYdz9tryL(R`gzEecsqxu=ajsn3Ln;gU(iy4HO zspqgWWI4Q$EQuQ$6Hg%MxC=BrIaV#bx&K?aZfg|A&yBqPjFqO=5_i&amE9gdCAB)X z!#a~doFS(b26nTBRR>Lfxn(8Csr={0@fIZ92>n3MnLV0z&&05RJrP5oI<6?Z8Aa=l znhMa~d&F zK|lc7Xnrn$;noYWH*M#bYj>Gm=ToH1zUb@?XpRB#6bEYGh^ z!M0jBATR!_St28}pPw~98N7Thm#?ln28V4x73FDx8}k5KZLcf;XLY0#`SH%|_)@QG z@1$?-%{#h-TKsA}tRsKq+907yNm>cfD!Lzybi+!pyU{Hu(mv!SATOO-%e`+>IL2>i z5RNQ0yGQ_cevfc)DoaEdR=*`mdkyM0F{XlS4lzohK>;1@p{f@ROtAe=wd_?n#Hh~t zZk+m^(=lAx-fOU(erC$o@-9^**M#TApLF!yrX51)*CW z<+d=(|0Ah?hDhpb+N4Gy7daauXZ4~vVA7LBv20Qvq}r9T5v|BZCjXUbU!Dw#$J(Sg zl=BN5YoPkI2C=hc?cDq0T0Ed^>WA}I%UHJmxsZx0&tub=>HUf?P|>S|W&jGpQ>?mP zxw|(2yuVsKP`g+t@vb4yJ|Jz0pJe(hE5#L28Y4*>?K_l0E#B&*m#%_xWr(ZelR%sZ28|y z3}Op@4of+Ke_NZP#Ljjw^Gxp>jg>tv_D)^?D2?yFpb$~d=R}d*&}gng!N=;Fgc2uE zt}g{_#B_|R8zV*ZEv<^? z3GgDd%M8r+zfIJ^7*&$Nyxx*prVFstjSVcW_1{xtIj)Z&5@J(MSINkju{Pvw_zUeP zv+rGdcSk@hP$evN;DA6LG{Fu)H)5Sf>yl5V!R`UlRtOf`hJw{mVw>-=X#9{xN3TMR zJ%|C^PJiOGFa9WZ+Dzlu>*?t8G^qw}ulFF43{3QlgA)D(UR!1QZ1Hz`T$d{e7r8&aihpW(!ouo{H`$+S$26T# zer|F}MW^u=*jW(okF4ssQ2W_8Am$Iq#dK5=s~}<$Qo&2Fzh8Gr47(3(SC!1euU3Kv z`e;xvBq$A!*$^={J^68PMz$oAasWqYKkDe>D*7N1R zodEr(GYKr>@L(Pp@*=o#=SA+fgK1l&Vi{Y^BMSuq;uF^aKQlb>gTa{_2RGtS{Znv^ z5Kizcw4nVA`_oZ7u8;s;IBC<9;hR_Icz9rAlf<0@SK@hMU8~W~7G8Vmr#m28y+e=~ zUu@-6l9PsW>1hv8V~(}j2dd(0HCbC;$VNLrl8BL?WOnvMW`-;t+4;SccufAl6G$WHTrpcF=sXsaz$%hHyk8MP)>7V zE^P_ebYG|y3u6Ah+8aL6-^iZD$(g+U)m<7r`)?vdk&Km934|1)%&H?7(JEgXY-o=g z{aAzC2Yri}K>ycwEsYC1_fOZI z%g4F4$Rmd!%0ogcF%X5Qrmy31K*Zq~Vz`eRboafo;4`e_?d|8P>iPURq@xm}V?m~J zUS{5b{#XPVZ}IN$-{Dv0y5=Rw>B4 zUO(nznyf68+2x?HJEi-G2_iE`0MaeVcHbl9e41&%A07odyf~)+8+Z&{*@~df*klid z*?EqOI9J1NX}Za&Wc~jzI_x+@Sl}wf?jv1k(;o|M)%;DVWUefTd_b*KXjROCXGv<@ zzd9G~-Jb9G?O2xo7Up6GXRfOS=GR@a_7c?^$hNm%o!P;#lq2jc@CydZ%DXm27s}eP zZ#}<#kIYt5uS^eu?($KEWr2K(EUiT!+&GOmcOLHw9TzcttueB>O3$8&&DMp$$yNc0 zryY-iH<&?IgXd(YG6cfvww9A(1WGX*>%s6jXa8lnT96+OWsHk>QY-x(&2`=76{)Gg z_&hQ_09jY{K6$Dh%E@>chV4p2{cE$mEv)`rFb#ZwjW8J=sL{#2_4;pdE3Xk*n8Vj- zT^8O;(;idwqrIo)bN!3jCDKJ-^k39|fb71nx!9cCfb_80g_>tr@WV*TAmy&Kr@##; z`r{{C$pl5z4;Sf4&+i)l8*dr7f_$WTCQ|ECql9&_7M@CPf&_Owkm*UfpuVou-+NT{ zuVOLVMN`&a#Ue(h2|X{p9)c|l^xiorrslYxK)bK+V!k7wk+ zccZsO1>P7;RQCW;Nt_LaJ6r)%%7Ga}y2RuEvQCN&GQBpZj3pP}mO-5zzlzv%y8l9; z?G@Vph8>(S?U8d7D`3RPQc5b4Wl=h34E=Vo)qdqeNb=nWt?c~|WTLYbgMP(-&(6lx z7CW)z*z>86Mt1&#*-387f3`=-YBc91KWgpLz2x-9cVX8r{~E-egb0A3F_f4;A`Cu8 zyb#!~iR2%82~34gXnev->rMdqSQUxU@U>FsAhsi183|jh7mQ)wF(7b2{>F7%%C`^| z)sv1|&7SU{kj#MFkA*Qdz;EcDe|+BfUDgD{D&ut; zG!TzolN#Ni?@)=pOqIORl;0~l3AAnt-)*@3(;axLB#tw-o6Y@;`|S2}=F>5E=3iQU z?KLL$n5V$9h64)%6!tkFEtrhe^D|3iOzL^@uAqJ?jW?*GHasTNiYF?CnkEwStzv3Dr-`e|E3932XO) zPr}|14=g8F&C|iD{i{bGrhMLrf+h2uIJ4Xo;fbMAwJoR z%#CR5J=WKljLsabAXfs0=Q4uy|Jw`TxcV*8>%Ma%g|{oX?%dVEatsOxKXGS++W5fG-5=k!%Z%-QQ{nd9U78yIjo;Z9tv=0HKmxvEkqmPH z%wQKHzxhkNkBiv!nHhm5+Hw>x*eS(>M?b#w3;*-yO_ek{aLxPv?SKb`b=~#TACCTSTxvND~EbeWA^PwEW@% zJ@wJankF{WUD)Y^2dLz+RlxU}k2wv0PNyiJ5Q~3%fBC9WPrz*RTT9Ar`{er%$>reT zvxz1*1uqhVlwiPRu|{RY>l~u64UUqv4b07dfe4nuKgclJ^mpHW4(~e}F3;-ExxB}m z7qBivE15uw31Qe;qoG7Rh$&mY%;y{&}dPE1S) z1Fg)bxi!V_u=QXYBs*^>vobTPGZi@IE&Khk*f6yaa{D!tS4^{hlFu(B4BU+r6|F;l z!tyl-|C=ZM9p&6u!l?Q=6ZujA&DRU#5`i*Zc5-!~qYMPO^k_R*g=38{vjyev(S)fS%ol|)uK_apwbjEpoW z5v%772&s}>ZH5x%x+{+`5KL481(%0v8wVgi{`ejgcvEfnsy$&H{a-|l2Zs?LbVG53 z2^ee~0PHfI`i)|Y{qGb1#C>42uo;rwM{__EqaMXZXGgy&_$EZ+=kG4*=b7I8k(*(B zo4N9vMOI=B8Nw&&UG#9i#G7_|`pE7oxOC1*TCkrj_3mCOHR(tn8L;r^AJQM{2F zmGd4mM&-->RE61Nr)1W|j-lf!`YT)l+?9m=_RFbO^j~pQ-ta_X|EO=sZLv?A@8*~x z^Nh&d>i*0$g{E%qWaLVfs}UX42Q5DWC5jzb#Xc}4OUKzwu_ zP7I>_qm_IrVju}a>jg;!Nwc|*6C+b@lU34q&PT8_i&IoNvpW?MuXgmg1wYalKek=r zkB+!f`FvoR*}R*mWk#ij3NSLz4!}~I!{Os8rgZT-2#WWGNgA}9(4VS<3WYrjTnPGv-(RW)GEx*f zirlN^p_a#Q86_poUpO`)822B^&Q_jcgBm#xCRC|I37rZ8Go?VtTJmIkq)hx6=_jUl zrk8h)CMP|(UAp!wixewSN33DAzuj$l8r|8RnNrfM$4AI47v>Omr#*dvE0#cDY)af# zmpR)BC}{7XA^CRyPMG)Xl@I{|=}H~S;j{4F!)`^U;NhMJojY;9Yw_{0o!VXj4l1W8 z4{aF`vY?&L+uh=j{|(3kf2fEnbli52XQD+^@wr~D+EmA$c3;fcJ=Vp!3aXrf2 zgboP!IFtCClvtqaGuQ3t7t-?~Az9^EzobqCpqvARoo7F*fOve$Uw#hTu1cTn@T@Gm zf7vqlND`jecw{&(N7bdqW;2Z%D|{!S?o6BpepV$t{htF84=<@}Icy$6@P1Z1Ess61 zhkM#ZbTnqpzMxh0Lob>->m%M_#U5z>d6A0%)vr{Yivj;ET0^qJxtke)Fc!bIn!->Z z-ct7gTScdYr}#eQw}>wPJL9+nrtpb}e^N>8z|13hZEbL5c0Q)Gc8@gDg2`Zul*A=A zdJ!j5c0$Az?PWz3^NvrLzQ%mGK=xCnCz^ME|;Rpi+kg)KPLh?76abN zfw*~n=XikG$0=F%mS*^d3P0T^L|h1!&~YvF;$cXB@%W(6j+-%Wlk+CheDmsa)S<9Y z*p6Fc3aJ$UU~A1B^4>~4^mw;*bZaQ{VTD3l=v-P{-}%eG5Z{1K6w?VgrYv=3I%?eO zxPumg{r2M_){T#Pmq46~UVUa>_UBERCIb{^rxNmGeIjN-9kL zl|9^BP|h8Wo{%Z640+C${^}nQ{BJpez4eaT@~R`wIKU7`e^J0@f7bYZ#h2UX&VCKw z-?=N>~vm~hzUoiymvHvlrgfnAD{2K99pte%_xbA$Y8Vp(SsO@euR> zWU$PJCv3<)ZDsW*s+TVpYBGIJENbJa|42tUP)c9}$54vqc)W&2NZTGf`0DM@s_fer zEGe%5#<)19USrg-a&)O{w{J&hTUC4awjZn}cqPRlc#l+JuB$%K!zrtnmdAEnUq4E{ zfPYrTGdJ6e#rFB38g_ab3b2$hce{Wu`}A|qPLG$<)dV0V$O=*^V^Rq)!)HFQhXbX$ zMC{pHALTB^0eHNLawu^IEuG0PgkaMaKu(iclyOobz_z;=o4KyjYnI4A@RtB%K$$Q` zx^AZT4bgC0oy1~tX-s**=Czv>o^-=%_=Kp#Yx@TgLxy%-;-B%~H=-rtY2!j~x7kl} zRyNiVt;$``$VFIT5^1=xct2B-)$U=>`%lm@V%7+nh!QgK)`e0}Two}G5^jv;R2_!T zR_L+N{Do?5p|yxlCtdbNP0x8j;L{y$XNQyI(KA&nUhbPH$DTc0xw6(_bK1+wx(*xD zBER&%G6Upi)roYh!zUETRsxo*n6E;C@B!j4$f1)m`I5<$EDHhs6-%4=hG=jl(bCD&!;p z_rI)UTDtKPHex~M7+JnNuW@{=zn~_@Dx%}@WKC~W!;#gY_+mS3>t*;G78uVS5t|Le@DA?+AvL8;yz{=b#;rP-_&We+{FUF;_P$+ z!jFE(B#9m&MVq3JzJG6>WZx){4}Tn1@_CL5EN)ER*N)kN|LoBMPg1?m(kTxq?54-I6=s_svW zv`R06zYjA7?Y!zB0wfu#cqLi=;CjaF6N-;!2>IP=1#gdkxtO54ft z4%`pRRyV2Nj=DOWlJ@oUb8^?Hoei)L+fZ^n52fu#KJ}mEDyMA;dxV2SdATG(&3@l% zU{+-aRxIs0k%EkILrx-wHJBBz9!gtr+a^Gibp6bV6z z=8*MZn+5*NUy(nbc=7S>YhHe55lW<3Q0oW5Hr0z;5$7U*v|PQOsx^bw(Afx@?bmT3 zfQvFc$-O$ae@5f{{-FyxwR)-V-yvRBv`62}t+HP=msxa)27Z&MwJD)_VT2}Lhh=uP z9CQ2Y#eFWtq@v&iAjV13nfN6{eZhlL_{O{~+&)*#9rf9MFW%qQ9)EdZbW8UoDk^d( zu{VrTk99mv_T6`7?STYdP6CKLIg1DGh!cU1L7m0QU-Nx{g#yCj=RbKwhF~%xb&Lx; zcss~*5|!7+6x+#Qy50d8tTNRTRjW*`8U)5b6oxHi82;*}NIJ_{cFNr=X_D*|gf2JY z|G8R?38Gp8%DlvdYyQyFFMI>4uF3QTd6&E@l65{2T@91q*C^hXxY_9;ZM*s9R+WI0 zQ50j8#nzElG)K2wfA56IwWZ^j3EE@SiU8XYi?t4qwz3aeHJoz32Hi4$@Ps4mC{}K; ztZ78Q9jQnHd=JUzQwaQcu%`a-iehc@Mvm&lhcpSUY>pb$Q5XsI{<%-Wk6m^Z40miv zbA)erCvJc3a?UnqQ;!G3gktuzi)+;Bfx4bNS1Wg!%TFO2hAMs1{zLBCcOUywDqfN~ zU%Uai=;g;56*flufXJ5=^IZS%7M0&SdCS92C=FykewBUwpSvI=Wmf?8|0WsueK(04 z*x%CYefRsBE8l*;p4R)3!u%ry2S4CKL?d-vKf! zF*Ed~vvGc9e51!;s&mX~BzKpauqpV!yJOc#A$Z#Kk2Em~?9w+%#|f&$J9BIuP{{xO z+2LoVD3y@yoaucwI!~pUs5U8`b;f)H4&v3*Hy+j(<#}(^p$HFJbr)<5Zz>34pS`Md ztGV%hS!-O}y}5D!S)5K!`nYQ!!VC9}%45DNIW#rq1cJZx!tpf1ZIo0jQYbK3iIV^> z?r$;5mEp!#)G9$>zLEBN-w%ewMM+_RcXUC_$}GA^ft{YIBd(pWP<|1p`;&Bb0G2$g zugcUQ$|BeGk#dnq`64i(t-mY$sQtN4R#0q>Vg4Nmmr_atRCco5$@M{3;<~GXk`R3; z@&I5Q`7uUYK$nEmcrQ&0@B=9%hFdrCx#~74!fS|TA2sYZz*~;VBD4^D(vM%i`%MZl ziCVDIAgrj6S^;J>r=Iqhh#;?vUJw(0bJnV_$0lk~DSHZ-V3`!4 z5^d~}?s#H>Sr7(1m?@F8bw_wz8MaqYXRr@}bpWYZ?)SOObgLcZq@*ZS_N9*-B-|(S zxv=<@VfP<4)`PEJ&&lYD^qDUN-zE(zm7?5ay9gIIW0K$xb?5&zlHnE{>kv-Npi4Ho zYZ~je;mc{eE8b@hRHV}rw>f>g_-9{(7HhjUhQJFe`+_we*OJsx-F1`7hflQ6znm^cA^w2Vd~Oe=@W$8Dh_1%> zBHcxvlQSvUzFB1FD|nm)I!=}q4@L+%8wNb~!W%z+4hGEr1kb*@#ds1b$ulK#NpatY zXyHScn=K$QEMrIU;PXa812#t1y0y?5zvh{JC3(= z9C;ciQBxikFALcA?yY$6_}q;rSwb`t(C?mTiwsW6uLfb1)mRT^VL|0Jcv1lFRKsm| z)Sn^}h|%Br)09X&;5{p>^;W^Jbn_9`WB?mW$r|r;(8RxdiMFIp7i{!AQY5wtZBT3X zIB8avrUF!cjKYHKdcFh0j^H&^ASn zs$M@jEaC6+pZ7{wA@aS?kxiwut8?DU*9rw_z1#CDbX&VEHmMTQ8wyWX|^}HEooM_^zmO;dq8!*1v!L=tC17vX0^ys$FVQ%D8qXbPS62 zjW0WCYn6$HKXC(6O)qj2jw=|^rPc&+GtA@L@QB|J)+s?%PH#o<2KD>3y3%Na^!0nA z_5j49F@-U=oyl-xURENQ*Hwq>CAM~r4ka=-)bW9rncKUsdq+R&0qwJa&pn2oexNz5v>cQgZ~;~nR+;xaV|aoCa!! zM2UxhsY)Q#tJMxSvdWlM%G^5gXNV$=3E?AhVj)5YR5E8CnQa&Sn7Cc*c@zyiKki!o z9_=IOjgv)g`=o%dGLN#uheS5egS$4M1xA6nGW$m+=ka=~tBpzMIxm|!nK%m#zaK)l z)9IHSq4KC2?gR^T&_s0>MxgFb7fUOJR|Q}bfbKDaJRlwQs2i2r0-e;}^nPFTr+fag zgHj4InJG1p-|Kew$Aq{VUG(zX(^o5$f$-ANr&2YTnBr>|Dy!akIR93f{Bw2^;|4}$I_?L_(c zH0GkqR5&4yAgN<&e)s#c`tSn{f}tp`sja?}V=E zyjK-5FwwzyKqlNIaD6|c$Kbv_4k@%>`8h`tx%UB^SL40uh`eU8yS3i%rhu48j9aq8 zs1y}C)=?mGbfJbp_sJyou!SJ|h-jbnONNEclM|T&?8H!-s(;SXeP)gIEy(2~NeVJ^ z>LnoUNCyG3dj<-Q0(OKHOK{Pyno=Nv3JOXNxg`|OO`bCcjDa#Nc13CAu3f)mWPusZ zgQv)I+uuXlyhXfnF~#l#Y6b!Cr9$Wpc|e9OeNDswj!#7hzuGmNi5PIQR8Rem?@ zn9FdpWh3=jjRnx~&>hY7!@DCbSWpq%SKTqzfnJUG^#)Y|U*8EEJOJo%#gXfxSEq5D zQgJ{Ex3_uE<@QJDIVJT_9fb9Z_u3Kx@7>aJ zKo9gl1}=pRIFLxIS&cEn!fn`uTJ$+W0hB*X(E!9~$6N-i9p~w4<31dygP{O&06hdR z;GvtXBIn@|ed}w-l;q*at^mOz&pZ`-}df4kR31gsn}v3dPnn>f;p2z@;78{m7r4Yf$<_TxkAzHUL!#P+Df?R737-X*0P;+J zr-G}e(0mL_%W)BJP$fq%L<7oArhy6_N6XKo8zSseJCs&`?Llm+I!yIS{guJKH|gy( z=k#oOQuC8b!@{O^bQOg>EG^C1+__3$znG@Kn%v;!MgGR*oTS{Glzw&j{UxJ*wFCBm zVrOZMyy=3^K#~Tvaj{SlFCp@ThZe)KU?e_Ie5oF|v|g4U1rB}nly{BK-hL@2KBZ#W zIPn~0Gf_DjU&1WSQ&a=PV!{iG`VW{&Z^0v1E6S#5H}I@42MmnH+^hwgFYmuF4S7}0 zem3g7Z#nwd_W)BstiKowj1QS;^E}R9R2*};kw=J(uSJ(@ePJRt8LX==%_&JdQqVfl zNpnh@BEr)Gk++DDr>n9mYB}$kWWYNCfj(#&&}_ocNG{>MuM9~I_FjKSP1bueuA8by z1AAVO`X8u1MpbzAt&<}E=6Wm>CuY;0DM{DIjqbkO`67n3F<)q^9>x3>aG4+ zU*)wae^RpeEh5NXZ(_a{k`29&akRJN@pWQf&)IB@u2E+UYKLkP>2JB`>-43Eng90= z{{ZFG0!tnVV8_549nIN^X_*XRj}f(C7MDQJu&2-b+;i_b7UJIOvX3o7C8XD2yjk_y zt3e`BLSV2HFPye?-DJ8!A3YMt$&U{RK!%}2$ZTQCBVJj+fVAJKiOI5jJ}QFVsKRH{ zlpi=KU#SNpAaV{JadSx`zX=`eHs^6vNMuOx4l}jilZK# z7V?lK$4K#lPs-Xn0%hfx<;C#C^jt3mZ>UNI|1a>gEn5n5<@Ie?j1AW$suH z2+$ZJkkP4Irr2_nXpQa2j@^Cr!^rQD|JrISeQ9~_%(%=jEUAwM#od6L3#ombbA|*C zU#*uKp^~00f5r5eF;xuAgex(3b^9Kn9D1yK81)FQ zU@ThaP327r=|w12luV>!I_2+aF$A3}r>!H$KGW1< z{28eX-DCgMjRy$E1CLmqP`fmzPH6m+wL@1z$IX7|irCV;xe?zv=9Z)O#ddR2A#Ewp zp031@LenNjyFAduG)kc)DKqOE7jc%_L6uodX8;nInD71Q)FITLe6In85lYrX_2S}^ zu-}`&LPAK}odq-hQZ&y$7p53+y-`V@?9ONVpFk1 zKxQSAaaxQUT481ZzHvG?p$@VSKui)tGQG+8!h}bBc~0CPbEIK~^-9+f4>@f^>V2R( zPe9<;)?Qc^$#x?s@{F$b%OKy8ysulbWcNS9ZApRa{D&6dT8 zbER*LZ$Jahv41-AI1P=Eg^a?N!acXyiE*hx&RfsP`^D}1_3B{YRD+&4f zBI2-8xkMZ_2^Mw>OH~V z0N>^2jSKAhxUi!R)T2Qn>eK@^$fnH1%jzvBAOIswLLy=NHOzH3pB1w@1}Yc z+Bo@|WS^CW69p1^p%VpG+%Rq1P?OICLBI-&&Ydw%?y@2k%)vUGp!v@L%67AS-h?s52r z_zi<6XE(#5oiaSDPh+5pQ00yKsy2FCANbUH*PW<0S{@b!?1yLR!!_jIk+i@&^>fvL zx02Hq><=wrE}NqQgA5&V_gU&D3{ zohYx)`zyoOe}{D*Kb$op!_WyuV$5Bm%ZaFzB4Y3`108V6rmTj$raL2AEMM5{&#}}n z_4hL9s1O9kIefAmFJs(Y{x0y`82Hqfo2samPWPn@}kXqLII8g z{vDs52td~p8NM5ib-IK~cY(-b#V+WKwz49R*V99#T=>nItJ8^{us#6KNBm2j?Reu2 zW7hj|tSrLeXUn!=h0iG@a$tqlss1 zeCL7J!1!BhT4VGz^*9xzf2U?NXVc7pH3^w0coX?=K`Vq7=!gR zF4Xv2LiUm)+c#n`U@1Ism)G)}@3+<9@qhAJdIo8&@9Mn|yk`5i&_U%fU59gLMG`4B zg_qMDkjitvUpnggy8oT|&)U;P%aEH>YdmkBbl^;ew=e)tbTDCP$5%f~%7L(F4K*o2 zwbaA-9An*fq1j|BhC6z(G~T!?$6b*^)v)EZ?p6QAtcn}#Y)jgHWVm8O`~p><d1=9ZPU8PeOa`m;;1KDvSI9Xska61Wc-R#22>ZS5>`lmBSyBi zh<7r&-We2SO^9^9{)I{5jg%_`lv#q3yP+JDb926}*w*DUJ4C&E2F1j}S(59sw6=F+ zA!}+=WHw zfA5~-SX^eKL=KwT)s+V|Rio*%OMHI~%E#ylRr*nqtTj^_%OjgnRKXXiyBfKcf5%a^-0y{((*|7}mSh54LSbXKVu{#G%Z|8UWsQs{k!9 z-VfgWdn)ue|2x3YyY_y)G;n5ehJ{70njY@#ZdSW1I@;xmDkn99MVr)gyJgJuq!WnO zH{gGFeNfSVhzjcm( z^;KPJBCz(1zKHh)jfo|M9RYer*B) zz)c}dS^dRdulWW10cBcHeMNUe7fcB%9JMf$-An}SHI<3Z{csi?9I{tWwOJ}`N zh6MXF0&iy3gwcSJW@hInea00!?;V5?7;8e-?GFM49T)cCn74R+GdqLN2(CJAj0{zK z&XQv*%aM~bZiN3Iv=vdw!dJm8frCj1&Dl~mg45kHbu0XY7A9bszd8)a!O39sLdzSP z^(!XRD@k89O#y)lC;GC%ZbEARPv@UmR$B7kuH`0z%Vzh9Z3;}zUxfOM2Kj{7%RAt8VvQ(C_BAw?b6O2dIq94o%nhuGz>awn4kZlj>uvG0O&3Z%g}FS>N< z6dyH%H_k1gD(;85HRetXo`mHyLQ3pPfcgL3-e;4=PcrQ;S;(-W(&&iKIg_p(ZwKTg zfMDFHr_+qDOP+7TM(EPF8jTF^0Lk(xB6CI?ena1)oK5ogfIQm z^^LS|Cm}HY3Ox7|4Ct)y>c%_cY6~rL^#2^F+*PKr_#QEnW|jMj7DJR;goKm0{r=CJ zcb(Lfu`3T5&VvbsilEZG(%9Vp{*?&NGXj-0!9sKVPv|UhDSuAeIvVf!IvW2Qr*$j% z@oaz{eWkoL$qX1)b|fI&h?pTX6jBq|iLEC#z{D5^jc>iLt`1eM9LHR_*!Z|KNzyQ z%D}nB!>h)`f)ouoFlbHVc-eCmi`wqFpub^H%h#}bOd+tZRPI`2QeZj3CzNh};lqnidXcO8hL z^E}*AXp6X}o5lQjor=W4Hg?)4e)HQCH{9bNz)!;ah5jUw0EuzO7 zhjl9w`NR+(k~P!aB=N+^De++7HTCk|XJ`W}+m4OpX!PbR^I4(qEeWJW>zQaI2G)4z z+jO2E?#<(u$3IFu0D~)FWJ}ox@hN*^t|_;pOh3G>>SelJreD{*3x>ofy#rV4c1vis zBjns;N1%)kLY<243z^9zdHGAx9hLF8i`K>mQ8d!_bDZLo%uDn+gie&T%3nIu9Q_Dt zxLQMviy*qLv;lEK6~0B=5QZK7c00rRVN&@v94i+hsjV0V2Wbsp>+FeNf)W zcV0=dM<>0e>FPAN^E%4kSqAb5<2<*jld=Y<-KRU(;f^|*;j?S)v`KbO#%aks+$#I_ zhVFc&ZL2WagCzWU`jh)W@$yM{7M^ps*Nb?KfG=ewD1gwl-$wovO0VNVap99Lf8kO{ zIg~TU!@jT|-=pfYN`gzC?PPrgw4Q-_(&3}@xSk9hN~)u7^9CInfQod-pRw~f+8sbQ zw^T>sWZKfxMoa|+Lt`~OYg+?~AqB(ccAGPJ_O?8Ux@Gs+z|OcycYIEE(|=(k&Nur; zeH%+h$3=a*FS2A}V&(+`FRq5k-iTdL)g}a*ue|5MUVrlriMjOcA`BebS~Q%(+zeym za$r5uo_4N0{^y$+_!s8+SX`vpGd=VSSodI~>SY4XwsM!Wtwdz7Qk}1;cp;&@d|<43 z5?U|b)9~4@SIFO~%s4Nmx7|qGlaUA4nECP^GX4DA+}#_;%Eit6 z2b2Z=ucF2Y31-jtzxG{XjH=phL7T8r|9a|WrvIfd zJGD?`&}WCAougEh;SsrSwLt*zPxtX>IXGMOr7BB!=hQv0|5#vbk`V8*frk;D0SxUX zae}zR(wbCMqiVICZ9XyuNoJ3lYUG#FeI_6^H;LR8T#dFZ@W~-8o%uCQ;b>~SPb{xF z%fTr-*9vHcX!$KQ4s*E7Wdw*37Zb`elMN4mIS0{PNdZH0UYG1o;t0W^U@{bEN})NU zF^LYUIg2Jh6sQ7|)0|Qkhfje)1I8vsg@K~oBVFjYiu2zRvOa=xll^N>{!f#dsLPW- z+9E!LT^n>eYp~L6lgFYX&y}w86y>fCQdE;%s;KCH`v&bGQ_(`l-+*76R9|BoQ+ekW zl7+dM4GOEc{QdJ2i2s=`9sjU$+HLyFkX-%+Lvmcdd)~eQDfhYM5>*Sb#L9qmO}uc` zYcwW;P=KnOKEQwqv-Nm}?bw=p7pWN-z(xDOKCVQlggfftloj{W;{NaJA)$8Uvv8%y zQv!=-#^-BUmNgcTO5*y4Q0_rB%)RDHeUg~h@urW5C|m91Uo&#r2;?pg!bJrJBU~Q3 zEvgyT{R;FgbiO-g(4XtF;i4XGy1@TuaXW6tbx$!Z$CV*LpYRjXKknODT$%tUp`6GJK zl%~SOEsz+j?Q`V+sQ2-RX>%E?bJ&%ulbWn+ZIlY54QE5De?QvB9s-z{24Xj5#M2?j6kq`^K7(~y+YF0{KzI5FEKkvox!0#px12OGHm=Nj<{@JO&f z$ioZ=S<(m`ZSKZ)S$8`Lu> z0u&|Lu|ie2S0e;PV=fn5tpnUZN=)xgm*e~-;@s5_CAS!UA@oTu$6?*qz0AOfP^FsW zdOiq7+wevw43^&XwMpLC-2X~)#+^(7_N+lK%)LlUGl+sxyCvK)N8=AENrrkf!oY4~ zLH#^2y0obJslJ}B15ZQs!tn;%j6 zS;AJ_73P{zqQoo)UnPb4iEZ%00H|E_HbL5{G!eAj@#v10#D_{5&MdBeaFi|{4J#I~gX7|5Nv9T=9Eg#+Hkklh01 z@j7){(99$*b=*e3$)2rAK10N&Qgp?}_}ZY61jN=F&&?Qc`7E4WlG-6CS#fCAaTOO? z^;TN^Y5*8{=>2vktV{Hni3P`0N7fT*LJG`k@{3GV?Yk)XMi%{Uy7{ zrkJ4db(7emB`jhYTRL8`FPnYLhU{0YH9?Y`-xo9N^r8|Na!}y_6O1f|plRuIIKbl7 zrzE1((DJ2XCg6ZhFu>f6Fi#cT){_h!09cZ8`bQbOOEzAmx?5w`jClX89PcZ4MvyO4 zP^~Z1T!Mp;@t#1>-&F-SLA%fvXOz}6lJWcXr`45=zWJmtR}aN4t2~aDLeegljruOQ z$-aq0Gflb*Y)i=;O13&zphxl{iy}c{myDG_T zDM`rjykxg-7!r_qA^2gRA8=FFWqw0m*%%w}xMPFk1VU2_z^Wmo!a(&i!)K)q8C}vf zzyxGh(%r297-JFgI= zRfDIi*w0?Nevs~p-UJK_@bXVWa6-co6%hw}Gwb9Z@Q~%@bieDc@|HPAYI@f#laWFl zMQ~VtnjIPHB=))&dRfcA?s>5*y2bVvyB9>}A>uA#(Xgw{`VKv^>RA8YkCxW|en*|$ z9m%%3P`TL~%(F%Cq2Bt3{vpV`JC3M)Xp`vokV*dD<7pzJh^4ay2y^4FWN`n<@Hvtn zAcpp(2i@Y|@YIDMF}?)Z4-|c3K51^zo^X$w-wufgjGbR-$x}Zj{Fd}oUzw7G9p~gn*~X?-dD_;aE#ZoGGWeqY>ni|M*4l10KI-mY@3gd| zw5LAu4h(tNEpH;@u1D@ikXl{ZjHVI-Hb+Ne0``>g0dD_E@r@v(AmFK~eqxe{ zB^Vq#sr3{y$NvuTt55Q@s1pe{R{YF5TF+@*X8v)zL>{mu!o$z{ht4!T=(0Jo-jU{U zpg~Z#e~u`b5QgC9394Fd;SPB6-#J(g`E{;|76F&5uL{~eVBZ!${nI}?msI*2QC$TD zM2b+!Ouc{p9_N#stvd?k(|+CL4L7C%_T!S;-O3|8x#vE!r=}4{Hvj6tU1YYL!Cd;rEvp$?3#7lS`}!ws#4&@Wbq4(bPg zJdn0LJpfL7kfX3w({*V`r|H*9n?I~r{1gG7Gn`BZZb zAw_yr>_%MGlLR>Ed~vvf@)zV6jyN*z57Yd6m)!XXo}&+28h-w&j(Buq z7hBC~5|uNzmIUkbq&Y<_d{*_jO=dV{O~QQj4$?vsKnSS*gViTGHV;F_(G?BaASulw zgA)19>2#UJ`tbJ(ApNi;Fk#0gZ-qWeBCsrkYHQU%te}Y7+@83SISn5V+~Ps&d!eB> zb&MN_Hi<=&xZ+L{{8e;eBf&&+1jo*!R4cW@C|_>N*fITlRr_b%pURmEc4;A=s3^}4 zEW!5EncE8Dp`Z}wy*7zZV>|4VQ{KrLjl7bQ{#n7q3!kh9aXkiQDDZdAehsSHtEGfQ zF+RdtU5rJ0nLmFb>)+6Q`Xt3C7WeC%FlPV~YDQI00`3HSx3FX8+MV9-i~$oaG{XUn zL2sMThsbwRAE7aJ3Zl4Gt^+XHnt{UZVr%hE!M3(*ZHi zlYn_*;cJ&mNdZrHJp_n;0m>-lZ|07e#JKj;-g72G9eXLr)KXniK0ZW)5t((e@y1u& z5E)v{?_xjQZriE)j6@bs+pkPF4jrWz_ni-4;ekSFgWsXAUpMkHz!F6WS3YjqC&+hf z-7OKlXHb-6kxhrgAk+6vpYA&+%viCkMYIVw1h_V%>8KLHFaxEk7Zy4s5Yol;87@Wq z4SSk^Rz8}V-uTtXfc8Rkop+{2v{_W-tnZ=`81f}y2b1|wAvDZTq+v_=TK&>I=g*t_ za)Od&&i3vub<1PMd!#alhh);X`xtw!P&p+cEYd%ME6? zC^U$_k9Rjrb46WTgjurbL?x%GPqahPe@tZ(3-0}qwf*m3QJ2nS`0O|+{X%bz)FqFO z+=y%o7_8nFIc{*Dy5CquO(fB;a;2KPx!$@u0~Kd#nNbj;I_IIM!V)?yM%^3& z*p5fbF((nLwA7ykP!%P+@um_2@Rr1H6!<)sM=u=`+nY->>Fe^^@$|90P0#FUt(4T4sj?LVw4aSK$n4M+`okj zW+{&?%#EoZGc%5uBU}w-?2~Nq%@(q%T`}NPx;c47195u>rrWE;E8z{9tXy`NOPH7B(qd~CGt8y1M$`f z&U#VK*>T=|mE;~|ArGy5i;k&bsmFGr+|}+!5SlM%S$}aM1Nvrsa*Bm!JY<>qaC|Yu zXHOju))w*(u**zmI0T8?uS6p8qbM@>Agv%b`WK9K9fSjmP&AyD& zk2Qd2@brnE5g3M1T8&qoT=p1Lc5oLIwm0>-7{FqwnT(7mRX6f5PJ77tRJO$rytyr= zNoD0&-PMXGnBi(E^NCQqjA5{e1-Oj={id}!fh9foo;Q@-oC>aTod$>1xMFzx)@=PH zoQ%M@9ix$}uLaAf@=?w)$Nh|e!NRx~UU_sZ{ ze5(~KYn!;2?+zWOF#dK)siTTX=!se60Rgg4@iEav4}O^8n$g@pR94NLEUGptsL#_k z5^-d8C1~23^ni}r&sfwI>??r?lgm`>H8{dAtdONFvNpvAi5t@s{ULjcB( zFTRPzT=$YJoB`#a+)J!DB??)aBt#P`aN`e70dPbwmOwdz<>|PX`?dHyA=K$cR`qnq z7g&~gi7f}RSZEITxCouO&mn$Rw0d5eV@_nFc3JEFyc}qzEinX~4Bi|SmE7KzYk^@@ zilQ*Rg9-bj+UFj^fD*Ydy%`CdRA*&5$qv zpIHS<2x7vV0eEJRP+hvjWmBE@$v$7@@x@yZ|7(DEnF8v2K`x2<7cs0|YM&^!qzD0$ z*PYKHFCyMymLjDKxUqouB?QU5kObvNp90bcxOR;zscR6a&$%1a`-C5ywJdicSIB|~ zfroXvU3gZ?l#%8J9q@-$C>;YQPcn_7^dHaDBS||)k z)Xn52Jc-51Qbfaatds7DeowCP3H1K`L3t-L2^hFpQT>anE%f>)B+(C^wNRcKlU~j! zXkDG$$^|(-lhSlBe-vY60Qd8{DSs_qiTa55+v{|{(R)XyKFn7VG(A-DyM7`W>CN{m zTIOwvT&)RMjW!FJ}p+Ipj~TU|KJtTGt9S^#iPxsTK-^ zCWkj9mCn~Udxu@upxs5!Z(X-aTvejzynt8tlazdSvSCK;#zm|lSqm~p-3&j6hOGa! zzI|i$#-d!tVoAvzpfKCRW#U2gTvHlL#6tL=E%sYqXwwB1zlzts8&LqcBQ+@T!00sK z#ls0M%t88~3?tU<{yKStQilLs<=v)461NPmM8d^ioI6J}DGWSWZU0NWRO)8f$4PqrcaHpDB91DLn%+j?9Jp9M>x>*5W}w z-;!ak!M}&V7>`W+A`T~$mh1k!vG^(4N-Yu+nK2G@$H z=sKaAc-8sF80}>b&7OV@MM%bt9e*dEY_iMe3~BwhnFxn{j^mT841C)DO+JjWYS4H! z;)q;nh47I}ryyvROfHAe(t{Kbc?x*2wkFKxi3>lF3YKK2#8MmD)&Pu4kE1hKLGz*q zi#@ekQ2dT(`{{gae32(&K(OPZ{kvk~D7zvFh;=~Gc8fx%ro?AS&}nwx^X$lE_wRi; z$}GO&$OYAL9~e82*1W_71G^hqQAufN9=-;>;v?@*PapT)W68^?K=OUEBWe?XsJzvz z5ITGHZbCoe8DBEU4Sv)7`@?oK+U^&zatk*G#Eft$YFyxS$ma&xnW3Bo-v5BbG1j*q zwM_~FhdUSbp;;a}DMrytpX^Tw-!;^!qvvpVKNHKFYC5sQx1eSow2zZjc;#5WaC24AV?#&S^*oON4NmYUIBfD#PUCfbFnAh#YK1DF+okzfC-;{s z7y{eBjb6@+0ZQ z>Ti-%Cl%=bZB#!ry>AO&!y;yaoSP*sx8PF>!Nhgy$bwdJl*YclJ{n+3GHf4~M^L{b zi5nc_BECriaF}n&X*jdJeRp;Q7I0{>uVi`uDW}Pn#5b#8x<&IQf2sIZwT}z4^7G3w zVu5#Ge|3{QlJ4%YT2kME$(QO+91&i@vVwQ+a-g1rv@CIS6$Mc8Fd}QNT%);OGM%QS zi*8idv85Lh?0+ZlS3y#Yk36fSWG8T6FA|qVj<|0N-G(wiL$H{&d+mv>Q|fJXYED~V z;DZ=(HFn#dtwL<>=B4lBMD=GPDk_?%0XHU%Nh=wEDmeGwZ{} z{NX#>BxKp}%*$w_;>^!r#h4I&1w@%)gHe-PB)Y`45TGbxP=YlpFfrt5%1pN2QvVhi zq?ArovO1b5k(tGzjXxA2!i@UyGwKGZo42={Ud(6E+*c0v$|EulkptVGx1j7^F6Y7k z_3mrcBszoF^?1oL^GZDH=^TK3c}~Ogr+3EbCiezMQv3f}7Je0{ixmFJNKAXD-j6oI zSbgEHf48?TmNt!G2ZkfZr(uh^~# zCEFo10F^e_l3-cOuMraQd^f+BG=W5oG61WL;l*F@bA(zlPH9BZj4YKh*jO{5ybXG9(!pQ>hr> zorHjH1kw2aripFZ##D3K^Abx$CXN`9=L`)2AhjSG=e1lQ98%4um1x+8$w!V+Z)Z|5 zd5RzOY^8)0p8*v$(S@MuP%yth`1w+B} zLhj^q9rr}%@4i}EQM|BwSVQN2>;#&tjX8pbI;ViUtr8Hgeg|?$>b>I6xgbecyZ9h$ z4Q0rHiuDIN)A`d+Zjw8R6)~8ijU(!ez<_s!LtLHHMMfuE)v3Yeh~u@814va0Q;b2N z0RJ;ygZs;kUO$PhO7aRu{PMq|{oR!EmSi$CFr7Sl>|lID>*QtFbsit4Fm3XjRzP&1 z>MX6&6nK5pJYRX?R^&MY!SCN^eJBnNTf*!W2q04K2xXstCuna@=TnpjLdp;+mRsHs!gYxBXo3r@4sOMri>kvP5;@`FZllf>F>BpWf#6#aFq0 zZW78wU-@i#cDBR84*T*|+U-aT!*c~~(HaRa;uXWQyh}ndqrjfvO{Y;VQD7B5);b_m z1(yFjRn8d@+N=lhNeV%{cgi(g()N|950j9PP<&tf{YBncLoa-aKIO_L{~F*=p5Q2m z-NSf7w*OzMejkJMRTOsh@4>rpKpl?pHM^e}6bZHyg%H;5Du5_gatsv@4XcR|a5kqt zwV(m9fUUx=94x%eq$@)A{zyR)3P@xRD|AgY8F{c2QMoL4yAgA+95iA`(vK3j%V?1K zx|ut{cu7FU_Y(HI4XcZEb*FaT)v=QLy#taFszO1;P+9vh;LA_Mryd>#-BO9v9NExQ8{1|!7b)x=^0$<$GxMDPiYbw>oH zkX(l%J+SyX?+rw;em0Rv;(3I;;=FCTa#@hiM?JeZ#m@R*Jj-KTK2V}hF_b0t8<=qU zl|2=4FHe8HJqC@p;3SD5`0ID8BfR;g`yJ_(X_nBJFC+goqO8YLVK6dk zqr7{M_etZHpATXV_#lAq@KL6|+VuM~&P>|QCH3;iKT^w3K`{VO?p1|!S{)t9r{BVE z%HJhlN#N#@jjwg0Yk#sN4cwu9BYw(>2Sr|*#Xn$nIG{pEBO5E*9Bgc%K7C*1F zMxAfJmCh@K{ME*@Uox`91kL^#dS5Lh$1M;( zKyxb@d$>CGZ_`{stivV+VAKEUwNSME>@Lz_e>(}`4PK+1q%cP($KOnUF@L5Ni%~iS zY~!YcBl%Dv7{MXvLAxK!U&jM(#?Lg-rK0yI184?r&g4hGqmxmX?W4MiKHqfZQq%~e z?KGcRyXD%JC>){^?POW+LW}o6x;qKYIb2%62>bioab!Y}DB`m9RY9A#?&n7SL?>Hp z^6BaGcr;awBmeYxIJ=}1BaUwr(UI7sc z_?g)XvXioNg7%+vzXOHDGM;K8-o^-D$OB+mWT@GY;N=!XK|x}hAK2}2udGSK8jGAP zFN2e|%_~VvnOi*GcwaMgseyjJnW$?M9PB{>-+WK{Ny3cFqaFQk__Krf5bflHnKuJH zx}`voeI=1_8T0^{cZZ-RTJ&#_?kpN8D1 zeMA|l1JHvDfr}$YCwH9nMFCZL0D-lCJZCs|S^PmF@J@YJJ6V(VLi*1}VWqf`wW_E7 z`%z`Qn~k4|m$6?(_{prO$L3G;l9J1%6QXQ@u{|B6uyBbI$~^sB4LT3I-sCEx2XG;5t1E;dslbjRdSLffE?Q-K{J}Yk`QNb` z>Z1!j4lnxfSdc=j@er}w$}RD8DdIw9vlL<_J9(>jk?4^5phE?a%m)j4I^c+ahDXR6 zL5Dgua2n{ZQMyw&zMD$*0y3>bP^m$f^n?mrLU~%`H)m3&Yw=0DC|{SrlPv4hx*C`# z{dKvTP=&r4YU~nxaofw6bKRHR@Cl6e^)H3Jzd>T>b4aK?69B0~8AS@1at1_j?q^K8 z7f^!&kj!8pf`mBnoA`_7#!jD_KvMihX`FixiZXv+9*<*5nU_oR%^`fhuh2CODyPA- zDz>2JGU5fj*B}ZoO`xBv96)j9(^>`5Uy(snJy~qU8DZAZx1^^Rore1(%scn5s%xwg zIZj`jtuot!8(7WBo_+11z$f1;(}OjX$a+UBz36>MC}>t>?FVcQ7=vvbq>suwAC5BH zX$wlLM!B`9tJ{2@(7r%tWDDTi2~6b6T!jKACt1LOEXaj^VzkKp7cQtW?L0P^lZ#f= zGyd(1TmL87+KviZ3o&1Ao}lfOHtW?un(i_^NulF1TLC1nl(>@AqBn?3ThWiBAt75n z%g)xMOjYytEn{%deemypf*9hLF}Y1x+;|XeH<1bn@Q$rAI{a%`l+8*tY0}{5<8L%s zf)212FZ}aCqVX9G#@nZ%Lf8=LaSz`5<)QWAQpD`HmIculA9U?#IHQl_q(B<=IMN_u zy)J!C6}tv|)S>@0^T=R8T;V6W#CX zB#$SQH7bClLFNN5F##R3aM)Lhbg(u&9|G*g2vr-O`J8ojCSPHQ+UD_M&9Rymqc?(o zm66RI;ceth-u~dNC29|_y6}F1<9x2R%Oqx4E#8a3gaT*0|;Jg3W^N1Sby|U(5SXpxw zH6*5!sR`J@b2PN1)M7Y{jCdoXbj=SQd>+HJq%`Olz^#hIS+tl`;t2OnUI2ud(FVS@ z2jA;&wmUmj>R9Q7S1KMS8EFH%hy$VH=5|#)j;M$TI&6x0hQDl`-}@ekv>4cyOl^>A z7KG-AAVU&23)F>E-kmzzEJ4TMOP>uh#?ZpR&s1)e1l@quUD$IEm^i@B`KSY)n!;G* zNRJ3<*GC%+(nagV#et4bVrsiBB&8rZOO|vaxZPxt7fm1%2y@bqX4^0jyiV8kTEd+; zb>$GPdh55meAc^f&3P))Kja7>;aPkV(!B!$nG_ld0vOjyB4GKK;{geAcn-e-20B0k zJrn~YlDw?L&OdMwu}$2C{;K=?0K7`U7iT0f1qIKXOFu6XXKV_UEI|c>;kkZ1$^oVG z_r@ay$w-pQ2wGr>Q62Iyv1}s!ULMh)@r7OzX?M8Ygt5=2HNN1|;A;fvX==U$r5Ya9 z?Wmih#hDyu)1@1Qx!bYl96|SgYv%9E>%z(e`n4&#ywD}BDD$RF zR&Q+u=HtZx7#1RD3CPF>wJkL5fHu-pZ9zs2Pp0%ieZ`nb_5G~Tf-k9#Gk<=kPU#x` zUL2W!pCzY9elTM-kN}f$G4mGgzC9&#E1&_Yy(CS;>W2Ysk`UjD093!d(H3xFW14(F zKZ&HuU67|B*_B?xvM0ANP;6@;y!^fX4Ejt@L)D<`P)oI@&0cBk+~L<0CO-xD)@%tt zQFglBB-hrTa*#%u=uA zpf5EL4JTveJOI0J_OOjafJ?==?<0Q-M|1B^%Ug}BqE=*fHBgZdMMzl?L9(XVbSz#5 zaNH35t}Y9$6a${pG6huVk6x?{S7n5~QHPLGE-XZMUXa$Pc+ruh4+ZZa5 z)TW{zoLlou3AE|)t{FrhH&jHFTuEcx0u0S_lS^GX-@7!&msX~2lWgV!F1_p-XR)ed z%Q(#MX(<(TxDtkUGj3hQI+dI|{cmd_EN6)VevqXC?*oRHrJ`K8o6LETAE7 zQX6_I{#)ReeUC3}$AGAI+OVUT}|&!18Z;^Pknx(NmV8z)63z&gy<5q7(cnUCDk+ax?MT>f~#C30;G`{ zd&Wu1xc@Tf?Ca{{OVg_cH7(8ywrL=cepZxVH-Gn{z}@o`fPzHV;;E~hkq{OJ7OkCi zT$Anh$47T}NeL1nB`ruwN~d%ToQw^|Mu&(Z4U*CzASfjvpp=LpjdV#WsHD;$;BUwy zIv=0%`@4Bv+xX{w&iy&(I@h_c?cSafnBBTja91$h^O4Q$U1}-|eKY%1a8* z5q|$>j7T$(A-jcAzinC?TZ7B3`h$x;1y*!CY|`XHl;PeLlAEn^j+H__ir$Wfp1GHV z=9NFrRAIBy32drTaLKwb5#{QHkZSm_-q<25^4FApc9zc+Acy_vj)BLBJZ-tN;wpVX zj6dOpvIpsM9DaDcqVMt!>`bkicAkJ+JkYy`d&huYI`=4Bf1G~?#6($yM`z2hdB_Chz$L4O^f@Br&mKyN3XpluU1T=+KpBtHaqA@xgC$F-a z6(qG8ij^Vhikosi2~sqrO_?kGv738G;pMVKkVb@*fCATyV}%+$)7lg3FW84}c4Z87 znbp?;tughh!CGz+rOBVD;|cCpR^zC;3bAA~`=D#488{iX^^A}w_cqDS68o|6>X?hZ znpc>Zeqwg`oLadpLMiQ1ZA$4iMbPzzt8>nET_w`ng^F(*!qG0LjTVKg5tY$&4x*uf z6w+|$M8k#W6%>a)m@?<^NV}=kM`6WWPdmklP}_vI1vYi*J@~Rk7Ui#K%v@RYB|1I! zapsz6Z?ZC(-Vm+Zutwx?om+l5JT0Ip2>YGNUHtw{+>k@nTzI+0|BBX?O*DRG zphJR5_zMW1S_C@Hew_ZPyq5ERuy@O6FgEI%U)NRHbIF$n-UkJo-r%^sEN_@eyXj+N z8*JB$!wMtfNyE-|vrRx7I&I!J&}PT3o|YhlXyzbrmk!jNtl2NJtMREIelDIOrAyuF zx{N`AMo{HqDjXRlc0RC>K2yc=RClE0nb{uAq!- zM|YwD4lLky2bhaYglsM)4`2_WGt`XDy&z1Mx_m&=Df(dd+Q*vuUUEZfgb(?$d)?csvU<6OQ%?eF+ypA&ZwNouZf6i;1oXh5sza*hn0z?(qB$BqPvWonjm3%tDV zsHaW>sk{-^Ec+Up2tMwc-K$p^Xyq1R+`J$+y-^ZVr#^7^ZF&;5bWPa+U5!uE^{7~y z?Q3RRou^IT7e6o0a7NzqFc}cqVe@2^#C3+Fy#38v->OkFExf4RRpBz79u;Gvx~fw8 zl*lQF2pY9<_)u$L{RJlsH3^=3xY@!~Y5hwHb)?waW58l1h9VULE8qBsk&MBgUxru7 z1_muGg0FSmlD?vI*Ufs6znpAEze8qxqsPtL;`7*w^NR+vfu{qRZ_=z~KY(MOx?aiq z(4SJR%NV>rPKEqsx=*+(9qk8)jeOLM=Q*cO5isO&b8!+cIarDb+kd8x!!L_8{Sr_1 zv7+7M(mhc4ox0ETubxy{&lr9TtbrhZ3K3@BQxr7urWG10u3}`$=vU%XWipiUdD~{l zX5V?_?81E>11J5Fb*p>(kAOFnK+){K%edbj1m0 zhIY}yuvW*|Nij*EfoZEAxNX4(r2-69q)NFe>fK_6 z-Vskf0ne~R`#ZcjXP=60HmPHc5In^Qzeu%xU`=%>&)3aJLH*8g7ECs7!KFNm!IYMQ zLl%NEITgDxmV1z3Z225;WS&#d381axVf4gzBBBJygByX z)w)aToKLqoS7R|j5E5sObA{-Rg5*PlI^?++5`Ito{1?2>DQ>Nx%fvjK$&E1)sC3j! z{0z`a{@{2`SfQ@ZTy32uc;|e1J;XKv^HOB#u<&_>V#6BImGbGpatww#AtPR5j2Yxx zHevQ(%uPjeHx5>oB^>2uA4)~|J+|mGW9Q}>@A0IVR_G}mT%5~$6HuL4Vk+g52SU4^ z20N(VER}61FEkMKw5=5xq7_b@M`!fXB}m&9?kiW)qXtG2i{zD;Asv-X0)q*Fak8$ewO704=ze19D#HS#>T$uB(&xb|>!gXQPS;fDaLq!LV0UU?PA)gz zA={quo_@>o=_)=|J_%Ezao$LF}G#s#;v(;$*pzHir$- z7RrBe_O5B=86V)(D@GQRpctL8CWAvqm42h0^EVmxS-ao%ihfL(1wnysOAlr~T)5w^ z?|aiboiyMQF=!HFwf_AaZYr?bygKfZ-ne}ilr3dKlgl?cvy(O<< z>RbM;i!?Y5nB%KKrByroI>h4H)&fs8KNsuE1clLC5h8CE3^_Qrr&oK<#Yi3!iQZ;V zioL4shbMhYr4tH_Nr9w4t3A+|x)%TVq3;vkv?|rt3rz#(6w?}p@8$c%Zp)yXy^e2! zisS5^*Dk%jN4_7h`NNMPfwO@RAk!3%%o

r(UWX2HDY`b!HU^tG`=;7ey* zNgDCXt!g;i?>W>r;+H~6uD=&lAZ?%}ERL3O^~Icnz4YV2W1h3HESAH;oPw(_0O7+LANh;9{T?e=Y$W<5pV z2unhBYUg%D0H&ZvSE`Wa_=hWX2(4kC%_E627Zgy)#K8M~b|q zQ*F-6#N)MoE{i-*LeDDhO>M6zlV0>fdw!Y0*K{)D_23IwR*tvxd|T&J)g7&Q0@Do2 z6U;NxHgyAJHi~5qFfv&(jFtR|y*}h9#U&g2>}Ewna~j^;QI$1&cWDb=u=>=Kb2?M5 z-F!2gh$5q8RYJ{}vRzA9D@cpaHh^u}B32B&AfD5KR={lhE^C&0W8`%5pz@Nxg_MS- zx?I4F4s%JghXBWP9*N?^jSt4bCGYzkO=lJC(7sRi4`*SkdtT4X||exzm3&{6Gp^v$#Cs_A<)mbNY5x-JD#7q?FuFpQ4OpCLr1qV5~VW^eFZ^x|d4X zDMejOh5&J!fJm=t{!2{GF#ultBms@nnMsz3n6=(Ulx_?_^-5j8E7o{nh4#GK(HZ=B zfMT2=!m>xCB@kZpp_*6#E}Mlv_f@E^VBKDO@6PiOXp4j8;rPzLj6k9|5M^%|dZumW>9Qz*Hnu04Rh&P6 z1bt=zu^W?8J~{-F9v5_I8X>;=UmD?$6dNaX(h2?9q)}MRX3U ztiGWe*rBj>4|?6JjI4M7AvvnkXXBqJqI2KKRIe#0_%POvfDiNMs3%&gCKfYZ=FgB! zHj{Q|Gq3d+tW=&VBK|^>t~GhS$SPqCfIL){G!={Gt!`+mV_;Gu|HlPL-r~~BsdQo> zK?495kb?@q2yg|$;UI{EE59w&$q5L7yPku4zzy{A02n15;?_q4;XwdE!&F#r0)2e| z-jRa@3Xm#or#?@HFtF$ra8hyBsF_zuT*nA3wY$)&fxodK5}lLtm}bcTa9!k-!|kln zSpr{&R@IRfZd^E4dlA6 zVN1R5ll?bG9N`Qnkf_(yVoRX5D$O&107_0eGbQC(MCAjBF5g4!TJU^^h}oSpS| zkr)3gvZ*4_-Wmahv*;qgKxBx_@$pf^m{Oa&If4!V>|p}{v_Beh078H;YcP^;eGUWx zoka2%Mtt>a+{Oh6Cw8g!(B@BfWw*U5wXKB6&{>fujC?e>QIYNAE2mZop*1&{lt>Lr3~5xy$!WE{9zV2lLayYN*lm8dK&(%U71QP=&5i^J&BaJ&x&U$!3DdTr(bi_uMrMXhWFqZTTVm{S)SY6 zkYWb)N{`q^R#gqRa`z(dEq04It7{RMSIdAY=^>S_NXhWVwhj8cnl?F4oKg)UNI!a3 z<^E8jo?N5T<-)yykFPJNTod@LiXlU9LbX21xNA5;$LH6ISzqG&@R0m$>=}pPyKGd7 z+MHVSm12dTR)wNU*POJiOw@p3m)hRQ`P^NUyc6|GJEk%py(p{j^mx!2dq=?_jQb^c zWmioYydu^ppIt99rTLVs+A^81Fa5|eE&FP%L(L&Zq1s;=)u29;a%Ucg1ELzM;F*<>2}Jz06to+ge9AS(Eb;Z@a1E)fbJu`B~jM zlZWx~=(QKU;OCws-^NzyyfKi%!H(@X5bkO~Hj}0}bM}e*h1$`q9vV80&vHRb6xE^Z z^V%u1n2!7@JFd65m^|K>S~L|-2Jww6fMr($sCvzBViJ#Toh9ZnAkWt^OuQB6{4j5f z^86t;)mT~MBuA1~>N^E6u8!WB8l!s5x|b`%0Y+4uqQdO8{T|D$p5)BT>6QsI>-v`L zFCQFM26dNvH(*DVe|E-88(w%r&XukfKJ?LHBI1B6isDm6PN_(dxof>;tsoGAo{>2H zHlKZ??B=1ZY66fgv;lQW9!!Pb(?nYx4gD0x@f?>xR?u&- zqi1a7#Xd0zh=iw=b)d&05-LF|wf+7{_29A*tdmgr-A z(SO79pWp$2<$&0~!~fahaVbHb(|!m1mVN{Cde@n*-yBh9?6WWgE?hT48@J$?(0s>|n};QwzqsDg_s`2SlD#{U}pt5W(e za{b4Qp*oTMs6650p`O6kyg8|S{}D}mf<9_xOis}7t3a5OHTbsziJB!@e`4B#5w36` z?DyKF?^+x=y!I#f|BxrBXgOqWd|Xn#Y4NWz<@?fQF}~=>h72Pwa(t8IxVMS^6Z-2C z_Pa4eEm0T*-~0xHAddee@^^Qgl?+wwkgmd!<6Dn(?5--3s0eg*ghQQAT>Q%g_83@% zT)O3$^xrBXVH(Im^hcT<1J{s1S2)7X^PDvVjy!eOuNM|UoqyVu`Mb6Y2PJcT2>}4G zwdYAz{bjRq?B7uj7ZY$%1BOl37{Hy;CJ7%7o_FrPZZf2TFQC05yHTXEqLAKDp zcm2Bs)Sb*@3&*o2aq;Fed%91|2;ENxAA^NZ%+My{^h3L-&y$XJnH`4j}|PZ xf3WbU-Mqh}fA{}nS|MMc*6QFlKhRNkK>iAih3w=2072y6At?Ybj06Ax{|C;~T@U~O literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.zip b/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.zip new file mode 100644 index 0000000000000000000000000000000000000000..6ee11415f433984103a7f0f73e476843be7758dc GIT binary patch literal 62699 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 y3hZfJ`f+TeIEd1B!EL-rF?VX?xg-AJ5e{U zQ(M{6$zWXqP0v%#XpDs$&+@aC>@Bi!_KFj#^{1Br=M?u?Q4bkn5B+zrF2@V8WWdH1 zOU)2#+J$vVXLI-kcSoPp4!o{Iq7^CS=M(V46Y}Uqs;*DnT zcWwypJr7YlK>@8QS~x%cw^G9<5?oi)dazHc5>wpoy%)Z84h9 z`Hp7BF-H_OQFRVC9@mJf&TwI8T<%=co^bSTbn5{!aP8`bRp#BLG6kKwXLUbcI{;36 zU0Al@R`asSAy&6Uz#%WUq`n5mEvj_>`Z-Zh%r^{%iI@gJy>Jyi%EVV1Jgi^KyAR{a z5`$v~8n1UL4J<;p6af7b8oj75ICGgkP?hkSFi2FEmPUbdUYpx1l%b?6Y2T~#HYE?j ziNTe9T4hv={&(+e99P`wi(b6pO*a65QyGBY#`sxpq{cut_dm(+d%uoB ziFUAXhI}G(Bcgf#4IKTI;a2v=L1BPfaR2Z zdo&Q4F}BpQXr)>EFmSUx`_In$W#7V@_3-5Z%kQeaL?Y=b4Q*sIE^-rL1aF#u#$xfb zo;LELX=kxzgKM{gn>q19kM)!=M5*u;C6~z~&8|LzWehTKGxBQdac-qSB6_;CK{io0 z;(K}?E5<2ZCx>r-A7%hy*x2Au+Qp(E8gAmF1-!4uYaH4>iN8a6Omd@ly3ak>m+ymk zxSeBoR0U2lwTX>G^FQm7x}~|roaz(9qRM$7iG&%*kRV9)O(R%CO{c6JP&9+b&ThPZ zh@vgz0{%Lr)p$mL>Fb3NH}aXs<&Ohj`4Tp9C<1Tu&)$DMd~gPs%-dfSa=yEL%i4)5 zr-uJ*Gg$#@JbkhqUXy;~KP-JOTaVj(X-o1=UQ3E4 z(%$Uy(9`LriDb>7`KPk3CM%6g1XCTkoI?|tZNP!EP;Ra<6<0{f;6JIGXV|Fd{wLMc zoSrzd22(Uluw^KU(k2$k7^9&t3EVIGfQ$vAj?!&fNZ;Ty1?lTgLAFW;4+I3}&S2p_le8 z{a-8#rFfn+3fYA(JeC#<=PWloK%$JC5SjQUetVj9S@O|tpP;_&J1tdW^xM+$_-^Uo*)|*?0rIP8F%8k zjcb|#Of?;Ii|nGp*qTjs%CXDuV9XcXT3WkrETCECF}*#nxi2<`5N(=e8ZHK2f4SDW zjU-U<#Q&8YXcM`m<+)~z)}QvSdC`sA*2|#3~W}Zr%&MHqt4E(e%ujxd9TtdJR#r{e6@ z@qq`iHd`umvg_ryYo_Du6Yz^*VZ&hqtY@QY>$a>q@12Vx^;Pq!M3d6Wey~BAx7gp% zvZp%}OEIUv`;I2^bp@nWAGbX)g|TFRe4LI5e=hu+Zwd(AitI#WLA#6l%)F+i<}|;p zUN1#VzmR6~m(aJ8&&H-qNTE5^ObZVD<3$)HX&KAfq|R742+!KFaZ8U)8qjgH!4zXs zT<2nkY1;&=(CvEgD^_mY-=gz2q6Cbul#tH$CP}v3jsZHJ zRufrecj~pT-z#C}_;Rocv+>Wea_Fl8pBDbN9}gXeOd$L_7!N*1~OO zJ(%?~#z!+yQzJ5VIZ!GJc?HPp21HYdz9tryL(R`gzEecsqxu=ajsn3Ln;gU(iy4HO zspqgWWI4Q$EQuQ$6Hg%MxC=BrIaV#bx&K?aZfg|A&yBqPjFqO=5_i&amE9gdCAB)X z!#a~doFS(b26nTBRR>Lfxn(8Csr={0@fIZ92>n3MnLV0z&&05RJrP5oI<6?Z8Aa=l znhMa~d&F zK|lc7Xnrn$;noYWH*M#bYj>Gm=ToH1zUb@?XpRB#6bEYGh^ z!M0jBATR!_St28}pPw~98N7Thm#?ln28V4x73FDx8}k5KZLcf;XLY0#`SH%|_)@QG z@1$?-%{#h-TKsA}tRsKq+907yNm>cfD!Lzybi+!pyU{Hu(mv!SATOO-%e`+>IL2>i z5RNQ0yGQ_cevfc)DoaEdR=*`mdkyM0F{XlS4lzohK>;1@p{f@ROtAe=wd_?n#Hh~t zZk+m^(=lAx-fOU(erC$o@-9^**M#TApLF!yrX51)*CW z<+d=(|0Ah?hDhpb+N4Gy7daauXZ4~vVA7LBv20Qvq}r9T5v|BZCjXUbU!Dw#$J(Sg zl=BN5YoPkI2C=hc?cDq0T0Ed^>WA}I%UHJmxsZx0&tub=>HUf?P|>S|W&jGpQ>?mP zxw|(2yuVsKP`g+t@vb4yJ|Jz0pJe(hE5#L28Y4*>?K_l0E#B&*m#%_xWr(ZelR%sZ28|y z3}Op@4of+Ke_NZP#Ljjw^Gxp>jg>tv_D)^?D2?yFpb$~d=R}d*&}gng!N=;Fgc2uE zt}g{_#B_|R8zV*ZEv<^? z3GgDd%M8r+zfIJ^7*&$Nyxx*prVFstjSVcW_1{xtIj)Z&5@J(MSINkju{Pvw_zUeP zv+rGdcSk@hP$evN;DA6LG{Fu)H)5Sf>yl5V!R`UlRtOf`hJw{mVw>-=X#9{xN3TMR zJ%|C^PJiOGFa9WZ+Dzlu>*?t8G^qw}ulFF43{3QlgA)D(UR!1QZ1Hz`T$d{e7r8&aihpW(!ouo{H`$+S$26T# zer|F}MW^u=*jW(okF4ssQ2W_8Am$Iq#dK5=s~}<$Qo&2Fzh8Gr47(3(SC!1euU3Kv z`e;xvBq$A!*$^={J^68PMz$oAasWqYKkDe>D*7N1R zodEr(GYKr>@L(Pp@*=o#=SA+fgK1l&Vi{Y^BMSuq;uF^aKQlb>gTa{_2RGtS{Znv^ z5Kizcw4nVA`_oZ7u8;s;IBC<9;hR_Icz9rAlf<0@SK@hMU8~W~7G8Vmr#m28y+e=~ zUu@-6l9PsW>1hv8V~(}j2dd(0HCbC;$VNLrl8BL?WOnvMW`-;t+4;SccufAl6G$WHTrpcF=sXsaz$%hHyk8MP)>7V zE^P_ebYG|y3u6Ah+8aL6-^iZD$(g+U)m<7r`)?vdk&Km934|1)%&H?7(JEgXY-o=g z{aAzC2Yri}K>ycwEsYC1_fOZI z%g4F4$Rmd!%0ogcF%X5Qrmy31K*Zq~Vz`eRboafo;4`e_?d|8P>iPURq@xm}V?m~J zUS{5b{#XPVZ}IN$-{Dv0y5=Rw>B4 zUO(nznyf68+2x?HJEi-G2_iE`0MaeVcHbl9e41&%A07odyf~)+8+Z&{*@~df*klid z*?EqOI9J1NX}Za&Wc~jzI_x+@Sl}wf?jv1k(;o|M)%;DVWUefTd_b*KXjROCXGv<@ zzd9G~-Jb9G?O2xo7Up6GXRfOS=GR@a_7c?^$hNm%o!P;#lq2jc@CydZ%DXm27s}eP zZ#}<#kIYt5uS^eu?($KEWr2K(EUiT!+&GOmcOLHw9TzcttueB>O3$8&&DMp$$yNc0 zryY-iH<&?IgXd(YG6cfvww9A(1WGX*>%s6jXa8lnT96+OWsHk>QY-x(&2`=76{)Gg z_&hQ_09jY{K6$Dh%E@>chV4p2{cE$mEv)`rFb#ZwjW8J=sL{#2_4;pdE3Xk*n8Vj- zT^8O;(;idwqrIo)bN!3jCDKJ-^k39|fb71nx!9cCfb_80g_>tr@WV*TAmy&Kr@##; z`r{{C$pl5z4;Sf4&+i)l8*dr7f_$WTCQ|ECql9&_7M@CPf&_Owkm*UfpuVou-+NT{ zuVOLVMN`&a#Ue(h2|X{p9)c|l^xiorrslYxK)bK+V!k7wk+ zccZsO1>P7;RQCW;Nt_LaJ6r)%%7Ga}y2RuEvQCN&GQBpZj3pP}mO-5zzlzv%y8l9; z?G@Vph8>(S?U8d7D`3RPQc5b4Wl=h34E=Vo)qdqeNb=nWt?c~|WTLYbgMP(-&(6lx z7CW)z*z>86Mt1&#*-387f3`=-YBc91KWgpLz2x-9cVX8r{~E-egb0A3F_f4;A`Cu8 zyb#!~iR2%82~34gXnev->rMdqSQUxU@U>FsAhsi183|jh7mQ)wF(7b2{>F7%%C`^| z)sv1|&7SU{kj#MFkA*Qdz;EcDe|+BfUDgD{D&ut; zG!TzolN#Ni?@)=pOqIORl;0~l3AAnt-)*@3(;axLB#tw-o6Y@;`|S2}=F>5E=3iQU z?KLL$n5V$9h64)%6!tkFEtrhe^D|3iOzL^@uAqJ?jW?*GHasTNiYF?CnkEwStzv3Dr-`e|E3932XO) zPr}|14=g8F&C|iD{i{bGrhMLrf+h2uIJ4Xo;fbMAwJoR z%#CR5J=WKljLsabAXfs0=Q4uy|Jw`TxcV*8>%Ma%g|{oX?%dVEatsOxKXGS++W5fG-5=k!%Z%-QQ{nd9U78yIjo;Z9tv=0HKmxvEkqmPH z%wQKHzxhkNkBiv!nHhm5+Hw>x*eS(>M?b#w3;*-yO_ek{aLxPv?SKb`b=~#TACCTSTxvND~EbeWA^PwEW@% zJ@wJankF{WUD)Y^2dLz+RlxU}k2wv0PNyiJ5Q~3%fBC9WPrz*RTT9Ar`{er%$>reT zvxz1*1uqhVlwiPRu|{RY>l~u64UUqv4b07dfe4nuKgclJ^mpHW4(~e}F3;-ExxB}m z7qBivE15uw31Qe;qoG7Rh$&mY%;y{&}dPE1S) z1Fg)bxi!V_u=QXYBs*^>vobTPGZi@IE&Khk*f6yaa{D!tS4^{hlFu(B4BU+r6|F;l z!tyl-|C=ZM9p&6u!l?Q=6ZujA&DRU#5`i*Zc5-!~qYMPO^k_R*g=38{vjyev(S)fS%ol|)uK_apwbjEpoW z5v%772&s}>ZH5x%x+{+`5KL481(%0v8wVgi{`ejgcvEfnsy$&H{a-|l2Zs?LbVG53 z2^ee~0PHfI`i)|Y{qGb1#C>42uo;rwM{__EqaMXZXGgy&_$EZ+=kG4*=b7I8k(*(B zo4N9vMOI=B8Nw&&UG#9i#G7_|`pE7oxOC1*TCkrj_3mCOHR(tn8L;r^AJQM{2F zmGd4mM&-->RE61Nr)1W|j-lf!`YT)l+?9m=_RFbO^j~pQ-ta_X|EO=sZLv?A@8*~x z^Nh&d>i*0$g{E%qWaLVfs}UX42Q5DWC5jzb#Xc}4OUKzwu_ zP7I>_qm_IrVju}a>jg;!Nwc|*6C+b@lU34q&PT8_i&IoNvpW?MuXgmg1wYalKek=r zkB+!f`FvoR*}R*mWk#ij3NSLz4!}~I!{Os8rgZT-2#WWGNgA}9(4VS<3WYrjTnPGv-(RW)GEx*f zirlN^p_a#Q86_poUpO`)822B^&Q_jcgBm#xCRC|I37rZ8Go?VtTJmIkq)hx6=_jUl zrk8h)CMP|(UAp!wixewSN33DAzuj$l8r|8RnNrfM$4AI47v>Omr#*dvE0#cDY)af# zmpR)BC}{7XA^CRyPMG)Xl@I{|=}H~S;j{4F!)`^U;NhMJojY;9Yw_{0o!VXj4l1W8 z4{aF`vY?&L+uh=j{|(3kf2fEnbli52XQD+^@wr~D+EmA$c3;fcJ=Vp!3aXrf2 zgboP!IFtCClvtqaGuQ3t7t-?~Az9^EzobqCpqvARoo7F*fOve$Uw#hTu1cTn@T@Gm zf7vqlND`jecw{&(N7bdqW;2Z%D|{!S?o6BpepV$t{htF84=<@}Icy$6@P1Z1Ess61 zhkM#ZbTnqpzMxh0Lob>->m%M_#U5z>d6A0%)vr{Yivj;ET0^qJxtke)Fc!bIn!->Z z-ct7gTScdYr}#eQw}>wPJL9+nrtpb}e^N>8z|13hZEbL5c0Q)Gc8@gDg2`Zul*A=A zdJ!j5c0$Az?PWz3^NvrLzQ%mGK=xCnCz^ME|;Rpi+kg)KPLh?76abN zfw*~n=XikG$0=F%mS*^d3P0T^L|h1!&~YvF;$cXB@%W(6j+-%Wlk+CheDmsa)S<9Y z*p6Fc3aJ$UU~A1B^4>~4^mw;*bZaQ{VTD3l=v-P{-}%eG5Z{1K6w?VgrYv=3I%?eO zxPumg{r2M_){T#Pmq46~UVUa>_UBERCIb{^rxNmGeIjN-9kL zl|9^BP|h8Wo{%Z640+C${^}nQ{BJpez4eaT@~R`wIKU7`e^J0@f7bYZ#h2UX&VCKw z-?=N>~vm~hzUoiymvHvlrgfnAD{2K99pte%_xbA$Y8Vp(SsO@euR> zWU$PJCv3<)ZDsW*s+TVpYBGIJENbJa|42tUP)c9}$54vqc)W&2NZTGf`0DM@s_fer zEGe%5#<)19USrg-a&)O{w{J&hTUC4awjZn}cqPRlc#l+JuB$%K!zrtnmdAEnUq4E{ zfPYrTGdJ6e#rFB38g_ab3b2$hce{Wu`}A|qPLG$<)dV0V$O=*^V^Rq)!)HFQhXbX$ zMC{pHALTB^0eHNLawu^IEuG0PgkaMaKu(iclyOobz_z;=o4KyjYnI4A@RtB%K$$Q` zx^AZT4bgC0oy1~tX-s**=Czv>o^-=%_=Kp#Yx@TgLxy%-;-B%~H=-rtY2!j~x7kl} zRyNiVt;$``$VFIT5^1=xct2B-)$U=>`%lm@V%7+nh!QgK)`e0}Two}G5^jv;R2_!T zR_L+N{Do?5p|yxlCtdbNP0x8j;L{y$XNQyI(KA&nUhbPH$DTc0xw6(_bK1+wx(*xD zBER&%G6Upi)roYh!zUETRsxo*n6E;C@B!j4$f1)m`I5<$EDHhs6-%4=hG=jl(bCD&!;p z_rI)UTDtKPHex~M7+JnNuW@{=zn~_@Dx%}@WKC~W!;#gY_+mS3>t*;G78uVS5t|Le@DA?+AvL8;yz{=b#;rP-_&We+{FUF;_P$+ z!jFE(B#9m&MVq3JzJG6>WZx){4}Tn1@_CL5EN)ER*N)kN|LoBMPg1?m(kTxq?54-I6=s_svW zv`R06zYjA7?Y!zB0wfu#cqLi=;CjaF6N-;!2>IP=1#gdkxtO54ft z4%`pRRyV2Nj=DOWlJ@oUb8^?Hoei)L+fZ^n52fu#KJ}mEDyMA;dxV2SdATG(&3@l% zU{+-aRxIs0k%EkILrx-wHJBBz9!gtr+a^Gibp6bV6z z=8*MZn+5*NUy(nbc=7S>YhHe55lW<3Q0oW5Hr0z;5$7U*v|PQOsx^bw(Afx@?bmT3 zfQvFc$-O$ae@5f{{-FyxwR)-V-yvRBv`62}t+HP=msxa)27Z&MwJD)_VT2}Lhh=uP z9CQ2Y#eFWtq@v&iAjV13nfN6{eZhlL_{O{~+&)*#9rf9MFW%qQ9)EdZbW8UoDk^d( zu{VrTk99mv_T6`7?STYdP6CKLIg1DGh!cU1L7m0QU-Nx{g#yCj=RbKwhF~%xb&Lx; zcss~*5|!7+6x+#Qy50d8tTNRTRjW*`8U)5b6oxHi82;*}NIJ_{cFNr=X_D*|gf2JY z|G8R?38Gp8%DlvdYyQyFFMI>4uF3QTd6&E@l65{2T@91q*C^hXxY_9;ZM*s9R+WI0 zQ50j8#nzElG)K2wfA56IwWZ^j3EE@SiU8XYi?t4qwz3aeHJoz32Hi4$@Ps4mC{}K; ztZ78Q9jQnHd=JUzQwaQcu%`a-iehc@Mvm&lhcpSUY>pb$Q5XsI{<%-Wk6m^Z40miv zbA)erCvJc3a?UnqQ;!G3gktuzi)+;Bfx4bNS1Wg!%TFO2hAMs1{zLBCcOUywDqfN~ zU%Uai=;g;56*flufXJ5=^IZS%7M0&SdCS92C=FykewBUwpSvI=Wmf?8|0WsueK(04 z*x%CYefRsBE8l*;p4R)3!u%ry2S4CKL?d-vKf! zF*Ed~vvGc9e51!;s&mX~BzKpauqpV!yJOc#A$Z#Kk2Em~?9w+%#|f&$J9BIuP{{xO z+2LoVD3y@yoaucwI!~pUs5U8`b;f)H4&v3*Hy+j(<#}(^p$HFJbr)<5Zz>34pS`Md ztGV%hS!-O}y}5D!S)5K!`nYQ!!VC9}%45DNIW#rq1cJZx!tpf1ZIo0jQYbK3iIV^> z?r$;5mEp!#)G9$>zLEBN-w%ewMM+_RcXUC_$}GA^ft{YIBd(pWP<|1p`;&Bb0G2$g zugcUQ$|BeGk#dnq`64i(t-mY$sQtN4R#0q>Vg4Nmmr_atRCco5$@M{3;<~GXk`R3; z@&I5Q`7uUYK$nEmcrQ&0@B=9%hFdrCx#~74!fS|TA2sYZz*~;VBD4^D(vM%i`%MZl ziCVDIAgrj6S^;J>r=Iqhh#;?vUJw(0bJnV_$0lk~DSHZ-V3`!4 z5^d~}?s#H>Sr7(1m?@F8bw_wz8MaqYXRr@}bpWYZ?)SOObgLcZq@*ZS_N9*-B-|(S zxv=<@VfP<4)`PEJ&&lYD^qDUN-zE(zm7?5ay9gIIW0K$xb?5&zlHnE{>kv-Npi4Ho zYZ~je;mc{eE8b@hRHV}rw>f>g_-9{(7HhjUhQJFe`+_we*OJsx-F1`7hflQ6znm^cA^w2Vd~Oe=@W$8Dh_1%> zBHcxvlQSvUzFB1FD|nm)I!=}q4@L+%8wNb~!W%z+4hGEr1kb*@#ds1b$ulK#NpatY zXyHScn=K$QEMrIU;PXa812#t1y0y?5zvh{JC3(= z9C;ciQBxikFALcA?yY$6_}q;rSwb`t(C?mTiwsW6uLfb1)mRT^VL|0Jcv1lFRKsm| z)Sn^}h|%Br)09X&;5{p>^;W^Jbn_9`WB?mW$r|r;(8RxdiMFIp7i{!AQY5wtZBT3X zIB8avrUF!cjKYHKdcFh0j^H&^ASn zs$M@jEaC6+pZ7{wA@aS?kxiwut8?DU*9rw_z1#CDbX&VEHmMTQ8wyWX|^}HEooM_^zmO;dq8!*1v!L=tC17vX0^ys$FVQ%D8qXbPS62 zjW0WCYn6$HKXC(6O)qj2jw=|^rPc&+GtA@L@QB|J)+s?%PH#o<2KD>3y3%Na^!0nA z_5j49F@-U=oyl-xURENQ*Hwq>CAM~r4ka=-)bW9rncKUsdq+R&0qwJa&pn2oexNz5v>cQgZ~;~nR+;xaV|aoCa!! zM2UxhsY)Q#tJMxSvdWlM%G^5gXNV$=3E?AhVj)5YR5E8CnQa&Sn7Cc*c@zyiKki!o z9_=IOjgv)g`=o%dGLN#uheS5egS$4M1xA6nGW$m+=ka=~tBpzMIxm|!nK%m#zaK)l z)9IHSq4KC2?gR^T&_s0>MxgFb7fUOJR|Q}bfbKDaJRlwQs2i2r0-e;}^nPFTr+fag zgHj4InJG1p-|Kew$Aq{VUG(zX(^o5$f$-ANr&2YTnBr>|Dy!akIR93f{Bw2^;|4}$I_?L_(c zH0GkqR5&4yAgN<&e)s#c`tSn{f}tp`sja?}V=E zyjK-5FwwzyKqlNIaD6|c$Kbv_4k@%>`8h`tx%UB^SL40uh`eU8yS3i%rhu48j9aq8 zs1y}C)=?mGbfJbp_sJyou!SJ|h-jbnONNEclM|T&?8H!-s(;SXeP)gIEy(2~NeVJ^ z>LnoUNCyG3dj<-Q0(OKHOK{Pyno=Nv3JOXNxg`|OO`bCcjDa#Nc13CAu3f)mWPusZ zgQv)I+uuXlyhXfnF~#l#Y6b!Cr9$Wpc|e9OeNDswj!#7hzuGmNi5PIQR8Rem?@ zn9FdpWh3=jjRnx~&>hY7!@DCbSWpq%SKTqzfnJUG^#)Y|U*8EEJOJo%#gXfxSEq5D zQgJ{Ex3_uE<@QJDIVJT_9fb9Z_u3Kx@7>aJ zKo9gl1}=pRIFLxIS&cEn!fn`uTJ$+W0hB*X(E!9~$6N-i9p~w4<31dygP{O&06hdR z;GvtXBIn@|ed}w-l;q*at^mOz&pZ`-}df4kR31gsn}v3dPnn>f;p2z@;78{m7r4Yf$<_TxkAzHUL!#P+Df?R737-X*0P;+J zr-G}e(0mL_%W)BJP$fq%L<7oArhy6_N6XKo8zSseJCs&`?Llm+I!yIS{guJKH|gy( z=k#oOQuC8b!@{O^bQOg>EG^C1+__3$znG@Kn%v;!MgGR*oTS{Glzw&j{UxJ*wFCBm zVrOZMyy=3^K#~Tvaj{SlFCp@ThZe)KU?e_Ie5oF|v|g4U1rB}nly{BK-hL@2KBZ#W zIPn~0Gf_DjU&1WSQ&a=PV!{iG`VW{&Z^0v1E6S#5H}I@42MmnH+^hwgFYmuF4S7}0 zem3g7Z#nwd_W)BstiKowj1QS;^E}R9R2*};kw=J(uSJ(@ePJRt8LX==%_&JdQqVfl zNpnh@BEr)Gk++DDr>n9mYB}$kWWYNCfj(#&&}_ocNG{>MuM9~I_FjKSP1bueuA8by z1AAVO`X8u1MpbzAt&<}E=6Wm>CuY;0DM{DIjqbkO`67n3F<)q^9>x3>aG4+ zU*)wae^RpeEh5NXZ(_a{k`29&akRJN@pWQf&)IB@u2E+UYKLkP>2JB`>-43Eng90= z{{ZFG0!tnVV8_549nIN^X_*XRj}f(C7MDQJu&2-b+;i_b7UJIOvX3o7C8XD2yjk_y zt3e`BLSV2HFPye?-DJ8!A3YMt$&U{RK!%}2$ZTQCBVJj+fVAJKiOI5jJ}QFVsKRH{ zlpi=KU#SNpAaV{JadSx`zX=`eHs^6vNMuOx4l}jilZK# z7V?lK$4K#lPs-Xn0%hfx<;C#C^jt3mZ>UNI|1a>gEn5n5<@Ie?j1AW$suH z2+$ZJkkP4Irr2_nXpQa2j@^Cr!^rQD|JrISeQ9~_%(%=jEUAwM#od6L3#ombbA|*C zU#*uKp^~00f5r5eF;xuAgex(3b^9Kn9D1yK81)FQ zU@ThaP327r=|w12luV>!I_2+aF$A3}r>!H$KGW1< z{28eX-DCgMjRy$E1CLmqP`fmzPH6m+wL@1z$IX7|irCV;xe?zv=9Z)O#ddR2A#Ewp zp031@LenNjyFAduG)kc)DKqOE7jc%_L6uodX8;nInD71Q)FITLe6In85lYrX_2S}^ zu-}`&LPAK}odq-hQZ&y$7p53+y-`V@?9ONVpFk1 zKxQSAaaxQUT481ZzHvG?p$@VSKui)tGQG+8!h}bBc~0CPbEIK~^-9+f4>@f^>V2R( zPe9<;)?Qc^$#x?s@{F$b%OKy8ysulbWcNS9ZApRa{D&6dT8 zbER*LZ$Jahv41-AI1P=Eg^a?N!acXyiE*hx&RfsP`^D}1_3B{YRD+&4f zBI2-8xkMZ_2^Mw>OH~V z0N>^2jSKAhxUi!R)T2Qn>eK@^$fnH1%jzvBAOIswLLy=NHOzH3pB1w@1}Yc z+Bo@|WS^CW69p1^p%VpG+%Rq1P?OICLBI-&&Ydw%?y@2k%)vUGp!v@L%67AS-h?s52r z_zi<6XE(#5oiaSDPh+5pQ00yKsy2FCANbUH*PW<0S{@b!?1yLR!!_jIk+i@&^>fvL zx02Hq><=wrE}NqQgA5&V_gU&D3{ zohYx)`zyoOe}{D*Kb$op!_WyuV$5Bm%ZaFzB4Y3`108V6rmTj$raL2AEMM5{&#}}n z_4hL9s1O9kIefAmFJs(Y{x0y`82Hqfo2samPWPn@}kXqLII8g z{vDs52td~p8NM5ib-IK~cY(-b#V+WKwz49R*V99#T=>nItJ8^{us#6KNBm2j?Reu2 zW7hj|tSrLeXUn!=h0iG@a$tqlss1 zeCL7J!1!BhT4VGz^*9xzf2U?NXVc7pH3^w0coX?=K`Vq7=!gR zF4Xv2LiUm)+c#n`U@1Ism)G)}@3+<9@qhAJdIo8&@9Mn|yk`5i&_U%fU59gLMG`4B zg_qMDkjitvUpnggy8oT|&)U;P%aEH>YdmkBbl^;ew=e)tbTDCP$5%f~%7L(F4K*o2 zwbaA-9An*fq1j|BhC6z(G~T!?$6b*^)v)EZ?p6QAtcn}#Y)jgHWVm8O`~p><d1=9ZPU8PeOa`m;;1KDvSI9Xska61Wc-R#22>ZS5>`lmBSyBi zh<7r&-We2SO^9^9{)I{5jg%_`lv#q3yP+JDb926}*w*DUJ4C&E2F1j}S(59sw6=F+ zA!}+=WHw zfA5~-SX^eKL=KwT)s+V|Rio*%OMHI~%E#ylRr*nqtTj^_%OjgnRKXXiyBfKcf5%a^-0y{((*|7}mSh54LSbXKVu{#G%Z|8UWsQs{k!9 z-VfgWdn)ue|2x3YyY_y)G;n5ehJ{70njY@#ZdSW1I@;xmDkn99MVr)gyJgJuq!WnO zH{gGFeNfSVhzjcm( z^;KPJBCz(1zKHh)jfo|M9RYer*B) zz)c}dS^dRdulWW10cBcHeMNUe7fcB%9JMf$-An}SHI<3Z{csi?9I{tWwOJ}`N zh6MXF0&iy3gwcSJW@hInea00!?;V5?7;8e-?GFM49T)cCn74R+GdqLN2(CJAj0{zK z&XQv*%aM~bZiN3Iv=vdw!dJm8frCj1&Dl~mg45kHbu0XY7A9bszd8)a!O39sLdzSP z^(!XRD@k89O#y)lC;GC%ZbEARPv@UmR$B7kuH`0z%Vzh9Z3;}zUxfOM2Kj{7%RAt8VvQ(C_BAw?b6O2dIq94o%nhuGz>awn4kZlj>uvG0O&3Z%g}FS>N< z6dyH%H_k1gD(;85HRetXo`mHyLQ3pPfcgL3-e;4=PcrQ;S;(-W(&&iKIg_p(ZwKTg zfMDFHr_+qDOP+7TM(EPF8jTF^0Lk(xB6CI?ena1)oK5ogfIQm z^^LS|Cm}HY3Ox7|4Ct)y>c%_cY6~rL^#2^F+*PKr_#QEnW|jMj7DJR;goKm0{r=CJ zcb(Lfu`3T5&VvbsilEZG(%9Vp{*?&NGXj-0!9sKVPv|UhDSuAeIvVf!IvW2Qr*$j% z@oaz{eWkoL$qX1)b|fI&h?pTX6jBq|iLEC#z{D5^jc>iLt`1eM9LHR_*!Z|KNzyQ z%D}nB!>h)`f)ouoFlbHVc-eCmi`wqFpub^H%h#}bOd+tZRPI`2QeZj3CzNh};lqnidXcO8hL z^E}*AXp6X}o5lQjor=W4Hg?)4e)HQCH{9bNz)!;ah5jUw0EuzO7 zhjl9w`NR+(k~P!aB=N+^De++7HTCk|XJ`W}+m4OpX!PbR^I4(qEeWJW>zQaI2G)4z z+jO2E?#<(u$3IFu0D~)FWJ}ox@hN*^t|_;pOh3G>>SelJreD{*3x>ofy#rV4c1vis zBjns;N1%)kLY<243z^9zdHGAx9hLF8i`K>mQ8d!_bDZLo%uDn+gie&T%3nIu9Q_Dt zxLQMviy*qLv;lEK6~0B=5QZK7c00rRVN&@v94i+hsjV0V2Wbsp>+FeNf)W zcV0=dM<>0e>FPAN^E%4kSqAb5<2<*jld=Y<-KRU(;f^|*;j?S)v`KbO#%aks+$#I_ zhVFc&ZL2WagCzWU`jh)W@$yM{7M^ps*Nb?KfG=ewD1gwl-$wovO0VNVap99Lf8kO{ zIg~TU!@jT|-=pfYN`gzC?PPrgw4Q-_(&3}@xSk9hN~)u7^9CInfQod-pRw~f+8sbQ zw^T>sWZKfxMoa|+Lt`~OYg+?~AqB(ccAGPJ_O?8Ux@Gs+z|OcycYIEE(|=(k&Nur; zeH%+h$3=a*FS2A}V&(+`FRq5k-iTdL)g}a*ue|5MUVrlriMjOcA`BebS~Q%(+zeym za$r5uo_4N0{^y$+_!s8+SX`vpGd=VSSodI~>SY4XwsM!Wtwdz7Qk}1;cp;&@d|<43 z5?U|b)9~4@SIFO~%s4Nmx7|qGlaUA4nECP^GX4DA+}#_;%Eit6 z2b2Z=ucF2Y31-jtzxG{XjH=phL7T8r|9a|WrvIfd zJGD?`&}WCAougEh;SsrSwLt*zPxtX>IXGMOr7BB!=hQv0|5#vbk`V8*frk;D0SxUX zae}zR(wbCMqiVICZ9XyuNoJ3lYUG#FeI_6^H;LR8T#dFZ@W~-8o%uCQ;b>~SPb{xF z%fTr-*9vHcX!$KQ4s*E7Wdw*37Zb`elMN4mIS0{PNdZH0UYG1o;t0W^U@{bEN})NU zF^LYUIg2Jh6sQ7|)0|Qkhfje)1I8vsg@K~oBVFjYiu2zRvOa=xll^N>{!f#dsLPW- z+9E!LT^n>eYp~L6lgFYX&y}w86y>fCQdE;%s;KCH`v&bGQ_(`l-+*76R9|BoQ+ekW zl7+dM4GOEc{QdJ2i2s=`9sjU$+HLyFkX-%+Lvmcdd)~eQDfhYM5>*Sb#L9qmO}uc` zYcwW;P=KnOKEQwqv-Nm}?bw=p7pWN-z(xDOKCVQlggfftloj{W;{NaJA)$8Uvv8%y zQv!=-#^-BUmNgcTO5*y4Q0_rB%)RDHeUg~h@urW5C|m91Uo&#r2;?pg!bJrJBU~Q3 zEvgyT{R;FgbiO-g(4XtF;i4XGy1@TuaXW6tbx$!Z$CV*LpYRjXKknODT$%tUp`6GJK zl%~SOEsz+j?Q`V+sQ2-RX>%E?bJ&%ulbWn+ZIlY54QE5De?QvB9s-z{24Xj5#M2?j6kq`^K7(~y+YF0{KzI5FEKkvox!0#px12OGHm=Nj<{@JO&f z$ioZ=S<(m`ZSKZ)S$8`Lu> z0u&|Lu|ie2S0e;PV=fn5tpnUZN=)xgm*e~-;@s5_CAS!UA@oTu$6?*qz0AOfP^FsW zdOiq7+wevw43^&XwMpLC-2X~)#+^(7_N+lK%)LlUGl+sxyCvK)N8=AENrrkf!oY4~ zLH#^2y0obJslJ}B15ZQs!tn;%j6 zS;AJ_73P{zqQoo)UnPb4iEZ%00H|E_HbL5{G!eAj@#v10#D_{5&MdBeaFi|{4J#I~gX7|5Nv9T=9Eg#+Hkklh01 z@j7){(99$*b=*e3$)2rAK10N&Qgp?}_}ZY61jN=F&&?Qc`7E4WlG-6CS#fCAaTOO? z^;TN^Y5*8{=>2vktV{Hni3P`0N7fT*LJG`k@{3GV?Yk)XMi%{Uy7{ zrkJ4db(7emB`jhYTRL8`FPnYLhU{0YH9?Y`-xo9N^r8|Na!}y_6O1f|plRuIIKbl7 zrzE1((DJ2XCg6ZhFu>f6Fi#cT){_h!09cZ8`bQbOOEzAmx?5w`jClX89PcZ4MvyO4 zP^~Z1T!Mp;@t#1>-&F-SLA%fvXOz}6lJWcXr`45=zWJmtR}aN4t2~aDLeegljruOQ z$-aq0Gflb*Y)i=;O13&zphxl{iy}c{myDG_T zDM`rjykxg-7!r_qA^2gRA8=FFWqw0m*%%w}xMPFk1VU2_z^Wmo!a(&i!)K)q8C}vf zzyxGh(%r297-JFgI= zRfDIi*w0?Nevs~p-UJK_@bXVWa6-co6%hw}Gwb9Z@Q~%@bieDc@|HPAYI@f#laWFl zMQ~VtnjIPHB=))&dRfcA?s>5*y2bVvyB9>}A>uA#(Xgw{`VKv^>RA8YkCxW|en*|$ z9m%%3P`TL~%(F%Cq2Bt3{vpV`JC3M)Xp`vokV*dD<7pzJh^4ay2y^4FWN`n<@Hvtn zAcpp(2i@Y|@YIDMF}?)Z4-|c3K51^zo^X$w-wufgjGbR-$x}Zj{Fd}oUzw7G9p~gn*~X?-dD_;aE#ZoGGWeqY>ni|M*4l10KI-mY@3gd| zw5LAu4h(tNEpH;@u1D@ikXl{ZjHVI-Hb+Ne0``>g0dD_E@r@v(AmFK~eqxe{ zB^Vq#sr3{y$NvuTt55Q@s1pe{R{YF5TF+@*X8v)zL>{mu!o$z{ht4!T=(0Jo-jU{U zpg~Z#e~u`b5QgC9394Fd;SPB6-#J(g`E{;|76F&5uL{~eVBZ!${nI}?msI*2QC$TD zM2b+!Ouc{p9_N#stvd?k(|+CL4L7C%_T!S;-O3|8x#vE!r=}4{Hvj6tU1YYL!Cd;rEvp$?3#7lS`}!ws#4&@Wbq4(bPg zJdn0LJpfL7kfX3w({*V`r|H*9n?I~r{1gG7Gn`BZZb zAw_yr>_%MGlLR>Ed~vvf@)zV6jyN*z57Yd6m)!XXo}&+28h-w&j(Buq z7hBC~5|uNzmIUkbq&Y<_d{*_jO=dV{O~QQj4$?vsKnSS*gViTGHV;F_(G?BaASulw zgA)19>2#UJ`tbJ(ApNi;Fk#0gZ-qWeBCsrkYHQU%te}Y7+@83SISn5V+~Ps&d!eB> zb&MN_Hi<=&xZ+L{{8e;eBf&&+1jo*!R4cW@C|_>N*fITlRr_b%pURmEc4;A=s3^}4 zEW!5EncE8Dp`Z}wy*7zZV>|4VQ{KrLjl7bQ{#n7q3!kh9aXkiQDDZdAehsSHtEGfQ zF+RdtU5rJ0nLmFb>)+6Q`Xt3C7WeC%FlPV~YDQI00`3HSx3FX8+MV9-i~$oaG{XUn zL2sMThsbwRAE7aJ3Zl4Gt^+XHnt{UZVr%hE!M3(*ZHi zlYn_*;cJ&mNdZrHJp_n;0m>-lZ|07e#JKj;-g72G9eXLr)KXniK0ZW)5t((e@y1u& z5E)v{?_xjQZriE)j6@bs+pkPF4jrWz_ni-4;ekSFgWsXAUpMkHz!F6WS3YjqC&+hf z-7OKlXHb-6kxhrgAk+6vpYA&+%viCkMYIVw1h_V%>8KLHFaxEk7Zy4s5Yol;87@Wq z4SSk^Rz8}V-uTtXfc8Rkop+{2v{_W-tnZ=`81f}y2b1|wAvDZTq+v_=TK&>I=g*t_ za)Od&&i3vub<1PMd!#alhh);X`xtw!P&p+cEYd%ME6? zC^U$_k9Rjrb46WTgjurbL?x%GPqahPe@tZ(3-0}qwf*m3QJ2nS`0O|+{X%bz)FqFO z+=y%o7_8nFIc{*Dy5CquO(fB;a;2KPx!$@u0~Kd#nNbj;I_IIM!V)?yM%^3& z*p5fbF((nLwA7ykP!%P+@um_2@Rr1H6!<)sM=u=`+nY->>Fe^^@$|90P0#FUt(4T4sj?LVw4aSK$n4M+`okj zW+{&?%#EoZGc%5uBU}w-?2~Nq%@(q%T`}NPx;c47195u>rrWE;E8z{9tXy`NOPH7B(qd~CGt8y1M$`f z&U#VK*>T=|mE;~|ArGy5i;k&bsmFGr+|}+!5SlM%S$}aM1Nvrsa*Bm!JY<>qaC|Yu zXHOju))w*(u**zmI0T8?uS6p8qbM@>Agv%b`WK9K9fSjmP&AyD& zk2Qd2@brnE5g3M1T8&qoT=p1Lc5oLIwm0>-7{FqwnT(7mRX6f5PJ77tRJO$rytyr= zNoD0&-PMXGnBi(E^NCQqjA5{e1-Oj={id}!fh9foo;Q@-oC>aTod$>1xMFzx)@=PH zoQ%M@9ix$}uLaAf@=?w)$Nh|e!NRx~UU_sZ{ ze5(~KYn!;2?+zWOF#dK)siTTX=!se60Rgg4@iEav4}O^8n$g@pR94NLEUGptsL#_k z5^-d8C1~23^ni}r&sfwI>??r?lgm`>H8{dAtdONFvNpvAi5t@s{ULjcB( zFTRPzT=$YJoB`#a+)J!DB??)aBt#P`aN`e70dPbwmOwdz<>|PX`?dHyA=K$cR`qnq z7g&~gi7f}RSZEITxCouO&mn$Rw0d5eV@_nFc3JEFyc}qzEinX~4Bi|SmE7KzYk^@@ zilQ*Rg9-bj+UFj^fD*Ydy%`CdRA*&5$qv zpIHS<2x7vV0eEJRP+hvjWmBE@$v$7@@x@yZ|7(DEnF8v2K`x2<7cs0|YM&^!qzD0$ z*PYKHFCyMymLjDKxUqouB?QU5kObvNp90bcxOR;zscR6a&$%1a`-C5ywJdicSIB|~ zfroXvU3gZ?l#%8J9q@-$C>;YQPcn_7^dHaDBS||)k z)Xn52Jc-51Qbfaatds7DeowCP3H1K`L3t-L2^hFpQT>anE%f>)B+(C^wNRcKlU~j! zXkDG$$^|(-lhSlBe-vY60Qd8{DSs_qiTa55+v{|{(R)XyKFn7VG(A-DyM7`W>CN{m zTIOwvT&)RMjW!FJ}p+Ipj~TU|KJtTGt9S^#iPxsTK-^ zCWkj9mCn~Udxu@upxs5!Z(X-aTvejzynt8tlazdSvSCK;#zm|lSqm~p-3&j6hOGa! zzI|i$#-d!tVoAvzpfKCRW#U2gTvHlL#6tL=E%sYqXwwB1zlzts8&LqcBQ+@T!00sK z#ls0M%t88~3?tU<{yKStQilLs<=v)461NPmM8d^ioI6J}DGWSWZU0NWRO)8f$4PqrcaHpDB91DLn%+j?9Jp9M>x>*5W}w z-;!ak!M}&V7>`W+A`T~$mh1k!vG^(4N-Yu+nK2G@$H z=sKaAc-8sF80}>b&7OV@MM%bt9e*dEY_iMe3~BwhnFxn{j^mT841C)DO+JjWYS4H! z;)q;nh47I}ryyvROfHAe(t{Kbc?x*2wkFKxi3>lF3YKK2#8MmD)&Pu4kE1hKLGz*q zi#@ekQ2dT(`{{gae32(&K(OPZ{kvk~D7zvFh;=~Gc8fx%ro?AS&}nwx^X$lE_wRi; z$}GO&$OYAL9~e82*1W_71G^hqQAufN9=-;>;v?@*PapT)W68^?K=OUEBWe?XsJzvz z5ITGHZbCoe8DBEU4Sv)7`@?oK+U^&zatk*G#Eft$YFyxS$ma&xnW3Bo-v5BbG1j*q zwM_~FhdUSbp;;a}DMrytpX^Tw-!;^!qvvpVKNHKFYC5sQx1eSow2zZjc;#5WaC24AV?#&S^*oON4NmYUIBfD#PUCfbFnAh#YK1DF+okzfC-;{s z7y{eBjb6@+0ZQ z>Ti-%Cl%=bZB#!ry>AO&!y;yaoSP*sx8PF>!Nhgy$bwdJl*YclJ{n+3GHf4~M^L{b zi5nc_BECriaF}n&X*jdJeRp;Q7I0{>uVi`uDW}Pn#5b#8x<&IQf2sIZwT}z4^7G3w zVu5#Ge|3{QlJ4%YT2kME$(QO+91&i@vVwQ+a-g1rv@CIS6$Mc8Fd}QNT%);OGM%QS zi*8idv85Lh?0+ZlS3y#Yk36fSWG8T6FA|qVj<|0N-G(wiL$H{&d+mv>Q|fJXYED~V z;DZ=(HFn#dtwL<>=B4lBMD=GPDk_?%0XHU%Nh=wEDmeGwZ{} z{NX#>BxKp}%*$w_;>^!r#h4I&1w@%)gHe-PB)Y`45TGbxP=YlpFfrt5%1pN2QvVhi zq?ArovO1b5k(tGzjXxA2!i@UyGwKGZo42={Ud(6E+*c0v$|EulkptVGx1j7^F6Y7k z_3mrcBszoF^?1oL^GZDH=^TK3c}~Ogr+3EbCiezMQv3f}7Je0{ixmFJNKAXD-j6oI zSbgEHf48?TmNt!G2ZkfZr(uh^~# zCEFo10F^e_l3-cOuMraQd^f+BG=W5oG61WL;l*F@bA(zlPH9BZj4YKh*jO{5ybXG9(!pQ>hr> zorHjH1kw2aripFZ##D3K^Abx$CXN`9=L`)2AhjSG=e1lQ98%4um1x+8$w!V+Z)Z|5 zd5RzOY^8)0p8*v$(S@MuP%yth`1w+B} zLhj^q9rr}%@4i}EQM|BwSVQN2>;#&tjX8pbI;ViUtr8Hgeg|?$>b>I6xgbecyZ9h$ z4Q0rHiuDIN)A`d+Zjw8R6)~8ijU(!ez<_s!LtLHHMMfuE)v3Yeh~u@814va0Q;b2N z0RJ;ygZs;kUO$PhO7aRu{PMq|{oR!EmSi$CFr7Sl>|lID>*QtFbsit4Fm3XjRzP&1 z>MX6&6nK5pJYRX?R^&MY!SCN^eJBnNTf*!W2q04K2xXstCuna@=TnpjLdp;+mRsHs!gYxBXo3r@4sOMri>kvP5;@`FZllf>F>BpWf#6#aFq0 zZW78wU-@i#cDBR84*T*|+U-aT!*c~~(HaRa;uXWQyh}ndqrjfvO{Y;VQD7B5);b_m z1(yFjRn8d@+N=lhNeV%{cgi(g()N|950j9PP<&tf{YBncLoa-aKIO_L{~F*=p5Q2m z-NSf7w*OzMejkJMRTOsh@4>rpKpl?pHM^e}6bZHyg%H;5Du5_gatsv@4XcR|a5kqt zwV(m9fUUx=94x%eq$@)A{zyR)3P@xRD|AgY8F{c2QMoL4yAgA+95iA`(vK3j%V?1K zx|ut{cu7FU_Y(HI4XcZEb*FaT)v=QLy#taFszO1;P+9vh;LA_Mryd>#-BO9v9NExQ8{1|!7b)x=^0$<$GxMDPiYbw>oH zkX(l%J+SyX?+rw;em0Rv;(3I;;=FCTa#@hiM?JeZ#m@R*Jj-KTK2V}hF_b0t8<=qU zl|2=4FHe8HJqC@p;3SD5`0ID8BfR;g`yJ_(X_nBJFC+goqO8YLVK6dk zqr7{M_etZHpATXV_#lAq@KL6|+VuM~&P>|QCH3;iKT^w3K`{VO?p1|!S{)t9r{BVE z%HJhlN#N#@jjwg0Yk#sN4cwu9BYw(>2Sr|*#Xn$nIG{pEBO5E*9Bgc%K7C*1F zMxAfJmCh@K{ME*@Uox`91kL^#dS5Lh$1M;( zKyxb@d$>CGZ_`{stivV+VAKEUwNSME>@Lz_e>(}`4PK+1q%cP($KOnUF@L5Ni%~iS zY~!YcBl%Dv7{MXvLAxK!U&jM(#?Lg-rK0yI184?r&g4hGqmxmX?W4MiKHqfZQq%~e z?KGcRyXD%JC>){^?POW+LW}o6x;qKYIb2%62>bioab!Y}DB`m9RY9A#?&n7SL?>Hp z^6BaGcr;awBmeYxIJ=}1BaUwr(UI7sc z_?g)XvXioNg7%+vzXOHDGM;K8-o^-D$OB+mWT@GY;N=!XK|x}hAK2}2udGSK8jGAP zFN2e|%_~VvnOi*GcwaMgseyjJnW$?M9PB{>-+WK{Ny3cFqaFQk__Krf5bflHnKuJH zx}`voeI=1_8T0^{cZZ-RTJ&#_?kpN8D1 zeMA|l1JHvDfr}$YCwH9nMFCZL0D-lCJZCs|S^PmF@J@YJJ6V(VLi*1}VWqf`wW_E7 z`%z`Qn~k4|m$6?(_{prO$L3G;l9J1%6QXQ@u{|B6uyBbI$~^sB4LT3I-sCEx2XG;5t1E;dslbjRdSLffE?Q-K{J}Yk`QNb` z>Z1!j4lnxfSdc=j@er}w$}RD8DdIw9vlL<_J9(>jk?4^5phE?a%m)j4I^c+ahDXR6 zL5Dgua2n{ZQMyw&zMD$*0y3>bP^m$f^n?mrLU~%`H)m3&Yw=0DC|{SrlPv4hx*C`# z{dKvTP=&r4YU~nxaofw6bKRHR@Cl6e^)H3Jzd>T>b4aK?69B0~8AS@1at1_j?q^K8 z7f^!&kj!8pf`mBnoA`_7#!jD_KvMihX`FixiZXv+9*<*5nU_oR%^`fhuh2CODyPA- zDz>2JGU5fj*B}ZoO`xBv96)j9(^>`5Uy(snJy~qU8DZAZx1^^Rore1(%scn5s%xwg zIZj`jtuot!8(7WBo_+11z$f1;(}OjX$a+UBz36>MC}>t>?FVcQ7=vvbq>suwAC5BH zX$wlLM!B`9tJ{2@(7r%tWDDTi2~6b6T!jKACt1LOEXaj^VzkKp7cQtW?L0P^lZ#f= zGyd(1TmL87+KviZ3o&1Ao}lfOHtW?un(i_^NulF1TLC1nl(>@AqBn?3ThWiBAt75n z%g)xMOjYytEn{%deemypf*9hLF}Y1x+;|XeH<1bn@Q$rAI{a%`l+8*tY0}{5<8L%s zf)212FZ}aCqVX9G#@nZ%Lf8=LaSz`5<)QWAQpD`HmIculA9U?#IHQl_q(B<=IMN_u zy)J!C6}tv|)S>@0^T=R8T;V6W#CX zB#$SQH7bClLFNN5F##R3aM)Lhbg(u&9|G*g2vr-O`J8ojCSPHQ+UD_M&9Rymqc?(o zm66RI;ceth-u~dNC29|_y6}F1<9x2R%Oqx4E#8a3gaT*0|;Jg3W^N1Sby|U(5SXpxw zH6*5!sR`J@b2PN1)M7Y{jCdoXbj=SQd>+HJq%`Olz^#hIS+tl`;t2OnUI2ud(FVS@ z2jA;&wmUmj>R9Q7S1KMS8EFH%hy$VH=5|#)j;M$TI&6x0hQDl`-}@ekv>4cyOl^>A z7KG-AAVU&23)F>E-kmzzEJ4TMOP>uh#?ZpR&s1)e1l@quUD$IEm^i@B`KSY)n!;G* zNRJ3<*GC%+(nagV#et4bVrsiBB&8rZOO|vaxZPxt7fm1%2y@bqX4^0jyiV8kTEd+; zb>$GPdh55meAc^f&3P))Kja7>;aPkV(!B!$nG_ld0vOjyB4GKK;{geAcn-e-20B0k zJrn~YlDw?L&OdMwu}$2C{;K=?0K7`U7iT0f1qIKXOFu6XXKV_UEI|c>;kkZ1$^oVG z_r@ay$w-pQ2wGr>Q62Iyv1}s!ULMh)@r7OzX?M8Ygt5=2HNN1|;A;fvX==U$r5Ya9 z?Wmih#hDyu)1@1Qx!bYl96|SgYv%9E>%z(e`n4&#ywD}BDD$RF zR&Q+u=HtZx7#1RD3CPF>wJkL5fHu-pZ9zs2Pp0%ieZ`nb_5G~Tf-k9#Gk<=kPU#x` zUL2W!pCzY9elTM-kN}f$G4mGgzC9&#E1&_Yy(CS;>W2Ysk`UjD093!d(H3xFW14(F zKZ&HuU67|B*_B?xvM0ANP;6@;y!^fX4Ejt@L)D<`P)oI@&0cBk+~L<0CO-xD)@%tt zQFglBB-hrTa*#%u=uA zpf5EL4JTveJOI0J_OOjafJ?==?<0Q-M|1B^%Ug}BqE=*fHBgZdMMzl?L9(XVbSz#5 zaNH35t}Y9$6a${pG6huVk6x?{S7n5~QHPLGE-XZMUXa$Pc+ruh4+ZZa5 z)TW{zoLlou3AE|)t{FrhH&jHFTuEcx0u0S_lS^GX-@7!&msX~2lWgV!F1_p-XR)ed z%Q(#MX(<(TxDtkUGj3hQI+dI|{cmd_EN6)VevqXC?*oRHrJ`K8o6LETAE7 zQX6_I{#)ReeUC3}$AGAI+OVUT}|&!18Z;^Pknx(NmV8z)63z&gy<5q7(cnUCDk+ax?MT>f~#C30;G`{ zd&Wu1xc@Tf?Ca{{OVg_cH7(8ywrL=cepZxVH-Gn{z}@o`fPzHV;;E~hkq{OJ7OkCi zT$Anh$47T}NeL1nB`ruwN~d%ToQw^|Mu&(Z4U*CzASfjvpp=LpjdV#WsHD;$;BUwy zIv=0%`@4Bv+xX{w&iy&(I@h_c?cSafnBBTja91$h^O4Q$U1}-|eKY%1a8* z5q|$>j7T$(A-jcAzinC?TZ7B3`h$x;1y*!CY|`XHl;PeLlAEn^j+H__ir$Wfp1GHV z=9NFrRAIBy32drTaLKwb5#{QHkZSm_-q<25^4FApc9zc+Acy_vj)BLBJZ-tN;wpVX zj6dOpvIpsM9DaDcqVMt!>`bkicAkJ+JkYy`d&huYI`=4Bf1G~?#6($yM`z2hdB_Chz$L4O^f@Br&mKyN3XpluU1T=+KpBtHaqA@xgC$F-a z6(qG8ij^Vhikosi2~sqrO_?kGv738G;pMVKkVb@*fCATyV}%+$)7lg3FW84}c4Z87 znbp?;tughh!CGz+rOBVD;|cCpR^zC;3bAA~`=D#488{iX^^A}w_cqDS68o|6>X?hZ znpc>Zeqwg`oLadpLMiQ1ZA$4iMbPzzt8>nET_w`ng^F(*!qG0LjTVKg5tY$&4x*uf z6w+|$M8k#W6%>a)m@?<^NV}=kM`6WWPdmklP}_vI1vYi*J@~Rk7Ui#K%v@RYB|1I! zapsz6Z?ZC(-Vm+Zutwx?om+l5JT0Ip2>YGNUHtw{+>k@nTzI+0|BBX?O*DRG zphJR5_zMW1S_C@Hew_ZPyq5ERuy@O6FgEI%U)NRHbIF$n-UkJo-r%^sEN_@eyXj+N z8*JB$!wMtfNyE-|vrRx7I&I!J&}PT3o|YhlXyzbrmk!jNtl2NJtMREIelDIOrAyuF zx{N`AMo{HqDjXRlc0RC>K2yc=RClE0nb{uAq!- zM|YwD4lLky2bhaYglsM)4`2_WGt`XDy&z1Mx_m&=Df(dd+Q*vuUUEZfgb(?$d)?csvU<6OQ%?eF+ypA&ZwNouZf6i;1oXh5sza*hn0z?(qB$BqPvWonjm3%tDV zsHaW>sk{-^Ec+Up2tMwc-K$p^Xyq1R+`J$+y-^ZVr#^7^ZF&;5bWPa+U5!uE^{7~y z?Q3RRou^IT7e6o0a7NzqFc}cqVe@2^#C3+Fy#38v->OkFExf4RRpBz79u;Gvx~fw8 zl*lQF2pY9<_)u$L{RJlsH3^=3xY@!~Y5hwHb)?waW58l1h9VULE8qBsk&MBgUxru7 z1_muGg0FSmlD?vI*Ufs6znpAEze8qxqsPtL;`7*w^NR+vfu{qRZ_=z~KY(MOx?aiq z(4SJR%NV>rPKEqsx=*+(9qk8)jeOLM=Q*cO5isO&b8!+cIarDb+kd8x!!L_8{Sr_1 zv7+7M(mhc4ox0ETubxy{&lr9TtbrhZ3K3@BQxr7urWG10u3}`$=vU%XWipiUdD~{l zX5V?_?81E>11J5Fb*p>(kAOFnK+){K%edbj1m0 zhIY}yuvW*|Nij*EfoZEAxNX4(r2-69q)NFe>fK_6 z-Vskf0ne~R`#ZcjXP=60HmPHc5In^Qzeu%xU`=%>&)3aJLH*8g7ECs7!KFNm!IYMQ zLl%NEITgDxmV1z3Z225;WS&#d381axVf4gzBBBJygByX z)w)aToKLqoS7R|j5E5sObA{-Rg5*PlI^?++5`Ito{1?2>DQ>Nx%fvjK$&E1)sC3j! z{0z`a{@{2`SfQ@ZTy32uc;|e1J;XKv^HOB#u<&_>V#6BImGbGpatww#AtPR5j2Yxx zHevQ(%uPjeHx5>oB^>2uA4)~|J+|mGW9Q}>@A0IVR_G}mT%5~$6HuL4Vk+g52SU4^ z20N(VER}61FEkMKw5=5xq7_b@M`!fXB}m&9?kiW)qXtG2i{zD;Asv-X0)q*Fak8$ewO704=ze19D#HS#>T$uB(&xb|>!gXQPS;fDaLq!LV0UU?PA)gz zA={quo_@>o=_)=|J_%Ezao$LF}G#s#;v(;$*pzHir$- z7RrBe_O5B=86V)(D@GQRpctL8CWAvqm42h0^EVmxS-ao%ihfL(1wnysOAlr~T)5w^ z?|aiboiyMQF=!HFwf_AaZYr?bygKfZ-ne}ilr3dKlgl?cvy(O<< z>RbM;i!?Y5nB%KKrByroI>h4H)&fs8KNsuE1clLC5h8CE3^_Qrr&oK<#Yi3!iQZ;V zioL4shbMhYr4tH_Nr9w4t3A+|x)%TVq3;vkv?|rt3rz#(6w?}p@8$c%Zp)yXy^e2! zisS5^*Dk%jN4_7h`NNMPfwO@RAk!3%%o

r(UWX2HDY`b!HU^tG`=;7ey* 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 literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.expected.zip b/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..507d8a97f3dc803e9394acdb19e05222ee225588 GIT binary patch literal 62766 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 U)JzTlxQzNaBmn?uXOI5-KgF0h-T(jq literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.zip b/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.zip new file mode 100644 index 0000000000000000000000000000000000000000..b1eb6ee06ff791481cbba62fe2bb6cbfd9a6fbf5 GIT binary patch literal 63723 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 L0N~!-@w5K}S*=dl literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.expected.zip b/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..4b5f52b66f88dd49820151f9795efe46bb467c51 GIT binary patch literal 64628 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 literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.zip b/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.zip new file mode 100644 index 0000000000000000000000000000000000000000..507d8a97f3dc803e9394acdb19e05222ee225588 GIT binary patch literal 62766 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 U)JzTlxQzNaBmn?uXOI5-KgF0h-T(jq literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.expected.zip b/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..b1aade240b6f01067ff8459762b2b09581470a00 GIT binary patch literal 111554 zcmeEv2Ut|uvUNiPjnX7ZEg1=tp(W=gO9nv+A~{N?0Yy@ilSB~&kt8Z8N)iysk~0XB zBuP#pAVEOjKg`S<@Ac{o6Yu=*(PGV zut2mRYkNmm7p{w1xFAS*Imm3{r@yY(aX@GoqLy{mKfI}bR|fQF8OF}$#>gW|!Ukdg zn>E;gMZ{l8vb9FKaJpP~`8C^=*xxBCPAjsZgVdEE*z>QKb58=&4ki9*_1C(bzo83h z?tod%(s(RL)Q-YLl~ez?_CfT z>+v(sJH)U< zCO77D4eG3s2W3|!kvg8Ptc_O+z!ehi z+6XB*MgzHz+58vn`$I37mJ{P{^a`bMP={=BXj?a3LX{#0+QZV^9)I|3$j@~MYthBf zxO)JkhvWS=C4zx(N&XWFSL>sUKb*7u=JaFryo=o9k1=jFZwqb9uF4{cW8gOv@TN|a z>mb|}5GkQ2v{g;auWG<`@U?mG5D~VTquQcmCPn<8OV^<+*yd1e7_o@L7e7$=X>1&) z3SiNpRY#|RiTUrGd*7k~AngAj4Whn50|1HNNP{jup2^1;uY-c*^#6wpDKYtIaS3>_ zJb9?KSd=Ic(X-^bmfj2#+PA21HuAR6km+-%BrKB9fDlw$V3?r)O;iYayLJ~^A`XM^ zj1$@qtRTAS#-tAzcxdF&Sz+P)C$a(%_J5ES5#L}1fW&WP1vlT+V~h(ySpPwa_`>gV z0)|Br5`c}mdB_Q6fD;h_Cr$&LX!wZ}ZoHuU!+>#U;`cdm`e)B(Vr_3`ZEtDnV2^Zh zHnz5R`MvQP&PzBb0^TaUH`8*%5MuaHFh*MwRUkoqU5hH87Dso#P%za?ToKG zI$Se%HUvm?gk`|{mi!YSS^|t3o$wgxr7He+HFFf)cfuph3ocOXmM6qps1eI*9Ob81 zZ2|poMy;3j-9Aji4sHE5@qCy-AogDwg|j)*+}X{+`pCm*&c_AOLculUL7~bu`%maF z_4oy~xeQq=Vul3zJS+&Lu;~K+^DP~p>dRZ)%FL+g*>8xJiR<1uxhPF1G8xyJR16}=H1O7KG$FZ#y|jq zGTKuB#vPjQZR3D1L7cy0+%;nWvP;IcuI5KI>w6*Z56u|B<^6A%F-IK6KW@ex(eD4= zj5(TtfBTF%npuCzi~$1l|ArZJ#9{p7X3P=o{_oA0qZ#{_fS)VZM6itC0DVKvM^2XY(H;_>od$Rkd~{4#l?6>6Ugi1t2#+-`2{e()RAB zMM62pyyIc?K2-Q)^aeis$Jj`}ZOZR1pt1luXum7-$AKPcaGcDF9Lz0I(=Bam3LGu% zoovlb*}WYBOmG3i{u*$p&D#8^l`&ur{;Hq( zN#O7HGlx39F0y=)2`q*F$XxzE5(w^uswNztyW5BYEPim*^HHA2SR>m(Q!2UDEAQXRc;I`9EZ{*0;o^>`0F6ZZrumuqkgfb(C!=Dak5Bns zL{53y-72b&MJ|_{41n;Z51uT^8XIJ5uwFVtP_FDZ%f2h1r z$Eve50W>@W=G*B^mjL8n@~odBvv4+aGN>%6CmujRh%Ls;r6xMP}ytuUO}?3u6-CHa={VqIz>g8E-RU7 zG`D#>mVfR}VCq2(&6IiW7-tdr={FFK%i{5BMzW1(>OZj0-r|)tJazMNs9Wt$vQA(Q zBse4*^%Ah}`)iKvZ>%}~1FqkcBenrY>bSA1^X{3l z5*!>{%1%beTdu_kZ-)(~@Ae!v3jHHrSY(H^rFc0UPzu<0h|0IuXy2-i0(kxQ>S*gB zuYi+>L#G?84(8EM)28ifd8N0`*j=cz?l{WH$>aZXjKDDh#|RuF@LLh+Rl9QN>{|)X zt^53HJ@o6u@K4(N{jsWe`;cwaM$N5r9bTBqMV(-9VaQ^y~+NpmR^wXKLU+doe zcKkd%Ge-AKdH;Y!4y&X=J~9xA_pfZx0R-33NTX0PSE$+HwBgW&XObei=|m z|4lRjg+Sw(8?aY<*jRjo)3!ZD0q8hjO)w7;5fTSUF9zlw=S9ICpS(L)tqwJH{IMiBv>ew(&H z8v6U@G98^Env}qo3?-ne-mv1O@BLW|4=~vHf;fse=ltTh5s_D@{^dN{VQl(I-eCfA#OAv9U-rMv_TO+w zV#<5)-R1eQ`|qFk9;3!`7`LJIDZTkXp!t3&>Q}HiTEEi&O>Bx}5j zD$ULsY06<~e$+1PuP11A>WP1upg#*c`~V2$IAV8nTRKn!g@PrM@rc|H=2=~R(R+Aq zOdJ;X>gSg!@q%mLISL;Ca}2>T3yvqku`f7whsP1&I2!&5(eUFn&cjqY@_FVP4`8SD zFqipuiR@RhoFk^%$63yC{63D~$MO3(ejms0ImcPf zah7xJnvUX{j!`;B={OfW&ISL3T=2VD&M$9&{dfo5Bi~Tz>+P@cPK;aaG^=bKWgci0I)8GKL-h93yayz&{9q?YlqR7{X6{F!nhZ1Uj7j->w&b z$1NPOPJHYZj$Pj|0{{OY@JHRk5eqBFZsGqQN*pI|#|V7aEqrT5^5tHTNC#Wvqdphw zTat)=Zm{@K(jRU=`f`u#e-rrM=s)^$8|QyBPyKDu z03iH*r{XETYr~&@ES~YZs{X=r@!ugY&_nY3+mOCPUO?tw)zI-B@&X$FY2*b=`md80 zu;K3_FQDr0Coj-R@~4v*koh;07tr`mBQIdmf1SL54SyGT0abq?dB0AH{%}jumj@I7 z7{PxM_`@&9O-a9q&Jk;1|9e}uei5A`mID5Fp!2QO3*OI}nTwUVvz@W+?~E@dfbcKR z6a61qKRgBgD7UZ&9-Gak%E1ae)JNg)$v(Nt9bBBDKRx@ii)UO>G4R~$ur%nixe33v zGV!mL{Gqw`?ZN$pm5DF+M)_(C|F!h^OY`?v7X5wM z@fUyel?i`(a{Og&{gtM_FgN}-ZU2y?{Wfg@k$=^)?%T8l6#m0#3t05urY&H?-$YwL z)89_pKNMBJO z;uo;_KVO9S1#JG$mmm%w=Voi{e)Q$|*M~x7fQ1j?7a>2&I#Si4Lm@|*gEeycoO<3x z$F}BoVXDfU&Fo4WXeSz->6}Ebpje?V!g$tNeHW^w5WcY)ueE?O0|YzPSAvfhPcCXn3{3gjE%M`UWL zuqwOVerb;cL9k4luSX{m&&}J=%48Oi^@$#Allwe+R9QSh;bqgLFd%yZ+eL_^!TQ8( z?$&!W)j_5Wrd*hZcXT9$47cOcfUr{c@X2S38P7f_r^mbvDG#!xmlLzC7TOnI5g8^Ki7&a1u?NW3oc_Ra3}`Tmjiue<}wD^I$n`cH=5R{VTqs*XvuoSr(nBb}J!vn17~HMV-EUpT)M&#aAIX>$G!->SdW#SWHWpYVjJR{pBP zOV`rim_P`idWh_|&k{a@fIzT+y>!5RbV6TxY> z+Hzjl<4(n5Tf9{w_jyb?GH1FMg7!@z)(lNOAMytbuV}Gyrs*$7d!fI*U5cw(_~3bX z%9Y_qCn-*jUvpBe)c%}>9mSw+kSK@b<+!u zEti0wn7cTFbuyBH{nX=V! zX6l~xGj!7nR?iYjGZ&n=FD^`OptS5{h$^0y(K~8XoZXqbEIGnoVI@V$U^8Nyb6v{j zZTH2kO;R=5lOZ?nm$eVPz~+2y5uknPV$17@BsMhDQd0sOLF_=6I1H9uKg{RPu-@Q~ zwcYOz?6G}&q1>=I2D|f|bxs}YOAm7rd{-1UeKCa5VSS#~{!*ur8m-A&IFO*d-@$p-YuTG5v3pBW#}>Y@~Zf9P3z-r7km!%l1lLrbUx?yL6PmZaa5LGr^h=> ztj{Toen3_ZSLEjnRp*wBPgLNnzbDGLRM^+mwU(BJ)8xJ+J%z0S9`}QZfXfCRR~Q%_Qhjgz0-$Yc*oo5Ls2ukVvw*- zw9oUXeMvmI3|{5f^@@=4d2fQhGrFMF8)A~@ZZFAMQ?h*(Eo|l z4Xf3l3?H$;dE9oI7TFWEeCk0}{6mzMHy;P&$`(CYYA&)y@9&s@SBR3FD@Wwy`5 zI*FXkI4$<3TUoSaCP|~8^ZqljlD-)IyJY9DP;`gCbgSWZ)e=&pvAgFG@al%6MuVW3 z3vK(!r%6|D7IRvmR9Bx>Xf4TH5xIzI4#^6=Qie=tQG}&O6re-98iXvYDD>|dUVC43 z!SXq|VHsy!c!pT-%C$?fx8c1-cPEwA+h{q~5_`(5)7n<$m|Qs=qmd#M}~T1 z^~=Pihyp)nhJC*LBrPHa>yyFVH0vv+R`W2gwR^YZDaPHYR?1a0%x$IFrA$j>C(;7yfWRD+of?zWhkxnOO1&_8YUIwB~!IbDv*6oLk$OnY)pQb1)QK=7TWT zcxgqn-@#HjWEC2P7e=M*HT&6`X|B%svI}`Fu89Ywz~*d`~}Gq_%bKO#iZ;ZP4ZeoeUDq zo9fFl^v>^npErCOd#JOeH#LNEi}U7munNq5FY_!g|L!$Al^{OhSW|yilN|M|GAu<3 zo14#Uts?EmKX`f|+0K1&cV+Tnvki0F;Tvlkt0C`}t8v~Co zkZARF%yiiAKcjtku?a6VxrIX_j+ty-Cxw^_FJu^kywo&46m4Qny zaN0-0Cus)n`e)3S2KTk&7PHkFUSH{MW_RGq?r62uu+o;%tOHTVNgV%=#`ly<%F^XSPy`5jM!oRwV2}SzvWzJk8Oc6=0 zAO3V2{VlYUFp)w6A06pWHNYS!FtEfZ{tB6U2lz-v(qVMRBV}b+ge)m~Ho@JV;_5O< zab2H(YWl3|X8Pxd%u+Is?DW%OTA>vLROth$W|94L`{y@@-OQGIo>1i(X5FRmRGkrA zExqNX)g7?OYJ&8;672p?U~lLJKkGo{ye9HdXj_G{<1*8nzVH36VO=P)r!tCqT;i78 z)wGPnmsUKLvzI3$m<@-d?=@9ieN4BRJH%`sQe0PBL+Y0cE(2`*q`W^&H-Y5Z>_bd< zzpRUjEzOtEC(V@Kr}^aU+^NY@Dj<`TUQfT#6*K&@R4ud(xAKzX^6guTGX_)HtS+hA zs@{{5<(3v|xckG;hcC}uPJh#*5{i2knM;^Lu_V+pyj`QuTYP(|lr9qG zf%k#!q(B2wfEMZRgEi(v*~;N$zl2ZQkv1E2{XVTsL>=yl+TJ@K+>@Jz6)Z4pRw`Fg z`MQROY@E@i}I0SeA!3FZEgYo2FrS8#4E7@=Ai;3@g*kv&t3_bAHyNT3p|V$OOY=|c`y|xOkWVWnQ0LMs<`9-DAWtlzMbl36Fv_%Oro8lWOz8(Z z8~;7akzoq@A`Sbr_^!Ry)W?lm#hB0d&PQ7G%mRF$eZmVC`F3HlvASO3;#*dQ2FV8k74`&cZWX)^$rij(-^9bAVY9# zhxzJfId6#y)EUL$_q?me-Lb;y6KFfJNxUqy=hkKC!M{{Ty|}$&oaVp=-S6w@$fzDCb0+M!uz9ob5}!~ zhA%J91i|*Mg^0PsxioW%z2gZTo*KzaJlKeNXr=#F*dv)+3jeJh#e~FsDHo|w3?KCK z0Z9$%_2qae#Z`EB$Dn$L2@1iZwm{CO~$z>b#)PwJyolM|bYGfi(BMPJVb0;r-NBr4Ls1;e8YALl2Uto?V1gkFd0aGf%3O z>27qVXp&`P)hr1dcXiQ%*|hvb7)ZXEzBq_CiG3ICu<9k~}E*wxmS`a_Z-Y{VDx(q*sUc z>#o%fpPOJjw?%q&8M1Nrt)V0C%~`j`$}&Bx<&6nsj}zEunYDCwRHhYIf{!v%k1`W` z{~gU8qM0DkK#>iBC!&FKojIeFBIVxr_j(eLc+O-TNcm?}`cUbg^>_WO;<>M6L zao)Qx?I~2(I<84)07m`0!dp}7*gg0dMTD{UnG4@3QCi}R_+y{^cum$kiX_fUuyASKG^_kV-*t;Y zZKb#?{;^_yflK*-9j0-6sH`R3-W{yQd(rYU5;%q9?jPtmJ<8LTQew?Ju?Ej#x8ez@ zY!=w?v{KVoEfFB!lie26JnwdjXdK3kYZjHcB%0KtroV~lSKy%(FQ#oUSbLjccS3k@ ztL3anGs}2U%82cX6Kz@Wi=|L@b3=X&-GarKWG;%qYah*WV;Mvm%AkXEoZ!Ju!a+z_ zYh_6Mi2Tc?=(m|4Jx`gZvg9rW-7M(ec5^o?A&mFJy#2P?h9JA(Y3z>UOAoxTx%ChbLN?aX)W(e-KXai37ua!D>CJgrdrS7LC&!&=vH7Er7e9+I6pz; zc^Ubp(5Jzb-a2tPoJC2^^IO$Q1fCMTU|Q`~y-oAi<`Rvqu8fgJ@nZh*Vu<1;bEF;=z1}sD-n-Zdo55-0Y*}17#OX z@(nLo?|AN=+NO`FGkXNDvJ52&qj@ZiWw@ztF{suYP35c}YxZbT7e46jj#DH2c<#=q z3dydA-FyK~jv@VS7S0uX(JWT#5=nJ8$u@8&OS8P%`As6x!E|pr1`o8tC3Q6o8Mma} zdfpk_skI4mw*qNp`F``c7(prd$4k#geUTT5jpf$vmS2yTbdwJ)kY3gt^(5)dW84;~ zE<3aRc&)TS%FVk`3YlIWcxMScU$pmKx+*i%F8N@Aw3yPU{*@dI4*{R78x_v3>$40| zeYaW5R)m8jKRjV`t%6Sa^V*k2Uyx6Nw3sI9o^S#K6RTqU~AdeArV zvJ>_w8@1%>juTC_u;Q0`Vnbv6zF!m=52KgW81aC3hJmPCW{!?V*W zy%z)xFP^q(nZ;xC2-xUiNT#(e7@K&bJvj43#*4bHh{1vG(b8L@ww0vI#lz!o6H~To zg^H~-^}*$G+znf5+7lbqRTi;(4^d0%A5H0ZUvjJDcS2Gs%eNn2)Wi*#(1+a;&Q4!3 zAeYJoG72`%vh$;U-lJ+cjtHej@=&j;2xN`|2bG|ddh5Y$?O61Q+!%n-{Cvkm8ZHz$8_rB#aG48Sn^$i3*T=i6T+(d1xxxuB{wfg z6-ZYks66AWHPrWp2@$!}nOU}I*N2RIr6+KDk6f^NU&&Pz8JutQ;#r;N?X0D0S#U>F z%rH|HZEx(#%3up#GM>{QU;SEKUZcN)cavsZCtp_U8^*8}d(O;jI%Uri?b+cD@NAxG zQzHp~(E`m?_Ig~RSDt|kgKtj_ruX5O3R@RQ>z`Hdh9MzV=i{hSu1OBI&L%0e528lr zw>~J@)!oTOFYP4bCkdS}LD|{|LjSryMT${4y6j`uOYn zoPcX6*%4&-jI+CNxpG;xAg0p$f%$AB-&!*sC5_(Zspu<;qf+YLP1@a^yXA%pCg1`$ zHD39|$#qOe+d5%wh|LQXCs%Ky^b%i}K_$lK(WKi;)s}CYZe6+5fpxugeM?XD!riK% zx58suR(t4Mh?UZ@6eAXPk#Nt8Sso)|VgX)duL>LzI7LG#GM5bhBR*s<%^dtCz|^($hyJS99v&E^wyuHn7tFS`h?V-C%3Wsk*`C7 zfFa)_pL=7vBDG;fOVvs~%&cV?oR37eA3w!W-rjXSCFUwqY7WD{H07Q^%+|4RKd^rf zS7&wsFY_(VQ|qhRe3P>rAxoD7%zbDdEpbmx$4{&9j!S^cNH2#tw>F8h?1+%b-nr#@ zd(I1$+&;6N_o#__tS4w-i!TOX(6WTrNLy-A*Mp4?Pk<>S(@#xd=3{JkYoB13*v@p4 ze}17FXZrkV(usrJ_|8IxJHdM<@T$40O|H~L_ldJr_&mnB>)+0=K1 z-A%4WqVK8XE1y2O6DdK0ZdM()Dk`K3YSrT|UxIfgFO7s!r!mH*K2vq5J4nf^^0(f* z!QG>3b&#A1FMLGWEyh>(F%#|mo0STu2WDhpHUl5~7Hc`)65B}HiY$c_w`r@8>NG0p zl}SgEuEoi0*)L=|_~z`^@Zy<^0NlB`ObO0jZ5&Yi7%^zr4(ByD-m5`h2S%t0@vlovG?<*J%H`R-bW3{guX3!R~? z?TCGS>b354Tl>>ZDGQcO38~awhM5N2kEvq&9K%}i{59Md9b08mHABpA$K+mkxWr8y zdk?cjnVSY5ym^&Pdvm8*1%JMPt%HLtGH+rGyy8I6iqrZ`r&2Mopq5}-TOsZWn*C|f z51)(5PC2`_#8Y9#?kZ*cOnaFvFqXYsEDc* zM?G&dc;C(_P--1yc8d0j(b?o>vQLy5)OBvHl&@3_rH>dr2s9UXRWNpuzeJgOaJqSr z*?72K+KP)gz5+LX@4>lJb3aiE^Qnb6UIX#lT@bw1QLM(bYq#q;h}z$<&>KF$s8D+E z8+<6@Q9dxLs<7qmj2zF4UMbf!+LU%{05ghR({(nHVJ#hXC0P!YiXBdPQC*KjMLO3% z-rjk$$F)%MPHdsX0(XPr2CO>jSE0{)*hx2{+Xr1;EL-`M9liV@%I`5dsp+wB<}Tx)7~mME8*ceVvtf^{c`W+ z`l!nI-s@zC8xBP8ynBYPQA^;xxR7ZWi0BMElO!Siu>s=~@p`3Ol9Eh+(tHxz6^~5! zxBxXlwbY3>-NV9Y-cfTD5P#CO*8f=!jV08ipJ5V!0 zXu_dwxBYwt>){CJ?dwY_{PJ&I4;a1Ym-BR4RVslD&ak8L%hJH>fV=P zk;L+sKw!^3O;6oGIDzb{Dt4zb2z>kF!V7E{m6YCjt7j}%3QyG|GKirJ8ryakTJPH= zUZ+$pkvWT`NP8MeS^|bFsKC1}UOb={wbKGf6W)L$IS}AfYmw@*O-a;yZ`f3X~D6G{N4GD)5P|JrgHiM~^OQasf>)wym z`Dl9O@>SOhOnCYfj>ABy)xNEECn$yfH8)}_>C~%g?rnJVLk4J$MFIFGtSg!ZtijGr zz}AY#j1P{+XB5&9jkFLzG$Nl$w5{+$H7-7tz;mP=ry5E4NV<-<7sOzU+Qd8suU>3_ zMG7|Kl5ohSe|sIY*|1`YR=R`|g>_j(p(R$LURNnY+2g@rYgZ3Kd<$O0BW+$8-JbS> zo9hhsB}wsy1|8+(H>N!?M+$3Dcer3oVoY&CzEF2KcOWL#0u?^@Ti=u3qG?=)qG>Wv z$}}7Lb#E=-m*ayMBh9j7SOvX@oOi%C zA3)=W5#)g>=2I-$y?j04>Fgp#4Rbh~YutHU44xBaf8K^azd`Us#Xt`(Cgw1<3X>t&zpVc3?wXx^e( z^wAUq&%rmKrD$l-w%p10Ew8GV>)TdQ1XvfWq327$F7HF0QKVcRfwiyjpEULd+qp*e z#ia^9y1#qQs9KsIYi?gm3bt~I68wBW0kioP%F!ORE*~9&h8qeS|4>F)gUBYpS`YB@ zjpe3o#?xAb8)b82Wl?WNbR}Mlkk}u%P*%ZCxqfY?PSPF~qMjNo zG)4hFWh(XXb2NhpEe=@j9Ji5Puy1_`8Uthwt(F|=56tjjo4uc~>c2heJ~9&Nlrl(R$coUcRNzQYx549VLcGy+{+ zd)}b$OY072E!+WuG}Czn1o^H)K)77!qYlFY$A;7<6?fLoly*c3@m^e1wu5%szqk zP_O1pjUHNrZ}(awxOLtj6~N>I8$r~GH-Sqi8R+>O67D+iYi`=2OGfNQU}aceAUfgVjTN6)jS%(_an!2A>w)#RV9KPEAtI>{$+mL9d#I3d7DlW$~_g# zV1iH-r9FkiZH!v?)HM#~%qcop>bvkZu|blEN0rSMGAhSojOu@qf{PU^*SGPU3AS=E zi0ac>cy)n2d!Ps{IsRt~7(oQ&4mU`DkxdrQY6yFhn;hbmERnq~)>DoyML<=28JN=o^+-RJ@$3arM!Ih2z zsy>?|oaS}9xazfF$Wmjeu-XaO`Dv$+*Ktksrc+TXH=e>xP|0XHp^BE$h6*Yf9@U6$ zWsaLP9G^?|thO0co_iLM>Y#2@vqpmMf-JEXP4~!+M#!VbE>GOP$Ym0W z=9^?(bp9!V6Uv@&(^s?HOWU$vusq!f1z*t%kvJFPEAgtp;>EfLG6c5JP|x!wzoNg| zE#+0sV;1sH9$AwwTW_G1C?x`qFKa+j(2 zpghjg|>9S8SUjprL9-Fy~IjM2zQmg#{v?jny-^IP!Vb>JH6qMI`irV8Rh!o3N_3T zS04wwPd!H3VLWY8_9*bA<$~#mbd_sYN$e+j^hyLj)*WO(m@#U|M{yEG2tMfysT9CE znNKx9fF_QhGLM+e5b}D{REYQTp=(Fx;to{Owt9^2N-1+anTe8gj;ZFkg?74AE0`HD z!7O%Y&Z$NeEnZwZO$-E_BP1hpV1(1VIwXUOS(Z)Ukyh zAce_ZQjCTnUJUa!)NQKqdjBQ(cy%LaX(Zh#O$#rEvfR0tGGpUi92bhm1*llRlh`_l zTYg~dS4^m}w>o4NPglG;6QIdS0bZ*MXsJUG(Lu2%Pz?w_bQr-jLAM*?G-bxC)B2QK zPENy;+g|1isgV#XAE`#L*|_CMPt0Idms1dfXdQ0fE1Q#=Ihr_r!L05=GKp&@2tO_z zMr!=z^xc`0ONIfGlL#vZUv$v|Wi;qi7cA>+Ft%-V3yVJSD$n%p;)4UySK`$BVhAm#lcBt43S+72Zp_~h&Js0Si#U$jrYDO`g@>nvW6 zbl2V^D!8k2$?~hK6^F3YcY7ZggEpOC3ldD6V)d1-qXs`Vf$5Mv4(j(MxGPO_QSn;X zLW%(o${X=0#_I)hvpf+;YNo%J@I~pNQfRj6;yvktw@v5u zoNpBM`RBf4E6XfI^>cYYP4Tv5}^yDwQR&>4f35xy!y#YpLau^ zq%!xS%t17cA5ST*Hg=I8htmx!q%BqI9b6x?tuv-^L|NhGn3WJu{&nBc1QVtPIzJsp zpU0SeZ01|787eCtu3Z?m56{SS8+@7L<~rl6O?tC^UHt5G@E5d>gA!SN4V*=K{# zYZ!uHP4^J@1ekJZ(l%&9a<5EbZp%>R7+%S-$s%C}6C(P7|h9$ID;3XCJsRh+4-}gQZJ<55a<*}Rt(Z@Iuufah2g4Ivl_zG2Y+yIfzc_XnkF;ijU;_i$Sig> zfAzM-?gflBY3DWh$myEW^SI~7)|LSZ`ld)$t?Ajs!E#*Oi)9J5fgEFzKs$L7H`TT`j(lR5RVUcD!- z1q^^nJ-W`%-jcePb*=#xVe{lnw|LE#jzBH;;tOxeGaK>53Kz?_<}Y!pn;kJZX2Xj2DF%kTa;|MKNO4Ey(KneI{JN z=hqpF(2#`nK6{$qVK-=ORFuUP?T1Ea=$IJn%jUvW9pNfSTaon{W1(RT4JN-x5(2^+AJnIKEbHk@fR(wK(v{HdFLy2&dy~A@K~O-kiwTvA8ips6K{n7Ws81tB ztJ~-vUnZ;m=)+qA7xJIR-pAE3szX#V7}5$+ztGX@|8VIPRvLso0xX`e;<1rd14pY1 zqLauEKVc<88;LfUY@z|R4JDfwp}h}LaZM6Z+~{F+Hy)w^;f2*kDA><=IEIXGOT_lT z3{9n7xEw}w&S52+8C55)i#~Fy-ohLUmB!dN%1gtgFH@xuoLF%bQ$nG1$Ox?gqpA)7$;6p3IG#fKJjpLcgXflm3Nr7+U7^T&l9K0^Ma(R%^NWJWFiz`%p{GVWI7-f(AW>D6PMxP zThY@1t1Lb~Qxu8e2I>n@7YTZSD&;cX^XO_?ki`@-f%TLjxAzgT2YzBWbQ0M_m5Hfr z=8NT+FFH~pT@N;AoJ`(%t?XN00g4uAL(FzLbU;GNiKO@Q4G)ae$&F++xkZhdQU4}uwz?6jmi3_;~S~=Xb?ok>lL5wY_7EM=G z=wDoudo3>1y#<`?7(GB2y7~$C6R@EJX55CQy|!X=;q9bee9qFxF}<5>8=z0i_w2Ty zF_lPuLp2{Y*0a{?!#pk&Ef4cSq3=Qa?Hh*gDna;m(wTVPnxeciymX87hVkjy+EVLHt8HRU-fL-`Nh4|y4l2`|K+VR;i7kKw`AA0idR2_=DG_{Y&hJgwxPeC>n?QiErGQ+|8JEHEd8(y%aDt;dp|P+mga>fx{LDlQ>UlIfBbQ) zuGOaX-RTI59O=FQV0B&e7#_K5=j3S_JSieVIW{=?se`)l)8=Q_8eLIZYSCEJa4#)- zEzwrLWLK*FLefwXYl>GvsRF|({<(Y&J1#S+w_5Jd05v2`9<1?XA#zB8hlawOlAva} zgtcxQX&4oQ5P#Yv)4*l)-ID`v(YE1;)J}t2_P+e}i4(Kh;Z>^~-Tq12TQxF{n=vI7vd; z@M`(VG2DrUMe{srBV&k}5vU_M(}}i(DjJ10C;ePpKim<*FevyUL1XWYQ+X~|4_V$j z0)+ywy1;OZRZxZ)?`b>Er#>N#q*1-~@RvgGh!W%y3CFm|duot(MD=JEd*W9@%sy~L zr>fn!pCdGs)ODT}FUYtmTC9e6WN=AO0%|*bPk;>tR-ioNz7taex}3)(qr^IkZ4hkv z%rS^_&{T(pI*|d2paglMjT68}GLxH*n;QY9YzJW5P~6Sh;KnI-Q(ti+(3rU;}6TeC>L-3#9~sLArMo z1*EvN`tj<%A+2Guy=+wNC(Upc>opxIZ{||j`I}NE;5%=naXK+w>9cTk!<`@~?Mi`C zv{lCERKA_SAr^%<*g)P;z+D|FjWM~lFCWM31Env7c1jy`*&NBC@N~{&O`bF6Q2PV-?VGk~=ptdBrgy+Q4fr6K_v`sBkAySqY z%q>5GP4$WeOhel_>c`ik64-|~p32j3I`%Uv0|qQ=O0Sz;=);7%o6N(k=mUHqQi9{# z=%Fy9YaM*!pdHnw7Aow9rRYwMq-?d#1Xe#Z9Wr18l+LM&xu4Qjbx6m{h2idkCf7Y} z&NdofFH8|KK7tkje|-I3jC~(+9GRmNyf(mU9_D5 zfmd5#XU7mDJM8>4qnn7Qu3Fudy>i$0EV*t=yU0=F#UzWKORPj-fVVKk&9f(W$h&&{jD^iq zXoJv%Ji3xQN@~R$FR(`u@SG2x3VvXMn5R6mdVT!T10(OO+v<_(Q1Dw!cvni4FL3@g zs}`;G+l@*AyiHc#s{v?6b5XmHZpm%xZo~-qka=4 zZ+77dwd)=Fwk!7>!_p6wy>ni)V4zta3-)!Bf?a1ofn_^{ zErna5j?sJu!^=IwNfKH_i*K;;O@XpiiVm0Ab$rKK5V)&Q=TtEECux?-mr^#uUHDUx z{EdmmdwM)uj9O`AB)vH4Zc8i+6tCLy#i?#rpS_(b@1}``wOp`*$%{q(p0L{2Z+0Zy zIRpe@do;)0M_P@~4to~5aaFkw!-MqhxQ>((`v)8!=}waY52zE087s{jnrspxggNWG zcz9AeUw`q&T1y~OMx7@}ENk?P8^pP)nnIL~3oA@_MSj2t!A@1Sn7~;LPdd*m4P;d0$dPb~| zgRfwe@(Y7Z5SH6V?z~5M!1CQly#InYR4Z24SKRvw4dy=WXcTEmKSnj0g9^xW%j7ZS z#JVtv=jfcPVNexyC}eA`gBRm+9x`2MUWs|mW4ywqR{2w@RPn5y;(`jxQ22tBF;N`6 z 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 literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.expected.zip b/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..17a885d7a5d9e033eddaecfa87620a0c41661369 GIT binary patch literal 104234 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

    cc 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 literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.expected.zip b/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..b1e47107e13aa8b767ee4dc19a1d5a994142122b GIT binary patch literal 67252 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 nV9q$u1DL&qfWJfmA8H(pJ9WBoV^sD~^6!C}F literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.zip b/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.zip new file mode 100644 index 0000000000000000000000000000000000000000..ecced32a77410521b282444049db8658d1a26116 GIT binary patch literal 63805 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 literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.expected.zip b/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..a402011e16ecb50a3e6420d28238274e43f0b4d9 GIT binary patch literal 60085 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 literal 0 HcmV?d00001 diff --git a/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.zip b/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.zip new file mode 100644 index 0000000000000000000000000000000000000000..c9e017d096146016eebd444d525e33d028ac347e GIT binary patch literal 63856 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

    C1@h~wX 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 Px>24004}0F3;_HO?h}PR literal 0 HcmV?d00001 diff --git a/tests/storage/test_service.py b/tests/storage/test_service.py index 31d702f9ea..e5d38e2e82 100644 --- a/tests/storage/test_service.py +++ b/tests/storage/test_service.py @@ -1,5 +1,7 @@ +import contextlib import os -from datetime import datetime, timedelta +import uuid +from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Union from unittest.mock import ANY, Mock, call, patch, seal @@ -11,12 +13,14 @@ from antarest.core.exceptions import TaskAlreadyRunning from antarest.core.filetransfer.model import FileDownload, FileDownloadTaskDTO from antarest.core.interfaces.cache import ICache +from antarest.core.interfaces.eventbus import Event, EventType from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTGroup, JWTUser -from antarest.core.model import JSON, SUB_JSON +from antarest.core.model import JSON, SUB_JSON, PermissionInfo from antarest.core.permissions import StudyPermissionType from antarest.core.requests import RequestParameters from antarest.core.roles import RoleType -from antarest.core.tasks.model import TaskDTO, TaskResult, TaskStatus, TaskType +from antarest.core.tasks.model import TaskDTO, TaskStatus, TaskType +from antarest.core.utils.fastapi_sqlalchemy import db from antarest.login.model import Group, GroupDTO, User from antarest.login.service import LoginService from antarest.matrixstore.service import MatrixService @@ -43,6 +47,7 @@ from antarest.study.service import ( MAX_MISSING_STUDY_TIMEOUT, StudyService, + StudyUpgraderTask, UserHasNotPermissionError, ) from antarest.study.storage.patch_service import PatchService @@ -1681,68 +1686,259 @@ def test_task_upgrade_study(tmp_path: Path): @with_db_context @patch("antarest.study.service.upgrade_study") -def test_upgrade_study(upgrade_study_mock: Mock, tmp_path: Path): - service = build_study_service( - raw_study_service=Mock(), - repository=Mock(), - config=Mock(), - ) +@pytest.mark.parametrize( + "workspace", ["other_workspace", DEFAULT_WORKSPACE_NAME] +) +def test_upgrade_study__raw_study__nominal( + upgrade_study_mock: Mock, + tmp_path: Path, + workspace: str, +): + study_id = str(uuid.uuid4()) + study_name = "my_study" + target_version = "800" - raw_study_mock = Mock( - spec=RawStudy, - archived=False, - id="my_study", - name="my_study", - path=tmp_path, + # Prepare a RAW study + # noinspection PyArgumentList + raw_study = RawStudy( + id=study_id, + name=study_name, + workspace=workspace, + path=str(tmp_path), + created_at=datetime.now(timezone.utc), + updated_at=datetime.now(timezone.utc), version="720", + additional_data=StudyAdditionalData(), + archived=False, owner=None, groups=[], public_mode=PublicMode.NONE, - workspace="other_workspace", ) - raw_study_mock.name = "my_study" - service.repository.get.return_value = raw_study_mock - study_id = "my_study" + # Make sure the session is closed to avoid reusing DB objects + with contextlib.closing(db.session): + db.session.add(raw_study) + db.session.commit() - target_version = "800" - actual = service._upgrade_study(study_id, target_version) + # The `ICache` is used to invalidate the cache of the study with `invalidate_all` + cache_service = Mock() + + # The `StudyMetadataRepository` is used to store the study in database. + repository = StudyMetadataRepository(cache_service) + + # The `StudyStorageService` is used to retrieve: + # - the `RawStudyService` of a RAW study, or + # - the `VariantStudyService` of a variant study. + # It is used to `denormalize`/`normalize` the study. + # For a variant study, the `clear_snapshot` is also called + storage_service = Mock() + # The `IEventBus` service is used to send event notifications. + # An event of type `STUDY_EDITED` must be pushed when the upgrade is done. + event_bus = Mock() + + # Prepare the task for an upgrade + task = StudyUpgraderTask( + study_id, + target_version, + repository=repository, + storage_service=storage_service, + cache_service=cache_service, + event_bus=event_bus, + ) + + # The task is called with a `TaskUpdateNotifier` a parameter. + # Some messages could be emitted using the notifier (not a requirement). + notifier = Mock() + actual = task(notifier) + + # The `upgrade_study()` function must be called with the right parameters upgrade_study_mock.assert_called_with(tmp_path, target_version) + + # The study must be updated in the database + actual_study: RawStudy = db.session.query(Study).get(study_id) + assert actual_study is not None, "Not in database" + assert actual_study.version == target_version + + # An event of type `STUDY_EDITED` must be pushed when the upgrade is done. + event = Event( + type=EventType.STUDY_EDITED, + payload={"id": study_id, "name": study_name}, + permissions=PermissionInfo( + owner=None, + groups=[], + public_mode=PublicMode.NONE, + ), + ) + event_bus.push.assert_called_once_with(event) + + # The function must return a successful result assert actual.success - assert raw_study_mock.name in actual.message, f"{actual.message=}" assert study_id in actual.message, f"{actual.message=}" assert target_version in actual.message, f"{actual.message=}" - raw_managed_study_mock = Mock( - spec=RawStudy, - archived=False, - id="my_study", - name="my_study", - path=tmp_path, + +@with_db_context +@patch("antarest.study.service.upgrade_study") +def test_upgrade_study__variant_study__nominal( + upgrade_study_mock: Mock, + tmp_path: Path, +): + study_id = str(uuid.uuid4()) + study_name = "my_study" + target_version = "800" + + # Prepare a RAW study + # noinspection PyArgumentList + variant_study = VariantStudy( + id=study_id, + name=study_name, + path=str(tmp_path), + created_at=datetime.now(timezone.utc), + updated_at=datetime.now(timezone.utc), version="720", + additional_data=StudyAdditionalData(), + archived=False, owner=None, groups=[], public_mode=PublicMode.NONE, - workspace=DEFAULT_WORKSPACE_NAME, ) - raw_managed_study_mock.name = "my_study" - service.repository.get.return_value = raw_managed_study_mock - service.storage_service.raw_study_service.reset_mock() - file_study = Mock() - service.storage_service.raw_study_service.get_raw.return_value = file_study - file_study.tree = Mock() - study_id = "my_study" + # Make sure the session is closed to avoid reusing DB objects + with contextlib.closing(db.session): + db.session.add(variant_study) + db.session.commit() - target_version = "810" - actual = service._upgrade_study(study_id, target_version) + # The `ICache` is used to invalidate the cache of the study with `invalidate_all` + cache_service = Mock() - upgrade_study_mock.assert_called_with(tmp_path, target_version) - file_study.tree.denormalize.assert_called_once() - file_study.tree.normalize.assert_called_once() + # The `StudyMetadataRepository` is used to store the study in database. + repository = StudyMetadataRepository(cache_service) + + # The `StudyStorageService` is used to retrieve: + # - the `RawStudyService` of a RAW study, or + # - the `VariantStudyService` of a variant study. + # It is used to `denormalize`/`normalize` the study. + # For a variant study, the `clear_snapshot` is also called + storage_service = Mock() + + # The `IEventBus` service is used to send event notifications. + # An event of type `STUDY_EDITED` must be pushed when the upgrade is done. + event_bus = Mock() + + # Prepare the task for an upgrade + task = StudyUpgraderTask( + study_id, + target_version, + repository=repository, + storage_service=storage_service, + cache_service=cache_service, + event_bus=event_bus, + ) + + # The task is called with a `TaskUpdateNotifier` a parameter. + # Some messages could be emitted using the notifier (not a requirement). + notifier = Mock() + actual = task(notifier) + + # The `upgrade_study()` function is not called for a variant study. + upgrade_study_mock.assert_not_called() + + # The study must be updated in the database + actual_study: RawStudy = db.session.query(Study).get(study_id) + assert actual_study is not None, "Not in database" + assert actual_study.version == target_version + + # An event of type `STUDY_EDITED` must be pushed when the upgrade is done. + event = Event( + type=EventType.STUDY_EDITED, + payload={"id": study_id, "name": study_name}, + permissions=PermissionInfo( + owner=None, + groups=[], + public_mode=PublicMode.NONE, + ), + ) + event_bus.push.assert_called_once_with(event) + # The function must return a successful result assert actual.success - assert raw_study_mock.name in actual.message, f"{actual.message=}" assert study_id in actual.message, f"{actual.message=}" assert target_version in actual.message, f"{actual.message=}" + + +@with_db_context +@patch("antarest.study.service.upgrade_study") +def test_upgrade_study__raw_study__failed( + upgrade_study_mock: Mock, tmp_path: Path +): + study_id = str(uuid.uuid4()) + study_name = "my_study" + target_version = "800" + old_version = "720" + + # Prepare a RAW study + # noinspection PyArgumentList + raw_study = RawStudy( + id=study_id, + name=study_name, + workspace=DEFAULT_WORKSPACE_NAME, + path=str(tmp_path), + created_at=datetime.now(timezone.utc), + updated_at=datetime.now(timezone.utc), + version=old_version, + additional_data=StudyAdditionalData(), + archived=False, + owner=None, + groups=[], + public_mode=PublicMode.NONE, + ) + + # Make sure the session is closed to avoid reusing DB objects + with contextlib.closing(db.session): + db.session.add(raw_study) + db.session.commit() + + # The `ICache` is used to invalidate the cache of the study with `invalidate_all` + cache_service = Mock() + + # The `StudyMetadataRepository` is used to store the study in database. + repository = StudyMetadataRepository(cache_service) + + # The `StudyStorageService` is used to retrieve: + # - the `RawStudyService` of a RAW study, or + # - the `VariantStudyService` of a variant study. + # It is used to `denormalize`/`normalize` the study. + # For a variant study, the `clear_snapshot` is also called + storage_service = Mock() + + # The `IEventBus` service is used to send event notifications. + # An event of type `STUDY_EDITED` must be pushed when the upgrade is done. + event_bus = Mock() + + # The `upgrade_study()` function raise an exception + upgrade_study_mock.side_effect = Exception("INVALID_UPGRADE") + + # Prepare the task for an upgrade + task = StudyUpgraderTask( + study_id, + target_version, + repository=repository, + storage_service=storage_service, + cache_service=cache_service, + event_bus=event_bus, + ) + + # The task is called with a `TaskUpdateNotifier` a parameter. + # Some messages could be emitted using the notifier (not a requirement). + notifier = Mock() + with pytest.raises(Exception, match="INVALID_UPGRADE"): + task(notifier) + + # The study must not be updated in the database + actual_study: RawStudy = db.session.query(Study).get(study_id) + assert actual_study is not None, "Not in database" + assert actual_study.version == old_version + + # No event must be emitted + event_bus.push.assert_not_called() diff --git a/tests/study/storage/test_study_version_upgrader.py b/tests/study/storage/test_study_version_upgrader.py index f04e722cd4..9c1ac2d74c 100644 --- a/tests/study/storage/test_study_version_upgrader.py +++ b/tests/study/storage/test_study_version_upgrader.py @@ -3,11 +3,13 @@ import pytest from antarest.core.exceptions import StudyValidationError -from antarest.study.storage.study_version_upgrader import ( - can_upgrade_version, +from antarest.study.storage.study_upgrader import ( InvalidUpgrade, - find_next_version, UPGRADE_METHODS, +) +from antarest.study.storage.study_upgrader import ( + can_upgrade_version, + find_next_version, get_current_version, ) From f8fdfd5638e6bc1e53bee929a52e97cf5576b933 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE <43534797+laurent-laporte-pro@users.noreply.github.com> Date: Tue, 7 Mar 2023 17:55:19 +0100 Subject: [PATCH 57/60] fix(api-slurm): avoid raising FileNotFound error when retrieving outputs (#1380) --- .../adapters/slurm_launcher/slurm_launcher.py | 335 ++++++++++-------- antarest/study/storage/patch_service.py | 9 +- tests/launcher/test_slurm_launcher.py | 18 +- tests/storage/business/test_patch_service.py | 271 +++++++++++--- 4 files changed, 418 insertions(+), 215 deletions(-) diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index 5e5957314a..ae247009f8 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -114,35 +114,33 @@ def _check_config(self) -> None: ) # and check write permission def _init_workspace(self, use_private_workspace: bool) -> Path: - # sourcery skip: last-if-guard - if use_private_workspace: - for ( - existing_workspace - ) in self.slurm_config.local_workspace.iterdir(): - lock_file = existing_workspace / WORKSPACE_LOCK_FILE_NAME - if ( - existing_workspace.is_dir() - and existing_workspace - != self.slurm_config.local_workspace / LOG_DIR_NAME - and not lock_file.exists() - ): - logger.info( - f"Initiating slurm workspace into existing directory {existing_workspace}" - ) - lock_file.touch() - return existing_workspace - new_workspace = Path( - tempfile.mkdtemp(dir=str(self.slurm_config.local_workspace)) - ) - lock_file = new_workspace / WORKSPACE_LOCK_FILE_NAME - lock_file.touch() - logger.info( - f"Initiating slurm workspace in new directory {new_workspace}" - ) - return new_workspace - else: + if not use_private_workspace: return Path(self.slurm_config.local_workspace) + for existing_workspace in self.slurm_config.local_workspace.iterdir(): + lock_file = existing_workspace / WORKSPACE_LOCK_FILE_NAME + if ( + existing_workspace.is_dir() + and existing_workspace + != self.slurm_config.local_workspace / LOG_DIR_NAME + and not lock_file.exists() + ): + logger.info( + f"Initiating slurm workspace into existing directory {existing_workspace}" + ) + lock_file.touch() + return existing_workspace + + new_workspace = Path( + tempfile.mkdtemp(dir=str(self.slurm_config.local_workspace)) + ) + lock_file = new_workspace / WORKSPACE_LOCK_FILE_NAME + lock_file.touch() + logger.info( + f"Initiating slurm workspace in new directory {new_workspace}" + ) + return new_workspace + def _retrieve_running_jobs(self) -> None: if len(self.data_repo_tinydb.get_list_of_studies()) > 0: logger.info("Old job retrieved, starting loop") @@ -214,7 +212,7 @@ def _init_launcher_arguments( def _init_launcher_parameters( self, local_workspace: Optional[Path] = None ) -> MainParameters: - main_parameters = MainParameters( + return MainParameters( json_dir=local_workspace or self.slurm_config.local_workspace, default_json_db_name=self.slurm_config.default_json_db_name, slurm_script_path=self.slurm_config.slurm_script_path, @@ -229,16 +227,17 @@ def _init_launcher_parameters( }, db_primary_key="name", ) - return main_parameters def _delete_workspace_file(self, study_path: Path) -> None: - logger.info(f"Deleting workspace file at {study_path}") - if self.local_workspace.absolute() in study_path.absolute().parents: - if study_path.exists(): - if study_path.is_dir(): - shutil.rmtree(study_path) - else: - os.unlink(study_path) + if ( + self.local_workspace.absolute() in study_path.absolute().parents + and study_path.exists() + ): + logger.info(f"Deleting workspace file at {study_path}") + if study_path.is_dir(): + shutil.rmtree(study_path) + else: + os.unlink(study_path) def _import_study_output( self, @@ -275,6 +274,9 @@ def _import_study_output( }.items() if log_path } + + # The following callback is actually calling: + # `antarest.launcher.service.LauncherService._import_output` return self.callbacks.import_output( job_id, self.local_workspace / STUDIES_OUTPUT_DIR_NAME / job_id / "output", @@ -308,7 +310,7 @@ def _import_xpansion_result(self, job_id: str, xpansion_mode: str) -> None: if (output_path / "updated_links").exists(): logger.warning("Skipping updated links") self.callbacks.append_after_log( - job_id, f"Skipping updated links" + job_id, "Skipping updated links" ) else: shutil.copytree( @@ -342,59 +344,112 @@ def _check_studies_state(self) -> None: logger.info("Could not get data on remote server", exc_info=e) study_list = self.data_repo_tinydb.get_list_of_studies() - - nb_study_done = 0 - studies_to_cleanup = [] for study in study_list: - nb_study_done += 1 if (study.finished or study.with_error) else 0 - if study.done: - try: - studies_to_cleanup.append(study.name) - self.log_tail_manager.stop_tracking( - SlurmLauncher._get_log_path(study) - ) - try: - output_id = self._import_study_output( - study.name, - study.xpansion_mode, - study.job_log_dir, - ) - except Exception: - stack_trace = traceback.format_exc() - self.callbacks.append_after_log( - study.name, - f"An error occurred unexpectedly while importing the study output:" - f" {study.name=}, {study.xpansion_mode=}, {study.job_log_dir=}," - f" see stack trace below:\n{stack_trace}", - ) - self.callbacks.update_status( - study.name, JobStatus.FAILED, None, None - ) - raise - else: - self.callbacks.update_status( - study.name, JobStatus.SUCCESS, None, output_id - ) - except Exception as e: - logger.error( - f"Failed to finalize study {study.name} launch", - exc_info=e, - ) + log_path = SlurmLauncher._get_log_path(study) + if study.with_error: + self.log_tail_manager.stop_tracking(log_path) + self._handle_failure(study) + elif study.done: + self.log_tail_manager.stop_tracking(log_path) + self._handle_success(study) else: + # study.started => still running + # study.finished => waiting for ZIP + logs retrieval (or failure) self.log_tail_manager.track( - SlurmLauncher._get_log_path(study), - self.create_update_log(study.name), + log_path, self.create_update_log(study.name) ) # Re-fetching the study list is necessary as new studies may have been added # during the `import_output` process. Afterward, we clean up the list to ensure # that any removed studies are removed from the database. with self.antares_launcher_lock: - nb_studies = self.data_repo_tinydb.get_list_of_studies() - for study_id in studies_to_cleanup: - self._clean_up_study(study_id) - if nb_study_done == len(nb_studies): + # fmt: off + cleanup_list = [s for s in study_list if s.with_error or s.done] + for study in cleanup_list: + self._clean_up_study(study.name) + updated_list = self.data_repo_tinydb.get_list_of_studies() + if {s.name for s in updated_list} == {s.name for s in cleanup_list}: self.stop() + # fmt: on + + def _handle_failure(self, study: StudyDTO) -> None: + """ + The simulation failed (`study.with_error == True`), + we can try to download output results, + but we expect to find no `output` directory + + Args: + study: Study extracted from the SLURM database. + """ + # sourcery skip: extract-duplicate-method + try: + output_id = self._import_study_output( + study.name, + study.xpansion_mode, + study.job_log_dir, + ) + except FileNotFoundError: + msg = "Simulation failed, output results are not available" + self.callbacks.append_after_log(study.name, msg) + # see antarest.launcher.service.LauncherService.update + self.callbacks.update_status( + study.name, JobStatus.FAILED, msg, None + ) + except Exception as e: + stack_trace = traceback.format_exc() + msg = ( + f"An error occurred unexpectedly while trying to import the study output:" + f" {study.name=}, {study.xpansion_mode=}, {study.job_log_dir=}," + f" see stack trace below:\n{stack_trace}" + ) + self.callbacks.append_after_log(study.name, msg) + self.callbacks.update_status( + study.name, JobStatus.FAILED, msg, None + ) + logger.error(msg, exc_info=e) + raise + else: + msg = "Simulation failed (even if some output results may be available)" + self.callbacks.append_after_log(study.name, msg) + self.callbacks.update_status( + study.name, JobStatus.FAILED, msg, output_id + ) + + def _handle_success(self, study: StudyDTO) -> None: + """ + The simulation succeed (`study.done == True`), + in that case, we have the guarantee that: + + - logs are downloaded, + - result ZIPs are downloaded and unarchived to `output`, + - the server is clean (a.k.a. input and output ZIPs are removed from remote) + + Args: + study: Study extracted from the SLURM database. + """ + try: + output_id = self._import_study_output( + study.name, + study.xpansion_mode, + study.job_log_dir, + ) + except Exception as e: + stack_trace = traceback.format_exc() + msg = ( + f"An error occurred unexpectedly while importing the study output:" + f" {study.name=}, {study.xpansion_mode=}, {study.job_log_dir=}," + f" see stack trace below:\n{stack_trace}" + ) + self.callbacks.append_after_log(study.name, msg) + self.callbacks.update_status( + study.name, JobStatus.FAILED, msg, None + ) + logger.error(msg, exc_info=e) + raise + else: + self.callbacks.update_status( + study.name, JobStatus.SUCCESS, None, output_id + ) @staticmethod def _get_log_path( @@ -405,24 +460,18 @@ def _get_log_path( @staticmethod def _find_log_dir(base_log_dir: Path, job_id: str) -> Optional[Path]: - if base_log_dir.exists() and base_log_dir.is_dir(): - for fname in os.listdir(base_log_dir): - if fname.startswith(job_id): - return base_log_dir / fname - return None + pattern = f"{job_id}*" + return next(iter(base_log_dir.glob(pattern)), None) @staticmethod def _get_log_path_from_log_dir( log_dir: Path, log_type: LogType = LogType.STDOUT ) -> Optional[Path]: - log_prefix = ( - "antares-out-" if log_type == LogType.STDOUT else "antares-err-" - ) - if log_dir.exists() and log_dir.is_dir(): - for fname in os.listdir(log_dir): - if fname.startswith(log_prefix): - return log_dir / fname - return None + pattern = { + LogType.STDOUT: "antares-out-*", + LogType.STDERR: "antares-err-*", + }[log_type] + return next(iter(log_dir.glob(pattern)), None) def _clean_local_workspace(self) -> None: logger.info("Cleaning up slurm workspace") @@ -434,16 +483,6 @@ def _clean_local_workspace(self) -> None: elif os.path.isdir(file_path): shutil.rmtree(file_path) - def _assert_study_version_is_supported(self, study_version: str) -> None: - if ( - str(study_version) - not in self.slurm_config.antares_versions_on_remote_server - ): - raise VersionNotSupportedError( - f"Study version ({study_version}) is not supported. Currently supported versions are" - f" {', '.join(self.slurm_config.antares_versions_on_remote_server)}" - ) - def _clean_up_study(self, launch_id: str) -> None: logger.info(f"Cleaning up study with launch_id {launch_id}") self.data_repo_tinydb.remove_study(launch_id) @@ -462,16 +501,6 @@ def _clean_up_study(self, launch_id: str) -> None: ): self._delete_workspace_file(finished_zip) - @staticmethod - def _override_solver_version(study_path: Path, version: str) -> None: - study_info_path = study_path / "study.antares" - study_info = IniReader().read(study_info_path) - if "antares" in study_info: - study_info["antares"]["solver_version"] = version - IniWriter().write(study_info, study_info_path) - else: - logger.warning("Failed to find antares study info") - def _run_study( self, study_uuid: str, @@ -479,62 +508,71 @@ def _run_study( launcher_params: LauncherParametersDTO, version: str, ) -> None: - study_path = Path(self.launcher_args.studies_in) / str(launch_uuid) + study_path = Path(self.launcher_args.studies_in) / launch_uuid + + # `append_log` is a function alias for readability ;-) + append_log = self.callbacks.append_before_log with self.antares_launcher_lock: + # noinspection PyBroadException try: # export study + append_log(launch_uuid, "Exporting study...") self.callbacks.export_study( launch_uuid, study_uuid, study_path, launcher_params ) - self._assert_study_version_is_supported(version) - SlurmLauncher._override_solver_version(study_path, version) + append_log(launch_uuid, "Checking study version...") + available_versions = ( + self.slurm_config.antares_versions_on_remote_server + ) + if version not in available_versions: + raise VersionNotSupportedError( + f"Study version '{version}' is not supported. Currently supported versions are" + f" {', '.join(available_versions)}" + ) + _override_solver_version(study_path, version) + append_log(launch_uuid, "Submitting study to slurm launcher") launcher_args = self._check_and_apply_launcher_params( launcher_params ) - self.callbacks.append_before_log( - launch_uuid, f"Submitting study to slurm launcher" - ) - self._call_launcher(launcher_args, self.launcher_params) launch_success = self._check_if_study_is_in_launcher_db( launch_uuid ) if launch_success: - self.callbacks.append_before_log( - launch_uuid, f"Study submitted" - ) + append_log(launch_uuid, "Study submitted") logger.info("Study exported and run with launcher") else: self.callbacks.append_after_log( launch_uuid, - f"Study not submitted. The study configuration may be incorrect", + "Study not submitted. The study configuration may be incorrect", ) logger.warning( f"Study {study_uuid} with job id {launch_uuid} does not seem to have been launched" ) self.callbacks.update_status( - str(launch_uuid), + launch_uuid, JobStatus.RUNNING if launch_success else JobStatus.FAILED, None, None, ) except Exception as e: - logger.error( - f"Failed to launch study {study_uuid}", exc_info=e - ) - self.callbacks.append_after_log( - launch_uuid, - f"Unexpected error when launching study : {str(e)}", + stack_trace = traceback.format_exc() + msg = ( + f"Failed to launch study {study_uuid}:" + f" see stack trace below:\n{stack_trace}" ) + self.callbacks.append_after_log(launch_uuid, msg) self.callbacks.update_status( - str(launch_uuid), JobStatus.FAILED, str(e), None + launch_uuid, JobStatus.FAILED, msg, None ) - self._clean_up_study(str(launch_uuid)) + self._clean_up_study(launch_uuid) + logger.error(msg, exc_info=e) + raise finally: self._delete_workspace_file(study_path) @@ -548,10 +586,7 @@ def _call_launcher( def _check_if_study_is_in_launcher_db(self, job_id: str) -> bool: studies = self.data_repo_tinydb.get_list_of_studies() - for s in studies: - if s.name == job_id: - return True - return False + return any(s.name == job_id for s in studies) def _check_and_apply_launcher_params( self, launcher_params: LauncherParametersDTO @@ -576,12 +611,14 @@ def _check_and_apply_launcher_params( if time_limit and isinstance(time_limit, int): if MIN_TIME_LIMIT > time_limit: logger.warning( - f"Invalid slurm launcher time limit ({time_limit}), should be higher than {MIN_TIME_LIMIT}. Using min limit." + f"Invalid slurm launcher time limit ({time_limit})," + f" should be higher than {MIN_TIME_LIMIT}. Using min limit." ) launcher_args.time_limit = MIN_TIME_LIMIT elif time_limit >= MAX_TIME_LIMIT: logger.warning( - f"Invalid slurm launcher time limit ({time_limit}), should be lower than {MAX_TIME_LIMIT}. Using max limit." + f"Invalid slurm launcher time limit ({time_limit})," + f" should be lower than {MAX_TIME_LIMIT}. Using max limit." ) launcher_args.time_limit = MAX_TIME_LIMIT - 3600 else: @@ -628,17 +665,13 @@ def get_log(self, job_id: str, log_type: LogType) -> Optional[str]: log_path = SlurmLauncher._get_log_path(study, log_type) if log_path: return log_path.read_text() - # when this is not the current worker handling this job (found in data_repo_tinydb) - log_dir = SlurmLauncher._find_log_dir( + if log_dir := SlurmLauncher._find_log_dir( Path(self.launcher_args.log_dir) / "JOB_LOGS", job_id - ) - if log_dir: + ): log_path = SlurmLauncher._get_log_path_from_log_dir( log_dir, log_type ) - if log_path: - return log_path.read_text() - return None + return log_path.read_text() if log_path else None def _create_event_listener(self) -> Callable[[Event], Awaitable[None]]: async def _listen_to_kill_job(event: Event) -> None: @@ -671,3 +704,13 @@ def kill_job(self, job_id: str, dispatch: bool = True) -> None: None, None, ) + + +def _override_solver_version(study_path: Path, version: str) -> None: + study_info_path = study_path / "study.antares" + study_info = IniReader().read(study_info_path) + if "antares" in study_info: + study_info["antares"]["solver_version"] = version + IniWriter().write(study_info, study_info_path) + else: + logger.warning("Failed to find antares study info") diff --git a/antarest/study/storage/patch_service.py b/antarest/study/storage/patch_service.py index 9d16199d14..a6b81c02ba 100644 --- a/antarest/study/storage/patch_service.py +++ b/antarest/study/storage/patch_service.py @@ -27,13 +27,12 @@ def get( self, study: Union[RawStudy, VariantStudy], get_from_file: bool = False ) -> Patch: if not get_from_file: - try: - return Patch.parse_raw(study.additional_data.patch) - except Exception as e: - logger.warning("Failed to parse patch data", exc_info=e) + # the `study.additional_data.patch` field is optional + if patch_data := study.additional_data.patch: + return Patch.parse_raw(patch_data) patch = Patch() - patch_path = (Path(study.path)) / "patch.json" + patch_path = Path(study.path) / "patch.json" if patch_path.exists(): patch = Patch.parse_file(patch_path) diff --git a/tests/launcher/test_slurm_launcher.py b/tests/launcher/test_slurm_launcher.py index ba06dc29ae..940ebe0759 100644 --- a/tests/launcher/test_slurm_launcher.py +++ b/tests/launcher/test_slurm_launcher.py @@ -20,6 +20,7 @@ MIN_TIME_LIMIT, WORKSPACE_LOCK_FILE_NAME, SlurmLauncher, + VersionNotSupportedError, ) from antarest.launcher.model import JobStatus, LauncherParametersDTO from antarest.tools.admin_lib import clean_locks_from_config @@ -237,7 +238,7 @@ def test_extra_parameters(launcher_config: Config): # noinspection PyUnresolvedReferences @pytest.mark.parametrize( - "version,job_status", + "version, job_status", [(42, JobStatus.RUNNING), (99, JobStatus.FAILED), (45, JobStatus.FAILED)], ) @pytest.mark.unit_test @@ -290,9 +291,16 @@ def call_launcher_mock(arguments: Namespace, parameters: MainParameters): slurm_launcher.data_repo_tinydb.save_study(StudyDTO(job_id)) slurm_launcher._call_launcher = call_launcher_mock - slurm_launcher._run_study( - study_uuid, job_id, LauncherParametersDTO(), str(version) - ) + + if version == 99: + with pytest.raises(VersionNotSupportedError): + slurm_launcher._run_study( + study_uuid, job_id, LauncherParametersDTO(), str(version) + ) + else: + slurm_launcher._run_study( + study_uuid, job_id, LauncherParametersDTO(), str(version) + ) assert ( version @@ -305,8 +313,8 @@ def call_launcher_mock(arguments: Namespace, parameters: MainParameters): slurm_launcher.callbacks.update_status.assert_called_once_with( ANY, job_status, ANY, None ) - slurm_launcher.start.assert_called_once() if job_status == JobStatus.RUNNING: + slurm_launcher.start.assert_called_once() slurm_launcher._delete_workspace_file.assert_called_once() diff --git a/tests/storage/business/test_patch_service.py b/tests/storage/business/test_patch_service.py index 6f1b7087dc..93820d23f8 100644 --- a/tests/storage/business/test_patch_service.py +++ b/tests/storage/business/test_patch_service.py @@ -1,17 +1,26 @@ +import contextlib import json +import uuid +from datetime import datetime, timezone from pathlib import Path from unittest.mock import Mock import pytest - +from antarest.core.model import PublicMode +from antarest.core.utils.fastapi_sqlalchemy import db from antarest.study.model import ( + DEFAULT_WORKSPACE_NAME, Patch, - PatchStudy, PatchArea, PatchOutputs, + PatchStudy, + RawStudy, + Study, + StudyAdditionalData, ) from antarest.study.repository import StudyMetadataRepository from antarest.study.storage.patch_service import PatchService +from tests.conftest import with_db_context PATCH_CONTENT = """ { @@ -37,60 +46,204 @@ @pytest.mark.unit_test -def test_get(tmp_path: str): - patch_json_path = Path(tmp_path) / "patch.json" - patch_json_path.write_text(PATCH_CONTENT) - raw_study = Mock() - raw_study.path = tmp_path - - expected_patch = Patch( - study=PatchStudy(scenario="BAU2025"), - areas={"a1": PatchArea(country="FR")}, - outputs=PatchOutputs(reference="20210588-eco-1532"), - ) - - patch_service = PatchService(repository=Mock(spec=StudyMetadataRepository)) - patch = patch_service.get(raw_study) - assert patch == expected_patch - - -@pytest.mark.unit_test -def test_save(tmp_path: str): - patch = Patch( - study=PatchStudy(scenario="BAU2025"), - areas={"a1": PatchArea(country="FR")}, - outputs=PatchOutputs(reference="20210588-eco-1532"), - ) - expected_json = json.dumps(json.loads(PATCH_CONTENT)) - - raw_study = Mock() - raw_study.path = tmp_path - - patch_service = PatchService(repository=Mock(spec=StudyMetadataRepository)) - patch_service.save(raw_study, patch) - - assert (Path(tmp_path) / "patch.json").read_text() == expected_json - - -@pytest.mark.unit_test -def test_set_output_ref(tmp_path: str): - patch = Patch( - study=PatchStudy(scenario="BAU2025"), - areas={"a1": PatchArea(country="FR")}, - outputs=PatchOutputs(reference="20210588-eco-1532"), - ) - - raw_study = Mock() - raw_study_patch = Patch(outputs=PatchOutputs(reference="some id")) - - patch_service = PatchService(repository=Mock(spec=StudyMetadataRepository)) - patch_service.get = Mock(return_value=raw_study_patch) - patch_service.save = Mock() - - expected = Patch(outputs=PatchOutputs(reference="output-id")) - patch_service.set_reference_output(raw_study, "output-id", True) - patch_service.save.assert_called_with(raw_study, expected) - - expected = Patch(outputs=PatchOutputs(reference=None)) - patch_service.set_reference_output(raw_study, "output-id", False) - patch_service.save.assert_called_with(raw_study, expected) +class TestPatchService: + @with_db_context + @pytest.mark.parametrize("get_from_file", [True, False]) + @pytest.mark.parametrize("file_data", ["", PATCH_CONTENT]) + @pytest.mark.parametrize("patch_data", ["", PATCH_CONTENT]) + def test_get( + self, + tmp_path: Path, + get_from_file: bool, + file_data: str, + patch_data: str, + ): + study_id = str(uuid.uuid4()) + + if file_data: + # create a "patch.json" file + patch_json = tmp_path.joinpath("patch.json") + patch_json.write_text(file_data, encoding="utf-8") + + # Prepare a RAW study + # noinspection PyArgumentList + raw_study = RawStudy( + id=study_id, + name="my_study", + workspace=DEFAULT_WORKSPACE_NAME, + path=str(tmp_path), + created_at=datetime.now(timezone.utc), + updated_at=datetime.now(timezone.utc), + version="840", + additional_data=StudyAdditionalData( + author="john.doe", + horizon="foo-horizon", + patch=patch_data, + ), + archived=False, + owner=None, + groups=[], + public_mode=PublicMode.NONE, + ) + + # Make sure the session is closed to avoid reusing DB objects + with contextlib.closing(db.session): + db.session.add(raw_study) + db.session.commit() + + # The study must be fetched from the database + raw_study: RawStudy = db.session.query(Study).get(study_id) + + # Create a PatchService which use a StudyMetadataRepository with a mocked cache + patch_service = PatchService( + repository=StudyMetadataRepository(Mock()) + ) + patch = patch_service.get(raw_study, get_from_file=get_from_file) + + # check the result + if (get_from_file and file_data) or ( + not get_from_file and (patch_data or file_data) + ): + expected_patch = Patch( + study=PatchStudy(scenario="BAU2025"), + areas={"a1": PatchArea(country="FR")}, + outputs=PatchOutputs(reference="20210588-eco-1532"), + ) + else: + expected_patch = Patch() + + assert patch == expected_patch + + @with_db_context + def test_save(self, tmp_path): + study_id = str(uuid.uuid4()) + + # Prepare a RAW study + # noinspection PyArgumentList + raw_study = RawStudy( + id=study_id, + name="my_study", + workspace=DEFAULT_WORKSPACE_NAME, + path=str(tmp_path), + created_at=datetime.now(timezone.utc), + updated_at=datetime.now(timezone.utc), + version="840", + additional_data=StudyAdditionalData( + author="john.doe", + horizon="foo-horizon", + patch="", + ), + archived=False, + owner=None, + groups=[], + public_mode=PublicMode.NONE, + ) + + # Make sure the session is closed to avoid reusing DB objects + with contextlib.closing(db.session): + db.session.add(raw_study) + db.session.commit() + + # The study must be fetched from the database + raw_study: RawStudy = db.session.query(Study).get(study_id) + + # Create a PatchService which use a StudyMetadataRepository with a mocked cache + patch_service = PatchService( + repository=StudyMetadataRepository(Mock()) + ) + + patch = Patch( + study=PatchStudy(scenario="BAU2025"), + areas={"a1": PatchArea(country="FR")}, + outputs=PatchOutputs(reference="20210588-eco-1532"), + ) + patch_service.save(raw_study, patch) + + # check the result + actual_obj = json.loads( + tmp_path.joinpath("patch.json").read_text(encoding="utf-8") + ) + expected_obj = json.loads(PATCH_CONTENT) + assert actual_obj == expected_obj + + @with_db_context + def test_set_output_ref(self, tmp_path: Path): + study_id = str(uuid.uuid4()) + + patch_outputs = PatchOutputs(reference="some id") + + # Prepare a RAW study + # noinspection PyArgumentList + raw_study = RawStudy( + id=study_id, + name="my_study", + workspace=DEFAULT_WORKSPACE_NAME, + path=str(tmp_path), + created_at=datetime.now(timezone.utc), + updated_at=datetime.now(timezone.utc), + version="840", + additional_data=StudyAdditionalData( + author="john.doe", + horizon="foo-horizon", + patch=patch_outputs.json(), + ), + archived=False, + owner=None, + groups=[], + public_mode=PublicMode.NONE, + ) + + # Make sure the session is closed to avoid reusing DB objects + with contextlib.closing(db.session): + db.session.add(raw_study) + db.session.commit() + + # The study must be fetched from the database + raw_study: RawStudy = db.session.query(Study).get(study_id) + + # Create a PatchService which use a StudyMetadataRepository with a mocked cache + patch_service = PatchService( + repository=StudyMetadataRepository(Mock()) + ) + + # run with status=True + patch_service.set_reference_output(raw_study, "output-id", status=True) + + # check the result + actual_obj = json.loads( + tmp_path.joinpath("patch.json").read_text(encoding="utf-8") + ) + expected_obj = json.loads( + """ + { + "areas": null, + "outputs": { + "reference": "output-id" + }, + "study": null, + "thermal_clusters": null + } + """ + ) + assert actual_obj == expected_obj + + # run with status=False + patch_service.set_reference_output( + raw_study, "output-id", status=False + ) + actual_obj = json.loads( + tmp_path.joinpath("patch.json").read_text(encoding="utf-8") + ) + expected_obj = json.loads( + """ + { + "areas": null, + "outputs": { + "reference": null + }, + "study": null, + "thermal_clusters": null + } + """ + ) + assert actual_obj == expected_obj From d16f4ceea2b49fe7cb770987d25dbdca55987052 Mon Sep 17 00:00:00 2001 From: Laurent LAPORTE Date: Thu, 9 Mar 2023 16:08:40 +0100 Subject: [PATCH 58/60] style: reindent source code --- antarest/eventbus/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/antarest/eventbus/main.py b/antarest/eventbus/main.py index a7fb136367..3f961fd410 100644 --- a/antarest/eventbus/main.py +++ b/antarest/eventbus/main.py @@ -1,12 +1,13 @@ from typing import Optional +from fastapi import FastAPI +from redis import Redis + from antarest.core.config import Config from antarest.eventbus.business.local_eventbus import LocalEventBus from antarest.eventbus.business.redis_eventbus import RedisEventBus from antarest.eventbus.service import EventBusService from antarest.eventbus.web import configure_websockets -from fastapi import FastAPI -from redis import Redis def build_eventbus( From 41724229f8886bc85c275454aed7cd8837ff110f Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Thu, 9 Mar 2023 18:07:01 +0100 Subject: [PATCH 59/60] docs: update change log for release v2.13.0 Co-authored-by: Laurent LAPORTE --- docs/CHANGELOG.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6d50e6a72d..3a3924f0a9 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,16 +4,6 @@ Antares Web Changelog v2.13.0 (unreleased) -------------------- -### Bug Fixes - -* **ui-map:** prevent duplicate layers and districts on create/update (#1239) ([eff4ca3](https://github.com/AntaresSimulatorTeam/AntaREST/commit/eff4ca369212e9998f9ccd96a938a6f91f5dbf44)) -* **ui-maps:** empty page (#1243) ([71f19d3](https://github.com/AntaresSimulatorTeam/AntaREST/commit/71f19d3484bb802f645140523a7b66f321a2aec2)) -* **api-workers:** prevent scanning of the default workspace (#1244) ([06fd2bc](https://github.com/AntaresSimulatorTeam/AntaREST/commit/06fd2bca478fc4f579ba0760e37969038e560f97)) -* **ui-study:** remove the create command button (#1251) ([463e7a7](https://github.com/AntaresSimulatorTeam/AntaREST/commit/463e7a789eebd2b28c33bd18e833bbd30dc9268a)) -* **ui-wording:** correct wording of user messages (#1271) ([7f66c1a](https://github.com/AntaresSimulatorTeam/AntaREST/commit/7f66c1aa518bea09c2db52ae87ef36e14cd5b9e0)) -* **ui-wording:** correct french translations (#1273) ([f4f62f2](https://github.com/AntaresSimulatorTeam/AntaREST/commit/f4f62f252d8b5556ba1cb2b6027360b9066327e0)) - - ### Features * **ui-common:** add doc link on subsections (#1241) ([1331232](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1331232e418ebfbf3cc1a82725b95cb11cf8b9bc)) @@ -37,6 +27,16 @@ v2.13.0 (unreleased) * change the `MaintenanceMode` class to implement a conversion from/to `bool`. ([a5a5689](https://github.com/AntaresSimulatorTeam/AntaREST/commit/a5a568984c9562e3eba67ba30c0a076b8f30190e)) +### Bug Fixes + +* **api-workers:** Prevent scanning of the default workspace (#1244) ([06fd2bc](https://github.com/AntaresSimulatorTeam/AntaREST/commit/06fd2bca478fc4f579ba0760e37969038e560f97)) +* **ui-study:** remove the create command button (#1251) ([463e7a7](https://github.com/AntaresSimulatorTeam/AntaREST/commit/463e7a789eebd2b28c33bd18e833bbd30dc9268a)) +* **ui-wording:** correct wording of user messages (#1271) ([7f66c1a](https://github.com/AntaresSimulatorTeam/AntaREST/commit/7f66c1aa518bea09c2db52ae87ef36e14cd5b9e0)) +* **ui-wording:** correct french translations (#1273) ([f4f62f2](https://github.com/AntaresSimulatorTeam/AntaREST/commit/f4f62f252d8b5556ba1cb2b6027360b9066327e0)) +* **api:** correct the way the task completion is notified to the event bus (#1301) ([b9cea1e](https://github.com/AntaresSimulatorTeam/AntaREST/commit/b9cea1ebd644869a459cbf002661c4a833389cb2)) +* **storage:** ignore zipped output if an unzipped version exists (#1269) ([032b581](https://github.com/AntaresSimulatorTeam/AntaREST/commit/032b58134a4e2e9da50848d6de438d23a0f00086)) + + ### Build System * update version to 2.13.0 ([a44a896](https://github.com/AntaresSimulatorTeam/AntaREST/commit/a44a8964da226931b7a67b95765abc7baf031eb4)) @@ -62,6 +62,7 @@ v2.13.0 (unreleased) ### Contributors hdinia, -skamril, laurent-laporte-pro, -pl-buiquang +pl-buiquang, +skamril, +MartinBelthle From f80f2d9e2748dd25d471dc6eb51a08ba910ebfa5 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Thu, 9 Mar 2023 18:07:26 +0100 Subject: [PATCH 60/60] docs: update project metadata for release v2.13.0 Co-authored-by: Laurent LAPORTE --- antarest/__init__.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/antarest/__init__.py b/antarest/__init__.py index 0761e13c39..923dfadcf4 100644 --- a/antarest/__init__.py +++ b/antarest/__init__.py @@ -1,5 +1,16 @@ -__version__ = "2.13.0" +""" +Antares Web +This module contains the project metadata. +""" from pathlib import Path +# Standard project metadata + +__version__ = "2.13.0" +__author__ = "RTE, Antares Web Team" +__date__ = "2023-03-09" +# noinspection SpellCheckingInspection +__credits__ = "(c) Réseau de Transport de l’Électricité (RTE)" + ROOT_DIR: Path = Path(__file__).resolve().parent