From ab1e86447838a78a195a86e67c46ea6131e47e9f Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Fri, 26 Apr 2024 15:18:47 +0000 Subject: [PATCH 1/7] build settings --- .env.example | 1 + Taskfile.yaml | 18 +++++++ fuware/core/__init__.py | 0 fuware/core/config.py | 40 ++++++++++++++++ fuware/core/settings/__init__.py | 1 + fuware/core/settings/db_providers.py | 28 +++++++++++ fuware/core/settings/settings.py | 71 ++++++++++++++++++++++++++++ fuware/core/settings/static.py | 22 +++++++++ poetry.lock | 36 +++++++------- pyproject.toml | 2 +- 10 files changed, 200 insertions(+), 19 deletions(-) create mode 100644 .env.example create mode 100644 Taskfile.yaml create mode 100644 fuware/core/__init__.py create mode 100644 fuware/core/config.py create mode 100644 fuware/core/settings/__init__.py create mode 100644 fuware/core/settings/db_providers.py create mode 100644 fuware/core/settings/settings.py create mode 100644 fuware/core/settings/static.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..bc721a1 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +PRODUCTION=false diff --git a/Taskfile.yaml b/Taskfile.yaml new file mode 100644 index 0000000..37a952b --- /dev/null +++ b/Taskfile.yaml @@ -0,0 +1,18 @@ +version: "3" + +vars: + GREETING: Hello, World! +env: + DEFAULT_GROUP: Home + PRODUCTION: false + API_PORT: 9000 + API_DOCS: True + +dotenv: + - .env + - .dev.env +tasks: + py: + desc: runs the backend server + cmds: + - poetry run python fuware/main.py diff --git a/fuware/core/__init__.py b/fuware/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fuware/core/config.py b/fuware/core/config.py new file mode 100644 index 0000000..cf6e3a7 --- /dev/null +++ b/fuware/core/config.py @@ -0,0 +1,40 @@ +import os +from functools import lru_cache +from pathlib import Path + +from dotenv import load_dotenv + + +from .settings import AppDirectories, AppSettings + +CWD = Path(__file__).parent +BASE_DIR = CWD.parent.parent +ENV = BASE_DIR.joinpath(".env") + +load_dotenv() +PRODUCTION = os.getenv("PRODUCTION", "True").lower() in ["true", "1"] +TESTING = os.getenv("TESTING", "False").lower() in ["true", "1"] +DATA_DIR = os.getenv("DATA_DIR") + +def determine_data_dir() -> Path: + global PRODUCTION, TESTING, BASE_DIR, DATA_DIR + + if TESTING: + return BASE_DIR.joinpath(DATA_DIR if DATA_DIR else "tests/.temp") + + if PRODUCTION: + return Path(DATA_DIR if DATA_DIR else "/app/data") + + return BASE_DIR.joinpath("dev", "data") + +@lru_cache +def get_app_dirs() -> AppDirectories: + return AppDirectories(determine_data_dir()) + + +@lru_cache +def get_app_settings() -> AppSettings: + return app_settings_constructor(env_file=ENV, production=PRODUCTION, data_dir=determine_data_dir()) + + +print(get_app_settings()) diff --git a/fuware/core/settings/__init__.py b/fuware/core/settings/__init__.py new file mode 100644 index 0000000..7d7765a --- /dev/null +++ b/fuware/core/settings/__init__.py @@ -0,0 +1 @@ +from .settings import * diff --git a/fuware/core/settings/db_providers.py b/fuware/core/settings/db_providers.py new file mode 100644 index 0000000..dcae60f --- /dev/null +++ b/fuware/core/settings/db_providers.py @@ -0,0 +1,28 @@ +from abc import ABC, abstractmethod +from pathlib import Path +from pydantic import BaseModel + +class AbstractDBProvider(ABC): + @property + @abstractmethod + def db_url(self) -> str: ... + + @property + @abstractmethod + def db_url_public(self) -> str: ... + +class SQLiteProvider(AbstractDBProvider, BaseModel): + data_dir: Path + prefix: str = "" + + @property + def db_path(self): + return self.data_dir / f"{self.prefix}mealie.db" + + @property + def db_url(self) -> str: + return f"sqlite:///{str(self.db_path.absolute())}" + + @property + def db_url_public(self) -> str: + return self.db_url diff --git a/fuware/core/settings/settings.py b/fuware/core/settings/settings.py new file mode 100644 index 0000000..2e4adaa --- /dev/null +++ b/fuware/core/settings/settings.py @@ -0,0 +1,71 @@ +import secrets +from pathlib import Path +from fuware.core.settings.db_providers import AbstractDBProvider, SQLiteProvider +from pydantic_settings import BaseSettings # type: ignore + + +def determine_secrets(data_dir: Path, production: bool) -> str: + if not production: + return "shh-secret-test-key" + + secrets_file = data_dir.joinpath(".secret") + if secrets_file.is_file(): + with open(secrets_file) as f: + return f.read() + else: + data_dir.mkdir(parents=True, exist_ok=True) + with open(secrets_file, "w") as f: + new_secret = secrets.token_hex(32) + f.write(new_secret) + return new_secret + +class AppSettings(BaseSettings): + PRODUCTION: bool + BASE_URL: str = "http://localhost:8080" + """trailing slashes are trimmed (ex. `http://localhost:8080/` becomes ``http://localhost:8080`)""" + + HOST_IP: str = "*" + + API_HOST: str = "0.0.0.0" + API_PORT: int = 9000 + API_DOCS: bool = True + + ALLOW_SIGNUP: bool = False + + @property + def DOCS_URL(self) -> str | None: + return "/docs" if self.API_DOCS else None + + @property + def REDOC_URL(self) -> str | None: + return "/redoc" if self.API_DOCS else None + + # =============================================== + # Database Configuration + + DB_ENGINE: str = "sqlite" # Options: 'sqlite', 'postgres' + DB_PROVIDER: AbstractDBProvider | None = None + + @property + def DB_URL(self) -> str | None: + return self.DB_PROVIDER.db_url if self.DB_PROVIDER else None + + @property + def DB_URL_PUBLIC(self) -> str | None: + return self.DB_PROVIDER.db_url_public if self.DB_PROVIDER else None + +def app_settings_constructor(data_dir: Path, production: bool, env_file: Path, env_encoding="utf-8") -> AppSettings: + """ + app_settings_constructor is a factory function that returns an AppSettings object. It is used to inject the + required dependencies into the AppSettings object and nested child objects. AppSettings should not be substantiated + directly, but rather through this factory function. + """ + app_settings = AppSettings( + _env_file=env_file, # type: ignore + _env_file_encoding=env_encoding, # type: ignore + **{"SECRET": determine_secrets(data_dir, production)}, + ) + + app_settings.DB_PROVIDER = SQLiteProvider(data_dir=data_dir) + + return app_settings diff --git a/fuware/core/settings/static.py b/fuware/core/settings/static.py new file mode 100644 index 0000000..40a3144 --- /dev/null +++ b/fuware/core/settings/static.py @@ -0,0 +1,22 @@ +import os +from dotenv import load_dotenv + +from pathlib import Path +from fuware import __version__ + +load_dotenv() + +APP_VERSION = __version__ +CWD = Path(__file__).parent +BASE_DIR = CWD.parent.parent.parent + +SERCET_KEY = b"oWNhXlfo666JlMHk6UHYxeNB6z_CA2MisDDZJe4N0yc=" +COOKIE_KEY = os.getenv('VITE_LOGIN_KEY') or '7fo24CMyIc' +# URL_DATABASE = "postgresql://{0}:{1}@{2}:{3}/{4}".format( +# os.getenv('LOL_DB_USER'), +# os.getenv('LOL_DB_PASSWORD'), +# os.getenv('LOL_DB_HOST'), +# os.getenv('LOL_DB_PORT'), +# os.getenv('LOL_DB_NAME'), +# ) +URL_DATABASE = "sqlite:///./test.db" diff --git a/poetry.lock b/poetry.lock index b81113d..003240e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -564,28 +564,28 @@ files = [ [[package]] name = "ruff" -version = "0.4.1" +version = "0.4.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2d9ef6231e3fbdc0b8c72404a1a0c46fd0dcea84efca83beb4681c318ea6a953"}, - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9485f54a7189e6f7433e0058cf8581bee45c31a25cd69009d2a040d1bd4bfaef"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2921ac03ce1383e360e8a95442ffb0d757a6a7ddd9a5be68561a671e0e5807e"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eec8d185fe193ad053eda3a6be23069e0c8ba8c5d20bc5ace6e3b9e37d246d3f"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa27d9d72a94574d250f42b7640b3bd2edc4c58ac8ac2778a8c82374bb27984"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f1ee41580bff1a651339eb3337c20c12f4037f6110a36ae4a2d864c52e5ef954"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0926cefb57fc5fced629603fbd1a23d458b25418681d96823992ba975f050c2b"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6e37f2e3cd74496a74af9a4fa67b547ab3ca137688c484749189bf3a686ceb"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd703a5975ac1998c2cc5e9494e13b28f31e66c616b0a76e206de2562e0843c"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b92f03b4aa9fa23e1799b40f15f8b95cdc418782a567d6c43def65e1bbb7f1cf"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1c859f294f8633889e7d77de228b203eb0e9a03071b72b5989d89a0cf98ee262"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b34510141e393519a47f2d7b8216fec747ea1f2c81e85f076e9f2910588d4b64"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6e68d248ed688b9d69fd4d18737edcbb79c98b251bba5a2b031ce2470224bdf9"}, - {file = "ruff-0.4.1-py3-none-win32.whl", hash = "sha256:b90506f3d6d1f41f43f9b7b5ff845aeefabed6d2494307bc7b178360a8805252"}, - {file = "ruff-0.4.1-py3-none-win_amd64.whl", hash = "sha256:c7d391e5936af5c9e252743d767c564670dc3889aff460d35c518ee76e4b26d7"}, - {file = "ruff-0.4.1-py3-none-win_arm64.whl", hash = "sha256:a1eaf03d87e6a7cd5e661d36d8c6e874693cb9bc3049d110bc9a97b350680c43"}, - {file = "ruff-0.4.1.tar.gz", hash = "sha256:d592116cdbb65f8b1b7e2a2b48297eb865f6bdc20641879aa9d7b9c11d86db79"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, + {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, + {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, + {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, + {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index f554545..239c87e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.poetry] -name = "item-exp" +name = "fuware" version = "0.1.0" description = "project for manage item with exp date" authors = ["Sam Liu "] -- 2.47.2 From bc8815f40e3badd2e49f1647463f8f5917a13182 Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Thu, 9 May 2024 16:01:32 +0000 Subject: [PATCH 2/7] finish for init core --- .env.example | 1 + .gitignore | 1 + Taskfile.yaml | 8 +- dev/data/.gitkeep | 0 fuware/app.py | 60 ++++++++++++++ fuware/const.py | 15 ---- fuware/core/config.py | 11 +-- fuware/core/dependencies/__init__.py | 1 + fuware/core/dependencies/dependencies.py | 20 +++++ fuware/core/logger/config.py | 67 +++++++++++++++ fuware/core/security/__init__.py | 0 fuware/core/security/hasher.py | 34 ++++++++ fuware/core/settings/db_providers.py | 2 +- fuware/core/settings/settings.py | 27 +++--- fuware/core/settings/static.py | 22 ----- fuware/db/controller/user.py | 20 ----- fuware/db/db_setup.py | 40 ++++++--- fuware/db/init_db.py | 5 ++ fuware/db/models/__init__.py | 2 +- fuware/db/models/_model_base.py | 20 +++++ fuware/db/models/mixins.py | 8 -- fuware/db/models/user.py | 15 ---- fuware/db/models/users/__init__.py | 1 + fuware/db/models/users/users.py | 20 +++++ fuware/main.py | 32 +------ fuware/repos/__init__.py | 1 + fuware/repos/repository_users.py | 28 +++++++ fuware/routes/__init__.py | 7 ++ fuware/routes/_base/routers.py | 9 ++ fuware/routes/auth/__init__.py | 7 ++ fuware/routes/auth/auth.py | 35 ++++++++ fuware/routes/authR.py | 50 ----------- fuware/routes/userR.py | 11 --- fuware/schemas/fuware_model.py | 27 ++++++ .../controller => schemas/user}/__init__.py | 0 fuware/schemas/{ => user}/user.py | 12 +-- fuware/services/__init__.py | 1 + fuware/services/_base_service/__init__.py | 6 ++ fuware/services/user/__init__.py | 1 + fuware/services/user/user_service.py | 19 +++++ poetry.lock | 83 ++++++++++++++++++- pyproject.toml | 5 ++ 42 files changed, 520 insertions(+), 214 deletions(-) create mode 100644 dev/data/.gitkeep create mode 100644 fuware/app.py delete mode 100644 fuware/const.py create mode 100644 fuware/core/dependencies/__init__.py create mode 100644 fuware/core/dependencies/dependencies.py create mode 100644 fuware/core/logger/config.py create mode 100644 fuware/core/security/__init__.py create mode 100644 fuware/core/security/hasher.py delete mode 100644 fuware/core/settings/static.py delete mode 100644 fuware/db/controller/user.py create mode 100644 fuware/db/init_db.py create mode 100644 fuware/db/models/_model_base.py delete mode 100644 fuware/db/models/mixins.py delete mode 100644 fuware/db/models/user.py create mode 100644 fuware/db/models/users/__init__.py create mode 100644 fuware/db/models/users/users.py create mode 100644 fuware/repos/__init__.py create mode 100644 fuware/repos/repository_users.py create mode 100644 fuware/routes/__init__.py create mode 100644 fuware/routes/_base/routers.py create mode 100644 fuware/routes/auth/__init__.py create mode 100644 fuware/routes/auth/auth.py delete mode 100644 fuware/routes/authR.py delete mode 100644 fuware/routes/userR.py create mode 100644 fuware/schemas/fuware_model.py rename fuware/{db/controller => schemas/user}/__init__.py (100%) rename fuware/schemas/{ => user}/user.py (60%) create mode 100644 fuware/services/__init__.py create mode 100644 fuware/services/_base_service/__init__.py create mode 100644 fuware/services/user/__init__.py create mode 100644 fuware/services/user/user_service.py diff --git a/.env.example b/.env.example index bc721a1..b317169 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,2 @@ PRODUCTION=false +TESTING=false diff --git a/.gitignore b/.gitignore index 1a145b2..fc6a7f0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ node_modules node_modules/ .sqlite +*.db diff --git a/Taskfile.yaml b/Taskfile.yaml index 37a952b..8832313 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -12,7 +12,11 @@ dotenv: - .env - .dev.env tasks: - py: + py:setupdb: + desc: runs it first for init db + cmds: + - poetry run python fuware/db/init_db.py + py:dev: desc: runs the backend server cmds: - - poetry run python fuware/main.py + - poetry run python fuware/app.py diff --git a/dev/data/.gitkeep b/dev/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fuware/app.py b/fuware/app.py new file mode 100644 index 0000000..6f1c60f --- /dev/null +++ b/fuware/app.py @@ -0,0 +1,60 @@ +from fastapi import FastAPI, Request, HTTPException +from fastapi.responses import JSONResponse +from fastapi.middleware.cors import CORSMiddleware +from fastapi.middleware.gzip import GZipMiddleware + +from fuware.core.config import get_app_settings +from fuware import __version__ +from fuware.routes import router +import uvicorn + +settings = get_app_settings() + +description = f""" +fuware is a web application for managing your hours items and tracking them. +""" + +# event.listen(models.User.__table__, 'after_create', initialize_table) + +app = FastAPI( + title="Fuware", + description=description, + version=__version__, + docs_url=settings.DOCS_URL, + redoc_url=settings.REDOC_URL +) + +app.add_middleware(GZipMiddleware, minimum_size=1000) + +if not settings.PRODUCTION: + allowed_origins = ["http://localhost:3000"] + + app.add_middleware( + CORSMiddleware, + allow_origins=allowed_origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + +@app.exception_handler(HTTPException) +async def unicorn_exception_handler(request: Request, exc: HTTPException): + return JSONResponse( + status_code=exc.status_code, + content={"status": exc.status_code, "data": exc.detail}, + ) + +def api_routers(): + app.include_router(router) + + +api_routers() + +# app.include_router(authR.authRouter) +# app.include_router(userR.userRouter) + +def main(): + uvicorn.run("app:app", host="0.0.0.0", port=settings.API_PORT, reload=True, workers=1, forwarded_allow_ips="*") + +if __name__ == "__main__": + main() diff --git a/fuware/const.py b/fuware/const.py deleted file mode 100644 index e590d37..0000000 --- a/fuware/const.py +++ /dev/null @@ -1,15 +0,0 @@ -import os -from dotenv import load_dotenv - -load_dotenv() - -SERCET_KEY = b"oWNhXlfo666JlMHk6UHYxeNB6z_CA2MisDDZJe4N0yc=" -COOKIE_KEY = os.getenv('VITE_LOGIN_KEY') or '7fo24CMyIc' -# URL_DATABASE = "postgresql://{0}:{1}@{2}:{3}/{4}".format( -# os.getenv('LOL_DB_USER'), -# os.getenv('LOL_DB_PASSWORD'), -# os.getenv('LOL_DB_HOST'), -# os.getenv('LOL_DB_PORT'), -# os.getenv('LOL_DB_NAME'), -# ) -URL_DATABASE = "sqlite:///./test.db" diff --git a/fuware/core/config.py b/fuware/core/config.py index cf6e3a7..0d5ebe9 100644 --- a/fuware/core/config.py +++ b/fuware/core/config.py @@ -4,8 +4,7 @@ from pathlib import Path from dotenv import load_dotenv - -from .settings import AppDirectories, AppSettings +from fuware.core.settings.settings import AppSettings, app_settings_constructor CWD = Path(__file__).parent BASE_DIR = CWD.parent.parent @@ -27,14 +26,6 @@ def determine_data_dir() -> Path: return BASE_DIR.joinpath("dev", "data") -@lru_cache -def get_app_dirs() -> AppDirectories: - return AppDirectories(determine_data_dir()) - - @lru_cache def get_app_settings() -> AppSettings: return app_settings_constructor(env_file=ENV, production=PRODUCTION, data_dir=determine_data_dir()) - - -print(get_app_settings()) diff --git a/fuware/core/dependencies/__init__.py b/fuware/core/dependencies/__init__.py new file mode 100644 index 0000000..c9753bd --- /dev/null +++ b/fuware/core/dependencies/__init__.py @@ -0,0 +1 @@ +from .dependencies import * diff --git a/fuware/core/dependencies/dependencies.py b/fuware/core/dependencies/dependencies.py new file mode 100644 index 0000000..cf579b9 --- /dev/null +++ b/fuware/core/dependencies/dependencies.py @@ -0,0 +1,20 @@ + +from fastapi import Depends, HTTPException, Request +from sqlalchemy.orm import Session +from fuware.core.config import get_app_settings +from fuware.db.db_setup import generate_session + +settings = get_app_settings() + +async def get_auth_user(request: Request, db: Session = Depends(generate_session)): + """verify that user has a valid session""" + session_id = request.cookies.get(settings.COOKIE_KEY) + if not session_id: + raise HTTPException(status_code=401, detail="Unauthorized") + # decrypt_user = decryptString(session_id).split(',') + # db_user = get_user_by_username(db, decrypt_user[0]) + # if not db_user: + # raise HTTPException(status_code=403) + # if not verify_password(decrypt_user[1], db_user.password): + # raise HTTPException(status_code=401, detail="Your username or password input is wrong!") + return True diff --git a/fuware/core/logger/config.py b/fuware/core/logger/config.py new file mode 100644 index 0000000..65598e2 --- /dev/null +++ b/fuware/core/logger/config.py @@ -0,0 +1,67 @@ +import json +import logging +import pathlib +import typing +from logging import config as logging_config + +__dir = pathlib.Path(__file__).parent +__conf: dict[str, str] | None = None + + +def _load_config(path: pathlib.Path, substitutions: dict[str, str] | None = None) -> dict[str, typing.Any]: + with open(path) as file: + if substitutions: + contents = file.read() + for key, value in substitutions.items(): + # Replaces the key matches + # + # Example: + # {"key": "value"} + # "/path/to/${key}/file" -> "/path/to/value/file" + contents = contents.replace(f"${{{key}}}", value) + + json_data = json.loads(contents) + + else: + json_data = json.load(file) + + return json_data + + +def log_config() -> dict[str, str]: + if __conf is None: + raise ValueError("logger not configured, must call configured_logger first") + + return __conf + + +def configured_logger( + *, + mode: str, + config_override: pathlib.Path | None = None, + substitutions: dict[str, str] | None = None, +) -> logging.Logger: + """ + Configure the logger based on the mode and return the root logger + + Args: + mode (str): The mode to configure the logger for (production, development, testing) + config_override (pathlib.Path, optional): A path to a custom logging config. Defaults to None. + substitutions (dict[str, str], optional): A dictionary of substitutions to apply to the logging config. + """ + global __conf + + if config_override: + __conf = _load_config(config_override, substitutions) + else: + if mode == "production": + __conf = _load_config(__dir / "logconf.prod.json", substitutions) + elif mode == "development": + __conf = _load_config(__dir / "logconf.dev.json", substitutions) + elif mode == "testing": + __conf = _load_config(__dir / "logconf.test.json", substitutions) + else: + raise ValueError(f"Invalid mode: {mode}") + + logging_config.dictConfig(config=__conf) + return logging.getLogger() diff --git a/fuware/core/security/__init__.py b/fuware/core/security/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fuware/core/security/hasher.py b/fuware/core/security/hasher.py new file mode 100644 index 0000000..f8044fa --- /dev/null +++ b/fuware/core/security/hasher.py @@ -0,0 +1,34 @@ +from functools import lru_cache +from typing import Protocol +import bcrypt + +from fuware.core.config import get_app_settings + + +class Hasher(Protocol): + def hash(self, password: str) -> str: ... + + def verify(self, password: str, hashed: str) -> bool: ... + +class FakeHasher: + def hash(self, password: str) -> str: + return password + + def verify(self, password: str, hashed: str) -> bool: + return password == hashed + +class BcryptHasher: + def hash(self, password: str) -> str: + return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8') + + def verify(self, password: str, hashed: str) -> bool: + return bcrypt.checkpw(password.encode('utf-8'), hashed.encode('utf-8')) + +@lru_cache(maxsize=1) +def get_hasher() -> Hasher: + settings = get_app_settings() + + if settings.TESTING: + return FakeHasher() + + return BcryptHasher() diff --git a/fuware/core/settings/db_providers.py b/fuware/core/settings/db_providers.py index dcae60f..95e3dd7 100644 --- a/fuware/core/settings/db_providers.py +++ b/fuware/core/settings/db_providers.py @@ -17,7 +17,7 @@ class SQLiteProvider(AbstractDBProvider, BaseModel): @property def db_path(self): - return self.data_dir / f"{self.prefix}mealie.db" + return self.data_dir / f"{self.prefix}fuware.db" @property def db_url(self) -> str: diff --git a/fuware/core/settings/settings.py b/fuware/core/settings/settings.py index 2e4adaa..f42e89b 100644 --- a/fuware/core/settings/settings.py +++ b/fuware/core/settings/settings.py @@ -1,26 +1,23 @@ -import secrets from pathlib import Path from fuware.core.settings.db_providers import AbstractDBProvider, SQLiteProvider from pydantic_settings import BaseSettings # type: ignore -def determine_secrets(data_dir: Path, production: bool) -> str: +def determine_secrets(production: bool) -> str: if not production: return "shh-secret-test-key" - secrets_file = data_dir.joinpath(".secret") - if secrets_file.is_file(): - with open(secrets_file) as f: - return f.read() - else: - data_dir.mkdir(parents=True, exist_ok=True) - with open(secrets_file, "w") as f: - new_secret = secrets.token_hex(32) - f.write(new_secret) - return new_secret + return "oWNhXlfo666JlMHk6UHYxeNB6z_CA2MisDDZJe4N0yc=" + +def determine_cookie(production: bool) -> str: + if not production: + return "logcook" + + return "7fo24CMyIc" class AppSettings(BaseSettings): PRODUCTION: bool + TESTING: bool BASE_URL: str = "http://localhost:8080" """trailing slashes are trimmed (ex. `http://localhost:8080/` becomes ``http://localhost:8080`)""" @@ -32,6 +29,9 @@ class AppSettings(BaseSettings): ALLOW_SIGNUP: bool = False + SECRET: str + COOKIE_KEY: str + @property def DOCS_URL(self) -> str | None: return "/docs" if self.API_DOCS else None @@ -43,7 +43,6 @@ class AppSettings(BaseSettings): # =============================================== # Database Configuration - DB_ENGINE: str = "sqlite" # Options: 'sqlite', 'postgres' DB_PROVIDER: AbstractDBProvider | None = None @property @@ -63,7 +62,7 @@ def app_settings_constructor(data_dir: Path, production: bool, env_file: Path, e app_settings = AppSettings( _env_file=env_file, # type: ignore _env_file_encoding=env_encoding, # type: ignore - **{"SECRET": determine_secrets(data_dir, production)}, + **{"SECRET": determine_secrets(production), 'COOKIE_KEY': determine_cookie(production)}, ) app_settings.DB_PROVIDER = SQLiteProvider(data_dir=data_dir) diff --git a/fuware/core/settings/static.py b/fuware/core/settings/static.py deleted file mode 100644 index 40a3144..0000000 --- a/fuware/core/settings/static.py +++ /dev/null @@ -1,22 +0,0 @@ -import os -from dotenv import load_dotenv - -from pathlib import Path -from fuware import __version__ - -load_dotenv() - -APP_VERSION = __version__ -CWD = Path(__file__).parent -BASE_DIR = CWD.parent.parent.parent - -SERCET_KEY = b"oWNhXlfo666JlMHk6UHYxeNB6z_CA2MisDDZJe4N0yc=" -COOKIE_KEY = os.getenv('VITE_LOGIN_KEY') or '7fo24CMyIc' -# URL_DATABASE = "postgresql://{0}:{1}@{2}:{3}/{4}".format( -# os.getenv('LOL_DB_USER'), -# os.getenv('LOL_DB_PASSWORD'), -# os.getenv('LOL_DB_HOST'), -# os.getenv('LOL_DB_PORT'), -# os.getenv('LOL_DB_NAME'), -# ) -URL_DATABASE = "sqlite:///./test.db" diff --git a/fuware/db/controller/user.py b/fuware/db/controller/user.py deleted file mode 100644 index 737fc64..0000000 --- a/fuware/db/controller/user.py +++ /dev/null @@ -1,20 +0,0 @@ -from sqlalchemy.orm import Session -from db.models import User -from ultis import get_password_hash -import schemas - -def get_user(db: Session, user_id: str): - return db.query(User).filter(User.id == user_id).first() - -def get_user_by_username(db: Session, usn: str): - return db.query(User).filter(User.username == usn).first() - -def get_users(db: Session, skip: int = 0, limit: int = 100): - return db.query(User).offset(skip).limit(limit).all() - -def create_user(db: Session, user: schemas.UserCreate): - db_user = User(username=user.username, password=get_password_hash(user.password), name=user.name) - db.add(db_user) - db.commit() - db.refresh(db_user) - return db_user diff --git a/fuware/db/db_setup.py b/fuware/db/db_setup.py index d5dae9a..a51e60e 100644 --- a/fuware/db/db_setup.py +++ b/fuware/db/db_setup.py @@ -1,17 +1,37 @@ -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker -from sqlalchemy.ext.declarative import declarative_base -from const import URL_DATABASE +from collections.abc import Generator +from sqlalchemy.orm.session import Session +from sqlalchemy import create_engine, event, Engine, text +from sqlalchemy.orm import scoped_session, sessionmaker -engine = create_engine(URL_DATABASE) +from fuware.core.config import get_app_settings -SessionLocal = sessionmaker(autocommit=False ,autoflush=False, bind=engine) +settings = get_app_settings() -Base = declarative_base() +def sql_global_init(db_url: str): + connect_args = {"check_same_thread": False} -def get_db(): + engine = create_engine(db_url, echo=True, connect_args=connect_args, pool_pre_ping=True, future=True) + + SessionLocal = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True)) + + return SessionLocal, engine + +SessionLocal, engine = sql_global_init(settings.DB_URL) # type: ignore + +@event.listens_for(Engine, "connect") +def set_sqlite_pragma(dbapi_connection, connection_record): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() + +# with engine.connect() as connection: +# result = connection.execute(text('select "Hello"')) + +# print(result.all()) + +def generate_session() -> Generator[Session, None, None]: db = SessionLocal() try: - yield db + yield db finally: - db.close() + db.close() diff --git a/fuware/db/init_db.py b/fuware/db/init_db.py new file mode 100644 index 0000000..edd9484 --- /dev/null +++ b/fuware/db/init_db.py @@ -0,0 +1,5 @@ +from db_setup import engine +from models._model_base import Model +from models.users import * + +Model.metadata.create_all(bind=engine) diff --git a/fuware/db/models/__init__.py b/fuware/db/models/__init__.py index f4a2da0..9917a30 100644 --- a/fuware/db/models/__init__.py +++ b/fuware/db/models/__init__.py @@ -1 +1 @@ -from .user import * +from .users import * diff --git a/fuware/db/models/_model_base.py b/fuware/db/models/_model_base.py new file mode 100644 index 0000000..4b6288a --- /dev/null +++ b/fuware/db/models/_model_base.py @@ -0,0 +1,20 @@ +from datetime import datetime + +from sqlalchemy import DateTime, Integer +from sqlalchemy.orm import declarative_base, Mapped, mapped_column +from text_unidecode import unidecode + +from fuware.db.db_setup import SessionLocal + +Model = declarative_base() +Model.query = SessionLocal.query_property() + +class SqlAlchemyBase(Model): + __abstract__ = True + + created_at: Mapped[datetime | None] = mapped_column(DateTime, default=datetime.utcnow(), index=True) + update_at: Mapped[datetime | None] = mapped_column(DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow()) + + @classmethod + def normalize(cls, val: str) -> str: + return unidecode(val).lower().strip() diff --git a/fuware/db/models/mixins.py b/fuware/db/models/mixins.py deleted file mode 100644 index 5b39ff3..0000000 --- a/fuware/db/models/mixins.py +++ /dev/null @@ -1,8 +0,0 @@ -from datetime import datetime -from sqlalchemy import Column, DateTime -from sqlalchemy.orm import declarative_mixin - -@declarative_mixin -class Timestamp: - created_at = Column(DateTime, default=datetime.utcnow, nullable=False) - updated_at = Column(DateTime, default=datetime.utcnow, nullable=False) diff --git a/fuware/db/models/user.py b/fuware/db/models/user.py deleted file mode 100644 index aaef777..0000000 --- a/fuware/db/models/user.py +++ /dev/null @@ -1,15 +0,0 @@ -from db import Base -from sqlalchemy import Boolean, Column, String -from .mixins import Timestamp -from sqlalchemy.dialects.postgresql import UUID -import uuid - -class User(Base, Timestamp): - __tablename__ = 'users' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True) - username = Column(String(100), unique=True, index=True, nullable=False) - password = Column(String, index=True, nullable=False) - name = Column(String, index=True, nullable=True) - is_admin = Column(Boolean, default=False) - is_lock = Column(Boolean, default=False) diff --git a/fuware/db/models/users/__init__.py b/fuware/db/models/users/__init__.py new file mode 100644 index 0000000..9917a30 --- /dev/null +++ b/fuware/db/models/users/__init__.py @@ -0,0 +1 @@ +from .users import * diff --git a/fuware/db/models/users/users.py b/fuware/db/models/users/users.py new file mode 100644 index 0000000..c0c7228 --- /dev/null +++ b/fuware/db/models/users/users.py @@ -0,0 +1,20 @@ +import uuid +from sqlalchemy import Boolean, Column, String +from sqlalchemy.orm import Mapped, mapped_column + +from sqlalchemy.dialects.postgresql import UUID + +from .._model_base import SqlAlchemyBase + +class User(SqlAlchemyBase): + __tablename__ = 'users' + + id: Mapped[UUID] = mapped_column(UUID, primary_key=True, default=uuid.uuid4, index=True) + username: Mapped[str | None] = mapped_column(String, unique=True, index=True, nullable=False) + password: Mapped[str | None] = mapped_column(String, index=True, nullable=False) + name: Mapped[str | None] = mapped_column(String, index=True, nullable=True) + is_admin: Mapped[bool | None] = mapped_column(Boolean, default=False) + is_lock: Mapped[bool | None] = mapped_column(Boolean, default=False) + + def __repr__(self): + return f"{self.__class__.__name__}, name: {self.name}, username: {self.username}" diff --git a/fuware/main.py b/fuware/main.py index 6732504..bf762c7 100644 --- a/fuware/main.py +++ b/fuware/main.py @@ -1,34 +1,10 @@ -from fastapi import FastAPI, Request, HTTPException -from fastapi.responses import JSONResponse -from routes import authR, userR -# from db import engine, models -# from sqlalchemy import event -# from db.seeds import initialize_table + import uvicorn +from fuware.app import settings -# event.listen(models.User.__table__, 'after_create', initialize_table) - -app = FastAPI() - -# models.Base.metadata.create_all(bind=engine) - -@app.exception_handler(HTTPException) -async def unicorn_exception_handler(request: Request, exc: HTTPException): - return JSONResponse( - status_code=exc.status_code, - content={"status": exc.status_code, "data": exc.detail}, - ) - -app.include_router(authR.authRouter) -app.include_router(userR.userRouter) def main(): - uvicorn.run( - "main:app", - port=8000, - host="0.0.0.0", - reload=True - ) + uvicorn.run("app:app", host=settings.API_HOST, port=settings.API_PORT, reload=True, workers=1, forwarded_allow_ips=settings.HOST_IP) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/fuware/repos/__init__.py b/fuware/repos/__init__.py new file mode 100644 index 0000000..bdb81bd --- /dev/null +++ b/fuware/repos/__init__.py @@ -0,0 +1 @@ +from .repository_users import * diff --git a/fuware/repos/repository_users.py b/fuware/repos/repository_users.py new file mode 100644 index 0000000..ae9d773 --- /dev/null +++ b/fuware/repos/repository_users.py @@ -0,0 +1,28 @@ +from fuware.core.security.hasher import get_hasher +from fuware.db.models.users.users import User +from fuware.schemas import UserCreate +from sqlalchemy.orm import Session + + +class RepositoryUsers: + def __init__(self): + self.user = User() + + def get_all(self, skip: int = 0, limit: int = 100): + return self.user.query.offset(skip).limit(limit).all() + + def get_by_username(self, username: str): + return self.user.query.filter_by(username=username).first() + + def create(self, db: Session, user: UserCreate): + try: + hasher = get_hasher() + db_user = User(username=user.username, password=hasher.hash(user.password), name=user.name) + db.add(db_user) + db.commit() + except Exception: + db.rollback() + raise + + db.refresh(db_user) + return db_user diff --git a/fuware/routes/__init__.py b/fuware/routes/__init__.py new file mode 100644 index 0000000..5ca2a2d --- /dev/null +++ b/fuware/routes/__init__.py @@ -0,0 +1,7 @@ +from fastapi import APIRouter + +from . import (auth) + +router = APIRouter(prefix='/api') + +router.include_router(auth.router) diff --git a/fuware/routes/_base/routers.py b/fuware/routes/_base/routers.py new file mode 100644 index 0000000..9324abb --- /dev/null +++ b/fuware/routes/_base/routers.py @@ -0,0 +1,9 @@ +from enum import Enum +from fastapi import APIRouter, Depends + +from fuware.core.dependencies import get_auth_user + + +class PrivateAPIRouter(APIRouter): + def __init__(self, tags: list[str | Enum] | None = None, prefix: str = "", **kwargs): + super().__init__(tags=tags, prefix=prefix, dependencies=[Depends(get_auth_user)], **kwargs) diff --git a/fuware/routes/auth/__init__.py b/fuware/routes/auth/__init__.py new file mode 100644 index 0000000..e89c859 --- /dev/null +++ b/fuware/routes/auth/__init__.py @@ -0,0 +1,7 @@ + +from fastapi import APIRouter +from . import auth + +router = APIRouter(prefix='/auth') + +router.include_router(auth.public_router) diff --git a/fuware/routes/auth/auth.py b/fuware/routes/auth/auth.py new file mode 100644 index 0000000..0ee809a --- /dev/null +++ b/fuware/routes/auth/auth.py @@ -0,0 +1,35 @@ +from typing import Any +from fastapi import APIRouter, Depends, HTTPException, Response + +from fastapi.encoders import jsonable_encoder +from sqlalchemy.orm import Session +from fuware.db.db_setup import generate_session +from fuware.schemas import ReturnValue, PrivateUser, UserRequest +from fuware.schemas.user.user import UserCreate +from fuware.services import UserService + + +public_router = APIRouter(tags=["Users: Authentication"]) + +user_service = UserService() + +@public_router.put('/register') +def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> ReturnValue[Any]: + db_user = user_service.get_by_username(username=user.username) + if db_user: + raise HTTPException(status_code=400, detail="Username already registered!") + user_return = user_service.create(db=db, user=user) + return ReturnValue(status=200, data=jsonable_encoder(user_return)) + +# @public_router.post('/login', response_model=ReturnValue[PrivateUser]) +# def user_login(user: UserRequest, response: Response) -> ReturnValue[Any]: +# db_user = UserService.get_by_username(user.username) +# if not db_user: +# raise HTTPException(status_code=401, detail="Your username or password input is wrong!") + # if not verify_password(user.password, db_user.password): + # raise HTTPException(status_code=401, detail="Your username or password input is wrong!") + # if db_user.is_lock is True: + # raise HTTPException(status_code=401, detail="Your Account is banned") + # cookieEncode = encryptString(user.username + ',' + user.password) + # response.set_cookie(key=COOKIE_KEY, value=cookieEncode.decode('utf-8')) + # return ReturnValue(status=200, data=jsonable_encoder(db_user)) diff --git a/fuware/routes/authR.py b/fuware/routes/authR.py deleted file mode 100644 index 47f192c..0000000 --- a/fuware/routes/authR.py +++ /dev/null @@ -1,50 +0,0 @@ -from typing import Any -from fastapi import APIRouter, HTTPException, Response, Request, Depends -from fastapi.encoders import jsonable_encoder -from schemas import ReturnValue, User, UserCreate, UserRequest -from ultis import root_api_path_build, encryptString, decryptString, verify_password -from const import COOKIE_KEY -from sqlalchemy.orm import Session -from db.controller import get_user_by_username, create_user -from db import get_db - -authRouter=APIRouter(prefix=root_api_path_build('/auth')) - -@authRouter.put('/register') -def register_user(user: UserCreate, db: Session = Depends(get_db)) -> ReturnValue[Any]: - db_user = get_user_by_username(db=db, usn=user.username) - if db_user: - raise HTTPException(status_code=400, detail="Username already registered!") - user_return = create_user(db=db, user=user) - return ReturnValue(status=200, data=jsonable_encoder(user_return)) - -@authRouter.post('/login', response_model=ReturnValue[User]) -def user_login(user: UserRequest, response: Response, db: Session = Depends(get_db)) -> ReturnValue[Any]: - db_user = get_user_by_username(db, user.username) - if not db_user: - raise HTTPException(status_code=401, detail="Your username or password input is wrong!") - if not verify_password(user.password, db_user.password): - raise HTTPException(status_code=401, detail="Your username or password input is wrong!") - if db_user.is_lock is True: - raise HTTPException(status_code=401, detail="Your Account is banned") - cookieEncode = encryptString(user.username + ',' + user.password) - response.set_cookie(key=COOKIE_KEY, value=cookieEncode.decode('utf-8')) - return ReturnValue(status=200, data=jsonable_encoder(db_user)) - -@authRouter.get('/logout') -def user_logout(response: Response) -> ReturnValue[Any]: - response.delete_cookie(key=COOKIE_KEY) - return ReturnValue(status=200, data='Logged out') - -def get_auth_user(request: Request, db: Session = Depends(get_db)): - """verify that user has a valid session""" - session_id = request.cookies.get(COOKIE_KEY) - if not session_id: - raise HTTPException(status_code=401, detail="Unauthorized") - decrypt_user = decryptString(session_id).split(',') - db_user = get_user_by_username(db, decrypt_user[0]) - if not db_user: - raise HTTPException(status_code=403) - if not verify_password(decrypt_user[1], db_user.password): - raise HTTPException(status_code=401, detail="Your username or password input is wrong!") - return True diff --git a/fuware/routes/userR.py b/fuware/routes/userR.py deleted file mode 100644 index b9f31d1..0000000 --- a/fuware/routes/userR.py +++ /dev/null @@ -1,11 +0,0 @@ -from typing import Any -from fastapi import APIRouter, Depends -from schemas import ReturnValue -from ultis import root_api_path_build -from routes import authR - -userRouter=APIRouter(prefix=root_api_path_build('/user')) - -@userRouter.get('/get-data/', dependencies=[Depends(authR.get_auth_user)]) -def get_data(url: str = '') -> ReturnValue[Any]: - return ReturnValue(status=200, data=url) diff --git a/fuware/schemas/fuware_model.py b/fuware/schemas/fuware_model.py new file mode 100644 index 0000000..2fc6fcd --- /dev/null +++ b/fuware/schemas/fuware_model.py @@ -0,0 +1,27 @@ +from typing import ClassVar, Protocol, TypeVar +from humps import camelize +from enum import Enum +from pydantic import UUID4, BaseModel, ConfigDict + +T = TypeVar("T", bound=BaseModel) + +class SearchType(Enum): + fuzzy = "fuzzy" + tokenized = "tokenized" + +class FuwareModel(BaseModel): + _searchable_properties: ClassVar[list[str]] = [] + """ + Searchable properties for the search API. + The first property will be used for sorting (order_by) + """ + model_config = ConfigDict(alias_generator=camelize, populate_by_name=True) + + def cast(self, cls: type[T], **kwargs) -> T: + """ + Cast the current model to another with additional arguments. Useful for + transforming DTOs into models that are saved to a database + """ + create_data = {field: getattr(self, field) for field in self.__fields__ if field in cls.__fields__} + create_data.update(kwargs or {}) + return cls(**create_data) diff --git a/fuware/db/controller/__init__.py b/fuware/schemas/user/__init__.py similarity index 100% rename from fuware/db/controller/__init__.py rename to fuware/schemas/user/__init__.py diff --git a/fuware/schemas/user.py b/fuware/schemas/user/user.py similarity index 60% rename from fuware/schemas/user.py rename to fuware/schemas/user/user.py index 7f41620..a887804 100644 --- a/fuware/schemas/user.py +++ b/fuware/schemas/user/user.py @@ -1,8 +1,10 @@ from datetime import datetime -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict from fastapi import Form -class UserBase(BaseModel): +from fuware.schemas.fuware_model import FuwareModel + +class UserBase(FuwareModel): username: str = Form(...) class UserRequest(UserBase): @@ -12,13 +14,11 @@ class UserCreate(UserRequest): password: str = Form(...) name: str -class User(UserBase): +class PrivateUser(UserBase): id: str name: str is_admin: bool is_lock: bool created_at: datetime updated_at: datetime - - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) diff --git a/fuware/services/__init__.py b/fuware/services/__init__.py new file mode 100644 index 0000000..f4a2da0 --- /dev/null +++ b/fuware/services/__init__.py @@ -0,0 +1 @@ +from .user import * diff --git a/fuware/services/_base_service/__init__.py b/fuware/services/_base_service/__init__.py new file mode 100644 index 0000000..9334f71 --- /dev/null +++ b/fuware/services/_base_service/__init__.py @@ -0,0 +1,6 @@ +from fuware.core.config import get_app_settings + + +class BaseService: + def __init__(self) -> None: + self.setting = get_app_settings() diff --git a/fuware/services/user/__init__.py b/fuware/services/user/__init__.py new file mode 100644 index 0000000..dda534e --- /dev/null +++ b/fuware/services/user/__init__.py @@ -0,0 +1 @@ +from .user_service import * diff --git a/fuware/services/user/user_service.py b/fuware/services/user/user_service.py new file mode 100644 index 0000000..323f724 --- /dev/null +++ b/fuware/services/user/user_service.py @@ -0,0 +1,19 @@ + +from sqlalchemy.orm import Session +from fuware.repos import RepositoryUsers +from fuware.services._base_service import BaseService +from fuware.schemas import UserCreate + + +class UserService(BaseService): + def __init__(self): + self.repos = RepositoryUsers() + + def get_all(self, skip: int = 0, limit: int = 100): + return self.repos.get_all(skip=skip, limit=limit) + + def get_by_username(self, username: str): + return self.repos.get_by_username(username) + + def create(self, db: Session, user: UserCreate): + return self.repos.create(db=db, user=user) diff --git a/poetry.lock b/poetry.lock index 003240e..7dba2ca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -33,6 +33,46 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "bcrypt" +version = "4.1.3" +description = "Modern password hashing for your software and your servers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "bcrypt-4.1.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:48429c83292b57bf4af6ab75809f8f4daf52aa5d480632e53707805cc1ce9b74"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8bea4c152b91fd8319fef4c6a790da5c07840421c2b785084989bf8bbb7455"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d3b317050a9a711a5c7214bf04e28333cf528e0ed0ec9a4e55ba628d0f07c1a"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:094fd31e08c2b102a14880ee5b3d09913ecf334cd604af27e1013c76831f7b05"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4fb253d65da30d9269e0a6f4b0de32bd657a0208a6f4e43d3e645774fb5457f3"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:193bb49eeeb9c1e2db9ba65d09dc6384edd5608d9d672b4125e9320af9153a15"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8cbb119267068c2581ae38790e0d1fbae65d0725247a930fc9900c285d95725d"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6cac78a8d42f9d120b3987f82252bdbeb7e6e900a5e1ba37f6be6fe4e3848286"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01746eb2c4299dd0ae1670234bf77704f581dd72cc180f444bfe74eb80495b64"}, + {file = "bcrypt-4.1.3-cp37-abi3-win32.whl", hash = "sha256:037c5bf7c196a63dcce75545c8874610c600809d5d82c305dd327cd4969995bf"}, + {file = "bcrypt-4.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:8a893d192dfb7c8e883c4576813bf18bb9d59e2cfd88b68b725990f033f1b978"}, + {file = "bcrypt-4.1.3-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d4cf6ef1525f79255ef048b3489602868c47aea61f375377f0d00514fe4a78c"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5698ce5292a4e4b9e5861f7e53b1d89242ad39d54c3da451a93cac17b61921a"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec3c2e1ca3e5c4b9edb94290b356d082b721f3f50758bce7cce11d8a7c89ce84"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3a5be252fef513363fe281bafc596c31b552cf81d04c5085bc5dac29670faa08"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5f7cd3399fbc4ec290378b541b0cf3d4398e4737a65d0f938c7c0f9d5e686611"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:c4c8d9b3e97209dd7111bf726e79f638ad9224b4691d1c7cfefa571a09b1b2d6"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:31adb9cbb8737a581a843e13df22ffb7c84638342de3708a98d5c986770f2834"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:551b320396e1d05e49cc18dd77d970accd52b322441628aca04801bbd1d52a73"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6717543d2c110a155e6821ce5670c1f512f602eabb77dba95717ca76af79867d"}, + {file = "bcrypt-4.1.3-cp39-abi3-win32.whl", hash = "sha256:6004f5229b50f8493c49232b8e75726b568535fd300e5039e255d919fc3a07f2"}, + {file = "bcrypt-4.1.3-cp39-abi3-win_amd64.whl", hash = "sha256:2505b54afb074627111b5a8dc9b6ae69d0f01fea65c2fcaea403448c503d3991"}, + {file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:cb9c707c10bddaf9e5ba7cdb769f3e889e60b7d4fea22834b261f51ca2b89fed"}, + {file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9f8ea645eb94fb6e7bea0cf4ba121c07a3a182ac52876493870033141aa687bc"}, + {file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f44a97780677e7ac0ca393bd7982b19dbbd8d7228c1afe10b128fd9550eef5f1"}, + {file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d84702adb8f2798d813b17d8187d27076cca3cd52fe3686bb07a9083930ce650"}, + {file = "bcrypt-4.1.3.tar.gz", hash = "sha256:2ee15dd749f5952fe3f0430d0ff6b74082e159c50332a1413d51b5689cf06623"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + [[package]] name = "cffi" version = "1.16.0" @@ -488,6 +528,36 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.2.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.2.1-py3-none-any.whl", hash = "sha256:0235391d26db4d2190cb9b31051c4b46882d28a51533f97440867f012d4da091"}, + {file = "pydantic_settings-2.2.1.tar.gz", hash = "sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pyhumps" +version = "3.8.0" +description = "🐫 Convert strings (and dictionary keys) between snake case, camel case and pascal case in Python. Inspired by Humps for Node" +optional = false +python-versions = "*" +files = [ + {file = "pyhumps-3.8.0-py3-none-any.whl", hash = "sha256:060e1954d9069f428232a1adda165db0b9d8dfdce1d265d36df7fbff540acfd6"}, + {file = "pyhumps-3.8.0.tar.gz", hash = "sha256:498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3"}, +] + [[package]] name = "python-dotenv" version = "1.0.1" @@ -703,6 +773,17 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + [[package]] name = "typing-extensions" version = "4.11.0" @@ -955,4 +1036,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "539143b0355e37d8d3941ee1bbe1011faa541e29c88aebdc30b8ba813ab15d7f" +content-hash = "22414c8adf366f3f1121008853a3209f20781962a1eda18e4d8b8e4f551dc28a" diff --git a/pyproject.toml b/pyproject.toml index 239c87e..4b766dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,11 @@ sqlalchemy = "^2.0.29" cryptography = "^42.0.5" passlib = "^1.7.4" uvicorn = {version = "^0.29.0", extras = ["standard"]} +pydantic = "^2.7.1" +pydantic-settings = "^2.2.1" +text-unidecode = "^1.3" +pyhumps = "^3.8.0" +bcrypt = "^4.1.3" [tool.poetry.group.dev.dependencies] ruff = "^0.4.1" -- 2.47.2 From 392dee864066d0b3059214d54600a703a19435b6 Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Fri, 10 May 2024 06:31:31 +0000 Subject: [PATCH 3/7] build seeder --- fuware/core/security/__init__.py | 1 + fuware/db/init_db.py | 6 +++++- fuware/db/seeder.py | 28 ++++++++++++++++++++++++++++ fuware/routes/auth/auth.py | 22 ++++++++++++---------- fuware/ultis.py | 23 ----------------------- 5 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 fuware/db/seeder.py delete mode 100644 fuware/ultis.py diff --git a/fuware/core/security/__init__.py b/fuware/core/security/__init__.py index e69de29..040aee3 100644 --- a/fuware/core/security/__init__.py +++ b/fuware/core/security/__init__.py @@ -0,0 +1 @@ +from .hasher import get_hasher diff --git a/fuware/db/init_db.py b/fuware/db/init_db.py index edd9484..548a42f 100644 --- a/fuware/db/init_db.py +++ b/fuware/db/init_db.py @@ -1,5 +1,9 @@ from db_setup import engine +from fuware.db.seeder import initialize_table from models._model_base import Model -from models.users import * +from sqlalchemy import event +from models.users import User + +event.listen(User.__table__, 'after_create', initialize_table) Model.metadata.create_all(bind=engine) diff --git a/fuware/db/seeder.py b/fuware/db/seeder.py new file mode 100644 index 0000000..1e28774 --- /dev/null +++ b/fuware/db/seeder.py @@ -0,0 +1,28 @@ +from fuware.core.security import get_hasher + +hasher = get_hasher() + +INITIAL_DATA = { + 'users': [ + { + 'username': 'sam', + 'password': hasher.hash('admin'), + 'name': 'Sam', + 'is_admin': 1, + 'is_lock': 0, + }, + { + 'username': 'sam1', + 'password': hasher.hash('admin'), + 'name': 'Sam1', + 'is_admin': 0, + 'is_lock': 1 + }, + ] +} + +# This method receives a table, a connection and inserts data to that table. +def initialize_table(target, connection, **kwargs): + tablename = str(target) + if tablename in INITIAL_DATA and len(INITIAL_DATA[tablename]) > 0: + connection.execute(target.insert(), INITIAL_DATA[tablename]) diff --git a/fuware/routes/auth/auth.py b/fuware/routes/auth/auth.py index 0ee809a..ec1bc90 100644 --- a/fuware/routes/auth/auth.py +++ b/fuware/routes/auth/auth.py @@ -3,6 +3,7 @@ from fastapi import APIRouter, Depends, HTTPException, Response from fastapi.encoders import jsonable_encoder from sqlalchemy.orm import Session +from fuware.core.security.hasher import get_hasher from fuware.db.db_setup import generate_session from fuware.schemas import ReturnValue, PrivateUser, UserRequest from fuware.schemas.user.user import UserCreate @@ -10,8 +11,8 @@ from fuware.services import UserService public_router = APIRouter(tags=["Users: Authentication"]) - user_service = UserService() +hasher = get_hasher() @public_router.put('/register') def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> ReturnValue[Any]: @@ -22,14 +23,15 @@ def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> return ReturnValue(status=200, data=jsonable_encoder(user_return)) # @public_router.post('/login', response_model=ReturnValue[PrivateUser]) -# def user_login(user: UserRequest, response: Response) -> ReturnValue[Any]: -# db_user = UserService.get_by_username(user.username) -# if not db_user: -# raise HTTPException(status_code=401, detail="Your username or password input is wrong!") - # if not verify_password(user.password, db_user.password): - # raise HTTPException(status_code=401, detail="Your username or password input is wrong!") - # if db_user.is_lock is True: - # raise HTTPException(status_code=401, detail="Your Account is banned") +@public_router.post('/login', response_model=ReturnValue[Any]) +def user_login(user: UserRequest, response: Response) -> ReturnValue[Any]: + db_user = user_service.get_by_username(username=user.username) + if not db_user: + raise HTTPException(status_code=401, detail="Your username or password input is wrong!") + if not hasher.verify(password=user.password, hashed=db_user.password): + raise HTTPException(status_code=401, detail="Your username or password input is wrong!") + if db_user.is_lock is True: + raise HTTPException(status_code=401, detail="Your Account is banned") # cookieEncode = encryptString(user.username + ',' + user.password) # response.set_cookie(key=COOKIE_KEY, value=cookieEncode.decode('utf-8')) - # return ReturnValue(status=200, data=jsonable_encoder(db_user)) + return ReturnValue(status=200, data=jsonable_encoder(db_user)) diff --git a/fuware/ultis.py b/fuware/ultis.py deleted file mode 100644 index 5604805..0000000 --- a/fuware/ultis.py +++ /dev/null @@ -1,23 +0,0 @@ -from cryptography.fernet import Fernet -from passlib.context import CryptContext -from const import SERCET_KEY - -root_path = '/api' -pwd_context = CryptContext(schemes=["sha256_crypt"], deprecated="auto") - -def root_api_path_build(path): - return root_path + path - -def encryptString(strEncode: str): - fernet = Fernet(SERCET_KEY) - return fernet.encrypt(strEncode.encode()) - -def decryptString(strDecode: str): - fernet = Fernet(SERCET_KEY) - return fernet.decrypt(strDecode).decode() - -def verify_password(plain_password, hashed_password): - return pwd_context.verify(plain_password, hashed_password) - -def get_password_hash(password): - return pwd_context.hash(password) -- 2.47.2 From a7e31b8ca9f988ff0f9b4918c81189965066cf71 Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Sat, 11 May 2024 15:16:16 +0000 Subject: [PATCH 4/7] Add DB version with alimbic and add log system --- README.md | 38 +- Taskfile.yaml => Taskfile.yml | 0 alembic.ini | 116 ++++ alembic/README | 1 + alembic/env.py | 87 +++ alembic/script.py.mako | 26 + ...2dd727be7_create_user_and_session_modal.py | 66 +++ fuware/app.py | 33 +- fuware/core/logger/config.py | 1 - fuware/core/logger/logconf.dev.json | 15 + fuware/core/logger/logconf.prod.json | 63 +++ fuware/core/logger/logconf.test.json | 24 + fuware/core/root_logger.py | 43 ++ fuware/core/settings/settings.py | 6 + fuware/db/db_setup.py | 25 +- fuware/db/init_db.py | 92 +++- fuware/db/models/users/users.py | 22 +- fuware/repos/repository_users.py | 34 +- fuware/repos/seeder/__init__.py | 1 + fuware/repos/seeder/init_users.py | 33 ++ fuware/routes/auth/auth.py | 13 +- fuware/services/user/user_service.py | 19 +- poetry.lock | 507 ++++++++++++++---- pyproject.toml | 3 + 24 files changed, 1131 insertions(+), 137 deletions(-) rename Taskfile.yaml => Taskfile.yml (100%) create mode 100644 alembic.ini create mode 100644 alembic/README create mode 100644 alembic/env.py create mode 100644 alembic/script.py.mako create mode 100644 alembic/versions/8712dd727be7_create_user_and_session_modal.py create mode 100644 fuware/core/logger/logconf.dev.json create mode 100644 fuware/core/logger/logconf.prod.json create mode 100644 fuware/core/logger/logconf.test.json create mode 100644 fuware/core/root_logger.py create mode 100644 fuware/repos/seeder/__init__.py create mode 100644 fuware/repos/seeder/init_users.py diff --git a/README.md b/README.md index c264463..489c2a5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,39 @@ # fuware -the warehouse use to tracking item in house \ No newline at end of file +the warehouse use to tracking item in house + +# Common CLI + +### alembic + +generate migration + +```bash +alembic revision -m "version message" +``` + +```bash +alembic upgrade head +``` + +```bash +alembic history +``` + +```bash +alembic current +``` + +```bash +alembic downgrade -1 +``` + +```bash +alembic upgrade +1 +``` + +generate migration auto code + +```bash +alembic revision --autogenerate -m "version message" +``` diff --git a/Taskfile.yaml b/Taskfile.yml similarity index 100% rename from Taskfile.yaml rename to Taskfile.yml diff --git a/alembic.ini b/alembic.ini new file mode 100644 index 0000000..d088a53 --- /dev/null +++ b/alembic.ini @@ -0,0 +1,116 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python>=3.9 or backports.zoneinfo library. +# Any required deps can installed by adding `alembic[tz]` to the pip requirements +# string value is passed to ZoneInfo() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +# hooks = ruff +# ruff.type = exec +# ruff.executable = %(here)s/.venv/bin/ruff +# ruff.options = --fix REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/alembic/README b/alembic/README new file mode 100644 index 0000000..98e4f9c --- /dev/null +++ b/alembic/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/alembic/env.py b/alembic/env.py new file mode 100644 index 0000000..c210583 --- /dev/null +++ b/alembic/env.py @@ -0,0 +1,87 @@ +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +from fuware.core.config import get_app_settings +from fuware.db.models._model_base import SqlAlchemyBase + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +target_metadata = SqlAlchemyBase.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. +settings = get_app_settings() + +if not settings.DB_URL: + raise Exception("DB URL not set in config") + +config.set_main_option("sqlalchemy.url", settings.DB_URL.replace("%", "%%")) + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/alembic/script.py.mako b/alembic/script.py.mako new file mode 100644 index 0000000..fbc4b07 --- /dev/null +++ b/alembic/script.py.mako @@ -0,0 +1,26 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: Union[str, None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/alembic/versions/8712dd727be7_create_user_and_session_modal.py b/alembic/versions/8712dd727be7_create_user_and_session_modal.py new file mode 100644 index 0000000..35d30ba --- /dev/null +++ b/alembic/versions/8712dd727be7_create_user_and_session_modal.py @@ -0,0 +1,66 @@ +"""Create User and Session Modal + +Revision ID: 8712dd727be7 +Revises: +Create Date: 2024-05-11 12:44:09.963953 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '8712dd727be7' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('users', + sa.Column('id', sa.UUID(), nullable=False), + sa.Column('username', sa.String(), nullable=False), + sa.Column('password', sa.String(), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('is_admin', sa.Boolean(), nullable=True), + sa.Column('is_lock', sa.Boolean(), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('update_at', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_users_created_at'), 'users', ['created_at'], unique=False) + op.create_index(op.f('ix_users_id'), 'users', ['id'], unique=False) + op.create_index(op.f('ix_users_name'), 'users', ['name'], unique=False) + op.create_index(op.f('ix_users_password'), 'users', ['password'], unique=False) + op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True) + op.create_table('session_login', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('session', sa.UUID(), nullable=False), + sa.Column('user_id', sa.UUID(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('update_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_session_login_created_at'), 'session_login', ['created_at'], unique=False) + op.create_index(op.f('ix_session_login_session'), 'session_login', ['session'], unique=False) + op.create_index(op.f('ix_session_login_user_id'), 'session_login', ['user_id'], unique=True) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_session_login_user_id'), table_name='session_login') + op.drop_index(op.f('ix_session_login_session'), table_name='session_login') + op.drop_index(op.f('ix_session_login_created_at'), table_name='session_login') + op.drop_table('session_login') + op.drop_index(op.f('ix_users_username'), table_name='users') + op.drop_index(op.f('ix_users_password'), table_name='users') + op.drop_index(op.f('ix_users_name'), table_name='users') + op.drop_index(op.f('ix_users_id'), table_name='users') + op.drop_index(op.f('ix_users_created_at'), table_name='users') + op.drop_table('users') + # ### end Alembic commands ### diff --git a/fuware/app.py b/fuware/app.py index 6f1c60f..cdb3b21 100644 --- a/fuware/app.py +++ b/fuware/app.py @@ -1,27 +1,54 @@ +from collections.abc import AsyncGenerator +from contextlib import asynccontextmanager +from mimetypes import init from fastapi import FastAPI, Request, HTTPException from fastapi.responses import JSONResponse from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.gzip import GZipMiddleware from fuware.core.config import get_app_settings -from fuware import __version__ +from fuware.core.root_logger import get_logger from fuware.routes import router +from fuware import __version__ import uvicorn settings = get_app_settings() +logger = get_logger() description = f""" fuware is a web application for managing your hours items and tracking them. """ -# event.listen(models.User.__table__, 'after_create', initialize_table) +@asynccontextmanager +async def lifespan_fn(_: FastAPI) -> AsyncGenerator[None, None]: + logger.info("start: database initialization") + import fuware.db.init_db as init_db + + init_db.main() + logger.info("end: database initialization") + + logger.info("-----SYSTEM STARTUP-----") + # logger.info("------APP SETTINGS------") + # logger.info( + # settings.model_dump_json( + # indent=4, + # exclude={ + # "SECRET", + # "DB_URL", # replace by DB_URL_PUBLIC for logs + # "DB_PROVIDER", + # }, + # ) + # ) + yield + logger.info("-----SYSTEM SHUTDOWN-----") app = FastAPI( title="Fuware", description=description, version=__version__, docs_url=settings.DOCS_URL, - redoc_url=settings.REDOC_URL + redoc_url=settings.REDOC_URL, + lifespan=lifespan_fn, ) app.add_middleware(GZipMiddleware, minimum_size=1000) diff --git a/fuware/core/logger/config.py b/fuware/core/logger/config.py index 65598e2..519cc8b 100644 --- a/fuware/core/logger/config.py +++ b/fuware/core/logger/config.py @@ -7,7 +7,6 @@ from logging import config as logging_config __dir = pathlib.Path(__file__).parent __conf: dict[str, str] | None = None - def _load_config(path: pathlib.Path, substitutions: dict[str, str] | None = None) -> dict[str, typing.Any]: with open(path) as file: if substitutions: diff --git a/fuware/core/logger/logconf.dev.json b/fuware/core/logger/logconf.dev.json new file mode 100644 index 0000000..a35d2ba --- /dev/null +++ b/fuware/core/logger/logconf.dev.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "disable_existing_loggers": false, + "handlers": { + "rich": { + "class": "rich.logging.RichHandler" + } + }, + "loggers": { + "root": { + "level": "DEBUG", + "handlers": ["rich"] + } + } +} diff --git a/fuware/core/logger/logconf.prod.json b/fuware/core/logger/logconf.prod.json new file mode 100644 index 0000000..cc2c7ef --- /dev/null +++ b/fuware/core/logger/logconf.prod.json @@ -0,0 +1,63 @@ +{ + "version": 1, + "disable_existing_loggers": false, + "formatters": { + "simple": { + "format": "%(levelname)-8s %(asctime)s - %(message)s", + "datefmt": "%Y-%m-%dT%H:%M:%S" + }, + "detailed": { + "format": "[%(levelname)s|%(module)s|L%(lineno)d] %(asctime)s: %(message)s", + "datefmt": "%Y-%m-%dT%H:%M:%S" + }, + "access": { + "()": "uvicorn.logging.AccessFormatter", + "fmt": "%(levelname)-8s %(asctime)s - [%(client_addr)s] %(status_code)s \"%(request_line)s\"", + "datefmt": "%Y-%m-%dT%H:%M:%S" + } + }, + "handlers": { + "stderr": { + "class": "logging.StreamHandler", + "level": "WARNING", + "formatter": "simple", + "stream": "ext://sys.stderr" + }, + "stdout": { + "class": "logging.StreamHandler", + "level": "${LOG_LEVEL}", + "formatter": "simple", + "stream": "ext://sys.stdout" + }, + "access": { + "class": "logging.StreamHandler", + "level": "${LOG_LEVEL}", + "formatter": "access", + "stream": "ext://sys.stdout" + }, + "file": { + "class": "logging.handlers.RotatingFileHandler", + "level": "DEBUG", + "formatter": "detailed", + "filename": "${DATA_DIR}/mealie.log", + "maxBytes": 10000, + "backupCount": 3 + } + }, + "loggers": { + "root": { + "level": "${LOG_LEVEL}", + "handlers": ["stderr", "file", "stdout"] + }, + "uvicorn.error": { + "handlers": ["stderr", "file", "stdout"], + "level": "${LOG_LEVEL}", + "propagate": false + }, + "uvicorn.access": { + "handlers": ["access", "file"], + "level": "${LOG_LEVEL}", + "propagate": false + } + } +} diff --git a/fuware/core/logger/logconf.test.json b/fuware/core/logger/logconf.test.json new file mode 100644 index 0000000..dccd8a0 --- /dev/null +++ b/fuware/core/logger/logconf.test.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "disable_existing_loggers": false, + "formatters": { + "detailed": { + "format": "[%(levelname)s|%(module)s|L%(lineno)d] %(asctime)s: %(message)s", + "datefmt": "%Y-%m-%dT%H:%M:%S" + } + }, + "handlers": { + "stdout": { + "class": "logging.StreamHandler", + "level": "DEBUG", + "formatter": "detailed", + "stream": "ext://sys.stdout" + } + }, + "loggers": { + "root": { + "level": "${LOG_LEVEL}", + "handlers": ["stdout"] + } + } +} diff --git a/fuware/core/root_logger.py b/fuware/core/root_logger.py new file mode 100644 index 0000000..873772d --- /dev/null +++ b/fuware/core/root_logger.py @@ -0,0 +1,43 @@ +import logging + +from .config import get_app_settings +from .logger.config import configured_logger + +__root_logger: None | logging.Logger = None + + +def get_logger(module=None) -> logging.Logger: + """ + Get a logger instance for a module, in most cases module should not be + provided. Simply using the root logger is sufficient. + + Cases where you would want to use a module specific logger might be a background + task or a long running process where you want to easily identify the source of + those messages + """ + global __root_logger + + if __root_logger is None: + app_settings = get_app_settings() + + mode = "development" + + if app_settings.TESTING: + mode = "testing" + elif app_settings.PRODUCTION: + mode = "production" + + substitutions = { + "LOG_LEVEL": app_settings.LOG_LEVEL.upper(), + } + + __root_logger = configured_logger( + mode=mode, + config_override=app_settings.LOG_CONFIG_OVERRIDE, + substitutions=substitutions, + ) + + if module is None: + return __root_logger + + return __root_logger.getChild(module) diff --git a/fuware/core/settings/settings.py b/fuware/core/settings/settings.py index f42e89b..ec4901c 100644 --- a/fuware/core/settings/settings.py +++ b/fuware/core/settings/settings.py @@ -32,6 +32,12 @@ class AppSettings(BaseSettings): SECRET: str COOKIE_KEY: str + LOG_CONFIG_OVERRIDE: Path | None = None + """path to custom logging configuration file""" + + LOG_LEVEL: str = "info" + """corresponds to standard Python log levels""" + @property def DOCS_URL(self) -> str | None: return "/docs" if self.API_DOCS else None diff --git a/fuware/db/db_setup.py b/fuware/db/db_setup.py index a51e60e..bc64ee7 100644 --- a/fuware/db/db_setup.py +++ b/fuware/db/db_setup.py @@ -1,8 +1,8 @@ from collections.abc import Generator +from contextlib import contextmanager from sqlalchemy.orm.session import Session -from sqlalchemy import create_engine, event, Engine, text +from sqlalchemy import create_engine, event, Engine from sqlalchemy.orm import scoped_session, sessionmaker - from fuware.core.config import get_app_settings settings = get_app_settings() @@ -10,13 +10,13 @@ settings = get_app_settings() def sql_global_init(db_url: str): connect_args = {"check_same_thread": False} - engine = create_engine(db_url, echo=True, connect_args=connect_args, pool_pre_ping=True, future=True) + engine = create_engine(db_url, echo=False, connect_args=connect_args, pool_pre_ping=True, future=True) SessionLocal = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True)) return SessionLocal, engine -SessionLocal, engine = sql_global_init(settings.DB_URL) # type: ignore +SessionLocal, engine = sql_global_init(settings.DB_URL) @event.listens_for(Engine, "connect") def set_sqlite_pragma(dbapi_connection, connection_record): @@ -24,10 +24,21 @@ def set_sqlite_pragma(dbapi_connection, connection_record): cursor.execute("PRAGMA foreign_keys=ON") cursor.close() -# with engine.connect() as connection: -# result = connection.execute(text('select "Hello"')) +@contextmanager +def session_context() -> Session: # type: ignore + """ + session_context() provides a managed session to the database that is automatically + closed when the context is exited. This is the preferred method of accessing the + database. -# print(result.all()) + Note: use `generate_session` when using the `Depends` function from FastAPI + """ + global SessionLocal + sess = SessionLocal() + try: + yield sess + finally: + sess.close() def generate_session() -> Generator[Session, None, None]: db = SessionLocal() diff --git a/fuware/db/init_db.py b/fuware/db/init_db.py index 548a42f..b0de2b8 100644 --- a/fuware/db/init_db.py +++ b/fuware/db/init_db.py @@ -1,9 +1,87 @@ -from db_setup import engine -from fuware.db.seeder import initialize_table -from models._model_base import Model -from sqlalchemy import event -from models.users import User +import os +from pathlib import Path +from time import sleep -event.listen(User.__table__, 'after_create', initialize_table) +from sqlalchemy import engine, orm, text -Model.metadata.create_all(bind=engine) +from alembic import command, config, script +from alembic.config import Config +from alembic.runtime import migration +from fuware.core import root_logger +from fuware.core.config import get_app_settings +from fuware.db.db_setup import session_context +from fuware.repos.repository_users import RepositoryUsers +from fuware.repos.seeder import default_users_init +from fuware.db.models._model_base import Model +# from fuware.db.models import User + +PROJECT_DIR = Path(__file__).parent.parent.parent + +logger = root_logger.get_logger() + +def init_db(db) -> None: + logger.info("Initializing user data...") + default_users_init(db) + +def db_is_at_head(alembic_cfg: config.Config) -> bool: + settings = get_app_settings() + url = settings.DB_URL + + if not url: + raise ValueError("No database url found") + + connectable = engine.create_engine(url) + directory = script.ScriptDirectory.from_config(alembic_cfg) + with connectable.begin() as connection: + context = migration.MigrationContext.configure(connection) + return set(context.get_current_heads()) == set(directory.get_heads()) + +def connect(session: orm.Session) -> bool: + try: + session.execute(text("SELECT 1")) + return True + except Exception as e: + logger.error(f"Error connecting to database: {e}") + return False + +def main(): + max_retry = 10 + wait_seconds = 1 + + with session_context() as session: + while True: + if connect(session): + logger.info("Database connection established.") + break + + logger.error(f"Database connection failed. Retrying in {wait_seconds} seconds...") + max_retry -= 1 + + sleep(wait_seconds) + + if max_retry == 0: + raise ConnectionError("Database connection failed - exiting application.") + + alembic_cfg_path = os.getenv("ALEMBIC_CONFIG_FILE", default=str(PROJECT_DIR / "alembic.ini")) + if not os.path.isfile(alembic_cfg_path): + raise Exception("Provided alembic config path doesn't exist") + + alembic_cfg = Config(alembic_cfg_path) + if db_is_at_head(alembic_cfg): + logger.debug("Migration not needed.") + else: + logger.info("Migration needed. Performing migration...") + command.upgrade(alembic_cfg, "head") + + if session.get_bind().name == "postgresql": # needed for fuzzy search and fast GIN text indices + session.execute(text("CREATE EXTENSION IF NOT EXISTS pg_trgm;")) + + users = RepositoryUsers() + if users.get_all(): + logger.info("Database already seeded.") + else: + logger.info("Seeding database...") + init_db(session) + +if __name__ == "__main__": + main() diff --git a/fuware/db/models/users/users.py b/fuware/db/models/users/users.py index c0c7228..b7ba6c1 100644 --- a/fuware/db/models/users/users.py +++ b/fuware/db/models/users/users.py @@ -1,6 +1,6 @@ -import uuid -from sqlalchemy import Boolean, Column, String -from sqlalchemy.orm import Mapped, mapped_column +from uuid import uuid4 +from sqlalchemy import Boolean, ForeignKey, String +from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.dialects.postgresql import UUID @@ -9,12 +9,26 @@ from .._model_base import SqlAlchemyBase class User(SqlAlchemyBase): __tablename__ = 'users' - id: Mapped[UUID] = mapped_column(UUID, primary_key=True, default=uuid.uuid4, index=True) + id: Mapped[UUID] = mapped_column(UUID, primary_key=True, default=uuid4, index=True) username: Mapped[str | None] = mapped_column(String, unique=True, index=True, nullable=False) password: Mapped[str | None] = mapped_column(String, index=True, nullable=False) name: Mapped[str | None] = mapped_column(String, index=True, nullable=True) is_admin: Mapped[bool | None] = mapped_column(Boolean, default=False) is_lock: Mapped[bool | None] = mapped_column(Boolean, default=False) + session_login = relationship("SessionLogin", back_populates="user", uselist=False) + def __repr__(self): return f"{self.__class__.__name__}, name: {self.name}, username: {self.username}" + +class SessionLogin(SqlAlchemyBase): + __tablename__ = 'session_login' + + id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + session: Mapped[str] = mapped_column(UUID, default=uuid4, index=True, nullable=False) + user_id: Mapped[str] = mapped_column(ForeignKey("users.id"), unique=True, index=True, nullable=False) + + user = relationship("User", back_populates="session_login") + + def __repr__(self): + return f"{self.__class__.__name__}, session: {self.session}, user_id: {self.user_id}" diff --git a/fuware/repos/repository_users.py b/fuware/repos/repository_users.py index ae9d773..4e3bf8a 100644 --- a/fuware/repos/repository_users.py +++ b/fuware/repos/repository_users.py @@ -1,5 +1,5 @@ from fuware.core.security.hasher import get_hasher -from fuware.db.models.users.users import User +from fuware.db.models import SessionLogin, User from fuware.schemas import UserCreate from sqlalchemy.orm import Session @@ -7,6 +7,7 @@ from sqlalchemy.orm import Session class RepositoryUsers: def __init__(self): self.user = User() + self.sessionLogin = SessionLogin() def get_all(self, skip: int = 0, limit: int = 100): return self.user.query.offset(skip).limit(limit).all() @@ -26,3 +27,34 @@ class RepositoryUsers: db.refresh(db_user) return db_user + + def get_session_by_user_id(self, user_id: str): + return self.sessionLogin.query.filter_by(user_id=user_id).first() + + def create_session(self, db: Session, user_id: str): + try: + db_ss = SessionLogin(user_id=user_id) + db.add(db_ss) + db.commit() + except Exception: + db.rollback() + raise + + db.refresh(db_ss) + return db_ss + + def login(self, db: Session, user_id: str): + db_ss = self.get_session_by_user_id(user_id) + if not db_ss: + db_ss = self.create_session(db=db, user_id=user_id) + return db_ss + + def logout(self, db: Session, user_ss: str): + db_ss = self.sessionLogin.query.filter_by(session=user_ss).first() + try: + db.delete(db_ss) + db.commit() + except Exception as e: + db.rollback() + raise e + pass diff --git a/fuware/repos/seeder/__init__.py b/fuware/repos/seeder/__init__.py new file mode 100644 index 0000000..28251c6 --- /dev/null +++ b/fuware/repos/seeder/__init__.py @@ -0,0 +1 @@ +from .init_users import default_users_init diff --git a/fuware/repos/seeder/init_users.py b/fuware/repos/seeder/init_users.py new file mode 100644 index 0000000..93dfde0 --- /dev/null +++ b/fuware/repos/seeder/init_users.py @@ -0,0 +1,33 @@ +from fuware.core.config import get_app_settings +from fuware.core.root_logger import get_logger +from fuware.repos.repository_users import RepositoryUsers +from sqlalchemy.orm import Session + +from fuware.schemas.user.user import UserCreate + + +logger = get_logger("init_users") +settings = get_app_settings() + +def dev_users() -> list[dict]: + return [ + { + "username": "sam", + "password": "admin", + "name": "Sam", + "is_admin": 1, + "is_lock": 0, + }, + { + "username": "sam1", + "password": "admin", + "name": "Sam1", + "is_admin": 0, + "is_lock": 1 + }, + ] + +def default_users_init(session: Session): + users = RepositoryUsers() + for user in dev_users(): + users.create(session, UserCreate(**user)) diff --git a/fuware/routes/auth/auth.py b/fuware/routes/auth/auth.py index ec1bc90..9471a2c 100644 --- a/fuware/routes/auth/auth.py +++ b/fuware/routes/auth/auth.py @@ -3,9 +3,10 @@ from fastapi import APIRouter, Depends, HTTPException, Response from fastapi.encoders import jsonable_encoder from sqlalchemy.orm import Session +from fuware.core.config import get_app_settings from fuware.core.security.hasher import get_hasher from fuware.db.db_setup import generate_session -from fuware.schemas import ReturnValue, PrivateUser, UserRequest +from fuware.schemas import ReturnValue, UserRequest from fuware.schemas.user.user import UserCreate from fuware.services import UserService @@ -13,6 +14,7 @@ from fuware.services import UserService public_router = APIRouter(tags=["Users: Authentication"]) user_service = UserService() hasher = get_hasher() +settings = get_app_settings() @public_router.put('/register') def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> ReturnValue[Any]: @@ -22,16 +24,15 @@ def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> user_return = user_service.create(db=db, user=user) return ReturnValue(status=200, data=jsonable_encoder(user_return)) -# @public_router.post('/login', response_model=ReturnValue[PrivateUser]) @public_router.post('/login', response_model=ReturnValue[Any]) -def user_login(user: UserRequest, response: Response) -> ReturnValue[Any]: +def user_login(user: UserRequest, response: Response, db: Session = Depends(generate_session)) -> ReturnValue[Any]: db_user = user_service.get_by_username(username=user.username) if not db_user: raise HTTPException(status_code=401, detail="Your username or password input is wrong!") if not hasher.verify(password=user.password, hashed=db_user.password): raise HTTPException(status_code=401, detail="Your username or password input is wrong!") if db_user.is_lock is True: - raise HTTPException(status_code=401, detail="Your Account is banned") - # cookieEncode = encryptString(user.username + ',' + user.password) - # response.set_cookie(key=COOKIE_KEY, value=cookieEncode.decode('utf-8')) + raise HTTPException(status_code=401, detail="Your Account was locked") + cookieEncode = user_service.check_login(db=db, user_id=db_user.id) + response.set_cookie(key=settings.COOKIE_KEY, value=cookieEncode.session) return ReturnValue(status=200, data=jsonable_encoder(db_user)) diff --git a/fuware/services/user/user_service.py b/fuware/services/user/user_service.py index 323f724..2f25120 100644 --- a/fuware/services/user/user_service.py +++ b/fuware/services/user/user_service.py @@ -1,9 +1,12 @@ +from fastapi import HTTPException from sqlalchemy.orm import Session +from fuware.core.security.hasher import get_hasher from fuware.repos import RepositoryUsers +from fuware.schemas import UserRequest, UserCreate from fuware.services._base_service import BaseService -from fuware.schemas import UserCreate +hasher = get_hasher() class UserService(BaseService): def __init__(self): @@ -17,3 +20,17 @@ class UserService(BaseService): def create(self, db: Session, user: UserCreate): return self.repos.create(db=db, user=user) + + def check_exist(self, db: Session, user: UserRequest): + db_user = self.get_by_username(username=user.username) + if not db_user: + raise HTTPException(status_code=401, detail="Your username or password input is wrong!") + if not hasher.verify(password=user.password, hashed=db_user.password): + raise HTTPException(status_code=401, detail="Your username or password input is wrong!") + if db_user.is_lock is True: + raise HTTPException(status_code=401, detail="Your Account is banned") + return db_user + + def check_login(self, db: Session, user_id: str): + db_session = self.repos.login(db=db, user_id=user_id) + return db_session diff --git a/poetry.lock b/poetry.lock index 7dba2ca..0d55904 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,24 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +[[package]] +name = "alembic" +version = "1.13.1" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.8" +files = [ + {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, + {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["backports.zoneinfo"] + [[package]] name = "annotated-types" version = "0.6.0" @@ -33,6 +52,20 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "astroid" +version = "3.1.0" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, + {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] name = "bcrypt" version = "4.1.3" @@ -164,43 +197,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] @@ -216,6 +249,21 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + [[package]] name = "exceptiongroup" version = "1.2.1" @@ -232,13 +280,13 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.110.2" +version = "0.110.3" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.110.2-py3-none-any.whl", hash = "sha256:239403f2c0a3dda07a9420f95157a7f014ddb2b770acdbc984f9bdf3ead7afdb"}, - {file = "fastapi-0.110.2.tar.gz", hash = "sha256:b53d673652da3b65e8cd787ad214ec0fe303cad00d2b529b86ce7db13f17518d"}, + {file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"}, + {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"}, ] [package.dependencies] @@ -247,7 +295,7 @@ starlette = ">=0.37.2,<0.38.0" typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "greenlet" @@ -390,6 +438,154 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "mako" +version = "1.3.3" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Mako-1.3.3-py3-none-any.whl", hash = "sha256:5324b88089a8978bf76d1629774fcc2f1c07b82acdf00f4c5dd8ceadfffc4b40"}, + {file = "Mako-1.3.3.tar.gz", hash = "sha256:e16c01d9ab9c11f7290eef1cfefc093fb5a45ee4a3da09e2fec2e4d1bae54e73"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "passlib" version = "1.7.4" @@ -407,6 +603,22 @@ bcrypt = ["bcrypt (>=3.1.0)"] build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] totp = ["cryptography"] +[[package]] +name = "platformdirs" +version = "4.2.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + [[package]] name = "pycparser" version = "2.22" @@ -547,6 +759,20 @@ python-dotenv = ">=0.21.0" toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyhumps" version = "3.8.0" @@ -558,6 +784,35 @@ files = [ {file = "pyhumps-3.8.0.tar.gz", hash = "sha256:498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3"}, ] +[[package]] +name = "pylint" +version = "3.1.0" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, + {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, +] + +[package.dependencies] +astroid = ">=3.1.0,<=3.2.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, +] +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + [[package]] name = "python-dotenv" version = "1.0.1" @@ -632,30 +887,48 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "ruff" -version = "0.4.2" +version = "0.4.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, - {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, - {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, - {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, - {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, - {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, + {file = "ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6"}, + {file = "ruff-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95"}, + {file = "ruff-0.4.4-py3-none-win32.whl", hash = "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876"}, + {file = "ruff-0.4.4-py3-none-win_amd64.whl", hash = "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae"}, + {file = "ruff-0.4.4-py3-none-win_arm64.whl", hash = "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6"}, + {file = "ruff-0.4.4.tar.gz", hash = "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af"}, ] [[package]] @@ -671,60 +944,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.29" +version = "2.0.30" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, - {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, - {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, + {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, + {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, ] [package.dependencies] @@ -784,6 +1057,28 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.5" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, +] + [[package]] name = "typing-extensions" version = "4.11.0" @@ -1036,4 +1331,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "22414c8adf366f3f1121008853a3209f20781962a1eda18e4d8b8e4f551dc28a" +content-hash = "88c334ca5304e6f095e81628512c132bb419f9ee5bb7e1e278a0b9d5f94b84c5" diff --git a/pyproject.toml b/pyproject.toml index 4b766dc..46beb45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,9 +18,12 @@ pydantic-settings = "^2.2.1" text-unidecode = "^1.3" pyhumps = "^3.8.0" bcrypt = "^4.1.3" +alembic = "^1.13.1" [tool.poetry.group.dev.dependencies] ruff = "^0.4.1" +rich = "^13.7.1" +pylint = "^3.1.0" [build-system] requires = ["poetry-core"] -- 2.47.2 From 4a4d8e762ce807213f2e8cc80c2fd31666f4a646 Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Mon, 13 May 2024 03:16:06 +0000 Subject: [PATCH 5/7] add FE source --- .vscode/settings.json | 10 + README.md | 31 + Taskfile.yml | 5 + fuware-fe/.dockerignore | 7 + fuware-fe/.eslintrc.cjs | 32 + fuware-fe/.gitignore | 24 + fuware-fe/.gitignore copy | 24 + fuware-fe/.lintstagedrc | 3 + fuware-fe/.prettierignore | 4 + fuware-fe/.prettierrc | 7 + fuware-fe/Dockerfile | 14 + fuware-fe/index copy.html | 17 + fuware-fe/index.html | 13 + fuware-fe/jsconfig.json | 15 + fuware-fe/jsconfig.paths.json | 17 + fuware-fe/package.json | 36 + fuware-fe/pnpm-lock.yaml | 2787 ++++++++++++++++++++ fuware-fe/public/vite.svg | 1 + fuware-fe/src/App.css | 28 + fuware-fe/src/App.jsx | 15 + fuware-fe/src/api/auth.js | 10 + fuware-fe/src/api/feature.js | 6 + fuware-fe/src/api/index.js | 38 + fuware-fe/src/api/url.js | 3 + fuware-fe/src/assets/solid.svg | 1 + fuware-fe/src/components/Header.jsx | 77 + fuware-fe/src/components/Navbar/Navbar.jsx | 34 + fuware-fe/src/components/Navbar/index.js | 1 + fuware-fe/src/context/SiteContext.jsx | 48 + fuware-fe/src/hooks/useLanguage.js | 15 + fuware-fe/src/index.css | 31 + fuware-fe/src/index.jsx | 30 + fuware-fe/src/lang/en.json | 4 + fuware-fe/src/lang/vi.json | 10 + fuware-fe/src/pages/Dashboard.jsx | 3 + fuware-fe/src/pages/Home.jsx | 12 + fuware-fe/src/pages/Layout.jsx | 30 + fuware-fe/src/pages/Login.jsx | 141 + fuware-fe/src/pages/NotFound.jsx | 3 + fuware-fe/src/routes/index.js | 1 + fuware-fe/src/routes/routes.js | 21 + fuware-fe/src/utils/enum.js | 3 + fuware-fe/src/utils/helper.js | 42 + fuware-fe/vite.config.js | 73 + 44 files changed, 3727 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 fuware-fe/.dockerignore create mode 100644 fuware-fe/.eslintrc.cjs create mode 100644 fuware-fe/.gitignore create mode 100644 fuware-fe/.gitignore copy create mode 100644 fuware-fe/.lintstagedrc create mode 100644 fuware-fe/.prettierignore create mode 100644 fuware-fe/.prettierrc create mode 100644 fuware-fe/Dockerfile create mode 100644 fuware-fe/index copy.html create mode 100644 fuware-fe/index.html create mode 100644 fuware-fe/jsconfig.json create mode 100644 fuware-fe/jsconfig.paths.json create mode 100644 fuware-fe/package.json create mode 100644 fuware-fe/pnpm-lock.yaml create mode 100644 fuware-fe/public/vite.svg create mode 100644 fuware-fe/src/App.css create mode 100644 fuware-fe/src/App.jsx create mode 100644 fuware-fe/src/api/auth.js create mode 100644 fuware-fe/src/api/feature.js create mode 100644 fuware-fe/src/api/index.js create mode 100644 fuware-fe/src/api/url.js create mode 100644 fuware-fe/src/assets/solid.svg create mode 100644 fuware-fe/src/components/Header.jsx create mode 100644 fuware-fe/src/components/Navbar/Navbar.jsx create mode 100644 fuware-fe/src/components/Navbar/index.js create mode 100644 fuware-fe/src/context/SiteContext.jsx create mode 100644 fuware-fe/src/hooks/useLanguage.js create mode 100644 fuware-fe/src/index.css create mode 100644 fuware-fe/src/index.jsx create mode 100644 fuware-fe/src/lang/en.json create mode 100644 fuware-fe/src/lang/vi.json create mode 100644 fuware-fe/src/pages/Dashboard.jsx create mode 100644 fuware-fe/src/pages/Home.jsx create mode 100644 fuware-fe/src/pages/Layout.jsx create mode 100644 fuware-fe/src/pages/Login.jsx create mode 100644 fuware-fe/src/pages/NotFound.jsx create mode 100644 fuware-fe/src/routes/index.js create mode 100644 fuware-fe/src/routes/routes.js create mode 100644 fuware-fe/src/utils/enum.js create mode 100644 fuware-fe/src/utils/helper.js create mode 100644 fuware-fe/vite.config.js diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..265989a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "editor.codeActionsOnSave": { + "source.organizeImports": "always", + "source.fixAll": "always" + }, + "editor.formatOnSaveMode": "modificationsIfAvailable", + "editor.insertSpaces": true, + "editor.tabSize": 2, + "python.analysis.autoImportCompletions": true +} diff --git a/README.md b/README.md index 489c2a5..2723b2e 100644 --- a/README.md +++ b/README.md @@ -37,3 +37,34 @@ generate migration auto code ```bash alembic revision --autogenerate -m "version message" ``` + +# Front-end + +## Usage + +```bash +$ npm install # or pnpm install or yarn install +``` + +### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs) + +## Available Scripts + +In the project directory, you can run: + +### `npm run dev` + +Runs the app in the development mode.
+Open [http://localhost:5173](http://localhost:5173) to view it in the browser. + +### `npm run build` + +Builds the app for production to the `dist` folder.
+It correctly bundles Solid in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! + +## Deployment + +Learn more about deploying your application with the [documentations](https://vitejs.dev/guide/static-deploy.html) diff --git a/Taskfile.yml b/Taskfile.yml index 8832313..ad2e949 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -20,3 +20,8 @@ tasks: desc: runs the backend server cmds: - poetry run python fuware/app.py + ui:dev: + desc: runs the frontend server + dir: fuware-fe + cmds: + - pnpm dev diff --git a/fuware-fe/.dockerignore b/fuware-fe/.dockerignore new file mode 100644 index 0000000..8d8bf1c --- /dev/null +++ b/fuware-fe/.dockerignore @@ -0,0 +1,7 @@ +Dockerfile +.dockerignore +node_modules +README.md +.git +.gitignore +.env diff --git a/fuware-fe/.eslintrc.cjs b/fuware-fe/.eslintrc.cjs new file mode 100644 index 0000000..f353c82 --- /dev/null +++ b/fuware-fe/.eslintrc.cjs @@ -0,0 +1,32 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + plugins: ['solid'], + extends: ['eslint:recommended', 'plugin:solid/recommended'], + overrides: [ + { + env: { + node: true, + }, + files: ['.eslintrc.{js,cjs}'], + parserOptions: { + sourceType: 'script', + }, + }, + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + indent: ['warn', 2], + quotes: ['error', 'single'], + semi: ['error', 'never'], + 'max-lines-per-function': [1, 1000], + 'no-unused-vars': ['warn'], + }, +} diff --git a/fuware-fe/.gitignore b/fuware-fe/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/fuware-fe/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/fuware-fe/.gitignore copy b/fuware-fe/.gitignore copy new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/fuware-fe/.gitignore copy @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/fuware-fe/.lintstagedrc b/fuware-fe/.lintstagedrc new file mode 100644 index 0000000..9cac71b --- /dev/null +++ b/fuware-fe/.lintstagedrc @@ -0,0 +1,3 @@ +{ + "src/**/*.{js,jsx}": ["pnpm eslint", "pnpm prettier"] +} diff --git a/fuware-fe/.prettierignore b/fuware-fe/.prettierignore new file mode 100644 index 0000000..4f671c2 --- /dev/null +++ b/fuware-fe/.prettierignore @@ -0,0 +1,4 @@ + +/node_modules +/public +/build diff --git a/fuware-fe/.prettierrc b/fuware-fe/.prettierrc new file mode 100644 index 0000000..41d3fb8 --- /dev/null +++ b/fuware-fe/.prettierrc @@ -0,0 +1,7 @@ +{ + "trailingComma": "all", + "useTabs": false, + "tabWidth": 2, + "semi": false, + "singleQuote": true +} diff --git a/fuware-fe/Dockerfile b/fuware-fe/Dockerfile new file mode 100644 index 0000000..e4294c7 --- /dev/null +++ b/fuware-fe/Dockerfile @@ -0,0 +1,14 @@ +FROM node:18.19.0-alpine3.19 + +WORKDIR /app/client + +COPY package*.json . +RUN npm i + +COPY . . +ENV NODE_ENV=production +ENV VITE_LOGIN_KEY=7fo24CMyIc + +EXPOSE 5000 + +CMD ["npm", "run", "dev"] diff --git a/fuware-fe/index copy.html b/fuware-fe/index copy.html new file mode 100644 index 0000000..0ca60a5 --- /dev/null +++ b/fuware-fe/index copy.html @@ -0,0 +1,17 @@ + + + + + + + + League of legend Skins + + +
+ + + diff --git a/fuware-fe/index.html b/fuware-fe/index.html new file mode 100644 index 0000000..c5e49ef --- /dev/null +++ b/fuware-fe/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Solid + + +
+ + + diff --git a/fuware-fe/jsconfig.json b/fuware-fe/jsconfig.json new file mode 100644 index 0000000..44e11aa --- /dev/null +++ b/fuware-fe/jsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "./jsconfig.paths.json", + "compilerOptions": { + "module": "ESNext", + "jsx": "preserve", + "target": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": false, + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + } +} diff --git a/fuware-fe/jsconfig.paths.json b/fuware-fe/jsconfig.paths.json new file mode 100644 index 0000000..c291a0b --- /dev/null +++ b/fuware-fe/jsconfig.paths.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@api/*": ["src/api/*"], + "@pages/*": ["src/pages/*"], + "@components/*": ["src/components/*"], + "@routes/*": ["src/routes/*"], + "@utils/*": ["src/utils/*"], + "@assets/*": ["src/assets/*"], + "@context/*": ["src/context/*"], + "@lang/*": ["src/lang/*"], + "@hooks/*": ["src/hooks/*"], + "@/*": ["src/*"] + } + } +} diff --git a/fuware-fe/package.json b/fuware-fe/package.json new file mode 100644 index 0000000..2a9a454 --- /dev/null +++ b/fuware-fe/package.json @@ -0,0 +1,36 @@ +{ + "name": "fuware-fe", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "eslint": "eslint \"src/**/*.{js,jsx}\" --fix", + "prettier": "prettier \"src/**/*.{js,jsx}\" --write" + }, + "dependencies": { + "@hope-ui/solid": "^0.6.7", + "@solidjs/router": "^0.13.3", + "@stitches/core": "^1.2.8", + "@tabler/icons-solidjs": "^3.3.0", + "axios": "^1.6.8", + "crypto-js": "^4.2.0", + "solid-form-handler": "^1.2.3", + "solid-js": "^1.8.15", + "solid-styled-components": "^0.28.5", + "yup": "^1.4.0" + }, + "devDependencies": { + "eslint": "^9.2.0", + "eslint-plugin-solid": "^0.14.0", + "lint-staged": "15.2.2", + "prettier": "3.2.5", + "vite": "^5.2.0", + "vite-plugin-mkcert": "^1.17.5", + "vite-plugin-solid": "^2.10.2" + }, + "proxy": "http://localhost:9000" +} diff --git a/fuware-fe/pnpm-lock.yaml b/fuware-fe/pnpm-lock.yaml new file mode 100644 index 0000000..0d5f102 --- /dev/null +++ b/fuware-fe/pnpm-lock.yaml @@ -0,0 +1,2787 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@hope-ui/solid': + specifier: ^0.6.7 + version: 0.6.7(@stitches/core@1.2.8)(solid-js@1.8.17)(solid-transition-group@0.0.10(solid-js@1.8.17)) + '@solidjs/router': + specifier: ^0.13.3 + version: 0.13.3(solid-js@1.8.17) + '@stitches/core': + specifier: ^1.2.8 + version: 1.2.8 + '@tabler/icons-solidjs': + specifier: ^3.3.0 + version: 3.3.0(solid-js@1.8.17) + axios: + specifier: ^1.6.8 + version: 1.6.8(debug@4.3.4) + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 + solid-form-handler: + specifier: ^1.2.3 + version: 1.2.3(solid-js@1.8.17) + solid-js: + specifier: ^1.8.15 + version: 1.8.17 + solid-styled-components: + specifier: ^0.28.5 + version: 0.28.5(solid-js@1.8.17) + yup: + specifier: ^1.4.0 + version: 1.4.0 + devDependencies: + eslint: + specifier: ^9.2.0 + version: 9.2.0 + eslint-plugin-solid: + specifier: ^0.14.0 + version: 0.14.0(eslint@9.2.0)(typescript@5.4.5) + lint-staged: + specifier: 15.2.2 + version: 15.2.2 + prettier: + specifier: 3.2.5 + version: 3.2.5 + vite: + specifier: ^5.2.0 + version: 5.2.11 + vite-plugin-mkcert: + specifier: ^1.17.5 + version: 1.17.5(vite@5.2.11) + vite-plugin-solid: + specifier: ^2.10.2 + version: 2.10.2(solid-js@1.8.17)(vite@5.2.11) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.4': + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.5': + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.5': + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.5': + resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.5': + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.5': + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.5': + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.5': + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.5': + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.5': + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.5': + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@3.0.2': + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.2.0': + resolution: {integrity: sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@0.6.2': + resolution: {integrity: sha512-jktYRmZwmau63adUG3GKOAVCofBXkk55S/zQ94XOorAHhwqFIOFAy1rSp2N0Wp6/tGbe9V3u/ExlGZypyY17rg==} + + '@floating-ui/dom@0.4.4': + resolution: {integrity: sha512-0Ulu3B/dqQplUUSqnTx0foSrlYuMN+GTtlJWvNJwt6Fr7/PqmlR/Y08o6/+bxDWr6p3roBJRaQ51MDZsNmEhhw==} + + '@hope-ui/solid@0.6.7': + resolution: {integrity: sha512-7zGGy4QbGUC7QhwRnNH8HO0MZFg4jFISlC2cnAMBfFBy272uqQN3PYdTjiIbnpR/4JilUfxCWpFQY+4qslqcIw==} + peerDependencies: + '@stitches/core': ^1.2.8 + solid-js: ^1.4.0 + solid-transition-group: ^0.0.10 + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@humanwhocodes/retry@0.2.4': + resolution: {integrity: sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.0': + resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.5': + resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.0': + resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@22.2.0': + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + + '@octokit/plugin-paginate-rest@11.3.1': + resolution: {integrity: sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-request-log@4.0.1': + resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@13.2.2': + resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^5 + + '@octokit/request-error@5.1.0': + resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.0': + resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} + engines: {node: '>= 18'} + + '@octokit/rest@20.1.1': + resolution: {integrity: sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==} + engines: {node: '>= 18'} + + '@octokit/types@13.5.0': + resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + + '@rollup/rollup-android-arm-eabi@4.17.2': + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.17.2': + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.17.2': + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.17.2': + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.17.2': + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.17.2': + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.17.2': + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.17.2': + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + cpu: [x64] + os: [win32] + + '@solidjs/router@0.13.3': + resolution: {integrity: sha512-p8zznlvnN3KySMXqT8irhubgDNTETNa/guaGHU/cZl7kuiPO3PmkWNYfoNCygtEpoxLmLpf62/ZKeyhFdZexsw==} + peerDependencies: + solid-js: ^1.8.6 + + '@stitches/core@1.2.8': + resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + + '@tabler/icons-solidjs@3.3.0': + resolution: {integrity: sha512-spOad61pFAE57YGOcPqFN5458TBF0ctZzEfwiVzvLByJbrmuocmgeUmctsmfmdXNQ5yTtyk5NBmelpxQuyFJrA==} + peerDependencies: + solid-js: ^1.4.7 + + '@tabler/icons@3.3.0': + resolution: {integrity: sha512-PLVe9d7b59sKytbx00KgeGhQG3N176Ezv8YMmsnSz4s0ifDzMWlp/h2wEfQZ0ZNe8e377GY2OW6kovUe3Rnd0g==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@typescript-eslint/scope-manager@7.8.0': + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.8.0': + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.8.0': + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.8.0': + resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.8.0': + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + engines: {node: ^18.18.0 || >=20.0.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + + babel-plugin-jsx-dom-expressions@0.37.20: + resolution: {integrity: sha512-0L3aC5EFyvCgIlEYIqJb4Ym29s1IDI/U5SntZ1ZK054xe0MqBmBi2GLK3f9AOklhdY7kCC3GsHD0bILh6u0Qsg==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-preset-solid@1.8.17: + resolution: {integrity: sha512-s/FfTZOeds0hYxYqce90Jb+0ycN2lrzC7VP1k1JIn3wBqcaexDKdYi6xjB+hMNkL+Q6HobKbwsriqPloasR9LA==} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001617: + resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + electron-to-chromium@1.4.763: + resolution: {integrity: sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-solid@0.14.0: + resolution: {integrity: sha512-EY0GJLOZdLynAyBM39WBLJH2bUftGI0KekyzpfxQEhCTuOhXkIRf648P97mQjME3TDaQQbY+ObVXeE2mjfs4FQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.2.0: + resolution: {integrity: sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + + espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + focus-trap@6.7.3: + resolution: {integrity: sha512-8xCEKndV4KrseGhFKKKmczVA14yx1/hnmFICPOjcFjToxCJYj/NHH43tPc3YE/PLnLRNZoFug0EcWkGQde/miQ==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + goober@2.1.14: + resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + peerDependencies: + csstype: ^3.0.10 + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-html@2.0.0: + resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} + engines: {node: '>=8'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kebab-case@1.0.2: + resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + known-css-properties@0.30.0: + resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scroll-lock@2.1.5: + resolution: {integrity: sha512-GN8Lp0AzXbkrPFUUNkMUruiiv019UvarNKE/SnXi+AxZRjMnDc2R22VB9RcUtL4P/uub04cKibmpHKIKTyWwYQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + seroval-plugins@1.0.5: + resolution: {integrity: sha512-8+pDC1vOedPXjKG7oz8o+iiHrtF2WswaMQJ7CKFpccvSYfrzmvKY9zOJWCg+881722wIHfwkdnRmiiDm9ym+zQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.0.5: + resolution: {integrity: sha512-TM+Z11tHHvQVQKeNlOUonOWnsNM+2IBwZ4vwoi4j3zKzIpc5IDw8WPwCfcc8F17wy6cBcJGbZbFOR0UCuTZHQA==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + solid-form-handler@1.2.3: + resolution: {integrity: sha512-OCQ358dgxXeUi4TkA7D/xrrhrsUeY0K/m1EGn5ZUPMuPyx+1Hp2PjtthsAyvsaoj9jyJppK3pAwY2eytseUlZw==} + peerDependencies: + solid-js: ^1 + + solid-js@1.8.17: + resolution: {integrity: sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==} + + solid-refresh@0.6.3: + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + + solid-styled-components@0.28.5: + resolution: {integrity: sha512-vwTcdp76wZNnESIzB6rRZ3U55NgcSAQXCiiRIiEFhxTFqT0bEh/warNT1qaRZu4OkAzrBkViOngF35ktI8sc4A==} + peerDependencies: + solid-js: ^1.4.4 + + solid-transition-group@0.0.10: + resolution: {integrity: sha512-b3O9z6BUP60CG1WnTdqFuvHms0reDNYwQF+eAEEaSaoDEmiOu9+Lu7zQgWGySJjaAdSAClhmFCmx/eAjQgfIoA==} + peerDependencies: + solid-js: ^1.0.0 + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tabbable@5.3.3: + resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + + update-browserslist-db@1.0.15: + resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + validate-html-nesting@1.2.2: + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + + vite-plugin-mkcert@1.17.5: + resolution: {integrity: sha512-KKGY3iHx/9zb7ow8JJ+nLN2HiNIBuPBwj34fJ+jAJT89/8qfk7msO7G7qipR8VDEm9xMCys0xT11QOJbZcg3/Q==} + engines: {node: '>=v16.7.0'} + peerDependencies: + vite: '>=3' + + vite-plugin-solid@2.10.2: + resolution: {integrity: sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.5: + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.5 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.4': {} + + '@babel/core@7.24.5': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.5': + dependencies: + '@babel/types': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-imports@7.24.3': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 + + '@babel/helper-plugin-utils@7.24.5': {} + + '@babel/helper-simple-access@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-split-export-declaration@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.24.5': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.5': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.5': + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + '@babel/traverse@7.24.5': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.5': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.2.0)': + dependencies: + eslint: 9.2.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@3.0.2': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.2.0': {} + + '@floating-ui/core@0.6.2': {} + + '@floating-ui/dom@0.4.4': + dependencies: + '@floating-ui/core': 0.6.2 + + '@hope-ui/solid@0.6.7(@stitches/core@1.2.8)(solid-js@1.8.17)(solid-transition-group@0.0.10(solid-js@1.8.17))': + dependencies: + '@floating-ui/dom': 0.4.4 + '@stitches/core': 1.2.8 + csstype: 3.0.11 + focus-trap: 6.7.3 + lodash.merge: 4.6.2 + scroll-lock: 2.1.5 + solid-js: 1.8.17 + solid-transition-group: 0.0.10(solid-js@1.8.17) + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@humanwhocodes/retry@0.2.4': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@octokit/auth-token@4.0.0': {} + + '@octokit/core@5.2.0': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.4.0 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/endpoint@9.0.5': + dependencies: + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@7.1.0': + dependencies: + '@octokit/request': 8.4.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/openapi-types@22.2.0': {} + + '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 13.5.0 + + '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + + '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 13.5.0 + + '@octokit/request-error@5.1.0': + dependencies: + '@octokit/types': 13.5.0 + deprecation: 2.3.1 + once: 1.4.0 + + '@octokit/request@8.4.0': + dependencies: + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/rest@20.1.1': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@5.2.0) + '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@5.2.0) + + '@octokit/types@13.5.0': + dependencies: + '@octokit/openapi-types': 22.2.0 + + '@rollup/rollup-android-arm-eabi@4.17.2': + optional: true + + '@rollup/rollup-android-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-x64@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.17.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.17.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.2': + optional: true + + '@solidjs/router@0.13.3(solid-js@1.8.17)': + dependencies: + solid-js: 1.8.17 + + '@stitches/core@1.2.8': {} + + '@tabler/icons-solidjs@3.3.0(solid-js@1.8.17)': + dependencies: + '@tabler/icons': 3.3.0 + solid-js: 1.8.17 + + '@tabler/icons@3.3.0': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + '@types/babel__traverse@7.20.5': + dependencies: + '@babel/types': 7.24.5 + + '@types/estree@1.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/semver@7.5.8': {} + + '@typescript-eslint/scope-manager@7.8.0': + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + + '@typescript-eslint/types@7.8.0': {} + + '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.8.0(eslint@9.2.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + eslint: 9.2.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.8.0': + dependencies: + '@typescript-eslint/types': 7.8.0 + eslint-visitor-keys: 3.4.3 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn@8.11.3: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@6.2.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asynckit@0.4.0: {} + + axios@1.6.8(debug@4.3.4): + dependencies: + follow-redirects: 1.15.6(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-jsx-dom-expressions@0.37.20(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) + '@babel/types': 7.24.5 + html-entities: 2.3.3 + validate-html-nesting: 1.2.2 + + babel-preset-solid@1.8.17(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + babel-plugin-jsx-dom-expressions: 0.37.20(@babel/core@7.24.5) + + balanced-match@1.0.2: {} + + before-after-hook@2.2.3: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001617 + electron-to-chromium: 1.4.763 + node-releases: 2.0.14 + update-browserslist-db: 1.0.15(browserslist@4.23.0) + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001617: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@11.1.0: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + csstype@3.0.11: {} + + csstype@3.1.3: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + deprecation@2.3.1: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + electron-to-chromium@1.4.763: {} + + emoji-regex@10.3.0: {} + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-solid@0.14.0(eslint@9.2.0)(typescript@5.4.5): + dependencies: + '@typescript-eslint/utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + eslint: 9.2.0 + estraverse: 5.3.0 + is-html: 2.0.0 + kebab-case: 1.0.2 + known-css-properties: 0.30.0 + style-to-object: 1.0.6 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-scope@8.0.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@9.2.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 3.0.2 + '@eslint/js': 9.2.0 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.2.4 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.1 + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + 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.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@10.0.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + focus-trap@6.7.3: + dependencies: + tabbable: 5.3.3 + + follow-redirects@1.15.6(debug@4.3.4): + optionalDependencies: + debug: 4.3.4 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-east-asian-width@1.2.0: {} + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@11.12.0: {} + + globals@14.0.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + goober@2.1.14(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + html-entities@2.3.3: {} + + html-tags@3.3.1: {} + + human-signals@5.0.0: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inline-style-parser@0.2.3: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-html@2.0.0: + dependencies: + html-tags: 3.3.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-stream@3.0.0: {} + + is-what@4.1.16: {} + + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + kebab-case@1.0.2: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + known-css-properties@0.30.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.0.0: {} + + lint-staged@15.2.2: + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + + listr2@8.0.1: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.1 + wrap-ansi: 9.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + log-update@6.0.0: + dependencies: + ansi-escapes: 6.2.1 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + merge-anything@5.1.7: + dependencies: + is-what: 4.1.16 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.14: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-type@4.0.0: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier@3.2.5: {} + + property-expr@2.0.6: {} + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + resolve-from@4.0.0: {} + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rfdc@1.3.1: {} + + rollup@4.17.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scroll-lock@2.1.5: {} + + semver@6.3.1: {} + + semver@7.6.2: {} + + seroval-plugins@1.0.5(seroval@1.0.5): + dependencies: + seroval: 1.0.5 + + seroval@1.0.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + solid-form-handler@1.2.3(solid-js@1.8.17): + dependencies: + solid-js: 1.8.17 + + solid-js@1.8.17: + dependencies: + csstype: 3.1.3 + seroval: 1.0.5 + seroval-plugins: 1.0.5(seroval@1.0.5) + + solid-refresh@0.6.3(solid-js@1.8.17): + dependencies: + '@babel/generator': 7.24.5 + '@babel/helper-module-imports': 7.24.3 + '@babel/types': 7.24.5 + solid-js: 1.8.17 + + solid-styled-components@0.28.5(solid-js@1.8.17): + dependencies: + csstype: 3.1.3 + goober: 2.1.14(csstype@3.1.3) + solid-js: 1.8.17 + + solid-transition-group@0.0.10(solid-js@1.8.17): + dependencies: + solid-js: 1.8.17 + + source-map-js@1.2.0: {} + + string-argv@0.3.2: {} + + string-width@7.1.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + style-to-object@1.0.6: + dependencies: + inline-style-parser: 0.2.3 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tabbable@5.3.3: {} + + text-table@0.2.0: {} + + tiny-case@1.0.3: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toposort@2.0.2: {} + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@2.19.0: {} + + typescript@5.4.5: {} + + universal-user-agent@6.0.1: {} + + update-browserslist-db@1.0.15(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + validate-html-nesting@1.2.2: {} + + vite-plugin-mkcert@1.17.5(vite@5.2.11): + dependencies: + '@octokit/rest': 20.1.1 + axios: 1.6.8(debug@4.3.4) + debug: 4.3.4 + picocolors: 1.0.0 + vite: 5.2.11 + transitivePeerDependencies: + - supports-color + + vite-plugin-solid@2.10.2(solid-js@1.8.17)(vite@5.2.11): + dependencies: + '@babel/core': 7.24.5 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.8.17(@babel/core@7.24.5) + merge-anything: 5.1.7 + solid-js: 1.8.17 + solid-refresh: 0.6.3(solid-js@1.8.17) + vite: 5.2.11 + vitefu: 0.2.5(vite@5.2.11) + transitivePeerDependencies: + - supports-color + + vite@5.2.11: + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@0.2.5(vite@5.2.11): + optionalDependencies: + vite: 5.2.11 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + yallist@3.1.1: {} + + yaml@2.3.4: {} + + yocto-queue@0.1.0: {} + + yup@1.4.0: + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 diff --git a/fuware-fe/public/vite.svg b/fuware-fe/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/fuware-fe/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fuware-fe/src/App.css b/fuware-fe/src/App.css new file mode 100644 index 0000000..fda00ab --- /dev/null +++ b/fuware-fe/src/App.css @@ -0,0 +1,28 @@ +#root { + margin: 0 auto; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +#main-page { + height: calc(100svh - 56px); + display: flex; +} + +#main-page.login-page { + height: 100svh; +} + +#main-page .navbar { + width: 350px; + border-right: 1px solid #dedede; +} + +#main-page .main-content { + width: calc(100vw - 350px); + overflow-y: auto; +} diff --git a/fuware-fe/src/App.jsx b/fuware-fe/src/App.jsx new file mode 100644 index 0000000..12bf011 --- /dev/null +++ b/fuware-fe/src/App.jsx @@ -0,0 +1,15 @@ +import { HopeProvider, NotificationsProvider } from '@hope-ui/solid' +import './App.css' +import { SiteContextProvider } from './context/SiteContext' + +function App(props) { + return ( + + + {props.children} + + + ) +} + +export default App diff --git a/fuware-fe/src/api/auth.js b/fuware-fe/src/api/auth.js new file mode 100644 index 0000000..7f0f9b2 --- /dev/null +++ b/fuware-fe/src/api/auth.js @@ -0,0 +1,10 @@ +import { protocol } from './index' +import { POST_LOGIN, POST_LOGOUT } from './url' + +export const postLogin = (payload) => { + return protocol.post(POST_LOGIN, payload) +} + +export const getLogout = () => { + return protocol.get(POST_LOGOUT, {}) +} diff --git a/fuware-fe/src/api/feature.js b/fuware-fe/src/api/feature.js new file mode 100644 index 0000000..42d4ca0 --- /dev/null +++ b/fuware-fe/src/api/feature.js @@ -0,0 +1,6 @@ +import { protocol } from './index' +import { GET_DATE } from './url' + +export const getWebData = (payload) => { + return protocol.get(`${GET_DATE}?url=${payload}`, {}) +} diff --git a/fuware-fe/src/api/index.js b/fuware-fe/src/api/index.js new file mode 100644 index 0000000..9fdf12f --- /dev/null +++ b/fuware-fe/src/api/index.js @@ -0,0 +1,38 @@ +import axios from 'axios' +import { Helpers } from '../utils/helper' + +const protocol = axios.create({ + baseURL: '/', +}) + +const forceLogout = () => { + Helpers.clearCookie() + window.location.href = '/login' +} + +protocol.interceptors.request.use(function (config) { + config.headers.set( + 'Content-Type', + config.headers.get('Content-Type') ?? 'application/json', + ) + return config +}) + +protocol.interceptors.response.use( + (response) => { + return response.data || {} + }, + (error) => { + const { + response: { status, data }, + } = error + + if (status === 403) { + forceLogout() + } + + return Promise.reject(data) + }, +) + +export { protocol } diff --git a/fuware-fe/src/api/url.js b/fuware-fe/src/api/url.js new file mode 100644 index 0000000..b8ebcfb --- /dev/null +++ b/fuware-fe/src/api/url.js @@ -0,0 +1,3 @@ +export const POST_LOGIN = '/api/auth/login' +export const POST_LOGOUT = '/api/auth/logout' +export const GET_DATE = '/api/user/get-data/' diff --git a/fuware-fe/src/assets/solid.svg b/fuware-fe/src/assets/solid.svg new file mode 100644 index 0000000..025aa30 --- /dev/null +++ b/fuware-fe/src/assets/solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fuware-fe/src/components/Header.jsx b/fuware-fe/src/components/Header.jsx new file mode 100644 index 0000000..d2c8250 --- /dev/null +++ b/fuware-fe/src/components/Header.jsx @@ -0,0 +1,77 @@ +import { getLogout } from '@api/auth' +import solidLogo from '@assets/solid.svg' +import { useSiteContext } from '@context/SiteContext' +import useLanguage from '@hooks/useLanguage' +import { + Avatar, + AvatarBadge, + Button, + Flex, + Spacer, + Text, + notificationService, +} from '@hope-ui/solid' +import { A, useNavigate } from '@solidjs/router' +import { Helpers } from '@utils/helper' +import { Show } from 'solid-js' +import { css } from 'solid-styled-components' + +export default function Header() { + const { store, setAuth } = useSiteContext() + const navigate = useNavigate() + const language = useLanguage() + + const logOut = async () => { + try { + await getLogout() + Helpers.clearCookie() + setAuth({ auth: false, user: null }) + navigate('/login', { replace: false }) + } catch (error) { + notificationService.show({ + status: 'danger', + title: 'Logout fail!', + closable: false, + }) + } + } + + return ( +
+ + + Solid logo + + + + + + + + + {store.userInfo?.name} + + + + + +
+ ) +} diff --git a/fuware-fe/src/components/Navbar/Navbar.jsx b/fuware-fe/src/components/Navbar/Navbar.jsx new file mode 100644 index 0000000..7c724bf --- /dev/null +++ b/fuware-fe/src/components/Navbar/Navbar.jsx @@ -0,0 +1,34 @@ +// import { styled } from 'solid-styled-components' + +import useLanguage from '@hooks/useLanguage' +import { Flex, Icon, Text } from '@hope-ui/solid' +import { A } from '@solidjs/router' +import { IconDashboard } from '@tabler/icons-solidjs' +import { For } from 'solid-js' + +const language = useLanguage('vi') + +const NAVBAR_ITEM = [ + { + path: '/dashboard', + icon: IconDashboard, + text: language?.dashboard, + }, +] + +export default function Navbar() { + return ( + + ) +} diff --git a/fuware-fe/src/components/Navbar/index.js b/fuware-fe/src/components/Navbar/index.js new file mode 100644 index 0000000..e6400ae --- /dev/null +++ b/fuware-fe/src/components/Navbar/index.js @@ -0,0 +1 @@ +export { default } from './Navbar' diff --git a/fuware-fe/src/context/SiteContext.jsx b/fuware-fe/src/context/SiteContext.jsx new file mode 100644 index 0000000..c580156 --- /dev/null +++ b/fuware-fe/src/context/SiteContext.jsx @@ -0,0 +1,48 @@ +import { LOGIN_KEY, STORE_KEY } from '@utils/enum' +import { Helpers } from '@utils/helper' +import { createContext, onMount, useContext } from 'solid-js' +import { createStore, produce } from 'solid-js/store' + +export const SiteContext = createContext() + +export function SiteContextProvider(props) { + const [store, setStore] = createStore({ + auth: false, + userInfo: null, + }) + + onMount(() => { + const checkCookie = Helpers.getCookie(LOGIN_KEY) + if (checkCookie) { + const storeData = Helpers.decrypt(localStorage.getItem(STORE_KEY)) + if (!storeData) return + setStore(storeData) + } else { + localStorage.removeItem(STORE_KEY) + } + }) + + const setLocalStore = () => { + localStorage.setItem(STORE_KEY, Helpers.encrypt(store)) + } + + const setAuth = ({ auth, user }) => { + setStore( + produce((s) => { + s.auth = auth + s.userInfo = user + }), + ) + setLocalStore() + } + + return ( + + {props.children} + + ) +} + +export function useSiteContext() { + return useContext(SiteContext) +} diff --git a/fuware-fe/src/hooks/useLanguage.js b/fuware-fe/src/hooks/useLanguage.js new file mode 100644 index 0000000..202a8b1 --- /dev/null +++ b/fuware-fe/src/hooks/useLanguage.js @@ -0,0 +1,15 @@ +export default function useLanguage(selectLanguage = 'vi') { + const data = import.meta.glob('@lang/*.json', { + import: 'default', + eager: true, + }) + + const imp = {} + + for (const path in data) { + const keypath = path.match(/\/[a-zA-Z]+\./)[0].replace(/\/(\w+)\./, '$1') + imp[keypath] = data[path] + } + + return imp[selectLanguage] +} diff --git a/fuware-fe/src/index.css b/fuware-fe/src/index.css new file mode 100644 index 0000000..5d60db8 --- /dev/null +++ b/fuware-fe/src/index.css @@ -0,0 +1,31 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(0, 0, 0, 1); + background-color: #ffffff; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + margin: 0; + padding: 0; + min-width: 320px; + min-height: 100vh; + font-size: 14px; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} diff --git a/fuware-fe/src/index.jsx b/fuware-fe/src/index.jsx new file mode 100644 index 0000000..acf59a1 --- /dev/null +++ b/fuware-fe/src/index.jsx @@ -0,0 +1,30 @@ +import Layout from '@pages/Layout' +import { Route, Router } from '@solidjs/router' +import { For, lazy } from 'solid-js' +import { render } from 'solid-js/web' +import App from './App' +import './index.css' +import { ROUTES } from './routes' + +const root = document.getElementById('root') + +render( + () => ( + + import('@pages/Login'))} /> + + + {(route) => ( + + )} + + + import('@pages/NotFound'))} /> + + ), + root, +) diff --git a/fuware-fe/src/lang/en.json b/fuware-fe/src/lang/en.json new file mode 100644 index 0000000..8c6f4fa --- /dev/null +++ b/fuware-fe/src/lang/en.json @@ -0,0 +1,4 @@ +{ + "login": "Login", + "logout": "Logout" +} diff --git a/fuware-fe/src/lang/vi.json b/fuware-fe/src/lang/vi.json new file mode 100644 index 0000000..67bd3a9 --- /dev/null +++ b/fuware-fe/src/lang/vi.json @@ -0,0 +1,10 @@ +{ + "login": "Đăng Nhập", + "logout": "Đăng xuất", + "dashboard": "Bảng điều khiển", + "champion": "Tướng", + "skin": "Trang phục", + "list": "Danh sách", + "favourite": "Yêu thích", + "bought": "Đã Mua" +} diff --git a/fuware-fe/src/pages/Dashboard.jsx b/fuware-fe/src/pages/Dashboard.jsx new file mode 100644 index 0000000..4156868 --- /dev/null +++ b/fuware-fe/src/pages/Dashboard.jsx @@ -0,0 +1,3 @@ +export default function Dashboard() { + return <>Dashboard +} diff --git a/fuware-fe/src/pages/Home.jsx b/fuware-fe/src/pages/Home.jsx new file mode 100644 index 0000000..4ffe70b --- /dev/null +++ b/fuware-fe/src/pages/Home.jsx @@ -0,0 +1,12 @@ +import { useNavigate } from '@solidjs/router' +import { onMount } from 'solid-js' + +export default function Home() { + const navigate = useNavigate() + + onMount(() => { + navigate('/dashboard', { replace: true }) + }) + + return <> +} diff --git a/fuware-fe/src/pages/Layout.jsx b/fuware-fe/src/pages/Layout.jsx new file mode 100644 index 0000000..4f20010 --- /dev/null +++ b/fuware-fe/src/pages/Layout.jsx @@ -0,0 +1,30 @@ +import Header from '@components/Header' +import Navbar from '@components/Navbar' +import { useSiteContext } from '@context/SiteContext' +import { useNavigate } from '@solidjs/router' +import { onMount, Show } from 'solid-js' + +export default function Layout(props) { + const { store } = useSiteContext() + const navigate = useNavigate() + + onMount(() => { + if (!store.auth) { + navigate('/login', { replace: true }) + } + }) + + return ( +
+ +
+ +
+ + + +
{props.children}
+
+
+ ) +} diff --git a/fuware-fe/src/pages/Login.jsx b/fuware-fe/src/pages/Login.jsx new file mode 100644 index 0000000..4db7da4 --- /dev/null +++ b/fuware-fe/src/pages/Login.jsx @@ -0,0 +1,141 @@ +import { postLogin } from '@api/auth' +import { useSiteContext } from '@context/SiteContext' +import useLanguage from '@hooks/useLanguage' +import { + Button, + Center, + FormControl, + FormErrorMessage, + FormLabel, + Heading, + Input, + Stack, + notificationService, +} from '@hope-ui/solid' +import { useNavigate } from '@solidjs/router' +import { Field, useFormHandler } from 'solid-form-handler' +import { yupSchema } from 'solid-form-handler/yup' +import { Show, onMount } from 'solid-js' +import { styled } from 'solid-styled-components' +import * as yup from 'yup' + +const LoginPage = styled('div')` + width: 100%; + height: 100svh; + display: flex; + place-items: center; + + .login-wrap { + width: 500px; + margin: 0 auto; + + .login-box { + box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.25); + border-radius: 5px; + padding: 1rem; + } + } +` + +const loginSchema = yup.object({ + username: yup.string().required('Username is required'), + password: yup.string().required('Password is required'), +}) + +const language = useLanguage() + +export default function Login() { + const { store, setAuth } = useSiteContext() + const navigate = useNavigate() + const formHandler = useFormHandler(yupSchema(loginSchema)) + const { formData } = formHandler + + onMount(() => { + if (store.auth) { + navigate('/', { replace: true }) + } + }) + + const submit = async (event) => { + event.preventDefault() + await formHandler.validateForm() + try { + const loginData = { + username: formData()?.username, + password: formData()?.password, + } + + const resp = await postLogin(loginData) + + if (resp.status === 200) { + const user = resp?.data || {} + setAuth({ auth: true, user }) + formHandler.resetForm() + navigate('/', { replace: true }) + } + } catch (error) { + notificationService.show({ + status: 'danger', + title: 'Login fail!', + description: error?.data || 'Your username or password input is wrong!', + closable: false, + }) + } + } + + return ( + + + + ) +} diff --git a/fuware-fe/src/pages/NotFound.jsx b/fuware-fe/src/pages/NotFound.jsx new file mode 100644 index 0000000..5757a78 --- /dev/null +++ b/fuware-fe/src/pages/NotFound.jsx @@ -0,0 +1,3 @@ +export default function NotFound() { + return <>404 +} diff --git a/fuware-fe/src/routes/index.js b/fuware-fe/src/routes/index.js new file mode 100644 index 0000000..49800c7 --- /dev/null +++ b/fuware-fe/src/routes/index.js @@ -0,0 +1 @@ +export * from './routes' diff --git a/fuware-fe/src/routes/routes.js b/fuware-fe/src/routes/routes.js new file mode 100644 index 0000000..c7f28ae --- /dev/null +++ b/fuware-fe/src/routes/routes.js @@ -0,0 +1,21 @@ +import { lazy } from 'solid-js' + +export const ROUTES = [ + { + path: '/', + components: lazy(() => import('@pages/Home')), + filter: {}, + }, + { + path: '/dashboard', + components: lazy(() => import('@pages/Dashboard')), + filter: {}, + }, + // { + // path: '/champions/:tab', + // components: lazy(() => import('@pages/Champion')), + // filter: { + // tab: ['list', 'favourite'], + // }, + // }, +] diff --git a/fuware-fe/src/utils/enum.js b/fuware-fe/src/utils/enum.js new file mode 100644 index 0000000..7add46b --- /dev/null +++ b/fuware-fe/src/utils/enum.js @@ -0,0 +1,3 @@ +export const SECRET_KEY = 'bGV0IGRvIGl0IGZvciBlbmNyeXRo' +export const STORE_KEY = 'dXNlciBsb2dpbiBpbmZv' +export const LOGIN_KEY = import.meta.env.VITE_LOGIN_KEY diff --git a/fuware-fe/src/utils/helper.js b/fuware-fe/src/utils/helper.js new file mode 100644 index 0000000..72293aa --- /dev/null +++ b/fuware-fe/src/utils/helper.js @@ -0,0 +1,42 @@ +import { AES, enc } from 'crypto-js' +import { LOGIN_KEY, SECRET_KEY, STORE_KEY } from './enum' + +export class Helpers { + static getCookie = (cname) => { + let name = cname + '=' + let ca = document.cookie.split(';') + for (let i = 0; i < ca.length; i++) { + let c = ca[i] + while (c.charAt(0) == ' ') { + c = c.substring(1) + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length) + } + } + return '' + } + + static deleteCookie = (cname) => { + document.cookie = `${cname}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;` + } + + static clearCookie = () => { + this.deleteCookie(LOGIN_KEY) + localStorage.removeItem(STORE_KEY) + } + + static checkAuth = () => { + return !!this.getCookie(LOGIN_KEY) && !!localStorage.getItem(STORE_KEY) + } + + static encrypt = (obj) => { + return AES.encrypt(JSON.stringify(obj), SECRET_KEY).toString() + } + + static decrypt = (hash, defaultValue = {}) => { + return hash + ? JSON.parse(AES.decrypt(hash, SECRET_KEY).toString(enc.Utf8)) + : defaultValue + } +} diff --git a/fuware-fe/vite.config.js b/fuware-fe/vite.config.js new file mode 100644 index 0000000..c561a06 --- /dev/null +++ b/fuware-fe/vite.config.js @@ -0,0 +1,73 @@ +import path, { dirname } from 'path' +import { fileURLToPath } from 'url' +import { defineConfig, loadEnv } from 'vite' +import mkcert from 'vite-plugin-mkcert' +import solid from 'vite-plugin-solid' + +const _dirname = dirname(fileURLToPath(import.meta.url)) + +// https://vitejs.dev/config/ +// production +export default defineConfig(({ command, mode }) => { + // eslint-disable-next-line no-undef + const env = loadEnv(mode, process.cwd(), '') + + if (env.NODE_ENV === 'production') { + return { + resolve: { + alias: { + '@': path.resolve(_dirname, './src'), + '@lang': path.resolve(_dirname, './src/lang'), + '@api': path.resolve(_dirname, './src/api'), + '@hooks': path.resolve(_dirname, './src/hooks'), + '@pages': path.resolve(_dirname, './src/pages'), + '@components': path.resolve(_dirname, './src/components'), + '@routes': path.resolve(_dirname, './src/routes'), + '@utils': path.resolve(_dirname, './src/utils'), + '@assets': path.resolve(_dirname, './src/assets'), + '@context': path.resolve(_dirname, './src/context'), + }, + }, + plugins: [solid(), mkcert()], + server: { + https: true, + host: true, + port: 5001, + strictPort: true, + watch: { + usePolling: true, + }, + }, + } + } + + return { + resolve: { + alias: { + '@': path.resolve(_dirname, './src'), + '@lang': path.resolve(_dirname, './src/lang'), + '@api': path.resolve(_dirname, './src/api'), + '@hooks': path.resolve(_dirname, './src/hooks'), + '@pages': path.resolve(_dirname, './src/pages'), + '@components': path.resolve(_dirname, './src/components'), + '@routes': path.resolve(_dirname, './src/routes'), + '@utils': path.resolve(_dirname, './src/utils'), + '@assets': path.resolve(_dirname, './src/assets'), + '@context': path.resolve(_dirname, './src/context'), + }, + }, + plugins: [solid(), mkcert()], + server: { + https: true, + host: true, + port: 5001, + strictPort: true, + watch: { + usePolling: true, + }, + proxy: { + '/api': 'http://localhost:9000', + }, + }, + } +}) -- 2.47.2 From d5c967d2e53516f6e193c9edf9205cc48faf458d Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Wed, 15 May 2024 09:14:26 +0000 Subject: [PATCH 6/7] update backend --- ...0c50a8c3_create_user_and_session_modal.py} | 14 +++---- fuware-fe/public/images/logo_fuware.png | Bin 0 -> 357547 bytes fuware-fe/src/components/Header.jsx | 2 +- fuware-fe/src/components/Navbar/Navbar.jsx | 2 +- fuware-fe/src/lang/vi.json | 20 ++++++---- fuware-fe/src/pages/Login.jsx | 35 ++++++++++++++---- fuware-fe/src/utils/enum.js | 4 +- fuware/app.py | 4 -- fuware/core/message_code.py | 8 ++++ fuware/db/models/_model_base.py | 2 +- fuware/db/models/users/users.py | 2 +- fuware/repos/repository_users.py | 9 ++++- fuware/routes/auth/auth.py | 33 ++++++++++------- fuware/schemas/fuware_model.py | 4 +- fuware/schemas/user/user.py | 5 ++- fuware/services/user/user_service.py | 15 +++++--- 16 files changed, 103 insertions(+), 56 deletions(-) rename alembic/versions/{8712dd727be7_create_user_and_session_modal.py => 56750c50a8c3_create_user_and_session_modal.py} (89%) create mode 100644 fuware-fe/public/images/logo_fuware.png create mode 100644 fuware/core/message_code.py diff --git a/alembic/versions/8712dd727be7_create_user_and_session_modal.py b/alembic/versions/56750c50a8c3_create_user_and_session_modal.py similarity index 89% rename from alembic/versions/8712dd727be7_create_user_and_session_modal.py rename to alembic/versions/56750c50a8c3_create_user_and_session_modal.py index 35d30ba..66f4e30 100644 --- a/alembic/versions/8712dd727be7_create_user_and_session_modal.py +++ b/alembic/versions/56750c50a8c3_create_user_and_session_modal.py @@ -1,8 +1,8 @@ """Create User and Session Modal -Revision ID: 8712dd727be7 +Revision ID: 56750c50a8c3 Revises: -Create Date: 2024-05-11 12:44:09.963953 +Create Date: 2024-05-13 12:36:10.095215 """ from typing import Sequence, Union @@ -12,7 +12,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision: str = '8712dd727be7' +revision: str = '56750c50a8c3' down_revision: Union[str, None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -28,7 +28,7 @@ def upgrade() -> None: sa.Column('is_admin', sa.Boolean(), nullable=True), sa.Column('is_lock', sa.Boolean(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), - sa.Column('update_at', sa.DateTime(), nullable=True), + sa.Column('updated_at', sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_users_created_at'), 'users', ['created_at'], unique=False) @@ -38,15 +38,15 @@ def upgrade() -> None: op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True) op.create_table('session_login', sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), - sa.Column('session', sa.UUID(), nullable=False), + sa.Column('session', sa.String(), nullable=False), sa.Column('user_id', sa.UUID(), nullable=False), sa.Column('created_at', sa.DateTime(), nullable=True), - sa.Column('update_at', sa.DateTime(), nullable=True), + sa.Column('updated_at', sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_session_login_created_at'), 'session_login', ['created_at'], unique=False) - op.create_index(op.f('ix_session_login_session'), 'session_login', ['session'], unique=False) + op.create_index(op.f('ix_session_login_session'), 'session_login', ['session'], unique=True) op.create_index(op.f('ix_session_login_user_id'), 'session_login', ['user_id'], unique=True) # ### end Alembic commands ### diff --git a/fuware-fe/public/images/logo_fuware.png b/fuware-fe/public/images/logo_fuware.png new file mode 100644 index 0000000000000000000000000000000000000000..d9611b2c8019b7d3df17c2033f490453602a7349 GIT binary patch literal 357547 zcmeEucQ{<_y0-`+L`bwCf{18QqDBuwqPH2{AiB|e7eu^KBEje_x=}_jdhaEOHlvGZ zVU$D-qkK#DKKtx*zE{5M`+w)U%&aVHt><2M{oUp9R$cWu2@x$34h{~9!i#5`I5-5H zz|RcfHQ)@swyPZu&J}kXSy^?c>~mR1J4Y8SCsQ+vXEv@*cBbCy{5UvlAKc$JDz&Rq zbgC6;ei8laCjDK$x3Xg+L>|u8oD_1rAp9b&N%DD1#)tB zB6~(~Yc^Gsy~f&WE&()kf3AD^^hv5~tziqDIt}LmF56oC2jz|&9zLR>#<)UMv&K-^WsPCD=E%Ne?-7g{GiA6fbAlf2RCU$GlDoz38>j^8?>%T_XBe9vd~qqR8hg<0FDW9 z@UL9Mxe6Rz!NCPSXmRj=ALHOCUZMNfvE~)F|Gp;71_$q-*XRS^7l-dJKK}KMn~D2h zR}gS!Uj5hc%*C}{7058)>$=kmJy#qYiPslDSH_DGZa6qs-E2U*Zn`SUqGpcv+@|J^ zFDFDkzasU3sLjU^r z4?4}w{$B zb{4-G_pkT)%|U59xBq$e;`$2~*x6igR@Bba!Aj!37niw(rK!7}+kHu8M=M80OLtFG z7YlKoe_Z%KAMlT}|MR)xJby!i_{EEh>SFGa=;I{+-E081-=lPdKNfJ>T4+A## z6i4BiG|219#w^s%&?;c{Xw`dA#NFbC zVvmtSEvK$d&a*3)*V*@%Khu=k@!fa{P7`$>bd@AExVDEmKY#p&N{D%ks z(S!e(!GB!Ae>~y;mnYO^x>7HLUf?5Se1(I1`NxdL*V@&9dR=jK&cno-hA(yrMobEt zbcSavDS}qipW8k!C(P?VaajsIpjYb%E0Sk~2r^q_UjDp`)u3`;S&7!W#I}8_wBeF` zvLuezh+*btwlV{u@0Wz>DLL|e{C>K5IL%wQc93b8ewfE=>l5VrFmvq>bTXES;&sjT z?6zx^xIczdzM0(sO%~g@Ert}|@g^Nk(Y1Bk8iJsx^I~TcE`C;*3fj11y?_8DNlP4>5EroJ6Bp=_5QS?3FY-CV0C#*^Cy#LXBIBGg3S~8U}3VC zVr1Q&jYJOuneH5dB{)^a=EPrCa(|MH8$%%vAzSXWF>JUao*MDGc&wcIzCZLsT=GrkuXBN%b&L-=PT7^s&ehN?+US`%$ z;nOI)!(M54Ltxu~LBY}9x=?aAm~@3cZDru=KxZh*E}PTvPDczOnKt)zW>)DxMO#!} zOHTxK7QOM*=xF$9`zL29^7~jr3YmqKS@`G2kGsGWpqp&zk7#pY-YUxjL)(j!n1pZm&OXgmUV2%s5fNrW*EM+f|3shE6@1u`e<0&zrN8V9FY%`}e>M(ZclYsl*sSGZxj)f^3|>7iL;RTN0)I>k zNlrsa5u6oykb^1!WhMHJP3?ExQrgRz;n$j()HJEh)EeZ(Hc&-M!C&pDMRKOHjirnd zZ^}>c=ABw;1x_1g^}8fsXuM!uVbm2voAzS&fT+(PR|ny*uiu+XV${Q<6X*@Al+h* z_`1=aIqyLPTpwg&gWVw=4-nMg)df+b#2X$JjbonML&WAGZy4$lIRqL9QxU>RQmaPh zLq+(TQokNG#MC-fCelhIg{~Zt<{JylL*3skbl2UgxfP8_!7j_+`UAQN0(1Q+YCaB3 zSeF=fG7PUS@L#8zRlX-qET1a|jth{JduMtFM!fXk zZi^nj|I}jHHi^CK?H|w+Mxo^%EuGrI9%rn;!^e6Qf?1!JarR|E5&b`}Al)P~bsd|h z3J(fx%U!PK7puEu2lquOo?P1#ou9wXw~OcWIHlnO{(8H`#7^1c@$57yF*BY}GFA3K zKRum5&gS%?ku|cJ$rVt|argW&n*T_$YM=9|Zf(G7y4dr}U38EGrFx1EKCCfR^P|*T z!$3|Kn2VU(RMk|^9tV#29Xl^jdte7`wKThVzK`ZMv&H*Q-+CIBp~YnU<^AM}0WqmM zFOmshT0*aF7}_G8SK*{9>e)=C)erT&mONkGTk* z6Q8-8@gzYE@UO)E>AKbQKVPO~`+2S+DBR|}zR=wN=w6q7(}{&Sxh z+qARoltBpJ;v%Wfdj^sO9U~SXyn#nsP5$7zO(d>woD}ldbIXTrE{|<$?k}yVS67ESM1=x{UGp6VXGeYElHay7Yv7cXyOXZNU1Qz9;I`YOH@=xrDkk#oBRw^Y5# zjO6wV6LfYFt~OJ2P-+0?q$vu8OIEYs!&vC!rD9Hgl}^N|!pkcxRIJzJ3@p+aICA{N z_9y2lgRv1umBVb@zq)d@KYIV#oAe`562g-N1K3H+=GUL7A*%@tI#Ox=GHqOXlPYaG zIk_y?$d!(noN|Ys09viLU5#1h#($LpyL$8c{!4s|FBQkl+)dki{^R`wP2N!o)eAfY z2#knePGhm|ex!D>xP$CoSA9i=&YMA@3aQ$YcwyuDEzgiVNIebc5cvkBI5?CVs5%_?&z7?Y@$5_Wp?cibf(f zVYaf#%tHydUNPH^jjof2j>}UcW~xvNRm_nQW}{v*kzevPzvQkJ^|y_gjB}o54~2|R zOipNAkoKG)CBgkaf#r-x?+IYos?B0^=P_fV;isCPg}gBwN5f40Z@>(-S{TtS9Vl92 zYXAK`;WovRJ!{eNSXJp<%t$6*bChzlp2Q$LX6JR659n~$V>)a!59#zXBrijpZ(nEN z!zGML6@{{`jiQ#0+_H_;CZ{BS z*#5ChyE#D1$sW!2%DV=qPo|%rLHv8)w5;9+?Ag%pZsec5ux=(f=v@+mV(_^{u40`1 z5Ab|p`lBc4j5lRm9xLjWZHpRCYDKD=n-E6_?}PlWeCNaa2CN03AJ$e#q2-+P-7hYR zf|=bQg`=IBPrcN}K5N2-SsTaRhV)k-6dTg-cCh^+Hhq;QF38%!oEmdgafW`>|5gPh z>9blS8=DdwVv=Pis>cXVtd$x+nme2UI<_KwtYa4i+S zYhC^-!_JQwk|35_jKzkxiA5>CLv^e#C9~B$TCYt+Ym{c$OPhgQYfr|Q=^>jT2?F#Z876jwei+}qdGj1WRH^Jk$-)RxdZG=koO zO__phSma-e@3VTY!VB-NM{*TVX)suGJ?Fv{P#?+m&T~waT5qt9*Bx9H3~KzYQnM8- zMJw1|2-V432cS>r;avTlo6)u`gJ2J{BI}!|Wpy2JPBXXFUn%mJyO1D@+jl&(n{A0g zko1Da91c!g2woTG{+H7Rl@3Z}3#%00PC-p*{RD#d>#yN6BNOlgQn*+7VV92fVl1Bm zKf*V0tnu#XK;xRd*HF^;)C1#cyx5TInrc9M}}~y5D9&0pR=yG?A1jPr=lI{-VQCm z*g)tfQ3LMj`*nq1cI=_285~G))ZXNp40DnsL`pI+&Yit}73~=n{kqI0N{zQV>{9(~ z5v48@HfYS#XehiZM~RWK>EVP$`l}Sq%ECW@_H$@pT3J81HDL?(g0a;)TBR<%WGi4f zZ#j*PxGi(}{cIAm_FI@)sj=0(p|i>D6ZxhLk|0U|IvZ*@aKE{9Q5;-Oc3x4@d-gn= zYxb-j2-k!Dxnp{wwKv85EOdqrv0j>O86bpmzkh=F2dGtN_*8n?)gVA< z%Z5s+N_Q$&4_iD{doz@bWa4X4R~Qq1Og)AAO}66VwGV7LZayfjGe@hmKJMn;A;AW{ z*|ABolYUgq;vffn;4=$2A>FzS^z4%>eG-9^h0Xq%;p^!!5X!F4vMb>5W$sL8`P&<22<-=)&`4&5i zSIDvcJS*i*?l*B#-Xr6`n#e&bT!zy=?nXh&7WlB$V5DPyYjYBQ;8OJ2E}{W3wCm)8 z%r7r;4!*N%1=LOgu8}b?UmnC;u3q2?W8Y?dRiA*5UkaWLZ)ShL-Z|Tv6qps*o#+m0%8fvGXJU!ED5lo0uywmB7Axo(;|o>JxGXkJMT?nz0Rrw{g*m!1s( z-@3W#yMLU$**)i1>1*Fut^)o`wdl%*0(2AG8XEENbu3f(TsUSo|9m>|$dej{I&~3- z0#y?iu0f8&*Oyvm3oY4qcC_uBxs+ANX*tJ3&#s3LgdLUaAw@*%RRvkR#$hgv4i);o zyOo|RL;77O$U__E-fy)~2TRKz?RBVJbJ!3r#3G6OZRQ-6Z(Aa-vUAYkA2Ax*=DhGO5nK zW`S&xfR=BJADqlMGvrUMty#tku5Y%lSpSC9Mm%MZGlH3Y@>ZP7ov$tdfRUmNTz{3( zCC$#;jMcfDKlwENYoVM!jG|@p%eU}T?ul^c+MCL#-skt_lp$pVX<5ps@;VmKdqW~>9nBw!6^n6fX+ibY-=B19)jwg zo0u;h2Kh0V227HY%CO!}faGGzx<*C?euOhE5nv=Vz8@ zQL^t>uC(_~vpyQ-G9KqzWm<}p>CfY@D#SZvm`*w}9iD`a6ik1vQj9fSIpEo$4H|y{ zBqvE?}rn=1?kt03?3`9&m~=J=Jc@4Z>tHG>3M>O zEtqQ9((oM}5UtF6E^_`(a#TvV8c7d=2k^1I17oyPxaJBS^%w?wzSkfR;?gl3<#t7w zP12P8r0V(fx+kt~FAbHz#X1AA0~rpL9IpvJ46oA$==L!M_xI1w73 z5R_I1w-+%+K9h;> zf#bx6Sv7OqMtX4J3M^*IPw=KC#eWB#26U=#s1{0@*hx9^PbjI}dk-(=B6jMYTJU--2(9yla3VB}?b$^pY(Hlgl z_UR84XOu(p)vmCXMxZD^S9Et?_EL~$LQfodT7NG3wSQRsBWT9f4}}PC35H)ON#p0% zJuhhM3DGxm4*TnxOJ1jHzO9|Da*iO4S*WY1xjjNQY5p+Z4uVCnRZ7?gH*>?FZ~=*u zcm$&MQ7y0M>2dJm-MoBQm6cjkY%()Xu|a{_PqRZ>AbT*BjqNSDyc|&0fg9nk_xySG zYTvoI{scWsh|P?i7T;EhI7RS0!eqx8v*AH5M;Uw6Q#4d0Xv(Hrtq0Y($sS$2WTyGV z8)_YaK!ML5QZ2gA7m90YRPLXF$`%Mvb*_Whh@|TYw412O-T9-lr4P(Jm5!!Aaf1Z8 z0d44FO`N`*OJCFRySirPxD39rt}-B!T|Of8%i1~K7IWyj9zQREY+j+;Fe75|Ong+t z5gB2ZQ@~e~1%DVpw6gd4VNjmk3ZAPGB7cc5ch#(mv)JvY$aV#(Z2QpX#IDrfKEG2% zAv{!6%eQlH)7cqr;qXh{HV$saeUm6uir?1M)7!!k8m^{Y+F2?JnvYqul&_WSPa9E4 zd~8vnjMWe1OOzg0au|mqeMnOFnsNq9y;F3A_8VYIbL)bE1<8EMw5!}S+d~B!TQtZ3 ziCBDBzTL^6>W-@L$erT|t>0xg8ZW|PVW4QcFSIzrbGehxc)%+}B_VuR@$=1Qr~Y5D zF7X|x+>hqB(d4%)407X))vp~Y>D#zOXVpAwHJ`gF6xiXzz@EzNN+#b!z3Qgjna_lH zZ^!Xv{5W<&xoo8d(!3>mV2QGB70-7hoV zAa~YGUFVst(=Md>(B8WmaM8q^d~a2X`}C;s^c@zDeD`4jz`DIYNzw?u^qSeF`oPqOQ@+w`F{62 zUrBUEumoYT+J$^Xwr2z{lTV8%#S;Oc^t&4j+$n8MjUExR%jK1poK<)19&5LtirguM zITFQl0&+su*OT#zR&o{RcUm+Jx8&t4&XPBogZxzbyc-)IJ;aY&h^!p!-Aq0RRPWiq zqN&%>BQISKcKRKUn0@mo>{P$(>@!P2N?fm;J=I%n#+i}4l%OdJbz)8Ed1oRW{ar5f zNDU~Q*je)tXzJrQCg$6yB2$Js%h#ubRnK!{@H=BzLZOuY(EMjY+}i54JkzY#moOT6 ziq04!mQ{0qqiwa`J+AF`UvCzRl?w0N`q4bez~zat&d_Y~MUYlN%mXZ{5ht*x7;Ah5 z=Ta<+N`86|Bzd~G`?II#1)o9DCZW)DjQ40tM`?U+6I%YjhJ0hu7A%^noeK`d$9D|Y zZ}QM@prQc5`I)7cSx+H7+Il%9mi*7S1oD41jKeuyVd2*WVg31sON{{$+-upF$+==I!7*j zu>u$c<+Bw7FOcaJbL+2xhZ9rZno^`>;|?E>uRenbD{TF^t85*_5Nt(mI9rlN49D_R~aX8(1ff2`u zkj05^Q`J70u;M5WP7gob!bJy|iUasWcc44>FeMl%>yy;XvxIf9&xxyMlU$IyCsehU zs71N#c2lYIe*)yg2lSe`$sgs*T?*j7s^W%qDW5=c)oHA){6l35t1U)$GB+a(J|O2_U+t1t z<9LF_$A?C*tZMjbDjsj)`JgjGY4BqcKw))^U)YgD5-G(JkUEUh%`QXWF zGXMC)sS+3j5#X*{_e+e>p9FfLm7a}aPv6OyC;*v3LR@U@AGqxt^y$;50{v4f1+z?n zJE@!eP4qV2y(&q)K)%(>s^Sz~=-^VMk)i|Elot(|s(*8`{Ud@wiq3aS`)Qi9l`J8@ zey^*1goXzy-EHu!rE+xJyemE9@qX`|PdwNl^n|~yuRe7730}N9kT+j{EJAr%>;mA| zgD>CDZ9nP0#Rl(6l{l0}Pfpk*DNbYf`7;knN!RwvngC@+uyCoa?M-orXrc15d%sA& z-E%lJ`V!Pl0lK#VQHfv)>Y5$@#Bvi075_b&I@-`QA&ods6HSXnPr%Z=gsB5YxNgcAiA8V(G zQ(6ghM7-Krk^eNW@^&boN=2^TmB<$XPcHw!fY@h?ww=cakvQg{0u#46g{EU2@^}SZ zJwDppR5L%41cHN?6JU{~gXx@?)=`QBg6LYm)kp|fe*5^c!rW*`_EW??lus=3^BYa3 z3I*OKIAi&c{vnH;wegsJQTfQT>h72bir29j7#*1&J_`LUOAJvE&&op1oC*iwOg7CS0e)*1TT1LpNrzVpZs*;vSe5tD{mImei7aJJ-ox(CT~6c3IQnD2EW_BRB4NKu80AZ&rSGN zB(<%FQay#E4ej)*EQ+o(^j>J}5Qn(0eCuT9D<8@N%Dt1tg(dqa2%7WT>0C9O6$4NA zGqyKobuZOJ1~lft`^;>_P8K`PeLcqE8KY@tH_jG< z)eI-8vRIK{mefK`4&}Q@zPIa2FF#y1_bCV-Nqn}cfJ~XOE40!m@HRj@au)k>Rt-;9 z4bcLS%714^aFf8VuvLTsxBsH1pj?(pby>P>Vo!Kdbp8W-x*5#S_i`Fj?lImOIzeM> zH~j*mYAKcLq-k$Fz&&f9fyx8%+3Ys^>bxkl?d#0cWT=?Ue`++}oJYtL_kRRV}l`RnF?rhWOsoX=;4$`AB7dd=|Xz@j=-`M z3}Zw2pz-Q%+G;r_i(y-YA{HbG_LsIs}p2FC|RFHRnO|z-*EW+d|5};e@_qs#3oy6084H1_x!pP zOGzeNV5u>`a^cD0DcxH0(Qo7i2X$oAGQ68W*^#tEV^0pOepboXvw8FumJSZ)V53xk z4;1M)d!VvT3=@{Vid`qvK^-N>5&KlC{6K>gy@w}$2-~bTlXHrwrs(mjVD`uAYsJ#S zhXC)ne=(NTBx2TaDWW=LQV+1p1bSn3b_t8K60IawgA`y9y>LU#&&m@edD+-tq_Mhk zt;J8izL7`cv4_$Ds|fwr!tk9Ol7%>zew)>-q9j3`3hje+hJ!S}?#Sp>;=mPBz(?wa z06r4xq*=>yDWq4U{;qTl8$58peg~UxDY#5U=cwdogWw}NT*6{gAmf3#GpOvkc;>UtTC@Y87^hoK}lA5KA(~Z-sRIwkgFJz_i zd>__+GNb5!(D>zGyNZgITA!Go7~R+S(IcQ7DK7i9n2_;{3hs&Nv`R&*?xo&m3*7Q9 zDyr5D7@IJ2XaOdEEB24$RKkd0H6S`SA*@~zl1;Wu0$#8&E(bEQsp1frE{I3GO^%e; z7ybZ29Kz4n=6B(VdqjU};m6)5-Sv^YXXiDLb4Izn(XcOx6cVld0yi#h_VhmZvEWSK z4>&}O+$$+BbicA|#wDU}Nv6Ex$qXR2X`-JdwIF(@E;QdfH+!mbC6z^|UiEOz4?*%7 z>CO)l@SH~+Igi+$aZYFMbAUApS=f)TJGtklJ(Uxy!NFfiDakT!Il-SBZFMWhHw_D{ zJnxjR;?;@ttDQ>}6LNQ6_}<|K@h+6Tz>$rF>Uy;h%Vg|j-73`k3*)f!NUG7k8U9otj4_0PSwEOU^S@Q^Co+;Cg$m>~$<8*${QFbBNn{v*J9rdwtB zUe=G$&VR)vC8WN_KF$$E2210NQ!X;9`rz9}cV3wswWZxWJm9khzD*NK78gCKn4jh1 zY}7aIjV>}BLkUrwK@vQbwp>wl5q(_e!#w7J-}$w8lDy)!CD+&%GtmM616!{2Vd0^Pia50fSO4AM&? zi1S`p8kp)$8B!9vH+b;j)$1V}i9VeuVV%_LIw3zt;h)4kzI`rqeGU;IG3x?5Uqntq zKOmAFeZWUts=IY+U*+4LI1Ee-4`M=cGuSH^zZ2U&K8_fi=E1kZ+N(daL{jA<-|9DY ziGE?vZumL7RbPmFe81!uyB+h%$@2g;c%Jx2RDGb`=!)+qW}#tf$MRzAW~tK|A9m5N zdx{g3K?clETqm2mG>Ex{wVdxoo#zYxl5ggMy%~9LUo||(6#C(lPZ(8PbQGQ$DI4>2 z0eZZ_NAvude(VVQ$Is{E*|8b!-2=q~8h&hRuBb_^Icy|Lg8{lp zq&jm_32Xch&Fs%^I_VJ3R09FUpWFraQm2KbyhBePO+erqd!&*Z(|^C@aUoyBli3ZG zh5?!i;qY&b9R1T)!CV}nkre6<8ue)D(3nP1fumphygZ@pT{RaR=Vn21*;A4 zkqnT)iTsa+u)&myqe;3}Lm?H{EyL5(;{``|IQ#Z$mLK&MJX8=slW3y3!>voO#&?%1 z2L5gUtU$f-A@az7Sq67SUE3yLUVQ_L+0&i;;fML}9gw3XMXqCBuC#PiBdFsgySFDa!`30`aU~geq z$WZ9Ga=Dg1_;Mt+_UY4O;fwNT+ZG#*@}jk5pP}Q&I*E?q0Pwm*c3-0k(F02DH_4^- z(j-O%lrJ1c`u>9FfS&YL-NyBvm>7AzJRX;{4$7yzpYc=ZF6vvR6=*V<<5|-T(Spp6 zHG;sC=JTmN#T(&JpkOdX{*`neDV#rZ>k`-hr4ctf+xF)%tV2qZ-SN7HV|+(vI@xW8 zq^o_b&Bcnn#@hJH2V`SQ{Pi?{8RL%My<3-BSDy^*O)!(J zX=W2R9X79;JvKeP8o1YI>IjTmguBSCypCWj69VurdZocd=MvsLMPHAM6lWl{$I8@7 z=+b?!aHv+v%D>NWEh+*|)cIyie~&5jrEDLYl27x*#eRqB5HdniP< zUV=q}O3|q_roFk~{Hz1-%5q2|Rq5LnS_%Mhgv9o7U531k7)_$!Y|jb06~|SCCcneE zT{XNVcaSc3?fWAGHRWQPbFzBV;K>{OUGm|qj&xRX{Fm3&wA&oz!NzvoSoJJld6QP>n?--$Qo z;;H>3fB6hjcJOSq4Fv&*Vm=(%EzG=4a&^s(rIsnF61*!Zo~{Gpljal>Gb9W`@&I1_ zU^P+fvM>{G(6X{%zWM2SQ3#AA*P}Hqe2~)4DWy?x2p;@YW=V z93%y#Qh2yh)m-$Dz+kSI2p;|!oqeOirxXeat~h8nX?tvR2#ddtSVr@hPx@`l=7vJi zmhV&}d9)34&hm!@~2UrgQ>WUMYJII!oN9L`9Gxf%0y1 zz974?Bbv@}c@<+%d9pT|KhhpX!e#7Ab^*+UE@Dmg@@1H?C7Ha8dFb4sVLUOXS~m*O z6;&hbuCbvwC?d6F=%q;MLy&E9ur_G6{GKxOrC2Zt9qfhnj*}*K+^$G-y)!F?e3J)Nj!yTpH# z9plLtg~ccaZXY~RJfO8YG$5x?KmJH&VCDZ^V|dAR(P?9vf;(_wm) zU*|gAx6hLuc@_+v1jvWW)D*A$hjpu;b3v-var&v#-F!x9(y+T`nz)!0B>fBoViErs; zLyK-DEfd3YFUvi5{=@ z5}9wozpRH6zs?WuV&+0csK-*#*y^c=Vj@zf3uD!EQr2!SKfiq|K4G49@5?i1V3X3X zi~UN>#6arw_X!+E{V8P}Gj&!8GxOX1Qk2$PUw-P&4QR`*k_1-@Aud2X zp*kQVD$9ko?OKU_&4AZ#Cs|u8(ZlS9>7rnz<#=x{izaTC)}^ahma^m|GTP+G-Q;&@ z0rFj3U1rRo+=SEGpCZ+RF&%>1WOP=-4`fS~7s)R*^712(O=+H>8ZnDOV$)oy8pMGT>9OoJw+_2- z_up*+O)gEpckQwc#iOKGSzXRpYu6fW491&nKTjvud%R|s+o)-dY4aWsCtbdV4`YG>N9;xn$KG9yxrV9?m9NO?(`9Yje@s94+dgGbqLlii+l@GPq$AbQ^;f>ior4yPW2A`z=Fd>PuD z-1v}F@+r3$HSWPx%;$`hM`HKre1-Tm_hJ@d*&Z6+ zOO)bO3q5|o(fpY)GW~3%Mdk;cow+YijQo}rlJv8=0LkiE6z&p1^3l4um)Ibc<6y^~ z-3+|>)3e(%&gcUvrmoN3;xk%6CjzP_>Y6jUgPatVoVHHmQ5kQ4%pXgicE=H;OW${a z*NY{u0JEL*sgGY?5=*|8;)VN%4$Osq$Z`*(@Y)37t&Od__t0R=G>UZaWA$S-r7hIe zlN{6H_{czWu&r_iH#v-E6S)Z1AL%0jGajfOjo7RbgOv3mfhi5a5(RH4b3ub#D=`o| z>;b+P*>~N!to`j&-!h>qpf3@3L!K0@toD&L$}W&aweN^&F5kCNklFU9k9rBjvw+g> zp5l7Nm;3}dXv0*a=(xt*4Yu9}hkT<}v^{<-v2C-jhP{^+1+5iPf*PlC0Be66X{vKt zS-Gjd#AmC~Zp)z+s1~0d=M!l|B4CGr8c?M^vJ>IIL@;G{e~*L@bB2jhzDJ%d$P^}m z7AHt1*=XMxPNXE+mARU(R*5m(13x<|lPOz>POe|^hwK(}O5rD=U6e=Ch6>p<*K*Fl z_mY~0c8OvU>!;BI%vSr-{7+ox^n7jeV2%6v&HIR<`6EBSi%ErI2w)oHVxEzA{~oWS zQd*)o`lh-T((TybR535246Dl0G#Q6} zNRsIVS_Iyl==hO78+@3RpiW?##hEUX%WmE2k@eC z`5-NC2pFM534!QXEaNk@apteA%!}=`A%xxZ14;8&IDzop0tdFW7`kh9z508zG-)K- z(5Tm0rFhnL0M)m20gZcGfS1^tEAheF@t{H-ZL8rapM5>9!&$wAk;#PplSWJ0cky;( zsTDS^BS^$n(s9wst>C_KK3F6 z1VnUlLS1>tF!{!F(xfqEWp#~73D@oyKtTilq6&(Wq;y&R-IK}5pyNqtrskEU)>ch+ zMfqS7DVT1B$S>;*G?DOQLNv{Fjh8R?kNdGP+C}3qR5jq zxMIFybEE!9a=CAJpeNNvz_K&|dw4eL*Hq-X@obe9Xp-OrxnB%#mFA_S{C!U>h?}C! zIPlD~A62jKh^%ZCo2SmoVI{V?t*51~epLK(fju+^4i})5xGiS@wut-it&C3Ef_iS; z=dLDUl4XuXuoU9tSMcqgG5HmJ!h_enCq-4`KFn4M6%X8-916zW0!E}7}V2^cX09T7pT)~A18*D;YGe8y6*#k4$x?jmBNvN;qp*H_jaqyDN5B(AJ&)F8DAEKi-v)ckBO=ihM%r>4_*QLLq69H}BQ5eK>Xh%BYe|>{RaK)@_Ou4FcN<9~ zpU8d6egjCqc%1WA>?0=0%gT9MkKUh46bWW$Z`JNdMVG4#T+AcEr|J(LNK7lgWT7|J@8AgpsL87G#S@~(kZHtzP!AZ z@U|XueWl9M7v4;|u6)D`x+6jeG=_NeC~3-f#{t<9@&1G zdnS&o|MY3@8?5!EKw_81dSB;D_9An=JA4{d{rcFyoE@GPnj?NzsSQno0;-LMkcO%m z^VeRed((A=1SEw;*$=4F+U1A4%)N1vsa>Au%xRzv#_c!Zwwg<=7x!M9sSezh8fVyh zReLcC1wd$^VAA%;h4d23e2MGZ?965JX7ltkv?iY{E6bL-h{>gq2ik^48l4MA+J`Rr$JQm@)~^b=0yZvlQvWbPVbd4m{$x`^B6W*mu}a^r~O(H zo<8>bnJAVT8~xiQ{6CVM;;TW!#-}As19U>0G^z*NLiMMm{@xvwCl8U{{)*CQDyW~_ zCv)@Q-jF`SXUI5sMWz1o`w}RADoJc|K5^?Wvt*=e#8r}fdn$-paN}P0_G#E3;yS!=FvG)`p^)96#QNMW*aJ~P!*<)Go#8bJq+vmyNGPy$_o#c}vaYBtX| zD^#}79AVTtlZK%GH;HTWA@>MKFKkFPbPf@1W{8AT7 zpiF2yOcbZav7sryCME$9D}fYdo`6u?SVk?DjYtj%0@}B-Ctjr5NNtyV>TlK>a6Yg^ zfL8N!HM{rHmM;I1$F1OtW>(8pAg247>>1wqdjV`C+U=**@nGoV&mDkI?>qxvno3xEDB!Gxwz?m%PHvjXX4~LrTS& z9;NCT(A@PEm?=jx4MX!^XhPLJ?iqPd-&l>s50>d}h(+i((rOJwYdrDRqb!%Q#%^p! zs9@J~lI+rJ1!!(2XHRwjglNWyuc}|H{4@a=QS<11#(U$EXnQY6Gq+5NBfcrlN9w!s zogWYP03hSvioF8Xq}r<^2d%I7)$FM+>g*IRCq?8+6&Zc8OWSR2pfr5)vSHo4B&DL2 z9vQV4f|m4ac6MvaIdYFqek-2ypuq50;cMiD4E%w{@*FjT@!#)s4C21!l%2g;+F+kK zGOAPbpi?Gyvr*=SSyqQ+t_MO2kzhaxCSe;mKA)`LWvw5?Hti1Wrn(+BHF{o+@@M^P z1s?xQv)s-)>xmqz8~CA(8q25K-h3ZzAAYbZOq$1%CYE>aObA-$ikE7zEYd1_^L=|z z+~a{aoyEpYMt$r4bzH`$WYDYM8?oH0;zNFeo%c2I7;)?bwl)J8cD_0I5ABHNV`qFM zSFz&W?!;3?L=EM2zEN?I+M=skkY4uQiYfDivl-jhcHIRrBcf4qYgUyNw>O(@EIxNv z0&_}HKXl#_0}wiLb+piDab{!TD*5C@9A2E%^Ik1L9GMqGjMFxbW!(RlcKoh!IeFrm z4apx3i0#bEnl^SloY`Qmn4~cnu*_56agH+kB_eSb6$=k8Eq2qKZPY*Q8TaGEO6Lht z_XI0yq0huV`X5*E^{_0?STMA)ua0JXZV>kWb!xPo(pDR!oq(8^;7tyV!-Ls3>F7xS z)O?-#{^iAG*$F)p@TZyV98Bi7{Br9-m9>UVrV*vn9ial@eL@d>Rm>SG=Qc*az7CnZ zR_KV{4}T!MZYo#pcR;JvP56l2!BDfz!mO578v?#cOzc0;-Qfz3DXPn#b zFz|HMO4PDQSK~rQgD}AMaY+8xD}SG?xdpd$J@=&Q?+lu=WTLGc+@}~7$dJ#YNXdzj zKe#nMFOm0u_sr@ZJ5-BSv9N5deNV2W_Xc*CewiDA z>Apq_LR@#2@ee0#4veANZQfso8Xg_a*Hyib=-zyJcGT;@Gf!y^)dydUd8UFsEYr}u zn|aUia&CL+mSdQmUBv`bcJrK6p(ka%?Q4Vk#sx2&P_Lh_Q_bio$sLwInsOY2A}MsQeMIz%;8yoZAlKY-A~Mdl)Jw=@Q>UnaGtLV+fNEdyaqX{-s%1Upt5|hmVfh3g@Ubc& zngWt|JonK0jT<_~ADmP-cTCG%k+gP+}v}KV3 z0)ev{Y;%sXSBj5R2IVRHmB?lR0@Z>bt=po$i;A|3+aOHK^k>~kjQ2(XXguNv`&l^n z$EO@fSC-XUO$6s9%K!Go!X^BbgM)Qa2fyW@GG8`Py5I2=^Y%q<_GQN0<20B}Uga@A{#IixNx)>Wgme+Fc+ z`KYd>#)!#B9*=fsas;lx90Y3uyX z$wijeKos(!Lf$93Irk^MLOaW?q@x1g_Ec+aX>OCGs#yGJg7ir)>1~OUa>u0xhsngn z0akV=a!pEflDQ+S557e6?}_t#PI?(@itEamm3cU0`cp=XdkR41e&jwA@hjNOuj(^ znD0Vna&}xO)YXOFSeX>OL(E^3#rFAEqb4a4j25H%)llHx>6asiaTDKh1X7C&(Py1G zSdU1~E$-7=T#HIA7AB5)n!lg8H*tTpA3YQ?GAWi%%$8&Jer7TmN4$iC^e>n`uNVBf zYUu1p_|g09t(P$Yj11>KpT>pCw1%MTzqwQhKrxeQpMJ)^gfWmwC<_%9J!-o&zK=*R zRw+;^d#O_G4hbv>k*IovoudI6DsKy{NgX&42_4N?@<20rBHlaj{)`uQn0h^;zUOl} zpAUCFsh~P~CcAP!E!n;B%Ach)9K7F=n#2$cYI2YU9d=4X7N&U61@WYz<3q;hIE(;@L zxwPqPZL_?|H~m*~O3vvvI_PAN_3dU)-B~h`xP>R;Rpxas7#P z{)Vj!)6oLA&kgL3hxb^0or3DmLsk)$_o=sq>hTZ)1uqyOHv5H5ZSqc+)s+g#7SVPZ ztpt;A8%6?z+KG49?C^VYNF_{sW<56cqKpmpHU_4H*{>1HJmEUzVEdy|-e3YUgY4H0 zybBY<^)aD_wMiRI>&)=5U#04fz2A<8O_b!T*kcQ|AN=aeZQ8xx(FViOQwz!hHQCwNkCF*nti7pzME=Z>v4fJRz5?BLB`SAJe$k*x< zL#X`kBMladZ{$wfyyP{L$Rfs)D<${x+7>64>Qeua9Iv}t1`by!-|ec!MiGvb!S;5a zuCD~jkL$!bI&9DV^JaEDVoUt&a(yfS3&%XEypZ|QUA-~1xoHOx7Kjp5v}(R=+(WAA z^?k%K$NULx8QP}fU8E8b41u8zdK5^eZlqN^=NMe00l8cF?% zamv$AgljQMFRBX4^w8#&5*h>BHOVGqkrMQR_aV-Y{#pKaPkLVmFd*FeW%PxFvQHFw zYx~31385@feZB>Uxem9w(f1K5ZNF`=TL*hhU4n}9*n9qHYWda{CRm3fdG(*&ZELE) ze;e9%03d`59z2OHbxkK9DwGx1ZDnt^y$(~|vbn$9-u}b@BFF1=0xUBq-ri@|IRA+s zURMJyU5=&EKLOst-xcY>O+4(r?Ds+b$A^`OO4!ucRg#s|=8P5e?T@qB!ETQtZn;|Q z=Y|*O{m4zgD8Gw?Xur&Ny#!S-^TjmEVf^r^sdl+ly&E+(w_pBq{;1DVfRwtW_LAX3 zml_e$J>{Yg$};z^vnYCikt~mOK;CWH6keL!)gu{RZ4BH+4_VI$zZjA$ZO&I@bb6Yr z6hBN()hJQw^P&3)3z0K3ajZ#Xr%URr%B{-a`K4p&S7tzV{>zjDfrFQZ!YnUtxTxUM zkD+j@8ot35vA*kUR4QP#hxdP4|MUsP#L_2g_me@lTphGZW_G$Gj%t`e!j2bmB57qzzv?{g&8v>RcUEy9w|ir zLs3cMR)$&}@GebSFz1M+Lcf)78&mEB^hu#_hc z4#31UMUGvoNSEiE-kBJy>(ylMoDud4KO*ys7&DZCMPRv6ZqovJFM?N|`FvOB%F<&F z1NraR$aJ!@K5(;EfJBkhm2mo%oimZ9CP1Kep5V&^w9OZsU2*&U(JW5W$i~{C_BIU@ z_x{Je7V|FdoHbsTQch>r=Zn8MukDzBCH2YS&f% zwLjTM6$BhK8*V6Y(J|M@G%i^viO1nbR(+MIyUl=14r7@J;Qz{ApQpP>%b57!z|aJl z;^Azg5?1w}F&GzM48wKa*aPoxM*u=p6uB*B!pjME9@S34q3TgytccUE5eR2?I!L?1 zbgFHfGNSlx<8O&|^5}ny3R2EivXu~Qxn5}O(TchruPC`>XCr(X&3Wdx8Zqf^6CwiN z{S!A&Krd4ixe8PAS zQVI}>Mj9(ul`pysV9QAeKUS=&6Y7zr9xyWT%=A(%h%e8eU=$T4A+594+&|S~JwMNeQB;@D z0N}}WUF<~=V-3;J`~*aPG;T|oJ~1$y%$+$-@M$ksZi}TkA*ub*HByPW((t0@tO3$U z>cz(0FI#m;0YV)p9_4jN3nnl0+crut!$k4Nj0uq8X6lR+&N2@tAl|j~OKM=gz*w*6 zG5N53of%x1r^QuR*E*~rU_=>TD@Gv@SP_F&*jvu!=<#_WIq1{r-|@Wf*5;d;NoC38 z>P(W{djmK8aOS4;5fgvT{IuKy)o@{i2Q^QEvr1N^NfnJot(y1$COMAf2o7VSqJ8L*ACfR!} zfdX^$GSzvwDf|Uc7D#R$!ix}uDgrMB+s4`8RB?QPr)7xaaGwRI8W#a8~6*Uplil-QBY?<^TF6W3-p5y-(jNjkAZd zWy=?#W7e6tq<+jA#AGgBU0wn7-a5)E1!0B=iW(+3wuFZ0uBx(}qc=J>3#sR$EMlbC zGUFRs-_acRP5zhny*$3Up-M-b|6^~o>Njpn-t#Jn0En!}e_jS(l(SU%@MdOa)@t>$ zp8pQ26_26HQ?163chcYZ4JM!Z@~f4VekhPkajhmj{nNXrRw3e5&Y@rTMidIZ^}*fx zk}*C9bu_d{hD9v0+;Q4}-pgHPS;BWhn=hp7EUGIf0ciw2nq_(Wg6P&Daf8vYbPs{e z@IIcZ&*j`U8_c9Ba)UXhBlhszC&mj``3nkge3 z&d5s0lA;6|Q6zYVCEbfG%M5ecgkR4E-%--`pF$>GiOjTcA~>p0*=Nov6>cBg_OCN1 z*MIrP5pBBx%)8F>g789nlEy3Jo-j%DeiZbJzd6v$pU>4la#RUCoYTcIIB0=TumW4X z94%hLFP2vn&gACL5&Np5(>yD>s@`6=RFO<{?tqo`KwR6$q-6ak+5ETX=Qn)BGE9yP zmfZ$pJJ3W}?gFG{36p30HLNRD6Nq0Ptj?0SqTr+6JM;yjba%^8N-F8m6ojY-h^`8H z*cb7*=dwgK^5|H6&QcaYL;**ifQ&C+lsBv&+SXpNKP3qxKgvj+$R*7urqe3m3aI50 z!H>d+C|VPly_dT*n-L#~^5~==OxHTyiBdVB@R1>Hg)>8_HHqn^+*6Wo?C#WF_CAp9 zcKTIb*!Aa@0jbh(6*d%n(Jfc-4$&APU;MX+3ADG8rmUl1m z2Pl3sKz<|_712yWhG!pPs`V@w-&0*Bl?qk0pn2Z7+B@V~4J}jSb}dU#8BBRWS4e=b z1aXyb!D5?-E2QEdAP&_%$*k!U&Iz`jIlxw}>iksCDER+f6!;jC6hfR1m$qkFLC*Cw zHIs;Y#j;V6A`qEqQdMV-nd-q=1i-F2vmd!>ak?50B;z$ED$5<(8#d{5UU4`8Fyv}g zdfxd+c7r)N5X(BKkwSXr)>w7YdD_9Hnpz8Q}fDw z#VzzjA`W#eWemT{`}R{N*h8^JhY0zH?@3llL)Y2i^j;mTvp;c@ zIn(ud?DIV9=aTWYzT$(*Uiv&K9($iF-uu4JAy`Pod|h=a)hR~T!EyvQC+brUer!)- zyG~1cUv3f{1A@YZ_28Nla{sdxM*CRS#@9|DsnDaDPi z@@z$CJYgj>ssaKoQ%1KLb}lFr7vA$n2T$24NjdRVqK!pDFVlO)@IP_g>mP$ zY6Yw-9uDC1hg`%gR%SH}ez5yx@@D4ai?HNLtsCW4bdkYfqVU8T-oQ6bu7_U;7%CPI zvsnsYB`PN|C*2<#)Jf#DVUK2>Qz$s}sk^wDd+EV>UCN8l4~DeQ%*JOA*vny=;@KE~ z5w02wc#RIrI)U18IUk202D9^qxy*m+dD=!aXNLUZhbJCayY1}^s)-Oh-FB1W8-m&USGrMujDJ9|anVGU@M#6ci^>znEV&xV|VBc}uiH=eEvtp7tE_HPjTUq{0y(RA#`eJ>+2lpQISp!?AL|Em`S3fkTkHMciqy*7pt-X=QPw*_>y{>-< zyNckDDU0gL8L{_m2bW@pm4I_nsew>4YFAJw^IswSKPO?XtPBm6Y=%<1GC*h4AA zunm1>bPgN3oqU~sB6o8?AhC?c$wrN!F*>UDrY83JK2VKmy&kVeWrMw#f}}dZ(x_O; z>&yk)8|SV!<#pDpWOI!UzTih~5MH4lL)vJyueJ%6jq}wb%q?MNLJ&xVAKgJx^IKx( z!Uuf^5&ROG_H-YI)JV*-{dJxjOo-}s-dNZ-R(^wX#Xkz%#cmf1;exH{kp(>0InTS& zsjFvAK`Sqf$kDepyuJzEU__K`ysm;6T743%@o*A#7U!p4m|-cu}U|9pv&SY*(Ib z(%GMgefppK{I4e%%Wep*`?{u&eD$TIE(dLdA}E&|5KDR9h%+I0f`x*~{3FzM4bjM~ zvuXp)RH-z5j|AwUC^d|@p5PMAuWsAhSM8w}xpa`!yrpzhCE+*DUC#&043vF3hiVs0 zH56v!lRlSGW%n9dOL<`B5B*_|QKlFc^RTUcG;@vY&0GjE@jZ)*TxO{^S#93xA#Uxm z2^$1>m@CD;27{2RlRbVvguu#{Dy^m8=|xzan$pwfJN8EHq&q<;}@ssSk}}eB1c(C@X_VH7pDuDob9S#rcaw zn5m#(&Y^G2B}te~`Chw15xTu>Fw{PWina!`J{b9^gNszDZb|t4kDSHcLj%H?TXnj{ zw#L*-}DEv#RTn*y2pj^c>#HGak=5mmZnwf*KpfnO=xPf< zzT!w55{}+(Fj!z#3X$Fy8)La4*p=1Gr`VPi%vQ58x;vUkEO@562MULvvtjysV8RPt zopM#f_mATT({uW5BT#Xr#gZyH%K+mPB0bg50|FM~mxB_O#Le8Gb|NG-#f;L;Fodj# zqLhVvD$Lei-5^T4=Z-BMFdp_ML3Xm==c`+-nXlF(c+I%*V~(9_FhVD11|5JAHuw7S zEWo8R%iCqm|MIot)h_>(KUrV*=^1iUNHDq}6C)%W;y3LoyzK{MZr$InGT^f}(?JPz z&el=-7plB5tlvz_`=X%bdKDr!atYG58~l*U?>QQ)0=~|yg3+_v&X?b>TZ-Z^OjAQk z!<=h;+i!cpTLjDL_#-_P3g#4OuS%0zl}xOgQHybn_)6^?Jy`5R_`Yg4uC2sOi`u__ssWVsL?xJoP$o35Sm+oYIt2a1v`BX4DJ%%aG9m~qMXL+qNRHxmUzCdHR zvr@Na2R_C;G62`<$I6=&=WTD_@^|2NJtRk;L_Z$9jd5-Q56&rx7x`lR&JP!S?C z!mu-C$M633Qda-<$g0~yDMAt9ULOmKwOkh3^D!ahQR7PlG$u}oQtBq!9MV|+WlIM% zhH4h2m8hMF^qiqOb>Fm)S(hbzGZQ}o>-lVkGCPsi;5+DE4+ZTlnYrKem=Z>m59X8uO4P3ip3Xtqw3 z>-}1$l9-azm(l=U4oggW^7fHM3UzUYs`LdJ1^>!QNjFa31N1pKd#MAW z(+>9S2IsrXdLS$GIjMGt{Q@5DEQ&yG0x3|Ig zA;J0oKC71j|Ig52&~ z1AuNy?L*riLBeY>AhtRWtmzy5opODQ$nVjHHFv(}P&v${Ib7{rzTlj(09` zJg@6XAmpV=NFJ+2n-)O?nr)l%d37kMDMZ1IOaLClh6v+;t%bUi+`^yH`5AX0RIau= zkdjo;ox=CRNpDd!K@E1Sjx-iZDbven)*OR1l!$FVzEpn)J&5_3gdgR^KUf*5*XLho z8vcbmETwJl^1qClngIx6cGV$d7m!HNVh<7i*p}0o$#r%wyK&Teo5rV5IM4byTVNTF^Y`rQEzDJtCb`{iY!bJ2^AckH2BSdlD8-uYQ9t^T*SrJ`K*)rnArP( zt%RUMhZ~Hjs%gveql~ssnB#);5HF|#ivx>`WaF%#Jan&pMdiUg%|T;o-f7qsr(TBg zDclm(t~t+KJ$rZ_ZU0vneqTtpiGPPGa7L^=u6N45-dy;l;jdhkMnyHSgC9W%kWj7h zMP0}Hspo5l@TvK_zd-hk^oB<#0w@x}^HI;xPAiFFcO5t-ehrU~m$uDm7S;EZHFEE# zihm>F?L%8k$TTv@&vxGSQ&VDgRUV(kNt* z7rG`2G_|}cxDp6JYjz-JuGKE?p^eO@wj5Hgn~T}DFA=FX@jL5tHDtK>yRT+vnl4-a zROv8r{O2cZXw&ygJl*YLSk52GO`6uw8WEno50y#KlD^jL8ycL)hY`X5Jj@s+ zrnG*bPr70k^TdQqlQVvz6GC}-DD1tZ0rOf5y%n!N`EFoLBUsY>QcywFO87JA2I zDfsPA|2Jk{cSI2}(feO0G zellj~%=>}zwf!-*X^f^yMg5Oa-g2^mUePyCR(f~uZ|GXxC~YcS_L-?^YAbPb*3>FZ zR!q$g;d@}^cDkfc;`OV#exI$&Tl4{6ja-iCOB1=5^tmI~B=U2)r|s3QKg(tIepH>h5DH=jwgoq}N0FPjUJ%r`Zm6;g ztSQmoXAQx{W1FU#G?o#i;Vs4jc`EM?RSP!-<$6kM%idWa+B4mh42B2itdu(#z9)M5 zeE4M%#R)fOBdk-v4{XGDP!7{knO^noo8jvJ9>@{vuWp447yO#rw}s46HdtP${9Juh zO`vXy=7h-vmi1I8&#E7!?tKM=@mmSeqGh5RA0sXFDoUWhBQ`*M>^w1uT_`DK)Z{br z`0`juD?8Y2GB~}Csbkfz=;sQi%}BX+|MXx@Is&>F)0slj4wwF8*S}oA|BZ) zk^WgMm7bR3nzt*K2DA1ddmTW+E5iZGGIJvlu%)k=U7qeq!A%JACqk4#fqiF$!^Q+o z;q(Y6Enx3Xnz%04X&km@mQll0*ts?HmMoWnRJAUP-|iLdu;jJCTWlQyRg3zr=bgh; zB7j0*?+zuEb}`cezjd!6y4-wdZK2hxp?I@-cF@nekxHd!zg9@V*)^%71bONpurNj` zW+&^kAitQeCQ$eq&VS{#MIL;A=m3WaBWD{=nSQN`4z* z`m-?)i}9(B<4RFu$CET)c$Kr%etNG)Fw;(IUMpT^KCy~}Z<+0xid>wTvdb&=Ph#-P zONx6cq+f6-{q0o(W(-1KZYIl^j<-JtUkKeWX4_SlEjB56_jE50mc)7OmSMpke3YjT z4DGSYKb?4)y1hf;%YOQ9pKs7Wv>x=l&urwaTE%s@#9g_b_z++%kwL93s` zLLjfrz9a5svNz+6i+7GG=S{03PU?^uO>vdZeRz$zstQKX z96Fjs4|g(8gfkv9<&HBeKaN5cat)L1NnO_@F*O8Oyc^rVS1EXExwFtew}CyXnvY%i zKL6COv$inn8l2EMNOfKnPFeKwcr~JPs8Ci=!K<+0ToLy3oBEvgx^O{gZ*izvS=Gyv z#Mg@5B}Kxrh!;n(`?#nl(i2YNZfmiw4sX`w)eaqWU!67Pc_CBl$NQ(K`pEB|{)|iV zKUI6xicFLGolMI!CvF8mz=vPTSKpjWccTsp7Jfy&+voMy<{{G*q+5tWcMMZ;F3*g| zEO9dJKD{hoJ^FuXMu5gJpiCMQhu1n~X0VnXzB91M99r2nSN_kR5K5)b}eO zs|s*A_VFe5;@pm9PdK;zzjpzcZL1-~I&&)c5DkhNIp+5v7HI~C+C*{d@H^XD;7`c} z6Ee%S9l!^;WGJCwbD@b=9;a9m*hKZj-r=I!#4t-Wx*&|}`?r(Mp0PXW2QNI`3Zkpt zboAIs$hneq1~?Bty`(8FkLA#J|+;h#D_l^vgyNoIj>LXQu* zE9h0zy_e#tjj!p0J!3{;5DlUppnvqn`)<0cCEsq?p%qcNWwS z*%r#Q+Fg$ZQk}}I<|Tv&*sN=XT#2r07Nieseu2t5$&k6xF5o`Jb6J2g`zNZoYGfx< zs@|_z%C1I@_*}k*yr$bhOCwX6TNF#o4}liVav{ncDkwDq2j0gM6=e-Bg@_JBy|Pxi zjF>i&R)h`!i!HjT55@~?i4F1q^eTdLv5)^w z4YoOW`5>KoJAI3_ty={W;?h;kx)XCW+nmS6O-Tg{1593UxT!}&Gq;CHe#Bq<9rFXOB6f(%^ZrIH~5wwbv>xeF`FJ5 zieprn09G|EI)NzrnnVXaz=OU%i>%KH*5)}d(h486Cj5*ym)$fL0BpW}=&DBX?dSRH zQdUZ>ws5HL6d{gnJqf_|EjO_{Em96V4zO?<*XeDK+;I`4vUr8at{GR|Y97^HHPhPI z@?al|NeGr?NDAOz4Pqo zI78jcI4*keWAZ}AaMj62kU1a1BC2>^P+a)E0iD+If}p^DXI_jy8Q=OOF5Y{K;ZT1= zoH+RcSj|GWQA7{Bv0VORw)Bhja}Z9W-43T$j%Pm94r2yUmAs3JR1?&-n(QjQYyE6S z5zjncsUxSUE#TJI`v6@;zk532=I}zIGwYBePJDSc&Owo4{ub?XwcF+C*TNCM_ZAmU zs^Kd?n`cJgKTMz{Qd|_RaGeSHm=BX&oxib%Zb#Fd-jOcn?|J0il*#1kmOm>G1q~Q& zv)y=e32MKQtuy}yDrQ!0k<^jDiyLNGb7SWq#E%+&KY$Bd64<+j8nWum>~yfZTR-V( ztf$Pb-Mft&x4y17JKny@^EV+e6$;>u{>i28-MMRsvYr*Tdt9;iCR5mDh@~r<+MLV{ zj}ncmUL@q-&9#)Oe>NmvQJ7N1S7;d^g^+noH#Iy}3upXkjW$kIfUQdzx5+l)aHc?*~_- zt4C6mDeCBd!U!izj%rVPvKPgW_oclmZ5^kP#;t+pH?o$0rZ?X?D){c7tKJTl>iwNw z1G;BEp17M*(Zvtj*5O=xU(d{JkaP{~n2B-&=hIw`HW)9qZn8LPde8iEM+<6qyrmFc zN7-lmI3~bAuV*4;9JUcjzRfAyOU+uWD%niBMjc3{w%rQS8G_pYSnmc z6d~;wmY|Q5<|Ulv^z`Hz=F^+gl^E|ck;`1xCk9!z*J_hkWQ|87tUWTk!l{?CiGg`XtcOsj+O?95E zSjhG$+4I#wvI9PdJfzmXtQJ~(!w77Ca%}lN^fj7fBb@RHuq-@g_q{e72b8d2RF|0P zKp;7DPZL#GD95Zs9*W6{CRIAZ_UiID*L1JGf5wbzwUWy|s-#q`F!QV~OD+|jSm9Rw zRzew1#yq-xwCXLEwk8fy)*dNW?Lw{o;jBy_pQrPMjXm>>$VnqhUiiZ;#1RWF6&KlZ zbZcIyPzEuIaBvQT&z6|C&n7w|4rDgf$gsCkg%$O%j?{b&f+PcP!V9$p^6URGaY2Mgs+QjF^kFZ@m zML-5=S>sjydn?U|`0JUSD!Trp1fAUZu_@cge2oV!?xa#Ue*C+95LR${bJjbE@i5sw zYD?hlFxi3mPt>(ewbduzP-C#yj7Q7`X`s2@76g@foYZ{e!(L_Ke-qL;)MCj0`PLwe7~#Th0I@a)t6n zj%jCaqh-+qmX+ORZ}|*!0hn-&*kI}~cND?Gs3Cat_0kdZm6Uh0;p&x>iUKF`pMYJh z4&}-=puB*9`Q_2J%Roj*t;NrCYqp)4gVijqf#QTBxvCh~Yq}3TN*@P}%{$h1(xjLt z+BsPurD3@)e!e*8m_a`mwQjIX7OvVPqAQdB=TdsK;t}OxIC{EZiO75B;CEX`AhDDo z*#Whdyekx1xD|f|XsiF>jsIULX|N)cs_eBRS)zBI85q@&Yoc z^VR&nK*ff0$n$DID9rd^>Q;HoH)14_k7bPzW?=JcZoI<2u_$YV7(~;x=V*bSwkeJq zthj6ZlB8S2AtI*>J<5{HVLs1qSvy=Vul1WBDSV>hG`8OBoO=m#M`>c^VYz5+U3~Bn zVxw8%*J){8p(D!OT<^$rJDi#I&p?9m+bMOqDm~kGIt!vTgoE5c%&^ZAM|0(pI^%Vz z!9B%<-JHv>wEB2wk$Ev)1N(bTB`equAoI35sv&lD93AWC)5&+*;wxkLKz_!$nK?-T z>#ht0i^=}Fi$Y&K+0zIdQd8EoQV#U$0S{l~?($OYbs=96UU?svj^u~gXmnt*7G<#Yqmg$*)$qDp$ASJfm zH2(56Ws#_#ofQdZhy;+3m_n48b3+`~Vw{?fz!a7R73Grrl;2T{>FlF9WvhLxgvXDha({!AY%T68;|(@q zC?-34>0(r~l&67N(M*AwcqlDzz(Lx)h^_W8{bhmJU~^jP<8R(P-eK?8mMw3vtg{Fb z{v~DeDJPSw(5*)61aYxi7rdSIsOYY4^zC+HLOg4pC{XN-MO{_=77gap*!&9qI#M=( z{#D>ij4sz`4jLD`1d-$f(;K0C-t$z$ZaDU;W78;~OcsjUf9L3%vAe64yeGNclG8=6 zBHW(WXYH>px&9zWbz!ybTE*azVX#mo9e8JM-2-H?Ou`(JB){aLK9iL6&Wc+{S|84Y zLDMy$9|6Psx9>6AtmemL1Uhz&uZE10=Pld6;m7-!%XXy%a$m0i^yqWJl_-`P-*Peq z(31OXde;H4pnt-`2U0v7dqYj z^^{Nafgx1zdn)j~c?YCYyVER&%%PW@wlDDRyy(DF)q*8P2+!icpwUozYBAPCOUu~x z?yRAUUcI?sdb2Dw2%cT4Oct3hAfMw)JU?*zD3n+mLgK7YkZktx_hZa+iY-o;#T+la z#U6)A%l)h37QmFo(6&js0%iH3$4&>GbbabK!DWJ~8grKgdn?uFIRLIfoG#QCO;8Is zEXY-_ug{Ly&z&vr8ME+N366E28x~|HCFFtf$FU8}hze}c<r=b0yRZ)HZ)9$DRI2EQ{Jj5 zjOo5R4$$ei6Bl~?h44*Dd~R6m5s~fhIFc=W?w*C_|CU0ULnmRE@My~?JRneY_kqeR zq&68C23b7og-dh#4VqH3gQKl@EIS{ag<*NV63gBYHRyDWvcj+i|$2py# zd9FqHw&&=qbvr?!r2U#TqnS91qq2L0oR;PZ)IFgr;ZEBz(sYRm6nzERpAQk2>-Q6A z%V*%lXG*QtfdsjPr=MHrX0&6vZ3e1f3^rR3Eq0|BoFi$1O*#WQzxYSW^N%zVjSPo- zW>m6QmdAsnC`(icF#zT_RPgbPMbGRDg?qHH4QTUkjHyA5_=~cc*KV+={BAIy`zyls ztl@RP;!{{*j-ny_Jesjoey2=x_u~}gjTv?zvQ&mu!hGPRmde$eKSyF>Z&#Lm7BUFT&f1}o|)P)TaP z45#*dt2KJdjH1?I>_94{$HFadt+7~}Kkjy=&uc_@A0_y;F_(r4m-RNUS2kpDGk$YXV`7B3 z?|X_xc4siiIoMAzyS#8iqW=MRj~X<5CU9`9y7nH$%?-NGL!q-W7e=6p3`jZqE`8E1aD^ba@9lPBvg=Nw%cX~TLU9` z@So1?db4cYL#|YRQ9is{x=ql~g!el8*+^sXQrFY3(p%+xm6jg-r=NI@JT%L~dCK&D zn767I1P^1K5T*!-$S{iFl=%bb$LaUMgQT^lBX4pa1SC>=R+cij4+K+}iMs3jreZ%t zJZuRU+qBN^LP9&TmFOKR@xl#A~6)K@B1zCUc&7E46b$qRxt-gH_HUtD}?q z%HJ%=*GwQRQYqxE!1sCxN+^Es)ZOi%9p*SOQ%9u42|~J=?fxJ%YgXOPgGzU|6O~^; zV=gMz7^6U^@-D-a5$s%njJ!YSsy4aIfviNWVUU*t zoy!`~7yS-8Bsy$e+xjZX8k9~0CE3Y^CkW)sA=q+RKxGb0&V5D)@SuKl@1VuC)nC|R zIIroQyVd2BjY+nx2Tf7q?# zX$+g$E*~z|6sy$$49&l8A!OWO2i9=)YGU*iWZ+&UE&#cNc=5w;GSy)XbOIgEkocj6 zx-M;?FcMCqBhKLDGO5sxSQ_5P_q<`cVEMeDvoaTa1k-lq8CYhcIXF4pO7{xc{%{)* ziQq7iM1Qq>eNspY0rI5zP-lW_9mTz1UMtR%(oLN8^&~vrFFDlX6Ttg4qf7kEX(`b_ zUy3EIW+YuCp|{(0tMq9PrHMq;9c3>3C^W18R0&82B65GC9F(ZQP-wD)!;d)#Ueq^0 zJugX>=(s@ysbaofl3!?7t{PqP`cZ;!g zMgHMXjv#C)bZico^zs-K_14bkH>h=mSnMK|S3Hx*1QakEIm`~uG8#joEN-1x+}O6r zFI;8GnLzn}Y9T8b@JK+2%m?>J`y&WDamL<^q99BJZ^;|zTUnU+0)|u)&i}TzZ+EsJ z^vUAU+=lKUesR&&C|efGc9c!RAYQcZCOfaaz;ilJjm=pEl!M24ZbgH()=j-m~ffi73WGBamjv$Q?e&d+$aFeLW^6ci` zh^2=I&}Z-aHXYSldWTy_O9+~~S$WvCVpq%p)=$^WVVTF@lReG*6%W5IR$@evvg7ga z1b*mZ`+6@!i1oo+&&vpd#Q^mz6DU+h%Th**dvO9m3!YcjN%a)|NBe9vXiZbsW8TIY zyY@cwj+hS1@PS>DU&jPiJIVd(4!^bP{4XyE3;D>#tITym`d*iAS_|q)g+UW%pZ?E` z;uDtWli_dI=!;*3RCUc?4ZNZ^OCg?&DWq7t8APk-i=Z+ChLmwOdqMFflV3;)8N0{#MIsAtJWyi zl2kBvbDL8Hou^o+1fi0HrE-G&!`&UHkF>$}c3GY=ve*`zPqpi}mzxcnyHA1Ze0g<2 zi}!eqllWkTi+Q2R!7$>S#Ne=mQfE7}W+_Z}H(Tw-_u1^YSW|pi1UT1{ngE2c(Z_y* zi_oCg2dyC?N{2?MUAE7@tKwiuTF$Q8$n5DsH&abzh_qtLqud%WH6ZJ3puBreU4`17 zr&{AA%lg@n>Fdb>iK7Y5)B?+8GP%$oebvcj^~vd-Fd2T{%VnLJCHmLF`P(A-qjpcf zDpH#2zSx{5o6M~*H;gtGeC1N*JoG?jP~_E{S=K!&y;)Y<_k{m#Eaw4aL|E73*hRul zCrh72YrK&|gG|fpfz99uKe<}9vtpm{bjMa zVgtfbjkHY~V1KJQ(Bn68Ft&WgrJ36zG8qx<*Ingt&j}5X^sAsG6EstB$nJ?WMf@=6 zga{%BTerjHlpm4AC!HqnGHCbgcYkX>5_D-!lJ7NPr&#&=csHvfFdLU$$J|m>S0@;~ z-q_;2wbdEPb3y+mMSf}tvQ3hYHPkIM4*~{UkIP%%`VH3%UK>(A!G7{>w=!pJM`f)j z&nV+Y{y)0DGAa&b={9I^26qqcB)Ge~y9E*$+}+&?8k|6IcXtMYOBmcOKyddrx!;p@ zPtIGb|L}t~L({eQu3c5#PRnJyM@w>!>r&8_)(94M)`YgM*M}?z)AXGVs&D6mNXh0L zf`t_cQ8m@VW~Ke_3J%1>b4JUyz+-=gY2616a-&y_tOSc{n@Pc}J8n=Yl{0I0Y4+=7 zbB3)u6%1{{b>k1UkhCWjJ<@K{UR)-Ouw{Iu@MdbJ)qtoZ#G%{+ihc8CUE!TC;v0!?2fJ%ffg#rTmk>q zR`_4&y0Hc^)*w9=(>-0Q_c?0r<;RqjEtQG2@#XRptlnfl2Z3CRQP4?3p^7-J=vqyn zqfc`-10g-kaCHeY-XsjVoDyZJQ#M&Y>OnvQ(ND&1Nc6$Ycs4UFD=5>D`6pp_%Y*0d z;^AC{%~{8XKJ^A1t>X`!56jjfV4j-FygF}JyF(5;O@vaGtdb)cb#b?n`5^tqx#rOl zPz8i!aF7Kqf0Ly+?K&wZyH9?8?@xcBD%)v-?K&~e!l7U7Jm$6PK5#E-Oo{tb^T{e3 zYkhi9(f%l?*gbf>)0=m!?9rpB9WryA0qN~i=*l2FD${CjVo*4g zw{@6Ee_P=iU(P>4TR93Uc-nFKJ`$aGk;EX-o-e{!(tvDj(2-}yH&oHSV4T|&m=V8RTaJiq8QvTLxVkgFgySMrocnAEQ6DCfQ9nx839On^He$9uI=h3|` zPtBk9lCN4K8!B&9Sz)*f>*MO6KX#UnxlLAfqa)i z!={pH%0D%Q&M35R%5h2yzP)0>*==Pr`oZD#@3KcD*J7SLP^BwyG0gV00@~W9p(wvq zfp6bPgLBuL;x1lnHkX@=@02L^hjSMfFiwFhN7%z;T)Tgq230@OnGgoNry=`Ay}yny zMKgS5QH_)PvR_uXyiYiR#AIu_1$UJ}uTcaqZa>)S+uIh7qlQ)zRhXhTqHx@xz>Pfx zRYW(Rxnaqw`y;mK3@T(-ZGAd!oV3V{YewGn>M*ZCCwG#B`%S{5h19kHt- z#pC;jug>+7muffMe&c?hbgIPDYn)o&eMSGPRJjt_bKO&rL3Uu>a#gz^=`D_J-_ToL zF1v0YTk{Y8q#i+0;409di`y{^;w%Wm`lxP}=G6urhYF za?X7ejwU#7aHKciB#g}9+$)rqcOj4IBNtnL_X|l4$=<)z^EutUFp4oxn@h zpYHlyG(G>PnL%1mNA)S%K2A%H8<<2-ZhToiEuNV7juxv8Kgy~V(uSTU|K)$i-~X=x z2-)kNO4$G0cbBBrWm7&_rBCo9(qf#eRGgCulI~Bw+qvNSf z*vwZ3c^^^n$+;UAlewiTY)aRam%Dhov}pTRR_#m8$+|O$L>>#0o!ZX|*-m5&H8;3W zm#owj4Hb1X)q_Aeg}+xnZ+|pjsJjk(CkHJV#Twwzy`DbATm0zfEuvS)jPXV?;PS5N z1J5PT``PD%9HH^`X8-Q>N-*)6YLtM@ncJA6=t?K-t# zGvqPK2^x%OGRMMu-iqCmp~fbROnp6aS<;|P-V>@258Y62=B;|ujpMc+F9jnI;TAu_ zJs*7cJv|2Y-fX_!!_hc~odd(SHgA7Atu?{ar+1j-P=BpJbOaf8w!DXZ@7;%oWCLH0 zG6@~y%m}Y>se>DpA6y5mgHK5d7VB?Bci8b8;=~JW`cu6Z+VhmvzC8udocant(OKa$ z)>clsQ$vA;) zfeM9;GXQ5j>sdP!vvZk&SvhwKLXg#1knzCvt>{>wqRtSGYcYBiNjl|dfk^C%GO|iQ$?=vO3N}s@BF#qW6Vxkd7MDJlw{k#?!%t@m#AQ-j2 zvPlyVV+s2{6l zNcr=&*SY-doN(JJEMxczCY?Qre1l_!7ClCQ%*P760Tkk8%gx?e*#3hLuv{V5vv?AD ztYLgve*Sx)!(kH;QpR#{wAk*@ZNAg?2!?b`V%`wGFRT$qss4h{i{jifl4UjX=RIUL zuyHb_z$xrSr|{!LcSeaFgN-0!g2-2_gy-(dp&ypCr0!xE$SFtg7~8ydg;4Wt0Z;RNNB}A+@A{ z#BbmQ_0)Q<;~`}v&F}X>)Q%cNXrqxNv~R}0SZt8m$c~zoO`BC1I{>y+$8qmhq7vDE zKRYoHicyQTk3@goKH~fE{tVkNPN6r%kU#`sSk_+`s+d zOo4$=``qTnQ8J#o0AV5H;`FJ>7|~K+shM}+@Rbsi)K(WXURK)B(q7LD&76;4lhV$B*i65K~LW{$l#Ke4p z{9lq80--97_Rz^>2Mtcu)k=jT+y#e`vO!DZ{h$~^n~$P7j;iszr^OB5>!vR^sOhAG>1QsWVcnQdZ|^BRaR5J*dr!dvv}R2z zM52=c#EF4w_{P@kq3oPd`&C;!mNA6dfjNkc=~#T-4I5Q99arJqY5n&W=A43`tAw9@ zQHO}WNj=0aIg*7Nk9{%;=psAIaI7an(GkiCz?p<`&>ONvBki08n(}1w`_IJ*T zI$!9oF?_dj!P@Jq=?iDgl+y?|Up$oxHNQ&H&uzC{ya-e^-}WD|MFL^u?yEO8WLral ztFR&S^bxgK`O|5>`Ri`nO-5usCyZJhA6uniAq+xw_N4b0eLy}*8``++Rm}Gr^BRLe zij$%WmW<&(-M;FuxN!Jcq9c_i_FhFvDu5+=)A;*0H;t-J-^s&RKs6Z zYKV_vXzn^E)*(=iF2qmMyp@d`15tvd+set$seX$698+4OHg$_ zzhKW9G4U5m)oMsg!Il;Cm@K^_?H*5NTAdk^fcU3cENg_!+_mBG2QiHj*QD`k10vG3 zvUI6bD{(rlRI8!drGGgP4s5U-W!=Ul_m=q?NelY%nDP>QA&_^ZL<`1ol(5`Zi)+-M zg*tu)KeAa9gm^VRp5}*QH*YOVGrg;!f;uX-v^iIR~AjVL1q_1g+KVIKJZ4LBTI;Aq?2wP3z@f4CPF@UoC2$(;ys( zbrgj9i6iZc`2lV1KC%U$1u^~k!YWR%J3T#Q106-;wWzds=rQMql#aB?MUp&wLKX8} z0m#+YW${~lCi9L9E;L_0OTsp9EmiO6H54QLkgZ_abMPHCqgsU{$iOQ+&3!EweyBr* z8dal&9EnsJ=^Da+*%Fl?*pH`goG>}LrMeun^M{aQXP^nQ5SNJr(dZ^8tq+U?W2T!C%oY5|A-usNI(x?mHo)U zLF+osHm9TR_F}9hx>-*5`t-MHIs$P?_4JD)2b^w4}pPOUs-Pd{ow&9dIBN6ed z2S1%J`w<$d!Q}I(HE|s-H{MotYJCXNH*dii^DX(k4zaqxY93nzkYgGJ=RR`IWNRr(D~3D@4ZJqYHz=Ey?s)Dmx`92_&qxlRm`QFNG^(O z^936hRd+j+yYG5s4jG6=gfj0t$$wR6t!guai|XSY3mAKy zGt@z>T`7TkQPQ8Go%f<6k9#*TcCgbQV{oMN{WkwUMCP9#^Rf_!UtVIisk(seHdkBh z%6loL$ejZe^QyPK?T6{(`XBphaNB37*dBf^liY!RY2gP}a8pABMoPeSSi>5ckiZ=v zPO%4PT%jj-JF3$(CYF+Hx59D9VC@#~3m}+=MjJf%S{M;#(lKP_@Qa-3zMufzIp5lG-v&-4+avg`iif>1A~{?pcolnHCb6cQx{O&PM!iCR?v6}aa><7x4X!7$x3k=@6E_++RIeqA-LrhYb_!s(aqZ{yz#jy#)>D%1Q6h^Ud1W9-cx>#n(Io9D~XsQ)0x zwU41cZ%N!MGC_;ZV zi_kV6?9{L=nEw*nawJx~9p?@UY?cOmeWf2$rDs|)Yw0Sgttt=3^AOC5&c`jQ3z6du z9(S4jJkRmXKgM+WJPvIfxc(4q-0i^~d0CH^3fY<9-En)Wf7zK}YBsjKm2n@RMt0KZ z0W2di9@GWLb*sV$Pr3wUQRT8w(NQlIv2=+y%q-?hE}~6;Ot{^C-2jm+rk0p;J`?q}4JF@66)~kc#H|(;g08#bdF~=D*FTC1 z&%am=sd9#f$PECBjOl!Zo8CSX3m|t#c&>V>YzaRK+rb~T$uYsJ5)|GEQF0ov1>(Q= z?96k15u@g6%vh4Bt;_Jrw59%Q2TJ&$yT81IN>of7C*`=4RcMjuMMEY+NZgikxy0ss z-k|s6I^nNgWK}5CYt3Chb^_T#Oq-rC3`WwN9{sw6XxtAXZq|!pM$c)sl>j3|SPVNw( z30zMMg3}ITKo^cU@_klic}R*gjuUdsIW^GK13&OPLJaWzW)@t?1}po-f_-6eg&K2V zD|jM@tNOyvLfNX=C@G7{;OCalM7)QlAA%6aLz2?ocTMbd?vD4ZkNGd-^@{@-bkPC= zu)oG+8KGh|GOUK6B18D~m6}JTx#t&9kdcJ1ajgiCErJ4NXCwPV_%kup#!W_d3l$l;X6b z#1k#n5y??pUJaZDcKKpQa7X~ldZJy3cS$XtzxZEX?B@|NDLdE^OqnLd8;Q@w-@m-9 z^gRrlsOELA^4}Bw`PRR`iun734h{wNGGimmrG7{k&Ts~*I$}ghrzG2|9fe0{D&9Q( z*u8=$Qd&Dq=7^SL5MZb^m52iB)V~y5A)iL5u$ot|W;AOo;1iO4lsR!aTp~G?t95!S z;`8-im_;rj02@FtVJom(X2(ro{v%}7lMH!9Z~MpgNFa~Z&h}YeNVc?;>1XK{=~)C# z%Fw2sH4FWZuPUr{?{wT`d%V8lT&l_;Bo9l{OOQfOaCA(7zJHi+NY*AXm)b1jE)6!3 zggasQS<~2Txi%RqkXyTt%x>^BD*RTWX9A-Xq*3Yck>BOVJE3n$Uv=8wG5A`B;s2OGH^3rt#DLW1Yzkg>VS9H@S3_tIckcaEoxs9df z*DL?#oMeNZ6SkI-a|?(8xB#qp|JT_Oam5NySxh^MZOfhxAyOv3Nj{iiIP5L2G(z%) zrXluFi=uT@XS37QoarU|ECWf9DFXSa1ALOzb~Z&@kxZQk%&kdHC5tzTy-}+TaQqxx zIT1ijT(p+^+@W?kcwV1ndZIbR3%0T;Uqenui-@Z!PCk65ZktB@H02*|vK=azK$_An z5e*pfBK8wX3ldoY__frH-kyK>0{{zwB2qa(TL*Q@6x{6($vuTgRq5T_RF`;L|;DB~j=X;Vrt*YEfxU+BSOoeuN6Q!uG3(lTAiH(FE z&ty!wy{O`j*>>NNEA*@dzv{|tOdu|-e4z+S9G6Etg|7|UhE@1pfNzfXU1i>NV-kOx zNd#no#FeHU*7a3%O)k}2G0&YGOV+i}T71ZbqIQw~YQCUk)^rS!<;0w-zq88J%1;=? zW3wx@txT#;w}l(6OMMkH)jI?7$T4sK0J)}NO^!@M%fvt4ln+sS?paR!>eH ziw$3SFLA7ER>cra5<*pTdZqpGeJ$2)<)g*?PJAWX-iqW0ATEU+?RO1z9>4^I#JX zTif%Ib;IWy!V48W_N4DF2*X{e1qULnm2A#r(l^ycE_=c0xJ|Z!S!6;@#cUw)8ipQv zUknNa`!{oiSi|=R*F;C+lb_Pbj?I6ZLz0icY=i~HcdiE>4Xc&viJv(tsoIDjGK6j4 z2bXeHyk+mk#-5|Utm@moRRwE|R0DkEJ$MZ-Y51F;5z(a{`QW2biB{cGE+GNI0O3am z+6tdeF$9&0iiEh2@BaY$e=mlFH+`Kq(Jw7&Zt-3iw;1MQruYqd88Edu^kXJPvnX z{99hXs;51k|DpN&0UxraL_~q%cu*ecfWw0m(napxxzqdOS)rNW*4{ zLGv_1@N3DCmmE8w*`IvyVNWx&h;h1dvpJ$)Y@EJ1>=JSLWB1pu(qBA#8L#`ks`1Sn zh_TIvlWW{;dFweA=(NJ_&X@e3y8w_k(q)j-mD74pvK>ZWhg9Bi?^PR(qoSg6plq_- zonvE`ctOL!DEZgT1LJce%1h#GLwSc(RYL;~<6JDrxDuYAL->xa*WPF$hGZ$3tVM3t zjx!tee#fuuWzk?y%Wy?#z^k?CL_wdCm7wV+h3#z=yx6 z6Hnep#GhP^O>jAnYy2zO;8!0TN5fM@pdBA-&7X6)VHFr9Jn9v~uv0@fK z+^l&uDt^h9f;V^B;zcTY@#S%D>oDMB|@TPo^>pqIW{6u#RfTr_~`qBVFeaq zGJYWIoIeGjJm|3Tr?i+UnsgRjhzw2=21ft&)$9U-BVlHMHGBTM#BvP&@tUyZ396V; zdulw`cWDegd;B(0nDw83$0yi7OBxift?L-C8@LB&dHCme1~Pgg{GQ^9O5uOAHTpMl zysI&Wjq^XYFNlX5jja5f&t(^@+e8P&O7|SXzJ(v7XUn$51Bg>&v*zrn$6QMt>_~RI zeO6>GMQXOi$v>ME0tBFHE(j!fQjO!H6d#?HWDVwJ1RPxPopjraIZv}&Vu1%0g|FtF zm)40Nq}V@^NoM-~N>F}DB)I-vZ#&TdXsmUqgHwmyi?4xSW5n>e8Nc63@|Pd<3u33x zu{Dv(?iJuK3e_Vd7+aXCCO*YkKCr<@T%m?|%7>2=$+NT0-AA;P%sKm{gL}F43ko;n zRrweQUq~g|5UMIk(ZPCQOR{Cjrt#M6hFA)%pN9VA4>NYb-lyw z7QD>v?L8Y}@+h`OgaFG@)u(>h|3(!E$eeHnnxANJ#1x}RHaHtF?l6dn3iZs2jSf+$ z-1MZI_lGRLHp`z+#FMRhrAlKi5JBn4p2IV0*qJ$0nuI9!2k=G8^kE^)xb?$sx_bB- zynxA!#B=1rJXVQTyxraWyH(x?5=C=@_zcWRr)Yjl*&ec)PrWo}+9l2motmu4xEfkJ z=K~&4BwL8=1j1ouL~^{p_hQ|0OGw)CVYp|Z5d{(9E%`^G0-l%4xdg;I)b-1Nx8m$q z_4j~%fanpxEqC5Wrbr;2@Is&A>zl1=QFy#QY5Yxr zI3OFvM1Qcm82!E7=c{G8%+{dlG_lh8Cm-A#^sk3?rK!%RRML6^GYKlP#fu2fbd*Rh z99%-g{RT5(mb#O2sU!#++<|Ao7Yt$!-3)zaWZ6Njam{DkH89*=3ea;38`|ABvF5cU zkK}uCN;_}u1}UrHn=K_kJSZ&E<*Biv6F~a3TJA$6u~kZ1YA$Jl>$dVvt7AN{JrnD$ zRG7_)94_Wv00bq_bAe-BnSelOyvQ4vL)@6~vqEfn0R1Nuo$LYU0zl&$hkh?n+RzX@tzd(qP;#jfCc54Py znM)?~R-s(4Ud0YInD1NZsb3#TjmMx@);SL|NGexe6yox8~KP8sUZVKcjV>u3^+{8YflF(|wyJ9pa4t%-r7i zVK@;akm7xa)6yv3u|BKs!2vOcuK_#|Zwnc?)kt6P;2?M`1^R(6P^&Cf;)4%t;iZif5F312C zwfhMY+E2PPK4Jg%mnOf7Q72furN#i-1LX${idiBglQ1Z@rG6yiwy6{D6kr$O{h$Y$ zEYxihm@Z&m`L(HU`K(U@0#<^ERf^uAw<~tEpjD%Xm|@iem@uNoV_MFf5Wai+GLEqv za*}X;-bHs)#v5=(d3<=!Ho6h%(b3BuDN)HTir3KemJQK0Z;3R7JCwHwMNb7<^MfT} zHwICa1NMC|9ygZ(;jDa~z78B_%O_ZX-s1{L-R`DjyD^h*(*4qo<*-Pt&sOqd4DANH z2mB)urqrDuy;S6$qa>DL4lVGakTa{`6(bj*Pbt?h@m-5qp%1V3_^nvx{8I<1 zx6q@uY3W?zHN@87;emesVN~5!%D$G2a0D$Z!$|ujfI}BOzYgmwu0I;ERhsS7fC|;y zTaw^AxWPGMmJUtb!ZC`%r*?qDs~zvc!&=|m!CYz{g^$oRG?#L1LeB|AP_B^B=1Bfk zW)*=JmVd*4>R-N_c2qa4`cA+?khXx$OZqJSm}YZWX`zY~Am!R0FpCyX8}XJa9K(pw zOHGWc?mmW2{e?+esQxW9D9orH)I+TBJrhB?IqbYCVtU{ke91_aulUj<9{1YhKM<2XUf5yTv{Avs7P0;i$9a5#Hu z39p1e6x=_I7M0??Jy`!YHI`+*VNxTYe+Vc4fOPKiyY@4_<5CJrJh`+1|5huFV~p%B zxIe%GZX}7vtuJBD>~`g~&_M(vzb$-*)=F?k28AUO2BZb$Pp&aSP5h~F3Y_VL6pVU1 z-ZJepW{k%2GS1!AaUt84c*?8@&G1d%$HSpu9pgnaTZB22oo3_B$I+YhEyI_4E9j|f zMbZe|o+Egj&SK=v?~8p815?h%t9J)U_vsLK-wcu5#h+$v7QE-FB-hHIGU}&fW_ugJ zwYTp`A{fs5t-U3PvB+Xz?s~`>$T?mMR$Z^+1+?}ekO@@CdCT%2^2>vps4RfYpu zUHSA2zOGxm00Ybx`TuOpCy@J}%GQ4`4O%GIC!q1AQbgG2Y%ea-JI~TD=O0Uu(aoKo zsUo1jjLGWA+ls{SRS0oh0y?O6!=@i?`Iz20a3ko1&V&HEpEKe6IjMI!Kr1{xuB@^J zMvMr)RH{?Rf!lUC7onBs2mdDN~Nk5qU3sq(F_{)R0=0M;F-Ryk9M?c zvL8^VzmD3ZAq?+34p|x?$_@?GM=!IPB$Yvrl~LXWw%>i4``Z2Ra9WjOOQd_gikTos zfnJ3xoseCJ<(z=ZK3>NNy+rtv`&_?`Li|$h-OqxfqfO8qKkMSYE`-n+;sdZ@U=AT5 zS~Z^l91Yc^ql5TlVi(i|lx__}4z%r~t>0K44|V^17XSHjz9 zwVx*`2hbb8=OgA4vp^mWJhs`b-Vf?qa__#kZ*qGs6-a~?3WF$$c&Ps3zhgvZqaQZz zJAXlBkh6sJ&;4YT?wHtZRs4ptQ)??!JqqlTA%amE=iwRO@JcWD=YzZRCE% z_?Zh;5BBT^(quN{MTKNi6g^S_7h-{dSDbp_x=K`vw2jmnBm+d)CDPM#(rh4ccnJ88C4o2F`{&jcbR9E?<(pr1*@O#-jVuU|M(f8{yAzeSH zMwGp;;b?!m6net41m_Nh-XOPBEk)qd-RXDKKbH^_Hj}vy%)p@SOD4|Pd5oAbb07`P z;AM&3#R@<6uV<~rpYDA6(i8qiim{=t{foz^1$~k0d%e#2E{R$3zQFHTDq!_SY%o-P z%+v)JK9ev)f}XhGO>&5)ye&~v84ljE?>wSSxB+r>YkuKyUqss*`w=)9I%kA#uKXDM z{yXpG$xKF!QlH(UKI`5|Bg5Q@b;w*1jQp3L+3x$t$S@c4;M}XW(4Xk?wxl?6Zr|z< z3=z=nQ?n6eLQ7h`2y!&I#VT3HtH&lb6tNlHX@=g*K$A)Gu;+1K4(Gv{f9^& z!&1o<{t_FIew7+qAu7q&ghTyq<)#LKyt?qzkABXYG?cE#`6x=ghIR5Sb%@i31qhz5 zNK%ZP1N$-DY z9n%EpOnfDL0KInBwKrcdLHxX#cL}P`lMyoBPZB=86`qX@MHh1AQ^**k`a*H*4+Uyv z?^~vpP(LAtd{Err4H-|JlKj2ftS8UTfWUzxmc5=;&0S}^gvT>d*+PN*T>f39`~y*Q}dxUNal5iu=^OEUFX;0F$uL95d1 zebb&G06CgCThMJGYUSq{k0(*I0&iV^Klf0KsTx$dh-Av}+9t$BOi%h-x}eo;Qrg_fstR)5dXjh{}&vt9bxwN5U>c zA7Pa|vy*5YzP0E4>0TtnRiTy^fwVw5Ja{CX!qF0Hw4wEVRG6MWxU7l%Ye8(7boEb3Hoz zd3MHt66&|BW-{s~FVbE$F24wC?!?_;x9lJsL}WA0)J_o~>qi`?VUJX~-e;6NJ-*8% zPIn4VJV_BaLq-1hkmE|EoEtHqhT7PLm!nd3D~XU$*-`}pQ1T;**1@msle9E7L{$k-LVDDqboGEg7ZY`RTjCEC45>zb`jNeIP!ytwAE%VOCflsKjDU36HLzWqib z>`meug`&*6J9>N+<3PM!#{9E2gy$zcCdOx#N_$1r+)440hMY8}cjN-}RBTMkDq*q9 zo5s6})pB-a3*%=2`7e}QuuqLM7pvF1=jZm--FE$Cbr9i~j0Z&zpr&FbjcWP;F04%| z##x*B1Zca;r683``v8JaYq`SK>sIHnxo4xJu{AOsAz9YjubdUW+5w1b$rlz_53lME z6Jy3>PuE5GzX#!{`=dv?uHFc{&_ZlqcglhJzeUB!7m?S~C&w~QuuAoJp(tVjz`JOQ zot@0;#0c1&KmYjy(|y(II?~J1>owW(H>Ia^)kDXK zWc2hz%l1|a+d?&K+K`DqpE)RIF_ejeTPXbgaV_{m%rpEap$4m>9n_a&NZL zj*mdnjN>%{V2X!{Ef{HdOWT;r9+4`G-(+0_(@jcgL2|RUO=rfow(;h@Qi`a#^KEpG zn-Es535?aAe^$eQ!stRvyWNPAt4-@N^-XDML7-WpBpoer>H)GNw2h?#>U^V3hDMu+j5WC$>DiR1osh_qDy;Ivo&YZeg|Lg z{$}Tn0Wlf+&s4z4!Q4ZCUg#+-p_eN5+Cz_6MHN7$Kt~L1*`RUg1>=< zDI!zzlDOybTgJSZ>WPL~lc};(JpW5JAY`I1!4;a9!E{P(_}mg8H|@dZ;Ca)9Lk}sY zonQv6R{^y0#>AL(2kcOPj`^fLxMvEyk9R%fyX+G?QK>|v~q5ifCm~u!>(_eVchFtK>iGReppQ8J|HvQV^ zPm4L7BXseyx87yduS&c`8WNn?VU{%%#X6W?1@D^s9xrv8njrB2XqFwJm6Y^TF*aQh z>=i476my*;B{LEM`jjlh7}B}Ty&30YWCMF2e8ST-SP1h{Poq}A{xeZa=pjYKM!gpl zyluZ6S1n%s>3J4kfvzwW4ye8*zyg!It9D|RVbD}OLf`~77u`{f$K#2j9XE7D&}sjG zOx9#M2{TMRBtxQw)7**2&aALfgt;{aFmP%%H4aCUCC$Mckv4JnbkC@M_3cR}-Dd{# z*CbE4H=lWHLrHkxeZmZvPoquGQwn9CAx1zK+qi+GI>S$BWFO6KJc5tgoIO$hii zh6qH$qJ_L+Nh9$5(`q4j=z$=6$R|5#g$~T>*k5@Yc=2A1hh(9|aaan}WBFcUP$eSD zbjE|KF&4cI!PF>pydSvV%v?j*Pq@QzV%+nrY8)L|l5kY3Qo+K|8Tk2~%lK;m$!Q7# z)JvXxA(am5-v}!R_;u>;b#f$MK`lXf3^HHfC6(qGcPq&9!?z#}4=f_c#bp=kpP&|m z-F7jp0jZCjHoYAYaGi&Zatsk4*d6PAXbxp>M#_gZLbZfntT!6J-@FxI{!}zyoJO?L zcD8ik!p4!DuiamDueBO^VbIb0qg|ANezkv4pk3^{C{)e{Q#)k<2_xV`0u^{{gZo}9 zVf1x;>k51|^<<)if_mQE%oy=!lY&H~ZqN|8!D^XNG&Pq@dYK{!uO3PfEsWz-py5fg zT`;1uT*Z-%klacP2vooI?Sz~`hh@DsGD^v${wGo#@~~`VtlE}YZwQ`(ks?c_v2OZ0 zw%12Lne{9fdaYFXNi9`DdMz#0PxYn$WMdV2*oo}>#*lN&PE@rVHaXJJUEU(%X59Q< z(x82e4mt}YDZ+g%?`B24hS8O+-tAQy^2FO873LwU0i=GYVc_xz1#Y(-EsI6Q|x+UFQ~h8wwSV)AQ;5!r(j`~xd8Vlo#b zoW8FLSCIS_PH&jlp>vX-SD&k7KH$BQWI6%$45V)e3WSiAN9x%oBuoO`Y956U)w`~R z9%@x&1Kv5@B4YP<=}l9GI0ES5b_wmA&vtzEk)G=i#~tu@hC<546DRR#jCpg(NbQQb z=T}c7Mji(gq^{$m5JE=y@+HvsS|By6Il2`5l#3V?Fqa+{gFvDMy}u# z4N|@xydi|04;5J0VV}HTNIxeHntHuuBQqdZJN^L}X$TW3Os6cjq& z{b}t~nr|MIyztPTU^fi^Xo$Dh?1o@l86g)ijK7d!%3b1^vz(u)fK~y1b41p2sQ9am zmwM+KRoH(Hws#55esA=hO5LCSdz<+hv%ez27M5dVkNL3F-nkJ=3P|aiNPgPhhYU>F zCJDs9!tWy&(k%RzMR##Q-1jV%-UuKZBWy9r*h71=Ci?JpYVF(GU=o8ac0OdrLmJQ) zJZKp^@B$!BG0#W$ho{h95vw82HZ~+7{5aeQ^DArQ5ox}hQ;lR$!wok_@)P@+ z-ljITw0QG=%Lwq?&@M6L?e~R&Ml(HGcFVrAu(V0m7!+LR0chGkdjW|MJD&2`pVE?I zynQY7v}T7D%`K@D1QuiT2FmE>f@z?vc@yr;&84VOrcq@;05UbW&CO1n)TlOYIcmxh z3Tx?BK?r}z#bRQItJ%`X7Z|Kc>=#5#mP`N%5eu+s1^9dO5Ndl=UGDGIV zKQQNGj*ld=Gk1EWSM!;+_+tlQ*s)mh2_Ft&E!)i5 zRH^(kzp1o7o*08l)6O4>6PG$zFM5A(TnL*uL-{cMvB}WB1YrA4wlykN+5+a50B;2e z)W5CC6fe>_BF!r^YTTIQ0DGj~zuh+xl+M2>;2$=5QH$0Ij}dM5LC-7%>}fL77p&(P zf6Z;xa;Iv!SmV#fC#~Du3;YraJCXzmm5blp;EaEU%1HJbCtSg!rrT>z4u@=?%5yU( z8Uj3{B&{}*SpL#NAqoT9(uPveh;lE1dBj?TO=AkYO~`=J0vR-bE*8v|^T31aFeXaU zOp2=Bm&n?exmh;t#P`8c)7oFv28ZVLskNHz_tJ}t)SS;@PfvhzLTlCobw?q1hN@@&Ol`HZqmfl*_%#08itAOJ|0w z=7t+PpWDpLv!mvgOqmuSKAz>QgzVa*Hfsv3VUM)N z?04bOojz@xzD7GXgogDx{hHz^HRrgGUh_TwOlV%AC65@~bx2*E z*ktHIck33!;4m1YrCz?W-Q~W-e<7Z}fV-JV@kG+N};rBnn@<&c;Xm@1?u1 zPi)tR@nrMC#;Jl%52ks>@kjfr4+NEvPfFJ`b zhN4!o5`R+CH%W|tSIvMsI{4I9LqJi(&rXRhn|}nLz{sy=C**xRHq!{mK%KX_LS^$t z40}mK7B%(xUv#}?RGeMcB#Z^R(Z=1~A;F!-U4kb#1oz+$jk^VchTy^7-7UDgC%A;* z@OAEIzM1FFJF^z6SO4Vd>zuu7*Qu)G>1$<*@37AZZCBp(6gjcNcu@sOGVhJi2jBjb zkUq3$S&F4Bx(WuYZRlq9=6|Hn5xDheUEi^7K>40F7Ak&dUKVpujn@I2d+AKcHPhaM6poxG806g zEYJg(izRp#!|0{aBOCl;zf@NYOi`}Xl2$SjtC#0Pkf}xtBw0s!9rmC=@UeEt<;J9Y zNSkT^m`O2If%t4ajiH_Gead|9_=g2lG0JltaMgS(-(rt3umiNqM|(;iV6jAdgd%5{ z+K%{l@ow}|1RXSHyW?OtR}qmTGxuw^Y)LqpDs0%Lg`2V!sH8@4gTyucYAU=qf(LqL zFvQ@YhU|pei1%JM!zn^InwyL#XA3`K^aSasIjiFN8j^*oeiU_EZp1~?(Msb2Gyt{J>=G_F4~HDSiNHzaVgVU)lX@vE={O!MsAtb# zM?;iv>>TS)C8Yny?YtdEynW{( zl&wXDSrSnIM=L-fB@%nRqC2Kt#9`il9xTC!%B*hkhRDFE84Z>N+{GHzIg{48KCM21 zAEHohxH^U}tw^bJ_x)0Iw;8b+O`=01;g71*tg%MzZ~WwFgs`h5p+%*oePkEi4eCtjPA{~R>iK!m{;N3ucAdg*oNQ+ z3NWG$j|65bcb=1}=bQ~P$|Wu7LOT+McYO48&z$Mccl;8&U@qHflRAIc%?qGOe`YJ_ zBOFUCsI+)U`|jwa(|Z@m;wRMyI4tH&j^eJN4xHD=nR||mjnrCDHdDuVm-5$#ZfCrx9ZZP# z?Yn|Gn%^gP8C01dazM&hYb&*SwyM>iUqmmiM)-gHB3}?*t8+!^d@JctV$g?PFk}Mt z>~D63I#ym@NvVvO_)=&uQ%;W*Go+MYM$fk2%bk)bPFhWfILOtOs zo9S=%tWs51M?7vOR@Pl99xH0vM+z~kJ z%K3aXYXC&SG}5nu{WK)Q_@T_8^XS) zNv!V}dno&>;09@@_Fjh^ARz%AFq*^Wvt0x;SEO6WQ%o<7$P2% z!sBy8&^F@uNA_p-gv>vm6fBOv1rueEKfuiou!}YLh#xvKb6Nk~{(eH2Iec(Vy#08jz)oZ z&bORdzL@cZ1FoXM@sQJkJCKj$fD^B%ojH*8*h7u;_H4vAJ6Rf$M-wckCFhm4i1S_? zC_=*sKAhNpIj}g62uM_3<#emyD&lnLu>npOV6r(Efy>O6J_n5T{_aF{)9#&YD~Gr| zx4iH8H9e+q`y`=d44t7D6JWr%tyx*ZQ?B&Cg1k}`kv-oF!eub@Sy5{+@77D_#*F8# z1Ynd7?(Uk@{FLG83UtBe z@RYxXo)GE^`;LG58wGY{Va3OZ+?TDm{Fco+80if>SUuqTHX1IABq>Kw@liPXHO6-D z3h0S-G(=UDh+1uBoTUfEinfu-<1+Tt0ExHQO120cx5nCB!pPxb11V|9Xq#9t0 z3RWm91kmf!4<`N5@a1lso({&?nN-3NR=S%ty1_O46AD1xU1ah;tYW?t#Ewz}vc2W6 zX4^k-F|j-^q~F`5f4297ssK~O&cx`P^B-h`KUK4p1XEW%E$DFuq~96H^(e>KI!Z@%`@^oyzCc?Ak8@I1$nHLwXh>0# z7%t{evEMF!+#vDsht~CqxTj{snW+zi&h8Q`D78|tV{*sIlI`PD=ZV<;n7%a$> z!5n>Oa=$RxZt{KCPUnJN996}B9le=I^7oO){X;y6{CpU0zZTAPt@>b7RELXTk|S6jAFq+vwQG@|WBz52&zm zlP>Vt;&pYphJ^&ncDBZduqh;VzN9exIz3r0GhoCGuCqWd+}g}73}KTfC&Z|kf#jNs zN3|^$O#_<=72id=!e)#8vu14#k4P-X+@J0v2;C;l*pwa0e;**@Dt@Viy6PiE)3iz? z!<;jB7|YE!M{sJCvIF@%5r3DyS>!^mo(}b@r)WUa}T=iPP;8eYr$r|em(v5 z5O;+@zPbuH`4Mj3-YE~Qp&){QtcVk1ZpVF()Ruend4+5Lob~*j3=ss^HalIWESbS){2MSc7Dn(`cyQM0=f^H}SG-Vsh)>8F#&eggc^t0;mzid77ef}$ z@|K0|P#xNCQD)cTd-3nHpwKyHfWqS^G6W3HZTc6H-z%ogd9PUmmYIZ6s!~f1DUya$_~2LBUjG zVDCR>&;M5Of9U}X!9r+0N*+Vbf8p!5?ildJaOhGZ75wPojDZp=X&CRS0|MMqk%^IL zS2Mq=S|P0>+VgUNUeG7r_cXC|=`>j)-|6~~Mq@k`RobuHA|OF?wdhLe`g~kwe|}UN zTPR$S^(1;@OWYTf;lc_$Nr!pQR6j+z+UNgQZ}>>#N5Pura-4oTU+&C#Y&sg?_zHUx;G_xjz#lJEtltObzvz{3$zAMEN1`P+tCGPx-@Ih_fim5;1!KCT zk%OSvDndj8h$k-QqR$K;)3RUb$1kh3AKp1lBSs|`WE+N6moqb^)K{AXDe-*-w>i9e7-S}=0)Rpd?eC|ioE=^?rG z?rScHo$eu?-S5@Gu>|F*P`hdY{dL9NMc>FD^~e*r{#TaAwAwypT{W43|9DSVlKKy2 zTmIUuLc0#9<>xaan8nE}9o9-?)|$X^bx)xV)Pzf!p=8Hygy;IMVpq&v?SnywMF!CO zxK&uwjt~TqNErIExUW42e*?@fj{w<(;h|^B-2IG@kw!MWc4{aY9R@)KVT}oYh_;^% zmtX*2z(nu0Tbc;lvdFE>ZV&G*e3)-y0qO**?;vhqtacO35(F?4q@P)p$fR)A>Wyg1 zMCs|<#N@6 z+^Z41TP{~bKv6`~(+nfs!8|5l4@RtsOp)pmYfa$yNMBN|$RJ3ZWay8^yO&x-+EAA^ zn817VQE$4tOZmCCwdKZatzKMKCa!u>ev!WIbhHKG>WVXYpEILAyF(CskwJFcdi?a& zJt@FF2`9C>a|<_xm%Xf#g)ORE{7840-#C@TQ_mCoHfH{XRTp}giHWN};;MHkU6g#e zEuEeQPDTZ!@SJ%Ny_@=K$tWo=I9RpHA85ja@S}ZSYD{pWThCJ*;NFen9A)yMKlGn7 zu*E+*iW?w{=%>HQXY@$1m*Vh`^(0F7oRv#MRhn{Z=3kl2q4|mDIH=kfVgxnW$>aS3 zYk$(^qEs$1fFvMTMi=!oIRNIu)`>To>01d;9mn2t+$;?Cr@P0iw;<{=F{roBT!A7z zt|_o|T0Tw77McIPy8&cv+j=sav96?RTctazr}C0o`SQEZeq;1X_DeKysH4MTEj#;R z4caJYFhgQKw8$`BGrkw}&fh7-MCV6u7D2}EA}jlK$XQB}`Jxnef?d zj8D5hNa~7apBVBLpK?Ek9C2xL56!~&?ymBs0_|o53}tvGpo8`QHBs)EHxN2{*@wvQ z-Ud^Ykclgf7bRnr|Mrei1rjtSa+u-vwx7D|-`@R6ilXMBQ0|~tyzS&c>E7rkUGNBL z>)hin^|YY&p0TkWjN1Z2*IJ6gmmivp=7232V*ILHamH_LDJyHXOJP8YeE-qCP>&9g z&+?KQXgxPMeW77t)n6V+VvCdr2Am*B=2P&Ky;p2)ag1tyX(o^8r ze&*RH(;|+2d6x!UAH23*w7f#EOKbMlA@$=1LdW`|O1hn&^8;a=VZW#jPMl<|!V;va zN!0+cJy(_8fS)GvOV1ngkyoRnzhWRo`Q1GdEU+7J`>BM~zh03>E^wYHR+#fXwh@=T zjPJ)!plP@Vq&h&&-%vZpC3^RT-QU~YQ4GNhYVMC1B+fj}rCrM8Q!g_8ro?}`Go<|y zYf!oX?NTL@h~V9!YLOR#5s{OmJ=Z(?LlLeIb~~FJ!4yUkO`*KPdGSf=?7#>gmw`ui zJIQW{S1)%r*uIqGK|8n;i83h!fhp)8d3E0wHE_X&Ea32&a92VIc14KI`T0di6&~tR~?=t28(ZBUSxg0{w(oy};*lXUZJ^s~3wi zrMw;a?{CJ#n-uI9dEscpu{M?C%U%`e)qxvWGJfk^{^BfL*}14T8)wY=P2zd~gXCqR z^U3s>|IhVuitjC@89(^Cb7=5^1ZSUk;uJ#Cb>Impp4fNe(Di!v+=Jz zYw@Pai_3EmK@2n|kKWdi1bZ5LYFdF=Y=@XBWhO1&2hcCsPyyH#@$sb}ZM>X34>k>G zs)PZL_cMknvxU~nG0fykx!35Qt-~pgofLs;alcYFRe4AcTXtJV?B9L{F! zPa?8nhw45(d)w8h%@rkk!K@0lqH<65|p|}V;x-jfTQmhFxctcVIE@8s3));gaYdheOr2$BKpmKfP?~51hbRTa+%SYjQudZXuxfe2tto0 z1hQ{$TM12VNKa9k8Jo)!0`w8oBn^Ft;r8sRvL*pa>@gxol84tXkAp8e88$+q7*J8P z4n5ps+>$HY@CT9&pjI(!|jBTVXY0O0hPG(zw8RjVC;rJUDQV8vJd|BhI+K zeO$Y4S5Eh}S@*9?x2A>qb%Z$jKy&PXG72fO7>sOyHEgz-RyZUn$Y;*-Am_6GT;2?M zhLIOnNhNx}Lg=c#>$&ZC#s%tOr9-eyJDqPx*V!Dh4@ZmJX}FPSYcx1(sN8Q*gadh^ zfGjs7NZZ-!g?3);&)*&|3b_ohVpF&?Yr|d6YNxlQmnC7v__bSP7K;6#LrnwRFrk}j z)NOse*BF~SKvV-Y@NYj_G};2zdyhNF{Vh9{GR_E6lh6 zNDWKs^1_17yxClyY=7@#9r(b$h(a@}^~DoHSJ|fhc*#j7N-zXI3BGyxQ1kP zS%BGD2$Mx!QGPAF@TK^wx1a&{tzxdRIWA#$YfZpogF9YrRBx30M8uXNY|$n~Qp<8aPB)ar`FBmc&)DrK=b}#A_#rG?*LhNQVfVi;ptVadPT`4+*lGyT57b( zr`Hj&y`dR7xFd>zH&Nj)=hmEW{I48T{5|cJw70sU`-B)AV6qo#v?uo$!k0CYLMYn? zu#ep9X^&vv?$mO;f4WTEl4m4%w|)ElDHXgIS<#&(XOsm0K&IR; z??N!W1C2P}X3EdvBIVpkgxbBQ-xgBx#7>Kn`6fqz;rsDT9})lquw^NUHL4`<>+QMW ztGh-@)kURHu*0%C#`3+xIAr9F)o*HZO{uoexLEN~Q8|vp?stMzw8|7{H}Roq{kpN_giu3WrU4HTYb@-9F+sIDh{bp!$h!as z9d&c$xjzP>Asj|s2xzm}YJR1LT(BQK~JDrmQ@nlV@6i^2h!9YLkQv_=uKTAm5;c`n`f5nZ~NH!Vr3y0TK|ygViPvB$jzMTsbTA#<|)t*@10O09a@ zt1-S09NGKX5tl3IP(obU`* z3~OP47o?Jps%{8gIc^VRBI(o065c%#u6X+TdC~H8DdfG6=$?b))H=Jhqio>XE5VP* zJO_LRkx#t>8gvxaA3;(qpl0NROZw$Be@WSUV4f>xQ4Xo!Rmhk=yF7BrQCCJ0Mc_E} zXw~@*!`0szsG1UAD%npO8sbryIz3Oqj&jSXdqu} zskzkYOM`+!=0t*ITeO}rcySoT^V*=K(aUF;>}7x7`%#xs!B5@^ zU7tW=E=r^DhMzBgw_+4*hsSR*oqdvTwiYlWe95>@-T{)Z(ExCgyub>J44l?=Ch-q}9E`s};nfGBbM z09D|`31iztOV6;TSgsBPDn7+wH8u3$S}Havm)cm0yIYm1zCAYV&UhUXV#x#P%$jHP zIiq^tl69cTl`zhpNf?p;D3aKWfk*WQ2mAD69iONu$5rsy{su}VGz7XT8~T(L^h()( zsolRE0{fo&&5)Lhnu(>$1Og(b0yMA33&voF1bcp@ zVrE}R5sqk6VXumx(i0oR5Cb)Y1I_H7#LdUBWqBTH?yt#)Fv+yD%Ib87x(J?JesNBe za(Dr4+}HJf5;lnfZK0I*OTBla)2z5m1a>YCk_L_2=KTYu3Xeo)9p$63jejeB)fo=c zf`({#9!e(WqJfO4H}M&NRmZXQQ*9d_zQsq6JPLZ`YK1EuW$rF14V$3xU^$~Bs8ne6 zUSN~-U!Vut4c@}>?3P~Vzi0UHBwRw55hV+8vgp*hWK7fc+O%_l0h=?6(91_1*|Evz zm2*ak8#Y>HY0udazX1wvO&D4G4x80jR00#qzg^Z=(VVjb@>9@WJXA^g^l+AfIpT7H z8Xsk<-XRINM#JLJJ-@2Kc>0R-jH@=Kgbv;#RwH<3puTcoYZDN7$Zfq+z*_Wyt2smY zsY7LX>0*$t9+9Sq=liqevP!K6qw$JR=xh*^6Fxin2e7G}8g@l=@niDq9$Uh#A5sBg zG!_^Aqvr-$oOCU?h?nZsO&osv6aG2A0|JQ$C9+1Pf1du3X!H87KHtC^s85exhtzSb z%Z@gR=s#wxzzo>)W9X@P2r{@}KCU~U17DE(rV1Lh`EZRv zf79)-^<-wdQDX_|2o8sz$^D4eYm$3A@scV1aS-G5d#9XH5-@+}n}uxCxRSn%@F2g2 zgBjYgHF$1>fXIOt+(FjeW=}s)*T+#H5mkRBXn!Q#^#k<2HjP(>I-L#NnlAM0$H;_e z@qRF47$?Y+B}=cVgTp|l(dJST+UCr~15C_yHQ*hB{>{{USp~M8NJS8&U5{t)SP096 zX7eFjU*ylW;D0z&UM!2xlkIUVCpK=E7tc{lhK#stt?j%cG8t|ER{Hc@Mqwq<{=N5E zfXS5)&BkbdWWfL#B0EF%?xZ{~a&*JHT+P+5=LSA^YN3@pWrgih zC*P8qdImXDZ2}HHqV2nLS}9`hJC%nEOa}0ix0fswAg>DpbxgBz-b<=*pnk6e7iV%! z<49T>Ab+^NvvJ5CMn%sa@PQCR<1lEU$X7R_e&jXu?uq~27iFS>^Yb1|KO1RM1S&`y zY3(8K!SeWR3~^m8UU2gj=xx15b|hsm?(#WG!vRX3&QCVM7OQ-4P*_X@flva@MHhxJ zadCsB2wXm+Sns4=jjaTTb$A#3qJrLGz*y%Vr~f6$uY-(K$j*lOn<%!i`a`2qQ<*M{o#i%f$~6WNTsO8D{i=dsV31ZD;!?p7Dr ze^e35#Y~mTx>Wy${DIdLlM4ra6%X!MXuyRW*C_ijB`)T?8!7pxuTx&+;J5r94nf`D zaQ90|tBmKM0;W!myXVgNoeB?htVK&W&$=B>0<)aBo=w`4xpB{|oQ)q*mya~60|>h_ zD*kI(5hTAZ&WjUkNKO2Z@JeTQ&iI4^tDv&DvkpajyJ6E2FO5h-N%E#wxi@9=mr~jp z??O!YL}@~y?MF^ubH?u1%|bu&b?YG(_cuZ3U$FVv!jT8f!vuT5y}&wc$S-`SvFrC^ z*G=X0upVkbRsnYdB;bzNomtZ~|LE;jOvsYRk$Hd0*<*j|@y#lG7OnKf#h9Im|fPAX%%9LwU1qZ+vdS{4ZjYf+%Y7+ECF_d~Vf_hj!J zYfQ`#S5E^r%x?FZz5iPvCZ?S9IiW$l*_)|Wn!D8Lo4?K!0)H#4GvJJO9E{kf;7nCUnwZ5a38 zg1>hNxVknhJ5@tpgdMcWX}yc7ZTk!Gj#7c@7kD0&k7sn${1pXiu$@ZO0m^fbvSiX< z`MP-EQ>chd3~nVG<`P#B&2RL(7*hMRlRuD56r;Pz0E4sF%fRU!9jqmeRJgcyax(k& zQ;sI5&`nRDO(363C}m;laC~cdR##x95AFPsu%G0y+C$3g)-Q>TT{bm@+n%Xd&g2zF z!o|&YFoB8g^@+7Q&s>PC9n7GHn9y;UD1Y1VK^IT#cE_tb{11Jbghy&};iFVTSz5AU z%OQw<7ED?n-#e&$8`cf4iFG#RPQZ#27!g7=+{jB?;NDSFHulnv3bkx6*kNu%clYOj z6-*812yU2YMZ3NyO3P!P#D0x6qc_A!JzmvG5aV;i?&q-GU9>|6eKRTY(5hZA&ocT~ z$VwF|oYnPF3@PUpy&D&!Cq-nGgnIGQZ!y*^IuG@1h;cose~-tjr1@z=N*!nFKxAs8 zF|Oqs&AO|X4-hX(@a)f^5M7I8s6nudK|_eSgq;==zhtJ!}jz;ltxKV0)`G z#NK4=XJQ@X5^KJ>%SNL*{AV#cpVZj?wV2PK?3}M5$WNkoy$Rj*_5Pil;gBRlb)vyY zR!@RV0neZ@zpyn1*nWhdO-#?I4=l?8q@LF=xfHh8mBA{efQw=nwet|oin*L3#`ZG4 zR~%Pipwm!&Rm;Fkf4*XPr&2GqP`9MINdRX{CP;1yj})Aemnoju^3KSEn9O#D&@1&6fEM^GpYFz8*7v z+0Hfpduf-`-JmP!8Byy&|J70%&OJ0KFqmm}XFSB{_phJC=M9Q)B72v`t}OqsY*4Rm zA(JlXuL}Nv`QwDt$@*!Xh%s|sLueirDb9_7(+==6HCevlvn+W4LeO66L>#iR&a-LjVSNexaZO@NOzYb@6wM161*zX>A_ zK|-=3b`P-F9vJ@$Kk_xnTB_1=2xwK-h#IhXUiq!Qqxt)VSt{Q5%C01gtw$x4eQz>E z?!_L=-3`Ris+XOHKm-a6WGDD$#+TQ5*R`&myu^y@!!Jq`KH~ZOgNtJ4Lfk;xchHAx zw41va_zSL`N{AstU>;85{9a>z1}p7SuA~u1$*5KJCYe;K?Zaf6qHo?RxA{Q4>(^7z zZdb!KH_w1q^5y#?(RXjnL4e7TH$6YBc1tpyTmdQos5V@B4*G!9@mfz$uGK!KOt>RI z!gq>`>gMCbe{`APSxE#{p4MslBy(*e-aer^85wFf{}|w{d=bTAE^QLFm7MZ_`dLYD zv-8ZhBPdg+N}rMl*kgACrwB#JG~l|l@vUdk24WG>nvYypBAVJNk2tkSU$kvNFzyMm z@6>3sa{J07e!e)LfEf_orA-1{qOZdy-XucJ2~bc%cs->4--rbIy)6tzYfjL0E$gDK z(yfJRz988#8JIY&d9oaC5AhbZMVsK@KNIJxY8@!O$qXQu`yvnM+M&Uq+``KaJ6isc z@jBX;PY24xlp~m_hzeEe5g(--9H+zzSV0~EpQ^fQ)jz5hzt^vw1aBlH2x$+o8QlFg ze0<0J!I3&p6T6FK;#%-+^}S@4;K?id*XL$J3AUlCo+Ky^ey}@BmD`?5;CRJNs^9fy zFNI>w*84XilN6BBzHNByAaC^TU2Z_HgOSL^>%#RsX@OeLw{5>q0xPKup#w2geAOfh zC8TZ+dJX@2+YOX~A$nV9ifM(i(kk6*mscEm-Ne##Wf#ajifE{et{}!ERjwi&fGzQ- zghoZUBXJnD^TK=%(a^w)yDEZ?G8EVl$TiHUi>(UW)04HooyAy0>zWgOP}rw9@Ht;V zb#E;G9~>|e(3PECaZj;D`dYwR%H#s^b37-6(;>*zkayol81#KPT6KuqoZLJh{p*%T#CGyS;3%Gm00U&hy?>10S&S_YdJsCC@MNkehac@r}`ii=vI$$)#}F5 z5@8IhSI$*K=zrGL#vXA)>*3?bTa0P^lYCW2O)yD1VBM!JJv++ zxf9Q+BUaSqGD?v>&pD)nfv@D04`osxqIF%~PiVE-Dz|52@pZ)_NK1=<@g)Y!k4$fW z@?xko;8Vt%kn)dKoQ#48jj68 z&OzE&3qiSoT=;ah^1|m-G^)CP8jhB44cEUKjw&vKvhSYCp|yrY@J`ykDnmvbpu1xh zn}b0V7Omzj$_&IEf7y&RpMZQMUmvcbxK~5!%7~I&k)p3Qaqx;G^1Y8m0bZV3v0Vj} zbHeyAD9n`Hb@uq(Uva!KRLP0DHFt}=e`XT3G8cj65*5FrMj(vB>H`RT(*p7WMD~wH zsK(;G?!TLleo7(+vP3~$kv}V2QNXhYS&}wvbUD8YUO!L*Z0{ux1gqs}d)g!5M>FaO>0T8>On$xXA=bg9Cm#&yU*jP&i%90;0 zUC91xB}2I}N*ELkz27$&!x2E@l!=z++4>eX)RAfaL*^;7&Zs&*^xhx6LvLph?P})z zw3m(gzuq0%5%|!b6j_Ab6+mw%l2ethm=rS5U|<}y_in;{~}?Y``S z#5B_A_{v5&55Jo49EmFNB|bG|*s_Ad-R{FjKTEOmI|FVTGAK!O{>PQ;khCfIuVFDB z%4#v}F$!GQ(p46|!E?7pUpQGUZ~qeimTCW*Vs}A8XYDC@{%h|#AHs+<7BN?v0|~$)BuZ1qTNb z9CzQqGxKBIl-t79G~QS>wmyWn{%AE&68agL?@Thdf}wV7oHyG$B-czHHHoFeq59U# zSez*SJYu!VEzn$1mLuvJqbIMy1p$y`f_#Kgv3Z3%+ijk&llEz36tQ_V<&!7p^|)`I zl#@U?@9`%O6KFWkH)^QQ=I~qQtAE{J5_ls1<))STdqr4w_$#N%Iaxb2?M|TJoQQ|U zfU%@?yy0|$|LnZg=0_lOQlNj_xC;Qv-0Fr8Av-qBw@u7Wi=I>8jN_+8hK2H zO?o65B%~xlcD)kQN7gA~%;#0=v(cvsvH6yYvxD$UKM2(5_36!B`nT`Aae5Zz#x8z; zU1IP#5EFBWp5npacZqY*2^MoRD6maiK&@IKnWvUd&p6Nb(TCjIu0!zgg2uq*sgXqc zQqLJ1ZGn!LzY15Y4mTs9kl{}mpN_Ps{#Pr8CNurIZtnE^(dd&D$?JuVs-0j9Nyx{$ z`(+(6JtSTdOJE8WFdRdSe(sR|R)xZAx|?NTxsLKZN#V3p(-^il)?irABGT8@P`*9vHZY$RRu zY!o_3mp6hT!|+$SlN|`N4wQ+*ka=h1iAyD2mQ}Xm<3)^@UUHmMcf@DtiH8`R4Ky3c zxg5dsuR9^T(t$$PLkDeMNo5P!0yscV4JH?YffBbob8O}8fa-kAQ=$`&uQW#0L9);# zh*(x2ddm*o+wj0*&+z9|D&uE4%WIW{gawCIV*^xFj_4KmC8scX+AsO7@J9yOJ@J=n zfRwn++HpywX6#DFUONjvO9H)G`64)%YRTvao)bJ?>w z82nSs|4)a8LAdXTk8R{Vw&U%wOQb5pj?D;?T?$WGT^mxHjbZRv18JsLw-6f}6rjLs zp@vTKX|0-4gQ5EX7b`$%arZ)zawD0@t<;YelEIXU5qbYcU() z{(jp2=y}cc>-1!jc{W%7r`xUZPPl|`>VpS^nL zEz{=J4Epgh{jx-JxZO&k{o4c!=}b<@RFC4Oi9fO*_Qd0NA_2s<7}Y)l+=ZNsc=Tz^ z6|&}w`}WAwhqEHus{|CnYk%;@$Bnmu%mWkp&tgDHzB_TM$G-&bM(w~Mzp{M)^7b`h zJw5|H?lYiTWsHkXbBzLn1HR;t9zo@yaoZtCy>SQeoXw6w#6x|3PVI~ObbS4~X780I z5EhVVZGbFn59tWusA@!fK8^w`4aFdQOAN5JE5DM|FB^94qaKQQY~nmb7)V!+7QEJ! zGfN2xh5x2>W`!>V0r?z2KA94l7j|65u(Ot3CJWhmW5+{}eJbng=N!(H?2}nr(3o<+ zCeIKuP6aQm9>mOtftE!>A9vDrQuaO5u#m&vwxLyepgj}4HYYnq0Y$?5h=i3s2Z#U4 z5=)b-1g!%vv1=vZd-gx?{jJaa zx8*?DzMHE}!~fLa|NVKSXtW@q(&sv|q_2AKDDNqA{8Paoc_33m-L0Dnu2)m;OI_(v zGn5}Ldjm@V&GCZwhM!pT^mzOJBb9@57JK(hLRSM7$fjI#AY~|wWpmiUt;=pBlw>du zO#F1oj1{<2Ft)6kxOsy$*}hF^QO1!m&iX>KS_=nYV3BueX^m@I`s5+BcZZbndT^4j zMc+7`LaLC$jCb?Snp1kEn9$8>**kLF;#8Pp{)QUS_m>q>$$GVs+(f`bTJpZ9k1(X8 z(lWn!>pO0!p+ZMOv-7=8$aOp4#6RzwnI2lv_QpK^isb1+2F%XgaR(Nm_i|mAa%A{a zd@N2lPv_#)Q4>lF)6a-Xl-|Y_+pD0df`jw;jtqEklY?HE@!9A1_1K+LsO5WD(Nn$8 z2+;#g)Mx`#C7YxG8EP;0^8CU;Mbpjf;M0#<(o=8jrQdtG9xflNVo1nVKz157@WBQ8 z$@}wkiLT*!#>t)pC)-JBXIYZOR^U4js{~W{GOdIB(B`A|Dx|TP+`j|Zeo3YB>{Iv zgA;I&3L@HuoYFC!4?(D!gT^dYbs-^72+}45k;cO{ISd+Fir7ZtBVjP8@o;3ymqK9f zj@Suyg}sg0g@am)@A-DI{Lq=%72!VT*~^#hw6UM$1tFOS62P5B5P&t5i-cFVz}_lO z5KKvCOjDo()2o|%JyyoXf{vCC&nXr^y5H39o(yMf_~N=U*kaamm;A|#cUh7-@+07F ztFI-#UD_VySrgjN&R@1m=2ojbfnvjX>NrjXjj9-_920(TnLOWGa~~em9z5UwO0CUs z#BclOWtOEuA03x^2ljt2**&y@Q7#^Nshbxn3${#XH1WI zIXWwmY1{3j@Pc;P&>tCEdh>PH0!v2)jzeSQ6${es=fu;S%rB1IjcLtS$F(zBefdna z+0dEj1T2Oq*U4Fu89YfR8eA1l9!n$dkA?YMA1)<(KKUt0$DNB5xd=3X z?1qW(@F^u=RpdcF!+$l@3pa*Q^hlBk+dM0+_*!zcAIx=8NqIv);DbS#qLA<=SwD2Z zE(su(DTxvK3W2Twet957U$B&t8ldyZdu;)8X1H z_^(AN4m-n)1My(PSK#R6rjO|`XpnW)tP>B zDY#r`3WKpt<&iYSj9bm}N%mG4mr7bNAcyewTZuqY-j1^jJ3|lS4reFQ+me4-Q_D1L zQ7%SF-1K0x0M%Y)8?I`BVODK#7l?<%Zwq<0!O6oP29PGGxY-)zX&j+yn%n28bRNpJ z_KKa;N=`c6Qk!kr&@?fwP58Mn`9U7onc-+t-#9UvvjsIWM7y~|>)g1JwY*F+2e+d#w z-0~vG>-+C07L_QGur_3WeTf3c~5(C^$``u>gCEFP5B_fmUCx?eFgo=`XD2UQgT>*WBV29q6>y3?;6(%^(Fa_W<$-q6>2%0KSONa8~g-7}f+WuFCA{$M`BKbQ~E+#vX0<5~kh>`}rt&9)$^ z%*h-1V<*URIZbpsRsvlNU*tAvS1B6%k!A$i2j-Dv1qLXPwWWg9iA_k7UzhZNrdo0N zV@Yk@9qlw;N?cG9G4ocFd6ZmIeK}fdNj@SAuA4?F$~Qn&;|Y7+n1aRefuv%E{focn z)ZBK8Bd7Pn3cTTXL|{sG_(Ljl;PZ2f&i4~*d74#;5y)Un6vqqbj2)w|)px&Dp7a1rCNW{fJY@rM!`~7l9O{V{svMta~<&RBn4tfr~*XlkZ9Hlg^M5iY#LmHHD=~TAsheIm_WUYC& zuVXK(XkoP3l%dPt3{D$G}DNH+~c5KygY`m|p6@7xG z^Ks1^?fO|-l4_*hfg}K}7jo1zy2%|OnBHXt4CjW*-p(;FVH({TLv}3Ve|^UO!U+Do zeD9oHJ#cJu=`J4Lq>(W=*5eQl`Fmcpm@5&RJ)!EzlP1+gDDU&b`4jnIx?G(Qh ziJs)x9v5Sm?3(r@#Py>5 zC=Vs|1sz0QYYa~dgL_8ZZJs>Sd){Uv9T_3~(M399q zQ`HKb!c7XAvsG&lH*|9o8+OJk4Pu5}@s6)NmVN;6x3=!}2tL2yNo}`9RaFLNrVrlu zAo6zFdq_b?7c`nKSPS^A%h~_5_y6^&dWz8D=vzrX>%}Vm{n(5@ToxyaS5ecdFM{cAS&J zVadb0-%4<+%FeKK(tw&mTH%8BW$+Wy^nTUgy|uQHv(rJ98~T8L`B%rBj4>oZMnOWJ zCXyD;pC8Ek4M$@Fvd+w{mF)gMw%#(Ru5IZW#@V>LLvRo7?m>gQgy8NH+?@cy-QC^Y z-8DD_cb9K-&VAmSTlG~@yI@!GW6jlb&hF8p$4FY6o;eBm?y9(uYmG;+XyeE7CIRdj z*-j?C!I&CgOPy#>b|n7Fv+HOazSTh2)EngVnw4aUx~HX>!7`=_>d|&~E#NHacS5ng z;=8o}c+{#7S2k--L*2he4S{%lh@f8Ps!N#wVR-)wMf%NWni401dI_3W80tB~Ap)t8 zSOj&&=!Cl-Tvt5(qN}YCzbdzj;yOH$j$ev_SE?ncKDPyPuESu26Oh;$lW@7Z1C0Vm z{uk^beJU=;MJqG+_dL(;Uh@_NUvDdDwJv>@F3X^J4P7-rgI2=;MQ!Nc;Yq0U1YZ^t zF^wB-nK{6IbY zyX}T<2qtqpgiA%tDK!oG5skLasLNN`vEfRIm54o2Cc;UK!48k7(Pe}VoQ#Z*v%4Vz znC#JuOu_+Axc_eYu6?vaz8fvCuRUf_!{2^<3#-pKp6?|%W^x?T^NHPMnpvOUt|(jl zgioI>-GRmsJy0@UNv|6VK`7cqf$Cow7~@do7`0jaLq~iI?s~aDyYv0}cV_>zr!7%H zOs5*Y?^ht{cn1wgXc5C}>*vlsSd=0!Z^Z8HtjK8qrH6JjBApXp3vX6?GuVd?H>B3v zqnQ{GVNVzI?mV)3iO9TJC(uj|uG&1=N!sQsiRr|EiL^M0K*D!l zVUMBgPYG#J*2eZb$XHa$8;SVdW$IwoCS|Gv=?s#LnL$+7)S|GQmH`6~;>_RK5<2pt zu*niaDZcj{RwzhKe`90fxJ=4;tMj%$&(Qf&~SHw_q;g8IO)o<%EUf`!KJO1S4L6OCkVix05~Na*-hlP+uxL z3v#3XG3@;jFQA~V`IiL>PWoaw+lYbI4ezn=3_ zY-xCUagFUl!MeE}@ce$5>EWB`s{FtqvT{Bk$HODzt-s%HNwQ$W-mH^Xj&t;RQLsK9 zm#Sg5G90`r-^`)&byQ-gQ+A$$#<*3W@$U|ZiyKle{2o>sJ~XO?cJ}Mn7!uq@n;%yb zi-I6q3<55-EYwFi?mNv0*axT!si;RjIuW%&XllpV_OK4YrP3prM^kOsfzzj}kMLN+ z@fr??cs8;PXJuCQ-{$Cb8p}bVrG~EU5+W99=)SNhoegf+sjfMLlci)qIf|h1L|?kLmg56_HJSHHg2Au>4dn*>^H2G2wJPK($^ge z3*0u<>$m1>E$k8_?V4eQ$mF?rvV_fpviQCpajp_WYRf@tu#KLJsXyl%hvyRqIT6mK zU{I78wpYF;CF-%QXm{Ovz(L_e7 zG#O#raFI$y8;K;XlIrwCTK~G|H%ZhE54EBIH+^>RvwvJTufRi>_qWXkjSJ)JrajqFvAYBn8qPG~? zx#9hidN`Tw%+96GBPU+9T-**6R)fwZ!&=IUZFE4Sc;Q2Q{?@6B=YM2KeD_dez{E>B z7CJ-=D`Y2{L2slO_dQAmIPIYW!gZJ=(nYy*zya$(i^WBBUa~TiVZn+>JQ^w+P>%fKgY4vbauy0h3Q zZeK_))jG2Z3glx|RkADf1y;Z7b)O;ouedB6oUSQbdW#4bD{_t_@1i9Xst%tV_b!uS z)gvfSHhxcB_X+XBN5-@eE35>Xr5%<>-lRk?B>As0Kf+?dc7)J0!$yxxQ+*DnLH)Wi zBz0Ww`JFhuQLUwBfAkXKpKJaVcmk}wISrxyeefwG_}1}G@$WU1tWca5rQ302*g7hs z;j9zK*P;c*v#Xhg(mvFCLWmLN3D}yD7c5zhZZA{A0TwGUq$Xn0RP;6&vW_fM-wpB$ zH{Xs$vpRqO!IFQxbPaFWk1S~s7G7YRYlK@o?e{!a+f;OeRimkQ2*7FgP~_e(M|+*m zpz!0=5PbNFZ%!Ir4IGi{zwgn$*zd~xVP{!Sxo7wBqzVYYt4vjdzBb}NnH=ytK`;!V zEZ{r^bh-pu6s^1|xwjB*doQ36W}xI#gesd-5^hM`xVj3FNCH;iX((CaZLN7X;C&q|Z4pu`Gxp5Il8r6I{!yNwDhu8ZtojIefM& zaJr->AGgPNz?d;cvCLx?XJ;78)j!0eA{rpcp|qq$L;Wu>!uM1>>-|sVqD02*rkmGi zTjfZL9Ne-D?={m)DQXp-9zpi(FZ}Rih!JWHt}^fOZ|m0id#|cUpbz{)ii}paTg4gn zmF;;xY~dz9&>x3_$gC*Rb8N0h?SOmu)5VZ_BF&r!|JB_ohcF*(Y&p1&bPbI`S@{$R z_a5nz>?W&-(s6CZO@-(C&AFyLQ_E3#epf zeQOm+ISQExe)!DKfkO&UJ<4j$$oX3QHoOKTd(lxr*!B==gg!|PLEIn%UI~G@ep4n` zGEu%E2E;FE!=b*Q`*9mp=D@}o&}}9Vn59Vv5u|=A# zNI=aTnkV#i9fTyWaWPT8$A(`;`KZ-QK#(2m+W?R5-JiOsG>>#v2C|nkz$jex2R`zt zqI{do-!Gqr_=2bNn&@kR#=>5NHCqKZ0az+(w8)?vzIchhdigq7G!5;^+-4%TI-jeIB-J93h!nOmx;la>`p<(R5WxX^)}i30Pphp)RqPZgwN@UIU92ALr%X507FM znEYO2^j4+2*2Yt`O`AV^Rjc;(@|%N9>G^|4RoDRveC*(K1z*6!d6(&OAQ$m~jH}8o zcDcufx_WFhK>ntX8SzD`#@qnl=s2I4?rln>Lb^On3`Mk2T6j-zB`g`8y0Nau)ed;0 zor(hCC+8CS4cfnNdUCXw79lq2$v;;SUZQXT4?R%l#kov9gd#(Od`vxtDzDERnt~gX z{@w}9p#E#J!rB1_HiWtW7;N3>-hcxQBot3*8#Qq2` zg7#I=LcS@7=jT4>*+bmO5W(F9iM0CkjCLyP$TlP@U>2Zuq@>!w<-?^n*iro28jSYEI0a$vango)y;rNLfJz3K_UkA`KA-?XTwW5*22lM6Z|!gK!~?-wa$5< z2y)QnRM4#rQeKHe-fCD(WjZp=edUGY+7A|hU{RkZg)qT--&M)t)bBRSx{ebXX1%dg zlr^wImQ+QgHYgw*Ee5>AHKylBd;T6Ih$jK1i<2MKGMqS<>`Q?Y#urJegpxQ4P_)L1 zARg3*cf%i%TW!6Udme11doW7{W-rqe`Yo*>cH{ee{)tu1K9ZFJF8ZN?SKmdtp)TaA z3?dE48a4OXsh10W7c{)F{aVD{n552Tpe--N-^qOj4(_Q)2o@-H9$}!#A&B}BAk!da zox8e*f(?!&G(b7FIx`Ow#I!~%;wdmtYEi-tRWJGrK&!fQpS?4}3<24?I@Jz^YOC7k zi%(K&6!AuBhef}xW{1{1QGf9CNhSLP>!MDPG|5EwZgoO5v;D^AB_fYDdQRKSzY;!L zj7hv2^hNZ(ITd(Xm(g<2Yoqyye`N|_-kYFNNr&!gJWX%@L>w z9ibE%^9dRED+y7)8P&n+L3?c1XTX=Lv>uiQ7;Ukj!d z46?+;8TL!tkd!p8N<<|OIjU#9!*UMo>tdRJSlKdpWcoh<2OX$<>&95cr6huGV;%8O z1h}OPOm0=IVhT~)ues>(+~jt9yd7Z!hkY|1{jeoPICdJ?fiOCdgfdHTjT^tyAerw> zDrpBdQ$i8z{{m3WzA>zp!>RzS)IZg?L$Z${J2+Yw%qs0~BckpPl^u71rFd@bG+Z1(b#=TK3DoCVreSW<yH>4*~w&o&Lj}M*;|Kt|64`rz>?Hw%}%0M28#XSds}?`i&S(T?HXm zmg5xa!(lj<>G86r4)pDgh_lQ_pw!Aga|rz-R(gSSf7Qt`g3G9ay3zs}VQi1Xm^*I4 zw!krzq3J-C<)K>g9~OCj{LOgg@;R2HU3g@^9;j5!1fo@?J-zaXy;Dy=>h|EWQNGfI z?duSXiB@2HJYO_r9y#hfq6du0cgb9!0Dj%tybs)ap!iJB9U5Ra>tV&V?Q+RE{}%q) zOmiL>{#%XL7mYH*{%XdN1pmtDV$KWoRWdP>Y}{%Og6X|#!$?yUHwE5Pxw#w~ba|F> zZT(E7*nMXXXN#R=?bt5M3qLuSNJwuZkhu!|2m`D3QDxp;JN`hO7SvSXmH93o%6^CnZph;e^c5S-aTkb8Jxt$b+%SF3;Fcx*wVu7p#tj&i zBM)6^nRc{EAxelKMErA`{dAj73ynz?13oGV!Php-r}7ue_|~-M>_$Be*TGL!m|(z6 zH+tkO+PlqYI&PgIK-x+a=_!3ZX7y;nexHUP)6KS@evB_@Q`T7#i|l4^Z9#fd@3qy$ z`9a!|TH*%;fh*R)pk{;{f#hf#TrK}Gq;_=mOfPl|>z|!DoARMWTi!gW(nT_Fc1%bN zCQ2f)AL$}Y8|TzyHp0C~I@FX->;mLHrd~_YHU9pEr-me9@fKMVA|J5CrWY_(--t%^ z{@?zh2bxbPbtF@zFgdEMvs0UCD90Qm%rd>sJS5zZu9aitxDbqpKK+T(DUCedcygsa5=zhU!DR^dA0fNLl>R;)7Y7p=TIB*ZWtr#^q3%DE0h zcNW@7_GN=l;B8+O6Cxsgk$A2px%*oGfNc>u=`BG!`(o|)>$zT=E@tCU>PJ!QOY=dS z8=*<-2hyVdUzH0~;%Jv|mB%-eu3KE3OZ`@(E0GP4KMQYn6)QPn!~{(kROFAW&%Ty; zp$`$d;{eM}gR8n&4C|VLK$*2=hAdb%*306GND^UUFh?tFOB86z1*r7r5GFuqeiY;p z#(;HW;qls{gZDnipb0!VwvlB&Sy@F*Dgq}|R4t0OdPujqhr`CxR2vhFZ_ci3qG7c+ z-h+)>l<-0h@db5PwZ4Dad#wx+l()#FVQ+NB7HN%8AQHi>!v!-A z@FLjCM-X-yRSR5TG|C=U@SJcTcF^MYt>dmSvT>o?KM&+w4pXSCSNuW|zu9Z%^5kfdzEc{l>yaE-Or^w6^?D8C)gBc1|do~DJQ!!gz~{m{{ZtoT&C!KCS?BJ z%$D9@KjeAQEo_y_2jV0GXCxAYS4jLXDuoGywsKe96??+rh4Y(f$JC+OEbFwa-bX5f zPz5mr{p$%maj!TutFKUNQXox_(ZmcUQmb6|R=r<57SH^_GX~8Hi|H5euMOJ) zM((J>2mDLcTL#0Y9T0g*qTZh&&MN;@0kuM@*B;OQFm|FT-FFOL0Sgi)u)sU&X39f* z*b3{P!l(TX27ENj(PeEJC_PFmkmQS7f8KzD&Nk?E9iC>p<<;4~bqH{yr-TreWm7xv zA}c%#OR<3VE+^R$2efKJx?ML2;YC6^ISb*t$xn9{g3p#cYn3qP`9*m5oaCJwxL^)R z;gdPswa7;{-L1td2$a8V4D{UFQ(RPh*aw$WIippg zwCx*=;YkcFrplRaJWOPI4SO}_l%KaCKe97YIDKpXVhK>kgH2uq2l#N|XWUrIg)N_Z z?#Qr1QvszfxWO*QoVDan%x+$mG9*I@At+q2!+nmJ_E)BkR0fU8A;r~ft`V_FO4djDbnXWt~q|FQuLN4O7vec0OO-14YyK=mG12G!|Qy`bq_nC#pm{j?Haw!Wa;9dWSL z7$3HMGf|N^l87Zp>}nH(K9M1{*W9V3MBc3^iNNi&<42rE>@wEixRdj9wZ%A%MtXZ~ ziRO@>Ca1gT*o0FGW!=gaMx^<9a_EWzYmz`BE*<{S1s`M?f{_al*;vh?wZfu|&T*S4ym^Ze*+7_B(M#ar=hlyl) z!Uh%RR{6~Bh@&y3xes*)&))!t#8Oe1D14SOf|a-sd2R`kv<5fDxDe>=RB_l2A-A{! znp1}l;F<#;aa<|KmU&G^H~8;7-a7^?*4F28#te*i<6OV5=u_?1+ROV**&C=Qh|3!# z(iR1)fg4z3)K9EkBfkOhw14{6E`x3HWZ%LSCgjk>bPh!{%M?Pr;1uzj=`(%mbg$!* zYPB&&(!@+0+?Y9PU74LqsXCYiqigPcPR`$Rn^xv)yWtN928CeT2$_mtKNP4bv=Xm3i%{kB2qYtFBk9Ptowcw z5Rl%^<`NO%6qPV=-^AGe6 zjD6U~3IzVl5B4~M7wv}gz^am)u``)lDF#isggstFD?07D)XYM(Z*Uw&#!&RBIFOjlW|nmdBpv}`y7U)%~0$HtG! z7?_+en>Io#eh&qQtR9lRWku+>!0#M%Cay#cXn08B4YL+aNO%zQez*9@O+- zP(C(aHXmdRXW2-7Z4#0tuvlOHwr%b5<&YwP@4O4FJ`RB44mJ%Hm8}<~mVcYa8kPQR zu;$2Iuw`LwEYdY$7l1F6uPrKzU?}H+hQVeKwndjlN9n+_f9LR+Se7(=r^}u&fcNhz z0vVxKz0DU||4qY)eMiVIqGF3Hcw!|7Qt^747Gd(UM!!ywlnphwQ8CM_2J0^_Aw>u1 zF#V*UN5p>lRn+DXG!oeNQw0`O@^oeiXxPQn6xB1}-Y@w|vGNe{^E-1`&hcj^4sd|c zyYXgevl9*5PkmfoIoRzEvu@xZ&a4~lJ!?L`){J|{e!MM(gSFlM`9dW>O(LF*YB5A! z;g?p`8tCu*K>qM>0#&V5CGm@b$xy14*4Lg%3e{ug&Xv)`WxJ&Ad}H}e+nq>) zvx+IFGKD{!S8+-$tzD*A>Zd(?=Y6Fpr)L$C9juo|f{``FvOIc1{L;JG@%D(7v=1Ht z;pvK-jupjVZOfej2$$oq}Tsw-DF*Tv?gD;zr*}ZnEnM=OTeC0 z%De2Jiisdm&c76Gr5%^zl=Fh$!0Qaq!%cKxQVC!9?+3?J!GHNX&R1c5Yf1O1W{zgCZ#(j^T7RN6x%FhY^=xs(P-a7Do%^yVD zN#C?S@1pp|E1KYu4MrIfG-BEehrX$G+W#g8&kfAW(nG;Ms=u_z%aLXQ0eLnx1SIic zc%zUf%{stoeC`>BkyUEaE(&zE(npzNB@KbgG7dlsh;uoJECrbqVgKdB3|Eu^XFA7G z$J|>~g$Jr6eJu5@>_|6Bt&NE+hsj9)$VC?tfLDN1|8U&@fLye`9p3le zi{}a@2syh#v5Mv2e|HC<7If_18jlg~7Of$X6k-k_1^55~zSUnKSA?*x_(^7M(LMX_ z1Yuhc_KI>{NiJGIrsMFRKww(9E*~QFJn8dlqSNqJ>6zPq|MIFC8r{XS2SY!GsOdoz z;*9F#0Ow{04a~Pwv<>>`#?);-hFZlSW=7mw`DUETWEi2MO^x}Z`Vl2ab{E0H0!QZS z0|54`T#`1GA|W2xKKT9lkTm&T-cFQj6%x1i?~1~#92{J1M+Rj=9uTKA8WzYazgeV0 zw4a$&3A>t>eXbHt@@}%|DpMFj&y>C?+GyOsiPas`UgUTZUIHd^tvUny6|cF<4?YQZ z0^Kq~N9Zb1FRcH~Ie&=&(O`QjJEFh$+o`zVif6o}DEbG-UrxMaIP^4#d573u(F>Lz z>e(Qvgah@F(h5YoS#6a;0 zX1{vq&aVOSI*3pdSPRgPnw1zFtum~h# zG^x=;xPm`+^8#X}xdB~=J%DY&lPzHI1^b|buAGv#2~y}M5%xy@4)XPeICa;SI!GzK zeGC*fV2?@eAG0KBS+He6H<_^1J}Yn?lVBL5SQEi(qgmDe9Nmp(_JyD#o7b&mCB-M6@kIb#4a>-df}XXmr}LBH z(J+9{h-a7B1A`bfd$B{?>arOK@G!CTv23d!H zL5m_}u(TT$NwFI2|0W*_^T45;H9dhFt&X^x*Oj)N(SS?RJs0uM?yyjk?Z{xb`bR~9 zR8tUgtp=qcy3zq2ft)b@8?A1)Ma9ZaEHuwOi4jv^QdGtvsup6>u97KYb(d0}kC^at zi6n@+{?#i%=;^^`HYH6lIPKglDISz3#{=j!yTjUx>&Z-{<~@c!-`7O=+Gyg?-_PON zLMBWIUuQlYT}GjrKP8*I6^{Lg-i-dF;0saJH6(jtE-fxM^+}}+(l3A@mqZy?oJZZ@ zhmmEMt$x^{|5i19C2p}z@z9qxHi3qw?wu~!b4MMQ#6r2((9C1|wjj%ya+zXuD9N$s zG&1!fXY|=NfBkAS>a^o7C9<3kA2ap8Bm45HnlqD zUmq~rTx{kGj~3`(J8qv}%Q(9IFj|iOYG4FUkf3jUYWSiZ$g?b}Xu6AQOyZkD zM!bqrvmX6PGc0z?wsii+lZRwe9)E$O6mZ*;l@68F!BJDm>K`nx)%(1Xtzdg7l z=6n?|(%wZpPFAjtd4uX0Y|=_)#nBA!C+}P)sJ{fUT*FqzH;2p_M9njT@J|zmrDB#H z+@Z#O-T_!A0U%q>t!yj<1p+jaUZ``HJ*QitkjqB1Q2oLvBEV_BaJ=N^qGNSk+3mwafT> zBglCSxk6J|G=pH8H<5R1z(scH!$8DL_uNrQ#`_l0YdGG9TW{*5rL6*$08X7~`Vf{a z!W;aHdxmJB0rvN1TF_%IuxbsO$BOBF+45eO{;*El#q(>VPYU%AN~prdT4PSnb{a4E zXY1hXUnuuuO#jdnuQ=O?_u6*G3=D2l`JZYW1gKUHSGn>Ne8c)&OZ)actr|aSS%7u- z6Yg<_zvOeBI0S-aikYZi?1^L?8+j&h}*wCQcm}%9ZQ?wvjhQkBVq2HdoH9i||GfjKsto#7+ zYR+nJ6AGpt3GM5p75p?V@SI-R?mbv}ErMEP4Q8*e-=jFO;XGz04^*T=aoEUE@{yxG zs4eps{F4D1&0^M{fdg+}_^07HT^|O@a3LEP!U; zgPBtnv8UJ(;HL(?5`9l}Y9i8V7H!$Uk1AG5iv;azKr$nhJ%zk`>-XKQssNSLA#&v=w+7Tam<50`XT3^-gnQ`O>)AD4@RCdgqxI!?{C%VmOqOjRWb?BPI>-(=uI2%korF2Yfouu$Y7+C%+95Mn+#nw8taMu76u171Av@Yb^QQDxHtr=9^jB+pZ?!xU z%|)=q5NqC}t>x`Y+`3n{L@*=`Y!j?lu2ZTf2UdXJXim(JqF2|%lq)0DB}cG!WE!&R zCoA#f)1+(eDlQ{>&7OkHW*T|qZHmwSzkUG5@6XpGytfi&f77O@N%TZ>;ixLlel<5O zBB4n^5hFViQ>Lr_O5KiiKVTAx`HU=32Qx0@^^G^LiZH>c$%H#$btCL3?YXQ>7Sra} z79U?I6*w*DP>#YCtLO+4ipaLVWwq-i^!w2w#o6`d3(h}alVIRS^LUG3=;*%$UqKaA z9|f*Y8POr@!vjxEi`&%8;Yqr{#hVkEt!^%B(Vyd_$~$Xa@PZU61W*2%O<8I$I47KI zIi%JMAUk1=aQ&)uWEXL5hpkgdV^z`9=2ERbHd%rBG8TGxS#>$?M@VprNJNqRaQ7>q z;(Eo?jKB2D0~gK+;oR~*y?UN3KtEMXnF;9?%i7BfA@I28CMf7U(VBnevmC@}ZE)o@| zFhv@Rq+(EOfi3+a(R&c5S;;t&YC$QK=RP8?Y2rr=HRGU>t-k7TpCFDes59s`al&R` zXbL<|Zqo$J!cp?8Q|Vd~UH4y9VXQT~7ERc7 zseUBdU3@?rEI0Y22lBrQ7uioBc;c{H+hRs^D1Z9Sj=0s&j`I&#smNON>koZ>-*J{0 z3H|v>P;R@_%wkvi-Zry2(m`tEV3P-zfXYX%Ho$KJj`4N{s9-^B%FLNTT83fW6Si-kaQ5zWKSSa;tD*PFa>H zx9_N_Vwkv}w?uARynPz$Ls zKycok@bwNVBbo$N1d+hC8wu7#_19pcL`P~4<=*#ukZAdjJ_81j^oKmPU9|H#MG_S=t>X$3BU+`P4@$g9%_555SS+ZgjQN@M5$s>@$WimiELiK-@F%9+L)Hu#DsFw_m~nBaO{s1 zZW>$~W7D~aO#TVzhHVakxKdDpT29g3(qIqvVOvW^hHB-FD90&sU&yt`2x@a+n(+qs zpLp~OdS765zLrwjy@erHJOwLlG(p=a3!AFMP`n-gv+coS4%NInuyuZO zmiczK=4VfCXrLmcjrY#dI0AP2BZA)l-2uRhb(iV?HA{iN zEZKwcq_jNevC89;BXQ1HiJjp>X4hZ^74s);r06e&kXB-((KWW2^OC?=GJ&EQVi%Hh zt;SSP#>V`i2^fWO#s4CiTNvh>j9AmG@q*CX`FX_GiZ9Z-?-`!vC2bmNOAoS5mnQeD zjQrzL0-Bta#cs}7bM%BD9~XBaf#-VW4V3#_ZHuavomB^^>K&~|h28YmoB4Ua>2jW& zi_}(u4!Ej=8P=xw3YwKkkOz*y9xhs_z>~19nxY8U1-!&gn}4Q)2%PV)8!!HF%=w4< znkfmyM<}C_&^ZG_`EzVzFV=zu?~0Htr81}pIpYHXU0h*n35p%Of3XO6FUvL zhr|J%%}-pk+X`L`462n$ec^>$E3m1psOnU(^{|)@Ck=Kx8S6UG1KhP?+Lfms9a#&n zA87-_MwZdd({1yPx-p)pDrPCC_$`?>_uLbGHTw=OKF20z(`l=U7o1=5d3^y>k=4IA zE>{0MqjElgx+;?Y#AHO==P_(lQL@@D71?_w^@M!=i|L)Tub}M&w;sN`628~GV6Lkx zV0Q7oh$r?&M_vM-64xs5SdsZq=-3$Oc=Ydz-GA^4`3$!I$AaxFT2PvS z6)Mt6S0|Hf?4atobC?iX{8>VOY6;qZj@eV#*hRE`BsH6duhV* z!N`x80j^mt2s^-bjv+C^{`~2G41B1I<9RvpWAvg_QN+~1j^9)3B)BCWU?;iJZ&fJy zid$Tyvf)(qz3T*>H)|s<+l^xk%kqr@6Sas7>~uIIFO1w7wm7p_+qAughuNmDX?m+8 z2+W!uD%D_2EPq#C7P&22J7G2uzb7(L12|xI=kH-?ZLejR_}K|^Ymgw{8IYSP_zI08 zyfeDA~qAkg%IG~p*roT*^lj1Iu}6@GsN z)bfjY?;J{b&z-e>Tp2O7+U6{Kl-mQa$F&hDdu>D8%fPZW!vKiy1i9@vOBRU4HpD233RdUou{&BKvG6TD1;1u=|GZPAHBDz+Vhg;n0u-QlpoqOcuk3 zH^+JV9;mT(u`bLoH-ad|klPNPxB3kk1g6RRu0|QXPk&u__AVkRpiDMt10!)|(=GNv z?zHF?nW`~&8v#S{F<5nYhI80JTRWDUmuJoM4W8GGRyxbe^w4$thy*0t{``d{gDBM| zLUK70vUkUH&G*P`^H<|1|47}hJ+Vf}A>!e_UKR#>FWW;dUy)WzmBO+~<{6*T@9u!M zz_GeH*s&vuuSqvvps$GX(x7%q<$GCqoXvaS2XAufu(x5xa#BUwVnn(^bb&jI5TlR* zB)Y7cy7Va*@zd`6&)yf2`OiE^-v6h|N_1*S3Hw)01vI1~0;ScJO#bQbA4B31xSHkc zZv8nUCS%zK|1xt_;m%B=p|>iw3-L+ZHJObGdin|bdUa0%WQP#tI3^NiglB*)W0#ee zTA(l0<#L~u6lao({=i9R=qSZSIL;kLZ?DBay)r zQ8!eg>KY@7^2$Wxz1%N*O8rG1fC1q);ji9N)(u&s*K5Q!w|8+ozHrtX898RPi*TB7 z04nXljM~UVZQ~kFt=GQ+MnnlTs*S$h#-|xJwB@M&9zls)% zlglc}#QESH!C)6;04HSDksVeHvV?uxgm&imV)oQV(gab!xx%?8wqt|F>wUIbw1VJ z&{hIucrGyCAI2*seL?A zmjw1!yKoZ&9~@O+U%!U@GC`iOMxOAU7L}7wGf(T#YU*!_}p$q;ACBv zttImcU?(6xFROFgw{5On3-lQ`YJrH3@0?wUaMdK7#O#F$7%dRGXXtvcyG6Y)YGK>v zmKU0Q$eG^P7|UGhQ(oy;Zjam;`-P)`P65ELpS{!S|@{W){Q+y9LwW; z@stL^>2M%24bDQ_&!;%24<4E?><3l@#vQ8i7giH2wK-UunxG6$CiqI!KG^ zJC%s2_gYmb|4<4a)b}}}KTT^yj8`3Eq6p>I+ChhdQU2_UPa^;$vi>=uSEG+lHz4~5 z{?4;(@qDua6x<3Ht>L`hIOn6M`%My~cyQ^6Ya^fPf!nle?oLR%BpbU=B+NQ8!8Vg1 z?Mk{0!OEh8M=0rjH!Evk_()P*KXKYfrk+lJBem*ASj2g0yr47!Vm)Pw%YqA8=eo(J zPH?jbZx~k{9$w0}%F5xm^#Uoj+>WjzERPsNh+t({Y;1kZZt9PH9{f%&)!&g1S+4-G z=TBz{Jc=Bvm9irM;Mjyt5&|BAbA`c5??{YGI1e#hYqYID?9^8^#cCYM?eLjc6Val< zu$eaRtE>ELqh7GoYAS_aI)nd$gTTfcaHL7mq=x$6UHb7^B?O^gDk;Uxs#?SFhaj{C zo|l}U_`XZJn$ld9;EOy$hO+FCNiBkS5do8}qhNt$0lAmIyHBv2Bt%8Htn;VUMSGl{ zUFe}&XWbwual>Xmd=9mdX=&z;M0E^YDW5WJc&7KaAk(KvT^z0q++%*jo~I zZ9RmgN@#^I419ZbecX@Ap+~7MbL1)|MDY!%_;RAkj0!A#CA^0 z>8+bumm3yib5v*^sYFx2nT&a%Dnp=n7q_^;a*e4>&d3G4nS zO_kt?@J~tmrY}=f4xt)1E8tjt*y8P%MNilQ?FC`0d3$Ew!u7P}LUej2agmnbrIi!f z;i0Rxn=o5fbp;Vu*_IoniPY1z2^HiG~;DI6LOBJEK9(daM+l z;6I)-0R7FDFBN;fIbr?qFSI9L3|3)3&hq74^*&gVB>xisvfS{w~maiYa=;@G9 zUgV!eLI`PeQ+8Qoa-b6P57%0(ph#}@4HCHxZPW11WGFo~fbUOnftg$<4X?_%1hY{$#hr?!25La=h~z>#|Ggh(d>+5V7~DBDR7!D6gM zuf<5(*MU;lKc})4--j(>AzsZDA}3Vgy^l!H$A% zDcLpbp)xcJVrkOhtJps{y6cPxFx|3q}HO3=JcKiT(eQO}nfhprF&+ z<;Qr0j=$P#u`eJ?Pm@KyK?5Eia$XtWu^1vE>;eL7f+SMohMG^YUx0&fVIX52A?{Gw zC>gd&B1v`3Q_{M$rUMp`R$jQ%1?tEK6O6mRSeld9E?mCO;~w2c@tHWNaN8|IPEs9n zIUt8LtY3z|T;PI6l6 zUn3^G=Pj~$V7Os;D4H$5LaSPTl()DqRtlK_0W;7S)`N~}O%AKXwgoJx`z6Ol1NaaPMAD(k@nG2j<1j|MwnE3D zP0BLY+?i*Z_B9rd)U+jvWx(m(k5$9?P-KBjAENkgvC-v^{E$!C*}#*NmcCT0$Cy?n zi@hAVgU}UIJxS;?4rP3LQ76s^FnMc817H*NazTSXiD4fh*L;PNTx5koLJ3$xJKulp zkMm}})g%rIwtDMMp^LnPQfslsYm;#aWmQk$EsNQ9_mYM(NgBR@p2 zNPD$zz32JMi6xKgjER8r*6VAycdv)l=J8U9 z=r8|Q_J3^GLY8fg|KLI&js6svA<4eiGQ}g>CB9B@gnBoc9j5P7;Uy^^=~g05ax8Fq znQAC7r|0pi%TobnyWh3T;O2X_?jZF%O_~bwo4c-c1`jdK=A1bvPW&hl_MwgtT$&v{ zBML`DN?q`E56@eDliNn`ADBN9+^7XB1YdNIfI?l-p(!jTBS#TrGj%jt3wP=EXfJ3k zGRulC7U>WHdhAzgc6DyXLa^iRc00&vwx7?fq%kCDQPAZxSgj}nPiB_?A6Z`+6j#@D z3j}u!7Tnz}xVuAecXt?^2_8H^a0nLMo#5^k+#M3!9q#Z%zPIXDP0f$_bRDMBH6-(HgF#f$w`AxD)hj3Ms%`O%=j z#?xhX)(vv}KS>SpQ!7yX^ur^0{%^wO_jwcpg=q7y#{{>oyj2NUj_ME;>uG|{ShY#v z6T|>a7u+LZ1eKyBL}oO#N&l%2&j@#<`s6plims54v|9lp>AQ}b!<70RuM4UoYQs)b*dp`=SwX*apu7>;&-%& z1@(@&^>ksKBRuXX1u22n6vUu$rzv!jt&B=I!e1-N?i=bfppR{%(kI=6eb35a<5j&r z#W52-cSMNOK~4Rr@dE6rE8`J^{_NxX84x1hEvBdU7~qKdOGi2_sSzB)h5tAztTMYy z(iZ=IOotb&Iffsg@x|;ulxNxokDwty>E;5KhA-maRM&7@y67rJvza>uyDO{XjR=Kk zVv-eAwf3v)SF!;e->h~_P3yn(qfQ8nG9RE52U6fe`nps88A)ofWt z1C2kgxm_?4uz^Xwiji!x>f!5I#LdAb$eRAK&Gp6X#Nkom(rK><5Ll7!s#Yr_$shB5 z6}wV;$Ld`jZiR^^mIU|On&4LG&G6LIfPH#ZS8kuL_q&@D6Yc$oY|gC@wTOx7m-5_b zatxzH&mL>qo&dLwBNQ zjbT$T7-APEN^)|r@-1Iv7j`XjKL)OY(a)a4H*oL`>7fqNUk~9B*ps<+ldy;yK!04 zrl%~x1;nd4X)qOED2X*`>%aKCy1^6+}zDj8w5)d zgw5P;oSs4k>+Pu#n#e&s@tOy1Z%bpiokQm5H8LI-L*3!2A-kZQEv%{1R?2NFB zV)z~|L5#|qXgFX4vCB<=z(Rwmch4nd@)_$p&!+yTcOMH%P{$?3T=c|(qRG&QXmGZS zWEXRjE1;bW4to%1?L}6i-Yhy+xB>JpGW+xTRJ0%~cdHuq-}Oj~#h_xZe`qSry9awt zJSj?VK7U$!ffkL|_>fdx|KD}4dA-iIb2S_PuJepg$0F4$Xm_<*@6f2R5?{=qN<}bk zg*kK-om^=kb;1L9dVE8Y0S)^F{*2k~nFJ*>kuXx7o?Ph+(h*6ME~C%!`V8G&Gp-Iq zu0qgGdmh}L>CtrueXF&b!JH+)ul0^ldZnbZVRNB07rZ0sbB;!1Mh+EiqV>nPA0bY* zU~AmF@MCWqI@w|I>1+D-l?nFSVWXPQ?NuuQXALU&pB0bmf1JHRr&ffh_LpkZ;<9y$ zh$v}ryNYd_~-cDMg% z%hYn3(sKHMi9FZdH_EoNWK;UPq1?gndY2)B9R4R8{s=oz@qB+W6RtOST`;ojN5QKt z9vCT$#fdv-7tGy+vC(=h?6@D~fe9Ik@6|2OL|52UN(;9vK`eIpA!ryQ=`_g%kRjeP z^-kiRhGF`Qu7pih@QLe1=f2+HEHDObpGd}YNryKr6=Se%f+eP#{8?)to^wq%5~P%* zv~tdVF3k@p7z#(WjPIJPpt`5CN(7eD%#Irv4T^iqn zT}_!Z2|`>XYbeNAt#S(ALUXRjMV0;g(?^sVSf!b5QHrCjwH6Hdb^1uqPUpM zb{|t`{wB0HTmhY0IX%VgDi|B-xw&V^R?}od$_6xW@m=gTWEjji zl!iTFqK=hK)IT>)nZHNwty)4bcSr-^4f7CELMQFtZf+MMj$~O<>^%`v7b<<*qSQPa z+jGYEJ-6o5|85yWzIEn)JLjVScO`4Nr66U`0BWXFaSr#xCUmhcR(7LO%8yy9DlNkG z6(m)Jl0MHj+=W0Ee|c>&tZ>9?g6O&YKYBJ1eGEq;(5sVQJq+2<=Zx@PQmo4K*0UJ> zuGM;PwZVH9uQvGo3eXek#n`4^L=;F;UDIdB}fwkGKhiuN+ zlg#SFTi=Qo?MDy~%PrPhYhY30#3K(W=1=>&L^f>YBtLvG>l>Ha>d%-6m4xRj%?-bfr*kwz7d0XBAuM2RW9EiO^!j(1G)T^Q3Kkj9-R`>4x z<##j>3wA9H>=Tai8t*hTJ=Dr|9vZJxZpS&Ia}+EwFx)uVG?Q)kS%C-~vWxjb4jVac zieN9^%TbtMxolL9sVt-l^ZpQ7qaaVF;;)3}>c4NKJ*Z;v41_ZHznNAcPc$4n=QjPD zi&a-v0;{K%)IPzR60^T;lQ8()|Vk6b|NEGW1aBd0xdTe>%D?o>6`ze5BUs8QO|`LW`E zN{Ld~mib2)Wx-!{?7V~ZEmWy?I|1k_sw0|8K6 zV5BJj!^4Fy)S;cQy>2KoT3_KQK0Cuz3$1XQ%zC^v&(l7h*^RS+y!2yB$ut(*+HQ^y z5%*frX6IYdoZu!KoEkjPhLDm3`hBG9K%-d?;x9iuvKQ*Sn&El^l{C6jdVx5k4|~st zH*Mm+-q6P178w+2+O0DWqs)jGrxo3X-t;xjjlt(wwp|-pBBm z;iZZDL41*vGaTcDL@l((q*0-{yBj_OkW41K>fUHAV+e+x^w++Xe*A_u!F#4v@CClY zjuxyGeF2LL_QN8b$yg4NBErrHiRuo$#2}{ErHJxD&9U{_&}sX#1w!I1`Rwmmb&#^j zD+iEwcF)QGAOX7=)NqMEO*QhUR2-pL1#xlh15KI1j@D6EeJ4M3E@tk(ufNOaWV7W5 z*R*9>o^xjFTqRh%!8z54LU)iAynQBm8Lnt;xT-5YX6xHxh(4VrbbRJZ*myxKJIeEY zh`-m>CL!RVLrc}<8410YF1&3hrcgqB3c`1)8Wct{&U~gK;z)?^m!v*Eg7Q&8^T5X+ zLmkqM?9P5V)pdU^5KO&$$k*xe8Upov+#5WmJ<1Ig53<9WimiX^#)xw`pZAup^-mox%sJb7=9{4yxSSXe#*cShrT#y>E&zsMD zE!0scqPLCkJ)S{}>E+2Gl{xA%9nEQ}@e+f%I7yQ08_tJQckv^tTKTP`=5ZiC%n2x4 zVIANUfY94TffQv!CE^6ixN+@q)BnX-lHI5tfvZ~bmm|z>24yLH8uJai@TL#^W?tx8 zQQ8|DTR&gVkWmuD*fh0KlTjDEG^1U#AOd{jOPg}IakE-M>gMT?$=`wT%QG1UyVsOO%UPBfT#P`uTHW*flmnc zmBl?Iql@-mBvhjVCg1^zhJ_E%qj>T0YN?Nr5*Cp?G9--DB2%Fgi8P>FMBP+er%(O%F}SE9nv|XhX~2V| zFQz26V?s%Ex-8-tS#M7o)@3*N<$*1J54FzywRkSNWE zE0LCE1hfk@;#DB?%GK@n&^dTg>~r|FHJZDUP(?5sKl~v#EZ;^*rUlQiiFkl71dqXs zfa>YEWZe{}ho1wW%U2dU!2Nw53wEbeDIL0!{%`mpoOZ?|3KM z1{lBb4uo=qHfT?3yp;Ie}Nnx15T!M_wk|Nzek+KeYl}H#Sx-RZt>$G5`1 zAQY@Y@cTNL^r93e2+>ry%k`$NgdGNtxlh3I1lVj4mxnjg+Fk5&$_|n8QCP4vM4GVm zs8^1NR2FMYd7`t8v2lAcVM+&iaUheT80t%$TBWfj<b`9Ha^jg?@@7vKwEya|S}S#v!^9`z$uC zFRDbi9y70-3`446p456R^LYvZvs7nE_2s>Gp~hk^XSFP#G*lD}T4TNj?bpbz=|_sU z5(`j|E;4Wz$XzR~b~eG_Su9ihMD*ojkEb!u;%|vI=%~B%{qM$iQDfI0cZr%eg}_i8 zumS<^x~=&5CJ1b9x%O%k0cr>8R;AP_K&Ly%kV}IIAtJ?yQ)irS72Yr!#@(70=#3r_ z163;ks>;fS?sAbzU3|rc8m6aSo7LgJ{far;Y3Qc2RTEM zMAqG8v+6(;HnD!*pNA_+No`k2Nn5Yaa^gZo z>2JE$4$9X~y0oF^KaxY>A{jIDBGv)nz6>|5ia`asJ+yWd-6#e#n=g1s(HmyDtB!S~ z3Yni1mulWyxgpw!1ai>KmIagMIGcvi91uJym&$7c8ZT>Wk2BpIJvr&Av?v7kD+8t2 zB@S+`2z;K}>k9-x)V+kmjUBZg)rAPG;c&_UvuzOl-{MO=Uqa7(oOYQEo_C$K)M65e zfn~(ZymTfH-*tn0_5(xL*yh(ysb|>;xH*D{9(EmcM;MSa5jZzcW9GZ(SNIbsPVg;L z9xH1*dl^rTD6#ST2=8meZoT6shgyj6*wEp&!zWM}L%R%cnQjM`M*mt4xg#4W(sBJ* zxB0(mf<^}jnwc7^Ho8sj7`Wh5%RW2dMj=hc$Wh@Ygi!HS5>=QjOg*ZTG!}nN639;! zKoD01+Vw3Gj?u*sPEY`dq>LrN0(`ie_&=1fx*=b$e|oF(D@eeK9}KM=!L5o=g`Nwo zGP5(e&JehSlsc{ zE}ut{{hOKgw~-&z9~N-_yd}U9lo%7Glf?W31(duYO<$CTmKuCDNJ+>TWNc7UC=}#P9%w#9)-pYMWV*h;Py6ulV@bm~@Y#l4$MEQmMe@X6f?zs3ST0oytpUU35m^_7 z0T5zYL{h7#vC4T}%i+X+AQm3fxejL+k)H!+XoBE{aTD>X0=ZVYKE)mVE|;i-!+({< z9BtgnHlQi>?H!#P8{M!!|D#<9TE)JC#m?^%mNOpYT}ShVP5#cS!l_XK)no|MS2eJ` z#*UR>#z|_F$Re@alOF9U)QN1dy$vI*d%QI-3}ZhE!HEWUDcJakDF*#|hgmmY{8=d+ zwL+p>5t1-|mpqe7*cdIOIdXDivZQIGcXxs&-5?!t(IS`-mj?IB8f{k8p=LA}A0d?t zO_I}4=A$G<5DbIuG5d7X#S{ZUUN$9t_kfRd@+kpH>yH#yN?yO`Jfss4T%oRL2m+cg zJvi$;SV$MjpTslwhS0$Fy@j6Po!Ng^2$)IBFrFdxliq-WOdwQ}nJ zbVmqc2?tTTVN~iTY&I+LgwC-6;@<02muFYufZ9dVG%=4rK|xF4m-^*g*%Yr9xAZ*N&>9_}f_JlXI{GrSEZJ7mG8fN=%l!ZRn(;s#2# zep1kuRRNB|XmQu!Oc7LC&FB0PSZ-wt7*2J*h`V3I``v+s`Yj{Hni4Z{sw#swdB|&% z5}DRRy(tEzkzS$d3qBB_SyYW?g&u0APdux1(g`5tN1szZQ7BYq*}`qy(uaz!G-nlR z&?ZBEycX_QM#g;uB8EOV{{ZcudWQ=X1$I^hO9}p(c*iVA3y_iGC1QI_teSCA(^cFh zkX>2_s%%79vXH4`;)NPBJ%j5V;=Wa7onB9k9UOQrhnNfzBcx}fBS2kX zKnB(0R5WAt6Z@^{{wTw@@rtkwquty`ZvM7EOm9H9S3+)k)5m|ZVnSEwQiGrY$M^E~ z*pD<11TOr=;y%u0vAwER(7P?|m?FC;@ZG4EI&kMl$o>vx4z6lg`UlK&BT z4wPLWFGpSmcKf4&!Cl9CT zcEV+J(Ty|SZaQ)}6*kuo7~I}FaP;Z$Hgqc2qh!lBbe>vwYt;Be3ejvkg;lkG4EIBi zQ5E6VNEb2xnb_MNEIG=2Q{WScy{1M3ey8ZS^&*Xjeb<->K)mRUKV=pOD9J@QAg1>Q z;Hp`**JycA2JEz5R$Y&8;oYKc=o@fJnCOvHzT3*wl3`MOni+n1LngbNLh!ed348!K zp!2rLv(SGnr9?R}qcPGdKufQiI0~Xu>-_uHH{ZYMf%DAX%}98g`x9H)x>7mOr;}ZhBOmf z=~`LoZJP|-Kz25Xx~qJsvuV4^W&mfOMB;wW5Db1(<8jfHpGD2F5EvKap?uH@d610l zvbOMtdyiViXQxiC3k`kV&$zx-yqGVny;tJ|^Jip#GZ>}U3?_lt|6j_l^b8pik}g_e z;F@;bz(H~)CtCOp`+FWf$$)L3)B?=blm21)aj zBYw}N!8e{L7PJT{HMqOWSVt-jvl~uTDQ$+*lZwpF@#!w7_P%JyyhfSaF%YCc^Fwn( zSHd)L7&g!ccQPifWT_NdyIm(8#iB2!HHC=4cL6(>%dbb{pAF#4f<{pK&bKFj7mJ|p zR|!B{8k&&4?O1>SX)}h?)}TIFtA0>}TnE@3eclf^r*GJVroN|?2b~sW6izDITkrG} z6?HT*&;ei&%&nd3V0{*rEY~lrFcdcMOy8Us*! zNtDLHyL8Ou5<5f0MbB5)lOgQaWeevyf|8xKVX|dFTn=G{U0BU~DIU16_|u#`>`u|2 z%$csLu%*FlY$QQLU?%*P#T0#a^pVc}EQ|fMDnzslR1s~0*f$Yc21T}Q>lRacRB_#( z^GV?n_y%>B@6FL%Y9sNjpkN}w=+tVKMZiSzLCPj%&H!a*na}}Ukc+Jo1=}!yN%d!( z!oKpfhWEVe@qusjFqEB>ANxC#HZ{bL{Kn51Ha0 z17|)8p`9}ehdZwKf#Hs>m_`PF_tHQ#i$SkoLFY*Pzu;}l08Ds4vCyE`+`J^-s6n1( z6-3gEOFQbqEQ8nqJ7d~PN2264*E{(6$HMG~&lY5$D$G#4AM5tRnDO$sHpnfEQl34( z!AOl);VDSEV5QD;QdV7aMtT5PAlb`c+}Q#Hbz=$l3SBK7QQ z+K1GrYDkE%&*CF@^DX(P5C&OdGGRCQvlhfk#=d!9^z6*PxGdaVM8wk#Opbbk_aps@ z-?l8EfUbj>UhpUSfqDV2If6)&vgZW#o@`%XE2>qhk!!^I$Ur~&67lr>oF>dLCZt*7G8G2mW1Es5b$g?8@IQr1X0bqFjJZc z(51VO6#-E=_df!=j<>IozPH2k{ok4vh(s9>8`{2n z5ixqlY#Ae&Zg)!h$+Ad~Y-VqR|4u906eTmBS&q1;Byz(IlcTc2D5BZEcyayxnIrkB zBkX*oIe6a{`F|!4YZq=cLE$FTNM3F`vkR-!qKPtKS{^|A9V9%vX=6Z%63-)9yG zOlmP*6W*VwmTv-Sq?r>P*6=6)MBQx0gm(`d*Tf1PM!;pXF$n$X|$fkmSNl<$f!vNv7_fO|13g`>2dyhv!AsSLJlzz}#42 zd?ko|yBj&Z``Mq7O|UCHfhcRFsya40gptyowQuS&mAVE#roR9MTz8!K6Kb5%5>Fhm3VWVG&TK+y9&s zrfb5(m(^h@XdjdrYLP#x$P?9%)l|*8!DPU#I z><+aWRcVd9jeLvSb4gCfnxv{slP=mD)SEEAV@NB>hl@4uyR_jOC+g=QNLtV|e6Sr9 zHdj=mMR%LbOh^uloS3uPn7A?}KK3_rySz$}KqrjoZFb#9ZzCEO~ol2_2m}ByyTa5OI;1|ds@cwl}UKuA2&1{KjGR%^{0 zuL%hZGOixp1EcB)871|AwYL1rd(tNo&DnmbXs8EYPEo?zpRjPw55ebhI% z>2YU0>R*ZqjmiSPhX(hUqjGM|h>94jdy$({4~Ez}ofz4NvGg(Quvb6H-quSP`Ggkh z+)=f3>dVaRS3OCa4dIk-e;9hQ!l9-8XO`@4(&wf1be0W@I4yC2&;PwPNNR0MkLMcx z;P*fx2=!9u0>43q{aX)_Jgp?BbTpfQcFi-4HCx( zxY=z*aTVj@cbl3kE|B0w!7Ir1&`sxW_J89GK%+u)_ z5S;T7IKf9v7G4Ls++V8Fakt(3!#zmq8BQF;=i=Xh4MXW&Zldn z$PuXQX%<}=vTrzTCwO(3sUI23i)~3##t7PO_p)(ttL|<6F<8&_#*p!Jr(;Lrfuk#MWCoRgbTnxBTM@s4YO*;&79PCfA=I3e_Q)zafS1k(FG@ zUoptX*=3t}5leAeTj3=tMOCs3!m*!1#zq066PPYc+rO2(?N%q(HpOI628zCa_#w`kDjaS7Z6qr)y_FLM`Tn`&pS^zzJDog$v~~Vr7Fjo$o{M8j@Wq;Ju$RQ>Q0T z=g?N@5`ILyi(EQQ`*aiAT;N`DAv>FkzM9bJDsxAJAcH`pe}7r2MJ4IiY793(Vhed8 zx`5Zb5wG(8p{lAAJ`sx`ZgaO1JpTw+7xTj*n4Upz)lOdRS&!)%FKi-gXvHPI5%n4) zbni|3%hGaCwLs=0=buoY0P|YAPok9mg{P+3ft?iv#^Kj`@@GQz?}tKIG3~^yv=cE$ zE6Gm+r8kvvDBf3^5kgQr4hCJXi~SU8fow>VSLcX|i>e@mzzg9b;+%5=gr|pyGe(@X z(>KdgK3NI3s`B%N zDU5OuEvzNvc4_=3fGX2w2H}g`5VNyr$q(vsi6D-T4ZWCu{}Gn>gDjcO-K2cKg9DY0 z0o3W37^M?@NX@T@HC&T^yLHV$vE#IS^G&?aqLeCs%AC~z@!OLNELJ%(cnjCA&tm6PYo2h3MJ{eM>oXxD`>G5QLVElPVnO1W z6XPXxzwt+pu^|+l8&$=mrSqn*yawUYBA;U72!zsul&q>z=@msHUzDjwa%NeNQXN-= ztT*}hT2pG)?i4n@t(}`4p~XVzt9UoqxdbEXL@K$f_7mdRe-G+u87w;M3#;Uz%@-0A zO6e}4$sJi@oj7UkYpvyG%W69lZzBcLQh+i)QHOd!@ti!4qFuK{vTq})7qfir=9M<} z6Rq9*H1(g5juxWE_9JVYUO`BEpThQ>(QNYC>3*G_R1Kb;&zvQ?e#aSnI&-x8@%F?o zadoFu@IQ+Xl7Ho$`LQzI_s8ZzQe-%I)?v+OrlMb6L)ETEX^Yi$2h0J@he1kB8gNZ8 zq@#>9X86_?tyEK0=w>FeYS*C{+IpA22o=B6S$=J{0)^urRCvWGZCW4HXbR`@vcU=8;f zJ68E)_GBf}ZX!go5Lp+BmTyJQb}P<7{Fh|Fiu96*h}N^+_x(#duov9U4_6!7`vDD3 z1dBSEHgxom%Kdf6mE+e>b;kCd{!cCf8YDoDY-g+|e`F_h38xrY(KcPgNWXr`1UQb? zmTAUl%upJ&4@P@6(!bq*om9XJiB3f87zp70@039JR_q(*QV-Yv+GDJ9%ZpRgR|=Bh zRFUl7`D%=jDAL;s)*2#in>CC$OH1o;sxNWb);0&jHE|u^&;v&65_nOzczeRjLme^# zNRFvj4SLoJHq>WQva} zceysu%1Xc3O4~&+yH*GtHwHZn;}U!-p$oozjM0B4vMcPshadQ&7EDC~ETfu8wv`1j z$!N%4nE{Lh0}rxcZqg(o{TvQ#T!<`MqzhYO3@)e=K@EE=2x~Xw7lumOC@p50Hmayc z{Gx6w#L&oil=4V}rfT;4PaTV4MyGTY5n3jHoMhu`2gqZ$OYz@WDQ8H)JCVXJk@JOQ zE99J`Uc#S%I7aeq?{|HnFPN+Gf^Xtjp}SK;qt21p-`U>xixTq^fx7iH;E`@&2~%E@ ziW72cR(`dQEi-dn^)^ z6^+2$L;#h9`}7TH%$~YJ7ZTxYhOVsB=2eW?4TOm;<@T>_)wlrs7-KTgTWV7EM~Lfw zzUU}cLe3sTK{?!pSue%aGNqOl{1n=|WkbI&RwkF^5}lZo*582#qbVu9aV|-FtZqjl zG2vB8EnSrr>QfuGAcdd*jKSxXd_j`>_T%3XZ^K-;*A_h1V5TYQFMcv{*R1g2LKY)l zxgK649{}RB83VHz@m?wx)rPJ4FcoegXY)rsLO8y65D45y>WEh+l}!qZv_ge~docID zSeR6jA^t17W*~ls@8}bmpD?5Boud{*SuSBI$KU#-=qGv*Lj(J~l*WWo?kc}t!Qg6) zWK|p(-_G$?Zc5Hb3t?T*p7Np4F>F75u}Q<5{h&LuU|3(=1y|^q-5oD8NH*WW9rB_- zAZ1{nh3Dv7yLM_IYJxgQNW}_EoDk zummU@dOHY8AY3aTNqW9NHb_7xXAMNva17xZdpi1;n1@W9bJ*?d?>LgB~&c^@! zAJ;oU@xjM2gb(7+KONh_0it!Z{pH|Ij@rp6IqlJtZy8`zie?@*zS#t0&>ih(HAlo; z+?}gJtvPFyX-EPrrZ6l$vqSs51EZZR9hSfocC)oO5YcrrKJxa5YW>fni{R7I3#vCP zvnW8bMr*4|BNU1C35VM0xsqMRon)$Dl`J+DcVVRdU6k)XyPNY}1X_hP8BKCKc(#jt z6fLj5s8Z_++}-0hRZZIKn$Ub~2LDt6njXl0ptFm{KHy*#b455~Z<)p$HWKZ=iipvn zD|THktI*EG(hRm+12S`aTsQfv%kr*jE@>nQ}wQWTt|L8)#(BRlE=xs^`6&5Odx< z_$!;^BNZhuiXwo!A2rU<2ZM8joUjjXlUU``9D$v}gLWPXGlR6CZnAz#*1Nmom#)|f z{G~VQzU)V02fC7%K`Mj+!Z*@kPDiJBE!S(V>577@cjj2O3N|D$?}eRQWh@FLaYatI z!fwlD;7UCW=fb55I6E;Kku$sa2L1W39=j9E%Uwd}U34Ex3{`u**Kp+sVz)r&;*InE~tk(mF z%GC#Ln&yZPhV0&AgMA^CUN5!CWd#`lkaK+r-v|^W z;(0_q7Y$-7+-26ZuxBE99iVqg?Yiyi7jITo;>z13UOAQZxKoVi1Jned$sD@P(+g;$ zt;F8WZBgJF$9LRr7QJ-}@}w=vFGMj*8v*m@-L1Ux7U9!t89h1sT9 zP<;OR<&)bjBaiP|taKCVV*+96s-VdzSyJWTE_vS;`P59srl$fv+Yt^2rHD&gEKAK+ z|LQ=@HG?$^pKW({^*_LC8WrT;Ii?qE|5NS){mcgj4w{tYVV>M^McBY{rmLNX`BQt}vGMSttd40%rv;L?i8G%nNZH zJ+=mRz*EiA1)_*{T%?kTHup=EO2K1FV#*1M|B@H{a^>P8QB`aQXo(SoIxtZLBo0H>dwwSZDJx7@0|YjT?t&wJM)DbWl%rE-JP|=US*h5oa@VXCNzw%tBQS09yamf0e(+JrI5cVnN_61>d4Aca8Whk}i<&PCx*##z~|clXL+T zAfR=r``}oak*2s#Byc@rDq8(hR{J2UbKe_!%b|ZatL}UZ%%XhCE!@T#a&Gg0boxZB zF1fJfOJyIqV-{q{v;XxfyHqq8{}0!juz{NDV|q2LVn+ipG{^x`xa#iRKi^o;7 zhgo<(EH&74M{$-UY8Yzb%50x^*Z9dt$7H_q+R>HSdP}et`CS(4;K@`IR!?I}qgn=F z!*jtyVJbmQ`|c2Iv{g_kk%N7-eCK8=(I!lJUN{1K(@(a{-*)pLKm;TjJ(k!gv>?Ia zkFYU@2`R8r$V*RxeUC@uI|3a~ zs?*2bE?sw9+qj?lqMn?#3i%-FDX#b2K^$%R5=1_zD|Xf{GAdV+NT@3WNl@vR3?p(tY zdIB8eNmQSyB+?q3FYbt50GFYjAV>0JSA%n;s{&K2fg-cV4%ZayDEnpXloO8 zuvz-Dd#zcj^Zock7~2YPVpN$1-{?@LQ>u+9q{0r+wUMEOT5Z~i_5}61AWkK8Az`5`M7 zosyJ2Pt;p`2)1i+bW1y1SLeb$GCymmlW|x!x;pz+XjwcFEtd2169zY%ekXt<)4~slOsx(Y)Ls9megbsRe>yg;s5SQ%X znkB)nq6w#UMkOCy z1&F9Nh1<;eoFGp$mj(?b*)-Zk2}7NNYL1f2#UrcHPdx;7c;JC;>YccdlZWmr_9ilb zXGj|;BDOXG1I*209adR=RC+`di&CY*9~M6rKf(Ob9Re=CGOuthhUfobUIDt17zWFr zDZ2KVPB4-db8Hr3ilx{OaCj3d9Cr$rSuVgoKp<{o;lIg~7A3oDu7&n!zJn}PDmsgW z!dZE1c$(3-gsZu=t6cAy{_vsHM=;4i;OFh}l;WAXk5vdk0biR8(w)W-tvrdc0{x- zlRqrjb~V>7Sg#78xifaTNu76FkpYfjX|S3r73) zM7^9l2vh#SaB9&>CmEALq}Uv@8tMyFnlmbm!Oju&&?pU0j10tqREGq#+H8)P>6dGx zB?hC>?>d#I`ak;8yYKv^tz6y!dt`wIjHJuw63)$y+~gs$#+I;g5TXZ~oX5?XaHbi= z*`}ruj?-X>-D^T>I|{Io)pRB=Dnw2r6GbcJJ6qCyy4XxXb`DeV;^=_MWV*zS>AJ9oAUKL%9qP>jrT)EG zu$NgG7A`B9XNWy1^*KlSzxkFLKPc@`UlXGz{&N_mNWjjxzQTQ5`%^Oev~x1hQY{?C zjy+CobQhQ(tb3WSRPJ0zZm-5lmeqka{`Imf2S)6GnmO5Q>q>GIvszqaYHDTDdg6@*kx&Vf8k8QgrGzg_AaUkE9_d`fpC zdoX_Za9HuPFid>pmuP#oH1PHZmP!5sq2RAsLxn zsR_Bz7i4+9dZ-lq8jJ%~D6J?-j7Tph?s_u+`?x)?kIVA@Irh)v7AJSCe`TZAj|w}! zt}SsbCMLl4)NL?9YI_rw^N5Ft>@H7+pJ&oLNFAxeX_p+)&f=zt#YGo!Jq;P#JA)a! z3qTtWLuLk`Y^7C;})qBBGLmgx3Hb-`!WNTjhWlcdLMx9PwSVQYNsay3!d{w5o@>3Cf+ z)S%iXu)}ia@(&1Z21(>pA1i`G{6>ah$$)e5YiHFgGrz>9OC;Vue3hUi8Oy7R*1(R` zdQjermT5(kfR01gVmj-131c+*+{v7YTKa<)NKYD0b+${7=r~tZKlM)GK{|UGuC#;w z=iA4k`O%*XBxioomshxFC#=^Vx6(UC1}%2#c0uLH_ueEq?bL}ESb1DWW^0f6 z^Da1DW5%$&z>-VfIVSy=DTi|ua#Tu)r>8NJ)^=eDbvjBXg5hb08JS8M ztsya+3fBe+%Z4qvfYB)}mYvsHXEr~fy-)!0sJ<#clR6VH34Ls^pztie*A5qQxlr4at}ikI>R#Mmh+*SVzqo01lXU27cF;8q(+MIKF#M@9!w(eUvO)9P$IF;8nM*iiXP1Y0gDZJbjM zy@I{zB!K>(S$MsMEJE!Rx8ETPWEQ;cd2%~EZtMhC@ksnrkgese^&O5&Unx`q;hZoH z0MLCU&_V%d2>1+2Scs2Qk&xuo!d=rL%ox*SE^xM4Ox1A(K5 z=b6O(yOb$FJvU#vQR*CXCUTt?m6ifPnaoG5z2s>ByB#?nX?~+`Tma3MwL#yNuO2ST z{a_tJE}1B9In#r<(j&PmBKn`}CV_30nU>R$Ob50{Pxs5G07ECO~ zNDk#h1tWZs=X+?T5&!KccfBOY+Apc zd~211g+3X=DfuZWN{NYh=70^=aubz47u7EIT78`(a;27k=1N)>CK1JPHOX;oiQ`a) zdu^Eeq(Auci6zN6FF2y33PYH&QPukGg{*3RX>vJiBIo-E{8!Fd9`4)kRXL1YVhNu_ zUHVhI4jbDim>Va8CmKt4NJkESNbFOH$zU7jR#t(oiz7ztn>V# zy1RyMN$HNEQ(8KtTN>%^?rsn%LApDoq@w>B=j~O)LNCIL9vF@7X*?D_jc>Bj| z=G#0ts98BEC-c8)Ev)*aB-@UHO3RGw)!{BsggWL(4B?jPavh?-=A2H1QBid zMUn-FLhbnGEG#806ucIc9SIEc^TO?U(1%1?)^RU}Z>TIer&+X}O*C8)s!8kUCNmuq zVtW&!SwXO2?qBFreEEc1y${BpE;Hpi-GzVsr7ldJ9)-Gv%x0gpY!G2H)X zo3>%Oc;^LVzOGS6mdhgK@ir8+C$FMle_*!!PTj_`dA+e2#Gs^JhtR3x_Hbv z2}8SpasPp%76G&UlIc3&)*<3tX_mxDi{%?z32cK@F%qn$CsPkz-wB_cB#MsIY?hdq zoC_&MS9oK(UZmcD4UJ>~A)$9>l~*Lf*h`5Q_LAh84Cb!tDXy;(&E`|a$(=kA=O1_^ zGL%f$4U{EMc23VaziisKb#NDJyH7?_tiMpmacaZf@o8n9;tzT)6upZN*Y(W@g-9Kp zv~&Q79~R3VEA|GyiYcqb$^AXn?v&YO#>q}n$3l^Ur4fCrfS_&~g|!@2_n&$E)Qh=dW|ef$|HN>?oJf*DqUL%%89FE{q}^Q%fh zC%xbt;O(Ga!9-=Ei!H?6&U;#7;KaX|b!n za($2B^e=Xd+L!!({h2olINHbn61mMahI1q7H=4<<QHG6{*NgQysqANpps7puInGeH37m}`6}mADSAr_V3S|(&Y+VqYA0+C-RQa1IQ?24IEiI!PM!Obze zGfMUG=C!L2?(3QK1^|v?L$kA;S>m~B(_C#^l!5bq&%F#0LMNF2?Qqz@_+K99fHkT4 zeid~}(wBY|C13f#n$0R^E8a5S9!9)~Vxk5g0jB`RmYk^!CQSfv1^ZzO^?6q2nhrP~ zD~U9Xi5Jn`gGm{25KBi>KYgzPP&(!S z9|zOTAZ@)S!u=81i~hpiV;d9!FsYBOfo!_Vr|}yVd%5u|SK@w4g+BUyF2wNo9QGo7 z>|ly0xY>p;fmN<}cvH(00B$BHTo!vTJ1e#QTyvp%Zy&q~C|lf;zG}mEqOF1*PW&l) zWM2z!_t(xE?{Jw zX~SHX@^3lyqpMssm_o~}hXe7kx+Xto#EcOx)5PtZiC0S9;RXTm*OJKSoL9IX`-&H> zXQcHsJPWo?rKptK0pGg=4I;5kj9X3mknoW@?1ENJm?x#ZYkk?{~q2(}MzgBo3EbObct*btn2}t7sJb;*9>V~A=Bq5((?~2OlC}V zBy&V!83+n|cLyE=={=rxd@s&5XD47(RL%3|k$Fu14{JW}dxi*9rbCQs|L~<&NlI!>^X14`^rBQR{j&x<)aLO=xd!YeF^$o+1z=@c>C#o2K`h%vmF8& zlJY*20`KG!oi1_9lcLMKah>~Y-L-bP_&9?qhsm1xCh4cxmR>Pb8^3hv*;}{eRyNV8 zFcwYA#AYB%r}~$Xsg#Q$@Jz$9w?^v^JbNXcxB1}nFj;x=Ydo7_dU4~fM+si+25E2+ zRge9J5j%7Aae&bVL0TH0(Ys()gfH$kxy^$!mueg+69GaD{<3P=_0ok#x`E6JS{vOR zoe|bBJw@r<;Bj*1bL4<%mfZ9v_h5|Iu_GyKAIxCj-?VIE3|gZE)oqF5P4l}NOIws} z^L_MKEEcJGm4##DoB!QQ?BJ6b*0Rml5wO{Bh+1Q+KGJ@UTH295M1 zzPL&LM;^v&5Dek@_XL;29?i6BV z2-z9-Cfe*z94I4&coR#{d?oUwuVZPMOpm5E5c zCIqs;WcdqCL6o6{N;GIjHL*hMI)Jz}bb&XZ}&^TRr=2c>$66yUoenruB4s8rC@U4;qw$91n10#%dX6)UJSri7P zKj*GmUiDAe6(?9hTf}a8YsK-eIA|Jwiz{i+CFICMI>NO@f0x+)S5&8K#CN+WD%&KJ z(}xyOv|jP~^bwP_sC)6D@%^ar$psjLnvIFB8zhyAkaox~fV|&j3Uwb?PwM-3y6<-f z==A2~`c?!0%3#&IO*J3agvHu*YZn?8jdXXPnS8vm*uNo+t2^VBOqTnv z$P{}vaiGhHPyRzLEr`IVBBNG3PNhUl4JF#Os-2r{g;jT#d18O2vS6R)Q04BK^b3t9_4ve8YE2VvF0?vu|)G z4?|89r$Vg~!8hHD2~z-%it--)NH9#R<{OSh0j0{tsbCEDSL(sT&Nsr!$Iy%>b6mwkPy{l0Ni%}>v4x#(}vsw8)Ll0(rmky># z2D=0dXyrrN;IMG8^AkIA#SD)GM!}dF{?Y^m^kKt~H=~U+$<(C}au?_fp&^GE5Q;Pp z6=*se1C8PFWAZaL#o3$qfoi;DyWXpWApDIL{hl<;?rf}lWQDh=+K5$oPq%7tn?WO^ z!P|=f%CP-)+45b6j($9ho)To=4>2Oj^A{P%QFJsf;er`zIY5wDv z2%l-k0iwA6KLe#&nh=@mshdeNq*s<#FI#5u=`6q&>|x+feud*@D$z%^vA2qXW>G1q zq5Zl{H7`QaQg2-LK*#<#3jh)3Ts;nIv&0omfCUkXK)o4B?h~6V^W-xow$#q@@Nad= zvk7psGM%F`GTvmR5s}{85?KyM1NLLPx@wkcx5x&Q-ZduaHK5H8aE0A7L;1TzQP1TU z%AelJK<~oC)~ZH)0*XEy6kLBvmFrGO7)f zE4=F&|QDwa=v zSPFM=Qw+GDhOMa0$9Q~chlXq9jS%uf@3v0iV#uqOMLCgc1XzwX?!LH(hQ(o3p?v$H zXE-sc?-7Q<2b}?C+KptRmSS`Ek4j8sH~Vhb?chIo-WGL$ z2B2S1u)lgGo@5gb{w!9u4BIRAb3X>-q4qxE3l%y$Oc*&X*EB+W(zJ*K#J6kdyPwRvH?OqTZvsJC6w^{nX{(cEz(MSLhk? zd~r4Z_$NGeNQ;!XlEn0Q6Dx5SZ_1{p*-MOJ?9i!BKbYXBd<^x11<27Qx;}s)g_jRR zliqD-CCi$%V39ouO!JLCIZn zy;3GV@~@0_ZT(*B&c?K5s%wt9O(~pBzwvrZskq#LamAp&P3kH*;V^XF4xYpKf`~u2UDB3H(6t3nBEK=s6}PFgKYp$4Z|;xJk5agh zJ$Or!O;Wi}i4pfq&qvYU$Zi}4axTImPy{f(=tYK@fFKkM5=cIs=W}hor=28=;Pt;+ zhSa3D2vj;)@WqH7AsriK@o&lMWtmuNc!`2XN_S&;G5OrLC}H~}T)LVbY(A-4NJM0A ziH)MY$I6<2;R|L=hRpj`3OuMZ!~cz7(3oZKAxw*PCyF-gpOijG5vRg6Z8l#8TV){w zmY9tUgTi>3gN2~$s6~HAIIY_O;1DN@8sUmy_m{lKoNGd^4Ix69Me&d5R*guQ@|>l+ z>mb{k87Vt6<`qu9ihPWi-cHVR4vrTxDukv}n;TE>ju1kHCWx%J*tQFVa)dJ0jg8-* z(CU%fc^Sj?iXudZx1?SuX5)G#d~;;)G}Br4;QFPsHvu1HVJv9taG`dEdGDNq=cLm= z{}QSyP;r(Mvt?=Sb#Rf$dJ&zpEsX=MBkWXCqFA{{{#60nexfRR*7&%h!Ow4Gk6bgl z^D`dZE&rT_eu+UI-Itug=MUQgk_U8LSr5BQeY1}4n9f%95OnZar6(caSZab0I$^u- z-H;_wG%|yD7uzY-R4b5Y!n;}oFrl+9g($M^81i3AHFT%~WjW0I=8E@b9U-i)4=b|2 z5uNzg?RblGxhp9UCF~b#jcJ=19kC!*!LZMw_nN4*A9ls4VPq%*FfpVd+s~4t(ryAb z6L>iE&?!tL)rSTKBC)T$#|?$h2X8dt^cF+fI?V?xC(8raNcJ8 zu4X`{0QUW8?v^ZXA<}d!7Rf?0f=I?{btyH%_(Xoj^3U}ia~A1+go23Hro~3O7O+8J z0S5geoJ97c5psSOt!%015MF#S^w#wQ`YngKo&K9P&dY;hsVBis8JH`X^>1rWH&gX? zR&=t9C{srKMeqWq{1#=hAzk-DcD9~G#YaQ zV86F&?L2PvTyB0vx=S}J8r%Ifc=U%waUK`;*19uf9&umsiA z^8PE@Q3jImbkwl;H!!v>NlE;4KjYrNG%{olMrwvN!I;B*9T8H%V6Tg7ZvvEl zLEilxQRk&O-dkt4xsv5HlM6a3>V)U6AUR9yu5Sl}fzX@_9B6Ow| zA!RiVqj}uo`s<;TLiV^B1s%tavN@FbG!D-dRMtWwcFf{iiBopsJ=YB#i!N#vLF>Xo zku-cwF4@w~(|1e-M^(@ZUZGeQ6mY|}t$`Ia zm`fCTDutN*YVMfn*b{5A<@-TNfC-9iy>=D1?XfU6Kv&bnLbKiP)#yD);?NI+KRiOE z>{pu$EOH}tR5xRo5TPXE!cDgo72O>c6Yok%F%C z1WQtExVMAJ9@^73F+sdY8iI|WH)jc^Vx)sQ%gbQcu#V$UadC<<7gUuMjqJ}hTDP3{ zH5f%#9e&@L3LRR~g2caXpSi7eI-Y+=8zHaY`0&rQNd$%n47r>k`8)o9h=sXiNH2fi zX3rJ}<3{o*Y(7WPNh=p`41Oe4_8O3CIbvyF*AiFrTEFG|if+eCtc zR7Ri%m89_-AdXdKNE?{EYjpRNK6wvF=vItX)H9c$R*J8|iYrgCsMgqLm8hzwShxr7 zKnRZ;px2Rgi%%RShC=wyNE|iF*lQwx>AM`@nB^DlLP?|Z=IQhE;lveD1UnV)D<4C@JRIvtlhyt;Q$Snoq7 zdb>skv6a=~qR%6FIqm;4gAB9Qbf=3TZdn_>ljjBELyAJGQ*;>2t%OGIW`teu5jBKqZguYW!n7r^azQT)pl&$<#w z6?CQ02lMAMfv~PBTfJzR#D!2!omN;VC? zed{fgVJ@g|Hpcv17?QIy=fHxDqEjwh(Vv|u{CVS(Mjci?kt{#>R=_x#G;3)|5ATf( zeRKo|%?~V&s{VV}Sttnlc{M4`^jqpQ%Ma03M-lx{08<{3jMHxyBl@!ln(zgyhN9;= zPR38@vqtppEkbRXBUNUHl_Vjgy|!6uZ&f|{8pc+(N|bfArUnyt`CgZP?v^XsdLQv! zFfYB@+1y8JeUZ#1b^&*FEPPUpV!UhGAjHo)`Izyqzw`{O&=iZQQL|)!{S2E(Jh1zM z2R%A))WvLB((!G}>Gd~)Fla!-Ncfix%G1%#$58sOWlKr#JSQn_x?Q01RY5P9viB+~ z8;*XJZc6*RW=J*Ghpo?Nr5KY>Znk^Z@;Kei-Hr_@hs3X|&p9xm{sny^N6!cR({_mP zx%3s;Lnyj-ku?4EEopYur*M?NpemA@j$A`_27YFTgO%pcKb|9EccewwW#@wA{@VNn zca|R-r4_CU*%s?W^ty2-;z%9qS0Xc-1r&Qk(i#omCCf?T2uq)Q-;qdqZm$X607Wa9 zJ+!Em5aR&>`RVN#opU#vQ~e=cYG^1&$GBHlG@wVm3o*G$^$VguGDzo2ZLY3;Fuw}U zDi+D*O0_?WzcLetp}Lp+JP0u$zJRMR2Z&p*Hp;8r;!&c<9QEKcfM&g|&GJ8-w;=!A zK1>vfRruXeJ2eA*Z}d6xl^MEDu_&z0GG4Y;urgKpl>?NUq1cQh0O#ha@Fv>-eu++_oq;FL713axlT|v=POzedEE&txppW-bM^Y6{PUal($ZS z@0(noiFz*qnWw( zcYVU2mLA9kmHnSh{%*y1E>o7C%am(e<3Q6nwIDzhk`P26`gLWo~kcW|n zxLYB4096XRLtmOhw(ClHgC}%*52;#Bs|I6p#q`%l0I}ohX;zmLCU2#b2M$Jcp#y7k zRBI%C{dmyaW}D9NT3QopvtePUbwj(B-TzLsjQSb5mp5o>JbzY(1VeDASM>gCjK>SO z?CNIOcUDFjwa1#6aO?W`*u)Ya*Tcc~9=#)GULu$qdtDvl29KLu?UA?GDGp`ZkUAi3{C=}pHXg-JZ_ z5s$)9244I~xMjJ4zsvzM_FP0M-Roe z@URhX>xH@&T!|($Om`qO^9uGrIceYCp?KSqq9uc+p}5hEuXF?1t`e806G8hB75H3E zHf^|zW%pG3h=D8iwUDxE;85rDGFP%+x*v}R0m)31 z@>}`)Zb#~DrBI*UXNz41l!{Xo5 zp#{ktQS=^sI`v!)0Y+g9Iop@MZ}@BgRJiFbX^*caICxnfjt&XAt`Z|9KQIZjn zIkKWO7UPrYqaJj;Q!e`zMZZiMg&L%W1>VnPu#L&=5`K+tyz!~}^aVmtJmf7#fS18z zmN(5gH@5Nyxr4-?VbL;aGQQDZ`fY7l8te;;M&0x$d%Jqm^EYbU-mFd@VeWd8}_3OgN2gLtquLPpHG)l{xzo!e8e}^`OUWhsASq%BM3jpCt7m}mi z;?JcL7Y>f_H9c~7-mvTnJ)s&vN_!x&&5wvwla_HuHI|)5X=ui4G42DM?A4I!0XM7q z{k?bJdL6btXrD#sR#oUc7h$OA_s$RLD(BWAW5 zadk(*ZMxlwB=;5N7n1+}5v_k0(say$Pd{MCtcYD0__K**bnYVV)#sB4EoBK#tUejR z>R^VKW}oCgX_Eq$^1+2`%V=+7UB) zOJ_~iG~e_hHk^$|p)E9McDEQ+wu+^01|sbvT0PVB9Wno3>;w6aL#S7$i*J6^&lumI z6-&gp?Ycgq4A#L_QKm4%sOB(a>ngIw9CY=e5^YN%?M<4?bMwZZj~dE6lWL&$D2(** zMF2A-X!B!4iI%wW+D7pf20h|ablaG$vqt<7lJ_POf+-HOc$ZZ7(4*gXd(=nFgDBO0 zs$RcuMP=S~PpBMAadd!8Os%m_!WP-#QLvsW)kgH>;ca0t#3#?{Cik_01nHkShX_nT z9V%qqPy)P>!MR&Baqoi7Jd^L9R#Ei;1Q=x(ZqQ)B z1_OcvYepX7jqgpWa4v$4)kd5a*WZ)_B-#Dm_^l2u-V-)oY%y|&Rb`MK`NZPZA#-e(EM6K;(gQ(IVrLb5vnj^ z!1|Unh(+FqlTYxs;1XVBOX^>crBeR*+?2E)tCU=QVNvJuj9%{`){=2HVSIa&{fwwRP~;}XDD?e=@abM zn?eyEXGjMIL}qvzs;mu1R`fo3F;Vzdf8sG&Y@2~nC^X(rW{7zY4Nkc+mF-3_V3%{k zb3u2%(O2suuN`pCDsYXGPgnbgc}dqb^WiOJ;r2F&^^?!=Sgd^X%UERdfCfI$%|Gee zbNFF{Jc%8$Iq7dd1Tm>DaB9;^b~N?&O^<$Di(WVTv|f2{Pno!wcu^%?Vscm_96qi< z+wLC?g$T?mInW7Td=MwI>W2qu#||-9(s*v(*LJih5YV$&UOoL(yo5rx&}(n&!1}!{Cqj;cg)Vy zmKIj=70X+^$BgKVt%pYIJ8dX%87uD1MAhF;csYCNkGs3M{~T$91gH=WF31Y`9ffj> zB;D7*vnn}IG!(e=RsG;RW+Hrwx_Ftc#PW<}SW_;XnQtEuuiUUXUc>@HtuE^D$Kku; zEiQ^Zw1B8Is0^0VR| zcIu%apgEb$A4kl~wreT=7qV_8A#+5*nRY)StOqSs#kfSn!bIY3C51m!cbaVQ0F#6O z!SoWEKHsf9D$^Kqc!&hsbqzpT-#jUvC217j+$8zE7x#!(BBVR<`#e(@C2}5_pa$7B znnLO5L28I$@lIelXC_s4-&%@?0{yd#;LRRcOM%FDGyfm3vU(mE*0C2&`8_ZUu>tTz z6)Tpe&f%7|4W4)Bh+?zENBi9C?tm`2*RF@`Ew*(uP!Ej#!%EZ`0Z?7-tete-T2E&q z!DXrBLk*kj5h}?a6#TBXYQWU1P5K_PL*{ZmPJ|`D7-BMFRH; zq$W6hwk4Z>H6Ej6FS}T|t}1ba@aeQSx7&0;MWeHC+SKy6mW`Bo_+wSZ>LBK0oItO;A;PP|;*qTS~kOpU#k5q>qFahH4gC{hc%YS7{Zz zYEGQ&9aV098nkYMkV);s{4^&OC5Da6zrh$Q90a>9A;zH=;V|~ z0aa5v|KheEIR&Z%l?>3NQ*Snnl2d`!#KASF_wkGoYJ zAzqM2`lv*yaQveZp(6brzV3{R^R6nwB^c3})a>*zJ zdf$3m8(5$!;($jfjj7PZ#T^tkHNHGUL1)Oy7)T&;QG|k9m~WJNr%H_`yNDlN#wvs@l^xOIsKJ|^Y zQI5Z+0pf;{6~GDmL_$d#;U{@Pq6jbjXoETW>ZVe?c3g;@;5DZ3(bGMKNfgk z*4`H~;)Y9p_Oz2*;;B<7cvy@oU)W$Go%55~Bzs^dkAq54en83-)O%b;SUd$W)Y>%S6J|tVX3foC zN5TZsLid3;gn{U%(#mS4J&Qw?Uro^W!Z}MuDBS1N_klrS=BG0$gSQ@goe{{$FXWlt zP8mhz_44R*J(jg<<=jn?`FsJ3*PpXP-#Jp)M2X#ZgWBH8EMv0l|A-c&A~s^j|p zt5%qx14R*L1v6&&H97gHP?PIX?)UqTa6UwwEgoS`c6!8l;;h;Tg9-m`c8C~M~i z>!4y-4MTZikji~vv`gB;#t`jwU)>`kYteqe&(^&*)d?Z^Kex`Br zh&?Q)uq1|gnXlRkm`%A*A)Qg)XZ;A~--Lk$D&)2L#nPLI;YNPnC*ARwZ@ERaSa~%g z>6Q4nmlwTVnFNi0qVn-C_lL9eibGkqaaTxxm+ZqJ4lZ1i!{_!=X?1tEYN~xzJAt~# zq)2ZRgYZ!(#{3i4NW#BHt_Tj+-idGTN+@r)Bke!6!yQYydbU}|V8A+cB zrPJ4#qWQwud})J5-lmZXwU+jr5IP*7C&%3OoK)aLM}Ag>M1m?Tt>fP+D6U+Ql7xhf z`+RNl`5vyu!+Ni16|_V@RTI$V2kEn0g)vmuE@{7dbyq>zGZ1{)cr~2d^EZeb08+JD z7QlA6sENAWmn7F~+kt4Dq(O=C?#pd>B=O17~GLO7-ix}UFc>LJ&KEk{?g=BPkl&ogWC z)$PwnKEaEAI{tcrHj`MnnZ!kQ5u5fH3nU#ionIf$(*dOK&g1?pPZ9wFe@%D( zu(VSTk9q0N6CPt28P7l>?anl8f&Am}o=tGCA32{uyTIUVY4NNYnm(=?cBZ-1&>HI^ir4Wigsh($n}T@v1bZW=m?MiiaJY6h313 znfop<&M|0?!cI(dsls5jfscu!z0~9(i@wWJQGd5>8kztN^^TuDH{{c2TYVL?OU{|k z?h{llpIW$^5PTy>C4i5f8JGW&=(=C8NppXoX*D3}7{emoASy0s*S!BO(RI*^=X@Lw z!NK@JlIB;??@B5bLb;d-<~}R$yu{s#nB-JUmG>~%7lLI5^na9Pi)HHLUCnt@p?)kuhFZ0#IR$7Ipt}EX1F|OEFTlPKsy3r^t1sG&%@q zNqDjdy9#=p*~3GcOh`aeWL1|=<4~GZ2275vu^Gr_Vs`xz#^l2tdb8NX(u_R*kaut@ z*gwK&^G+ijAPw>c!1aH?m|9#$SJ$^*hqKg_Y{WmZ7vFC=Vl6m?kkAUUi!T_BkyA7f zpl3?-yYTbYktM$w-%bGM!T>pberiH?JUg{HeL=u6ExX#9Q-Ifol62nNXTyZ7XClvH z+Ol84Id<;ePt}SHEW?9C^kp^0`Dc^}LR5+2N>fW+5zCr`ocziy0bvJ_$Y0Y-Ke`^f zP{GH&2qV#JeJF~__8f`+ zWWyVPMfu2p>|8B<{m)Rby zE&R-dU_zus1j&lrp8aZx9|$)Pw)vTRURfFp+xDmoVO66UmP|pP&`2mnaE+12#dKFG zgxhcAeshJ19O&5kT|Gi7!9AjL*@|LaS2Lr{twd}xcjH+c|JjZz=>qa8rlPfI90oVh zz`ZUPBl`)*FF|jt>{6gq+cRJmn4o}JM3esZ{AQGv6aVA zygYq1R_(UgjIjdq5;o^PcKLJwU>KrSZHy6*2a&`CgIE{i^W|lb1<&z{v@ZAQnanmOQ^&?M(MR#WBDe9NxbpDk@%LN@pT zEFEu2slbnFauRH8z@xi;a6QA{DD5hHImwGrq(mNht4d%H7??1;^`Njow#qRgsLzxt zwdF5vZW&oW!3|LW`M}iNLm?aR0vjN>M?BU= z_ZQWP_`etrl&7Oq1CPci61xVlY98aw2=KkI;`u$!;pKbl&TP9V?I@sWF~aGj8oM)_ zG-Vs42vd(l%rYj3cQWqHJeLqp(6&S{hzO$UzcsZ(;IW^ zO6}rJaJs2@+bagngavrnw<{t86t!CGE%4}=cPJ8KqyeyVxML@bd?x*NWgry|*}6H6 zz7b+Wf>!-*WCo<(!1o;i>}@#TFKB(=U5xXxarW_c6K1_==s=1{ZdeUqg4h#^v}44< z!o!=CTZo6cUUIOe9WrHNMpe{_6DEe7^?_Agdweh(aQj2OxV{qc{oB9Tk>z*o(&HAW zzs>U{L!>i`Xb%;+h)a(zr^!eo-{^CfPV(l7=oSgaZRvUO`KttSe@~DyTbAJ&jde>Q zY;R%%&wZTst$=P%^;!V)rIxa)$+j^;{Nn%KKu$_mW9Qm_bH4=xj`d#m$|$Nk*0Cnd zp4fL|3T3dzfd72HlOexNulHM)W5=3Rs>g5mrDKvj{5c}c;3Q?d;Il}c(*Wcwq!;{n z_=E))TQfOO5TjPZ7hoFkgquK+0%OSr+@9e|5EWB6iW|Ty0y($#+2q-u zg&YJA@5{Y2*ru^uZ9kat@hAGLCNl0>2>%w5yvzhGA!!-L`NB3}MtbE|KflI_*UNRp zQyQXlSH|qBL#pCQiwQ5Ai9mqM!ZRgKM4VtGZEdiP3qcv@ibQ9UIy*nfqIWii#GL1` zW$b>Fi|=TE$eaCC5%3iX;*Iofjut%~Epc(a5cq3^W69}VavwZ~v5O%)gSvbO<=Td_gpi3xb1~6f;Tk}}+b}J+@31n1| z;V)3uA5Nj;TviCJ?gfL|TT5$`!t#{RSs2I-L?1qH)C#?Aujy_r71AoLs1r(N0#WNt zoVipf-;Va2I#5RhWFHDv-iG|AG3vPCLA!GEKu87Ya!c z294HFa)B|&gDau5E{6gT9P4egsy+~9DNNTAGyjrULY?qTpu>bR`ZqPxC63V6a+>f) z@q@lQ$w?qApeiWNsJpTUa^g4dT9iq5lxUSbuQSot{& z87gb{4W_zOYUXN2dbCD4QauTHMz?ZXQK9j%ivF=4T-aR>t8{GS^=WjB=4N3Bs)96P zKH0xtab66tj084)=yBHzGkRM(@wBKAcCG4)s!o;)OV*gg)&qYAqt!-|l7$!G(y z$h|$AV1SDCjZDwmurOJo1;auH`!9M75!Bb8^f8hbp4chqXjt|5J|uZ`TJ*6gwfLWo zY6*%>+%NWQqCM_;;k=nRx+d;;=<}6XM}^Qi0yxhXCNBdB`l@D5HHDgA_f6Uw6dbz9o6D=8czAbGyrqhKmXA&}S;SF)+pv@|ot8Spzv<=1Tg~o@y zF+uHsPqYPSZ3;s;IKvm8Y8f5ed18NNB2nv^-tP@k51sty9)JQ3U@N=Kx1~30)9;fY zMdu5n{{pFN;EGfNH7q}Mg#`}%up+6i{e@CMPcGea?XN8>8B*_zgWSq>kdfVJlcXTg z6F;@wH3bI6=CCgD>g(&?*VJN9(bj2Rh2bMKaha`T4JhfVL?kOk#RxweH29ZN$EiTX ze#vhATRGo|ZB-omR4ZJIi*TrOMK8bmP$^jT+7zKg$n%qqr@3<)mtge9+j@@je*-HB zXv7YhV=e$;cz)Vfi>LPs5GCqUdA{0#84D^sOWmRY+AXSrqK6c?>69vUb+kuL-nEeu zF#l8qH2K&a+!Cp%kp@Ce5*I<5ji)RpvYi;q-{v(&GtLB>AifFzq?cAG$SxO)&Tkky zibNPs=jp1BQ!~?^Z8+>(khq+>t(e1Ep~D6$(nH~Tk{?1rOL^yIk# zb_xMyVFNV)wNqjnKZDc}g$)zD8wNy!Q$u_iHJc!@&n8uv*Sh;kUfv3&ho?cM$VbvDN(6p|vN3)|kMM7}sc|gKA zLwb(AH9~;OdDkL0`y$@-V`YrSuj;M|;ZHtaaIj=O4b)QcTin2CN@-{%ZI2*?Ocv`!zteOuf1Gq}lPT z5c6*ZA|vxa+Nob;UNuIP%|te+#Wi=ubXVZKj~%b;`zY3hh*}V)?}0ix?tO3Gd12iP z5Qj_$I2aC+HXf$g*8DsgT=s^48IV#l?{RccYU>V9O!6IooN8`V_=~sh!uOW!snI~N z^LlWT^uOtyydB^W#30Qop?0TWZbb%1A&E$^ydkBEtS`BzJv?42U&sdw){0|5Wqv?? z^X@aqBNo$Ac*&4i88PkUiy-M{pwyZ6So(UF>03yT7sd^Zj7PInh=A~(nQ5yx8bJCy z|2VkSZ~uH{x-u}NNd$>)&s9ItP;^GTpf%`_y_mjGWs?Ic=O5Z^^BmnR-G?I$TIA6NC)W7ZW|Tv{P?WzgFcrD@$N@kla@m zYY$k`jxFaJlVinT(}Ma|l98Z=2Ok@K9ft^OHJ6WzpjF+fopsEmr-h4k!MiXhj6r=7 z^9EaU;Hy&=J~N!$d}=^^zHCIiP9^22JOn{d0|*Oc8X>D>Mj{VIJ1;2ivux3+S%tni zra~%Xp}ve4VM+7x;a=EI+XBN7Lo7%+*fbYT{=?Ijeg9a@v`c?%+-s8C@S{6Hq3Y8D zbM=&OCFpdk5_|vh>U`Y#WX-+va=~lkKcFO?7lLq!@|NOx6mc6+*UqO8qdiMJucG?X zpHZ)wWa~RdlT~NPtZKV^G;_h z81Ytx-`9IRhvoeEOTOT6JC#K~B_xzX6os28vLpPt6-ePt3ejrkbpQ|V9xLYw7q6nW zc;HnoNXK3+kx=TayR_kPUtGV38R!B&zNMvdWe~^FJ zg38b3qE@u@UwSQ^bm2DjAb;M+$8g993l|LRkM6WxUR!oj50u>p;r~a}TQF4BbzQ@N zN2I&E8>B(HQ&PH9K)O2)-6192-3`)>Al)V1A>Hw9F7N04e!)I0)|xTq7-M#=JTdR? zYbz@7auuQXZgDjuj!399GVB)UNBV@qL~M|ncl}>wp6vs3<$C-XGq03-w=@q2(-lXd z&;E5o23ffvZnXJ!e_(Y`?K6kfy8pXRD7R#DSfQ_ip1O!_bhv8F(X!=o7ED4q{6YSi zJ*@oLvG0$*X+q0#6@7IeH=<}}`!oIZ3*x9+fGNP}3y2yZ1D@v$1fW; zO*MAxi{f^RHr_o)izFW3;6TVzD;E3q!8q1ekA1x%ES>VUdb)Jp$GG6qfo4@!QfDvNk&jJScu5`0)Z$`BW{-gN?y`I_Jtj|j~cM-fO2TS zS(%ySw3qMMl!EJ^>o_0sx}Ekx7sRW@FPZGq?P1VM`dW`h0c4K(-`Bj<)O<&eDP`V`dJ+Ci&9r3 zH8Ybb3c=LsP(3`M!QqdZ#V6YTrvm1XUau?ZJNot4Z81MBnyx|ghXHaqfxVk#Kg*0@ z%sJ7K(JveKWeB78272wC!K@R*>n{TFLK-kCVlwG3bHDVMwp2PHZTZTjX{%Jf(eyi; zZre+a)V$uccCz9oY1I({nQB&?B*W&a9$T9Hev0Ty_~ZJn=ZDjt6A!1Gj?mmd>&oTe zFw?V^ppFN)YMtmYtihM7nAb-U=LRZSQ7B6ZArJ6*J^gp(5~9zlncbNu4-LoYM8x() z-h=FOwRad)^IOUzzl`ilNP-^>+6X+J+Rw4yvg2EG;te{jSy^Pi5U)@kp5!I(S;XV6 zo#mh+<$n)3RS#Ft8u!vb?63bZl9Xiusv;mi!)&E>wQksy66%W(JI}x~}NE1X4bqTXmV)Z8hl2<2QzJ@gBpr10OG0ev8qNx2 zio~Y(*^N|1#(oUO839*bpx={JX2(hmt4K~yos5w_3(#-^12GL_sGSPN$v_PL4$hDq z5idg2fMph9R5JSNi6$>LQ zgb|#rQt*g5teOW%B3i4?l}RVmN!_*t&j+4bytdeVn{xcS#{3ruybI33To|Nq$h4_uOp~=OY+p*h+|FEa>;G z>xC`((bgLwv@&c%`Kxeu(G!>9Nu8(cTe@F zAm^5`=f%HIaC>e?eQB-#+$RqUT>~x#-I=Hny_EhLh1BM7AtHy1NizMEy4vH>E$UO8?{+w>3AmrTkU` zVPhK;uA!%MT=k4C)s!n1hEB~S&y(_H@Z=lpNfe(p1$YRntFQ zYnhPDB%g0Tr_Fn@ZJx|KwX3FNl{a0K48CmGGWZ#M)7?@yhClKm-ALd(U% zZ75EBs!S9mx%D#%arWy_FRUmOT|p}ARGT&XEEHbPa2S!Vh(7O%>79#$y;h@KwxB^a zb2&MYk0fbKKSO2dt8no{(melp1uU3AQTM?%^ZbNG4ZEh9=SL9zQ#X`)gEH5Sh@OYhAihJU(|(1cC87(K z!B_eP452pGz=AcK(S6Ln1PomZh8`NW1@Lz5$E3>-w7l_6IC&p zJ*Vx?i4y`Gbzd*iUT>KQRVD3PJYc++HI>M!sa97lYUhnDO*DkecM{?r!Y8}U8Pv6o z1uwrpx8dn_{k_Q;r?Arpd3gHLpSFe}X)L;oC=!cp_Zl7#C4I|Y=}^ms)?}x{W$#n9 zYs0yt{Tv0rg0|A^lY{JIA7>^CuJQlxJ=5WYXA49{I&h!NW2E zej?9${F(0vrX^uCL@AYhg}WFxt@QoYU$A`OvClm)dc2@%_2F}vbjNuYXBOKd1itYz zXRJ$}odbfiE-DnEDBN}{B4Pf4s;-nxch^H3|@RPl+fhUK=?z}+_5 zl%S?6xkWAZwy(B)zC?!bFrWaB9l%gz+$AL zz^ENnvM9Bsy*S@z7UvzDzz^Bx4|kr%GoFTp%>EYIM1(w9#01A+(JkCR@H4yaI`Qp= zBzp1F1M)yrx1s`Lcii(b+Gm)@^l$3gQTjJEV2byl7Y|>s_r>u~IJ#_*>nJF(FAu@! zEgLOzkY_HOSI2dEqf{$#oALpR9k9>%KG^mU1YU`AqjsRmZ-+U){dAJ z`C^3H-ipqd{l_Siqhe;K82uBlIzdj*7k9fpX?P9iMDt)kB;ppbr})JUq41ZmCfq>n zNXnBBsec?Y=LS4lF+CJoWiW3dObl)T(z?;ad(ncZU;}M_NScq71cU}Z#GyNiLJceyGmukK-6UybR0}4Wp5vCAco1+=N#& zSn!yG)&2u(p=@m@0+N@9wF*DUAuMNn&YImaK{a84tT4s9P=GwoHl~5HXGG|4HSKg` z%Yd75G^*rNVNtnJ@-o$*bL#c++>p)K?V zNw@#_Rr}y}`Z4@5^HPt=qzv> z#oac{L7Mhli;s#YA2J3j#2pyY&NQLXlEenZ`mQpM^Wgz6eddpHj!%=p@9WOz0N(%y zi2rv_IY9Yc&s`-OE~eLBjp}OiW?8GDbssQ~6-a+pqua)7EafZFSlCWCe>=xWzmMK> zB%;s&9bdI!tz<$BZ9TG z@lGUN$Xyg^G_u!6)hPASIR^H@kbqHotRZUJBG>#Xq!W5uvO>A=jg4A(C$Aa?YOO~^uAvu_bwAw+= ze9^m2`u)92&P?y!`}Dqh+o;5$1m&>k;`kbyVdnCSI=_e^clG9~QX&13WQTIq7TSGx zlz%P5ESlR!&{|l%t1}hWQe92{o|sWw^Hzjt;v=MF_@LqN%tNmCmW@fyen&4a~~FwJ`-*EDa6qlr*qkJUA+_gqUT(%Llf*%)3U$4 zXKOY+JL`T^hzdKQu^3u6#sWkNFFHueVuaT86S-)21o6VA60w;tQiuf&0?-@VN-MGC zWW9}em?~;K!dZl#x2lQIF~!fzl|ycB*v$OOeTG$;dr{%1FK- z0iprhE3)fDZA%CO~HgYXoY|BDD1Mw%fE3`_qo@TT0> zSbzL0@{8>v`E{`B<0_j<2Pv453J4Ea3J}P^UT8&KP!g|DyQ{xcf)iKoo`#mvkmf8RS_PqmlsQGti?4|)cw=bXmfRE3sf&@xNA$h zpNIaOQ+nt>XiZf?E&pex0q`BTQ2(mM4Pgf&DHyH#!bC@`%9L(r#IXyXS%V*=)MHp+ zX)cTi$JWFOlGWi0>?YV`u*F(tejYQ9M2zfKxcDEJvD8s8se^lw!jRP=m9MbbEFA#;&_Mn zd!36pN@|N1hk-hl(?n_qj{J*_VtQH{z3VtEza1W|;bRS@_6ZvE+_Z8hao{dbuBn-s z*+8~=1?7=u541_v=#N7$*pYZGlgB9>8!Zw2!AOW1Lzn87mfePl7iOY~8}!>tr| zI{F~1RQ1rkYLU%00G7N8ic6&7&G&5&9Usfn*s(^;D^O?ns*9@YCdiRU#6t>op26Gj z8~QLpYAXtQ&yPJ1SSjLOtgRIL^=pBe?pEA-=uwzZ);FNHr0K>}or>t;Hq408(K$0O zezHpyEoK|8o=)InH1x8QdH2q{oa2dn&oOZ-PO+4xFB8Wk3uc=@2fesV zds&6txea40bnXrn=Ov0Ze0g!_0CTb0*V=P)?tev+9Wf|>|3tNDsk5*#Dv_?1U%8z} zo(xS|s$o3z40fw{P-)kobCrvokhA@Wvs{ARY!(87i(@gwFGuUt{IA z#~{8dr(|M<;)UEJB} zFvcVv?d^`dR7T#L%_U|zD?ujHqO<_r#ik{TD$U2mpS=y`C7S9IE1HC;T^t+wR|F?? zVFsOhrIK;Tn?mB!VTwmQcso=G1-S@8q5(C|mDu)(Erh%N^p0d%n8qz=VeT+tFV&b67@{)08uLCH2987%X4!stn0H?tTK#l#S59y6( z$p99(?tuq3wkyenGVG(|90V^x^&pAilz!yI;=k><2dOFhm%FXNQb=F`-k%Kk*1IHC zF*0KF!quG>A}sLlXOt(0q~k_ncuQ8Mh;M!2o$1Sd{?e5%V`Z{YX2yvOuto&geZvqX zXFIUsiFwGIGw7B8^cCxY+#8{VL!1`Fg9HVc!UKV#8q@Y`0otxir$5w-Z7DW)f>OIi zxcp3Mu!6UmL_+?|ad^(vZDomPJIJBD+=LzxOe+gSVN`#}sSkYjZYDVaTL6A_@TG`U zPg=|})YLAm-+S8W)z!!Q!5IJiKamZ1@$k%D!vJUwXK>}*W9`Wjr4Rao0y1)4=^EfopN<2GuDT6^t zM*S|q?u`C9$pN>j$|zku?&5|gflu6YJ+izFUN&ektZo^*Zu9o9Nq=buxV8vU2Dre` z8E!~vzy%KS<51xwG`CTgaW<;44G{|X$pJ*-A`r!ljB*0$pB{3(p1aUKT`6R;L;~>C zX}B=qJN13~d!4TW#JB#+B`TS+qlxr!3A0gRnLO9IX-qq0u+*rcpX=49Z;59|Q`^bG zrPOvh_1r<#3tQZ$(lciFtm$zsl@%c@bz2A^~{M*k{Z!cqePEX)BT{q6JOrCe4FlY4hM| z%Lf6jf1NoAcoxks=K>q~rOZvaADz|Wd&PO6x?&D~_pPYujfad^H_kPK$r81|0%f2U zObgLmDb1DV4&=>7d)}F8cWUF-YZL$tmicR=w=sXYKO~ zl7Lmw6ou=1qv+#>HWN691PJf+YQKw{Ci1R-b%h=J-pHEI`ZrCnGl)lH%k{PQ{{(p& z3Q&Trdz}#yY2^G<9FIXq1Xm3f*ZIlSYFykz&Kvj4+mGZLb62T*?LA+u>Ke_`a;q`bA>Cf|e6&p2}ysh^W~$wZT*ox&X4J;R}`VYYwU6 zN`aJoSAE_6ngZ}$+I%qHB`OQ@6B8?7o>p8(CSx4Z<~bYRaV)@f`bZp^*dt=dLV&Yh z_NlwE$yF+Rp(8)sUAJ+!oL!zevId826n)m=u!i`5!M~akB;Q^ulie^~KW#vU1+#2)@r}B4FtMHuoombsEs#1fzWrkrepo5O`^<>{mL87=!N3@7XY^C^f5R=9Ehd&nW#}I~!iu?I?s%?l& zd$BM#A;OyDpLh3S(b56Gx%jS+g10NAxQ;}UGu_xZE4N(k`Y7-SF^OXSuR z*f%kCn~!*;5U5y-kwJ{rHpI*-xl{!h7CF}_;pO^>1uX{_W(07B778OyRLOGs`(Y-M zFTE-d&-K@ zFB4V713@eZ_>1J- zS#yziMZ9rqUyNg~k=MDp9UT%>g?(z>)x@qIAs{Ya|)T_mND#wu=9 zBS0%>-aKR!>911EMP7x?-y6e9Oe!&5nY2lgkOCZ2uRg@`pXzY}hp9;Z_#Gbypg)Xj ztd4((T8cqdJQGJme|wzNF}eUc*Q@}A66+x@E9T_llFfQ8PpJxj6UejLw$`DL`=o`5 z;%9KEZOaRD<_LqF8RFCmBK0K_Id!()W|Z`33UF{2$emUGnE)UBk!Kwc{}rW$nT-q)z!LNelf)YGA=*0c1#u_PkYC;0I5sAF3j2#K zFZ$qN(=(h9i7mWfeyGbG8iL7?UZF?{Q4S7Q%TJHzw&(n?Gw%Qh^2iYD6Er}T;6QaF zeKh6bUPuiU%iw1=Bf!Wx#gJi@TS=vH*kYuF2qWxit6;0{l+h)Ld@))7Wfqy-{GrJSr$e zI;Ymq#%vCe3K%;zNM%PYH4 zxhGz2>1Cn^l%BjG0zMw5_*ED)cHqc{54lwQmfq(i_RsO5^d_i+Ez7z`HXS9XbHzV3Sd`9_;$`VGM`9*a~>y0aY)I4U{wf$oZ-Or79$(wUtjR>N76lHY$`AsG{RQM4Xi@k$KDSJPAKz!p+Iy z>odsM{wQL`&1}#)t=?JG;*gOz!wl!l5K9D2Qfg4R@E-U~6g7#yTU~F&iKV45T#2>T zK9fnbh#ZfEiVp@q)64rdeX)uAa!x~;Z4OKV;`e>?&Z6rxcCClpiJ_MBi|<9BrehJK zMK2|LjC!L)bj&U&T> z8Chzt2?gqTK(mF5qS2(B(4E*Y{9ECu8e*)!N1AAupAOwAY?6I1nKSz-j)_4Y!|`@zP;1ZF z!S!Ehz#*5d(4&YO!zt+zNF9^MH1dae_Y?yzI#7fnaloT|6moyvO3MYg_NUyfmId?J zs`sMCc(VmKhqdc0q#fiWO z^(p)hd|Ad8W(&GfqJ!4a*~#y#sjP9m77ZMN<8J4?n7G8UouQNeiXupuF8c}0)zz9) z7ZaXvkGL+!CDf1ZAmzK{>ge=9%F|HRo|s<;BDNWvX21m#lMwL^EI z{trbFJP3N=MF*A7W8?q>^PTf6Cj+_xsiOIT5$&IRCuc1u+L0lXdJeM{zg#ioKYtyPJtf>RSG{d7<)K#6>ynzO=NM@= z9mZ1XM>w%ph} zTZ|D|k-ZJDP&tvs0c?;EWVgp?G$gqpg=w^ioV_xmXs!rR9DQK;kq)G&s4JDfA73nP z0msb?k76<|Z4I5{gdfr+nCI250r#}yFs3OV5w_Vi0+s3h4&$pkG@!p`M*vUj|BYy9 zaB0A!UWvx2&Y-bF?-rl%u$)%Z`~+X_WNbB>cC_>ZwVZZZy5Qmtn>-J1SA9z3T~JQ# z7ujn_C%4zI*cMV|AD8@ zfa8IJ3-M}7WQp61x^O*1!_*&{mS4^GF{ELG3c?^kkftN`94hjK8NrbqJVKK6K8qC= z8#hvpot$waN_2pRq#Ps{&BR}oT2ozrCjcx)7`MzB$VZAgl2DG%gNIMqaHM2eAP#?d z8OZNf;^G4i5B~*&1Om;R52^;Gp*;#tv5EGBJ8eMrFbMR)lRwZuJ_=L{_R|UU6NCi& zK*Qy|PtUTb=*J9%(03a4D9nHEU-+ITs84Vk(uV@lEQ>MLs{Hoj(+!|^Gq{8~w&9&2 zDn9d5+LT^-5)6blB#4nYUm86Uzb1l(#@`R_Lpx?qu6MFYaB|n$EoVajk`y(heu&(# z(y|@@LPWgphcRz4`w4eL#yZ5ES~)`g2+Kj|d_ThPU?SpuqMrW1sDE9F66^v`g76m; zU+GlBO7xTPZ-gZ{l#D2p$Oi4+a2RESrWb3zvSTrN~~taEeh+u!YR zY)>9idyHY=e%%JtcHkw!eZeyJv7#m5ZVjChG;7|~BC$f01>RtAh6hqQ2rt8r`&?*y6q-vu)&km7UJh$FoI4DF|lb}w$`z@@jeY{Wv-LfZ-g5|QoWv&{NBjMhKJ3T|L3Aqb|nnK%PvZei9d={>7u78m%^~P{11<~QSINNSN>a>_$}2>45MJ$ z%gGER|5D@Rh|`c4Hf)}}HAH=O0aNRI9Q4c*{hKiHRe0{WYwt0;)4aDft+_0xdabN} zKqsQcMur#?&2-;&*C0PV@YfC66>rm-k1{_0Veq&5AMks6_kUzLk6-}+7w{5hSG!OF zm^bF!P*NJG-?+kt{O#}pvZ{M91EI@is&^O`r3}zvHTq*4gJ#)6{e(dUL&7CG61u~e zZqG>mkW6kt2FEd9U%$bI=e9P`aMkz%+8`jXsE|V9(A|z_ob~y%5YCT>)IF%Hx!KbKx)xW{`K(+zCI>Qb*G_#4Vj}|v4 zmODFNSf?p-1VKT7dqWa`#AavYju9;+xq&hdYQaCyUG(`5QL5PUNPr|H^%x$hDY61p zXX*CbXgO10D#(kL@jL&u?NyuRu@{h`0o@zBnol~++8cL|A8h{h)0q~T`&t}%?9ayD zOL*~4dc6f_K^LUzC76X}$Oef131@DC4%ieI4CrCgob+GW1o9&yK8E#tiFuNq4Wsyv zfVWC@BB&$t$-SzcYbnrwS}`G%`#TnE>O}x-&8LruWO<5t%D;$1c)Y#@kIhUy@nMn? zGjB$CkVCxN>6pNLWjy@i1IhX<9a$BnlxUe^N*_bk8iFd?ociLMgS8i_Hox0rFX37K zp1kReiUVGvBI$gX6)>Cs)k~ODL@5#NX|IpHC$o z+Sc@*p}Z+)%^jKbJ{xZIeg0%BqMU`jksBG?58P_a+65rH3VOcUhA(S2Gc~x-^6yYO~xM8u^fUONW~wmluTL#ViG9{N_dH3 zrP-H~Apa%}q9Me4VisjBO0@rt6krm_cBqVJh)mOU&$Lem9(1Ke#kpN!aN?V23nSTW zJqEme={V}R)%CstF0~}rQrX|pmP8R5$q8}jMva?^2>jCDe}E2`xBOuTPag<&)k)}` z|E#%o_&Ro?IU`El$04*`_*PCSvH|RmjI1brLQCtT&s|}Hv?2!-`AYA1nup}72Y;Nw z+m#AL!3^)w8;khZ@hvxCj^EW^=&m?3WSH%6aDYv1~yaJq#o%aAM7T^&Cb|#ZRaz+-W+*p1B z9&LywVzdcQWUhgL^@ZbFWIY*QmYQl}xnVsWJbN3o<6(YF5 zICSn>K1>=mZw0nF$Vv7HspNO^hWQoyKy<6mG{Tlnp5a~j`2+K;NdqdI-eea3;+h%( zu18c!pI`*et9k@zChU*Et>R^7@m90F7?W6zV31FqQStWs4S}ySg%xbk=rGiM*Z#vZ zk3vILz|)Eql0&Hu9zM0^y?rl26hVI(dLuR^g&Br(Vos`!YSH;&pz$5f=YAVMw0CnN z7WkRPxf;Uu<7)^AiPOsa#GBKkGuI3wiesr=D@bzoS_ql2ec7uWS!bu+16&km@c{n# zB>kUMIr|Un)pZKBhvz%$`%4Q!rli25g&A|2gFXqUBUuO$Z`grf2sf#stIT3QyL!h$ z@s)cmb$_8&?D%8($Xg`RGA2)Rv3)6s@SWUSYeCN@Y3-QqZhyO@tdMSgS@M}@xhJjY z%6E^7{ClW63NZ#!{LCt~U*%105S2NH*{`IV44Yea@cEOKMgZ|A@q6O1nW~*SKW}Pq zE6~JL-HK~zxi)aN)T~N`d_X;$4E_;Q?2Opjikc;u22q)FmWLktGihXM-(slHnCWnp z>Akq8zSyU$y7TkS|1KOnD4*MV>EPr=T*0ZSNn%q^Qtulkx{afBu%r&D0$Kl2yvDoK zifLpl#h?gZPyr~l8m_*JJa zgwHh^OeRJp1cyV8a?jjC9n@fjH}XbN+{Pa8=2atGN0N3T^LgZOMdBoxoAtT1xxy`6D>GD%n5c^deN^ z%XE;}chC&8o|ri{eun%P7=%XA0kaAI$;}oI$q2=6Q7~GJ#Czp-xK#xH1-+7f)C5Fs zBxxRSjs%IiXlZ4>M+24&L&=r){T;0Vp?6nt_yOeZda+H&w_T!ds+=CU}VeP}LV$^MD_mfsMjl)$c1$db{&B`PE+Y_F(2y{H{fs z_F}Ko>l(V*F$U2U39>@^kin{}3BV*wi!ov3{=n$hcsrRMKDSem0zb=Wns^;^6r!~9=&>0+oI7-L9#@; zEEIo!D$HH26H^**@Go4#B?3E!eh@4xl%+Pot?%eWKtu2PT;MoAAMb6j;zi@x*zaHi zRS4p=xC#iLv#9U5ZNBdu23yG{>V^YTm=oN$%4kj4TF_x8^)acTd4=D6dj^KJ(pYW) z-yQ>9*k*|yJ=zF6qJVY7aFjtSx=(oY^N9||$G|pdnqnrlP-Xle_)P{KRMZ7Bo2?ZO zTpiEW5-sclv`Ra9eJS6>{2VzVEcM~=Myw2+44~%eJ_7aEFwE7j z#%6rjEqSx-YiY`iJVg|zu874#ukzXs8(mi+vVfuDWk>|1*8{+MmM4KWu+Dk9o7@%! z;AdDN^PuyT{zQySRIC;Vc0Q&-!p_NYkejH8*M-D}6$|)*ucy{_pY^&vPtsZY&kkya z2rRHN*B};7n9G)9^ms-^%a3^-b)Ep17U}fU(8v?1cH^>nvF<=mu>OOF1?sE8BRkZ@ z5llNoi3eV>VzTnRR8m^^(R{D+*;v7^jf0#Q0iJs=JOLkhC`*d7jed(L{q5cVLI^U5 zq~$(mPHK6bLF7Eezvtbsf?HxuTo>M3eYCXV55BM!6>D&#`W@1t=b~bgqsa8J3Wtu@ zdYkfXJuVm}#oM9z7hZ_NEsrup6ty@-vVGm>FkQsDUV$eNm=afPYv82E!yD>VheZwV z-4AC%83qk1@@Ig9>=Re_7A3Djk5MR&u!CCb`yvgLFo8IQEg@NhBL&6_|4M|_#d z1;))URsZ8kg6T-@0LmD-%dxdGs`GEDYpC>jkBJ7PmA~Tb-;_jXB72AygT~kQ&B$rW z^0zo95X<8@s|}@Ou6evD)+VTEc$O|l=+e*NgZguP3^RP+Dv!A^fGc$b`rZn-1{TXf z4eyK4%;NCnNf;EbK*z8iC9bNZ;z$Q3i)q2Aau z)0W6?x^3DNHf#HY7j_(Cv;$Mw@@SC1pCqy96r<8m{`)gh=ML>zOLWtglw?q-1t(gu z0@SYw%PFG6Svq$yJV%(k&zs%lG?p1QGYkHCtJWrgolHG;R`QI~IW`ptE&TtrJQyv@tt5XcA1&;yp#C_~3X_4;o<3OO zE@g}-vraI<3s1w?jwD0qsFN7xihI0{T6~(q-<(QkyeEf-1_s$f0{GB0U}Q$=T0j(fMAMcB=P(J=kt`+ zcg$|}O_4h`1>}G`6tA|*jmW{@$PHr0B*;wjzjM9Qf1RLDOR>z8UA(NYon)(D+AZyV zL|>gOC*gtjsZc+;K9O-pwEBe#eaWkQ`7&6M(5fz-)*(5ei7140H33UQ2RIp9bdU~2~9FK`@CBQnU>f0 zc8}m5l%4MDo_dZuUyIYXBJd6%q~&s@WPJXTR8n@Z zW558OZtt9*X>T=^+%J{nqm>uY_k=J~!>)uaZa4i1gV7>z`&pQ&HJpLIk0MuW407qy zMo4eT{mfG=&d)Nh=ap5v|1Dq{1)gvJUn&GCCGF$Oz5Vi>Tyr|r-tNQB=e*Nv=n?=y;J&1DG{$XT? zK_Dw4#KC@L+~gF8j@Hgg;ERng)a@G`3KxVOtYfbgLzu}C!r8xa2m_U9?iA*Ws^ogzHq(b zA4-AOB#Ys&heeR=x`v(`8j-s9XgE%;l5EiN+Uqg@Y9d6!VMPh3QBPvuOe4$D0U&7} zmckY2Hx`Z`9loD=C>zB%I=BkK2Aw#*g((`Q`AoIh!8VIqoCI7;T zqGhdOipTouiDL9Id%c%(ZC!^pu}*1FHfpD+RyIW>ENB-0h+@MW7)Eg>b-{mplBZbN zYxt=*Q}|VKm2eu?TBHtRsoy!}5S!G>y9JFX!Y%S~cvK3rc9+1QdX^eYgHa<!)FygK6=S>#I-I35PTZN2@S( zk$)2gRy8}xSAWE* z8d=BUff(~BzuB6OZ24Y&=xnTJk=)Yz-;7X7h{$$vm14<=H+KIB#YwsK__kq&_xu5N zzX*wp)dyK1T=eCVF05`N}|aK-EG zZ&`+tF7#kfV{plvH%0|H{ATJ5JtEaen7>{k)^|GTWmpz>yX?rQwc^^8ar|l*;CWkpj z4g+O^elwjQyP!I^zSqcCCPRRQ4RBr9)of7RhybIt?4K|ufB4kHy{_;3Z&-5=$Q*v} zR)jzV{A9AamdjQy>zbp<2q=01?ec|)m`5~2;`By!wHRf8WXJ69Q90E5$;-8UdwXlF zO~3xXV$q5Ma?mmN%;67GP?X%e<)9<>zuE#2Na}cL9dM}16B<#kMQe{yEKehqaynT8 z27TDqLhD!ak4CGbo@vfA{4l*w)7$X^oF|=+Tt>)8 zYI*rb% zweXfUyC6{z4#zffRQ#NNxLDUB12q;elxO^h@1N99FB2YRrSu=fhqgnQr6^hqwBaGE zwF9Fcp)fXH#e=(BBYbQaSj+1y7eD+5i9w>d*+GS*-iobanHBy05szY><>$9d9yD!8 zuqE6h3cx$wUt0)8{(jgARikV80_{WcAQ9Pf{OGONR*;wu*ULHJLeUrU5|o-Zs= zbB<$JN(zQH$pv%8(zHzG*3cP><5Ifm<6Cv+pN4d0K#6s1IW24Mh~`M2Bw0mjz5 z%P_y~o+~8TJw;A*!&4ISwDXpbxe3qtUMXsTBrc1Eq*^EB04ekbTiC+>U7>#~1-O)i z*|t`%haxplsd$?5b|c+3=n1PNd~8;N8U@T~1=?YMB9N$0nkPJn3TnAuSuD)S<_zxA zdy7*-)@b`DC(gkU)VZE91PdpyHSji5nR^nc8#wLLs)wO4*S*EOz!u4SPMtEPXCV)b zy<9tHX`yxFR$oARI3=Mxwh3NJm^h^6FhP+n$xj`6eDR;!A<>%Z&p{_cd3J&41i;B} zqyReB@Ei09#MUim#edUi{6zpek%kRwE+@kQP`LgWkyeQfr0>?9+i5i z+Mfo){2R%w!q%nX3Phw-UeTE_TmfT1cPs^l(9*cLkkz&Ko70RQah=A5ek%dEct6o%elAMCT9>B_! zd$_~25?r@e6QyLxbTJ`UDE!(6vLF;D?ia#h)z%y_OS49#vUm*z*_I+7`Zo(wdU`fv zI&c57-LSnK<>4F9=sX7R2~6Dpk&sq|EoMYZl^nL#j%5W|_{z6khy;H^6rxtroAt~r zxM{}J)JGnMuLu&7M@me|EZ*-|5bm^w=#^6w3#yhEwW3Gjde0yqS~`=wE_q!^lLS4z z$U>*%<^m8M#56r?Y-YE)jneE_iSSLKg7W+?YLpwxPNCa`-$7LpFcG3B7R%&GZFLiO`RCls}AL>6=Dw5?U8goBU~X5&6$$S z;~|%&ICp^0mC5!mL`6+|McUTDvZ!5pnt{1U(cEx5=_D*T_HxoJIB?gE7b9H9mCl+N z87)_}T;C5ZbZ#y4aQw|UQ`HXiu@|4gh^KWWKMob z;5D`%J(`vDC_uJ5I<|u_wW|xB;i(AppHyD+hu~%Cu`^+6;O33>WDH=h!u;6wD1h?6 zZPjP%AdxUM`Oj*i&-o{x}W~wOOWbM%PmfXbVOx-b!mLLCyZwAjW zLsdQv;|BtCXu6Ci);x!VSTd)s1;=7Hg;*8N%CPqoCQIZ}ml%U}+UMZTy*r)x)9#ui zt^o`Z{NF-qZtxhAsOAv(1q7lLI}JuPPA89@k5RuGj-!`>z+lA>gt{glqy?Z&0Mk)I zeB_E!sWzpN8a|V{$sq|$m)15-l%J<|fv-y(Ao#;R^^`I7phI#kX5SJUR^ZUGu|eOx zZV#A zGxL}iL|wZPs4b!B`_U4b=7Y8}I-QP&3joMuu0#i2$Od@qLQq+v5GDGO(1ESJ*IFtw z%LR#EL_DE;IkG&Fwv9&5%Aq%+gfh56bYa8!_Kg>Q;63wyOj2 zl{ZeOun8VIGM6|6V>ew&6NRI_iGD`Q-!yuEP0d;ALsXJdba=j7hfYK)GAL%K+I?L4 z=LNQ22m5sUdiuIFixGCrmUF6xJN-2i4YgdgB8NF+NW=pzxbB_XTF|~gx&8zN>HkO8 zUq;0dZC#)!G;YD&A-KD{ySr=9V8Pwp-Ccr*;K2zJ9D=(BcPGdza?W?&z2lD2Kl)c! zSJmEY%{|v#bIHKYv&%N-$GU2~L9L)QSSlFDirvv4_@v+kf4gdjAD9cR`a1AEbU+zV z`^6xC4(S^Z9A-&?)nV&6vj|uU1&)&zxNOnG|L7o!=O)Dn(d@7rNX#yTyg0yY;c>ap zk!mZB5i$R0Do;BwYod(hjK+5R0dk>g`9M##>QJ;|KcosfYDv^>Q`cVy5pgl4Zq~yW zOaC?gy}rzuEX==tMCU6{y-%lY*BvBwzv(s6goS{YM)$)|2PT_corz0j^xCF~L~raZ`<;lwE(1XUv*b>Ikwc7;!yfK64F zez01P6|wryYWECCgszGa=o7tnxt|A-XiMR;49@F0|9Ik%#P@p42W!y6zXXqip@gni z5C-Yd%_I&A&f@B*#GQ7*_JG64*KAD-f^cZn5@Nzr*u@IG48pt+%QhoRO}&mzmLv{> zpXlvC-As$mXmIK~uD6dd(I;&Mk6XkFR1slEDZon-Cfj`yg!c zWqx{j#JYbR-0qh%>eX?_>;*}>=@Q8}-OojYRvw%{b-u*;UT50_bIP>ODKL`IAUxU@ z=Rps<_o(`S0g{yrId1GjX>qZL#dM!vlw9B-f$BtYtHDo}H0oP+>!)_Nl=;*E(MDR< z{FL%Ll6ZkJu%w(U5YGMUafb2#c>xqnEC^QMxr>0W{!~ukn4}UnQ~NpR0>4G2R!rVD z@Mnymn06s1(FnLA2{@^jo?mSfj(hV!@kAGQ5fwx7R7UtWPJuXAc+`|4{5pYQn~EQw zjmOwgJK}l@!gxnNJ{UvBKpRyX&7=ux4=!_t-IL3HmE&#v;In1b8***fm4hd<#2qY% zM@x*z-K_x95CKSp$_!{Xz;e0(4-WA|-sM2Sh5w$OKPOFJ{V(pBvRi4ga48r>lX>sj zZ5^#x-@0zWr319sa72;K`apUC~((?OCl1g{~ z)9lQoT1rU-J8+EHYVcxT-k` z^ceUN2GM!{w@b8{Q$=x*06G>tg8iQK-Cnv8ZS4#7Gc*7Lo6rD-t?s9=mv_n#4`jlb zi}mZLJyl5Ij7klPtdg*?O`!0I?LpZ%+E{`p>3P%yAWszemK(bA!2KDPaZ5-n4>dig zA@AzD32jWuXbYgOO~8ToU)^xP(<7L5?dQjlp-Veg55Op-%m$BA0Yz^u~{p+-gPUyhyf~ImjlDPk5CPikDYyZoK z--`CA{#T;nM^rgl@dx5LNkMq@U8R2Q=8dGjPpJAXp+_ccdsj+V3Y{SBpvKd zGZ=1TOy)qGO1f%X?^h?tz^Xb+w#;i*N4f7_W7y+fNbR%Uq{xcdf!2DQcZ>>(T1gEqEdLl#j_VeUN1*r#b& z*m7S-UmbML`2eW$Uf0JXnewe~`W1gf74s!e!aYB1`x8~|A;;9U!ZBG2M_E9V113imo8ALI6^Zm5xSsu$77aB?fWUGUa;Xh$qn^BhV*P7ZjB zQ%Za2k!F|XhyKK(v87qh|GuSsk)rPU%v-yEZ(!ewik66SuA*olvL8^6)Ge4Nt&3oubLq3<-=!vE6a5OMF~eoVbDcC^ zJCGfED?H%~jJKJ5MgC=+ncYD$dh3E1sk0-7H>J0o7#L1S16mnyQ<>F; zhq=UgzY`9z0ul=Z{)PMjvL_DxgZv(^s4O8n?dt%DssiC$qOZ=%^JDk^`wO2g*8K(n z1SVnpX>)KyK{355r*3QPjko|xaWhL;U;xjujf@T9JLKMzt2y4|=Y2VS|L0 zEk^CNkt0YU1(mB*Un%Sychg$*+itwAbDi<7I~uI?$ZXci6zIZUP!{M~2E70apuz?e z45RjBOetTLwi$GpBP4k=U0x{959Mph#T%DWZ+9#O)&iqiKv{|#o@GIhQy$8ioM2pj zk*`7=I!m~tQ2wkB9wvM2IW*t%4^tSPu-Yp-H}~jg_VD!SHX!*3Iv%`-D@|57oLMu? zb1^zITaERe){26!;lK891e3v7KQU)qvBCLn3%OL-@`cm=#QZpc4_~6+r`ciXLq_Wd zbUsWSKz{JQ&Yq_FiO%qu-fe_n>TltK45VyRt7H@D>49OZ?0G0-5n)aTrWi$R3cmNm zFxu`qYPBv`Df@!`nuQ~i>}mHFt~(`PYBR1xYnlDYN5}L3cav>p8rYFo=lwWg8`CZk zuIBi!YBzOifbg%HAXQgBjW8F< zxoy>%F`F)akGfTm`#x(!?3+NQxL=;V?k~n1E{4`*C!8bw>)#{bvmAkf6hL!CxsqTG zVsRyc&>|%U#o**a?Y@@*vY$q9zw1~TJF%o>pomB68;Q|~V%<^nY6PTBq_9KXZ@Rqb z1FOb4jI4%v@b-hb>*yY4MXsK}(F~s59xojsqAa$bw>=ybZ8vqbU0Oml**8 zUikOWTozWJMJzaIqe7Q}vVtVrXfH?Nhwz`u)X-0-_XigDo6ojh$cfq|YibjIIZWOx zD7N)qJoVbzX_|zHzS=hva-uErgP1y|whqmHB-hZsMg%RXhWsHZ3R<3mpbZhs2?MjP zNteJG8%tp`%WRoQ6@11vN)+}*d01Nf{Y}){TdB`Qky=V1GV9`p=DedW?E-iIa0Nq| zBV6a6^u44=+Klb9AQu4KNdmn-k_<#|xF#zu&ZbxiL?9Lm)W^CO6IqZYw2R@o!Uye( zwYpKFF75Y5S$@ARD2w<)lDMt2wV}>YeH>|mlqza|ffLB`K$cfi>_tR5S~U_OH=Wep zpwEbnRe)xb8I?ZC`9h8I>4^vKm=|sp7fxO19nAU1Es6oxt|Xl*hna*GfGs>SdOr7W zhXl7J${X`Y<5Ym{xU5zlZH5QU4_iTL*d9oHDWMmZZlbAD<~E3tHDkozLKKnVI}b7K zWjLHo`tZHZ=e(4^8Sq^2h86Bz`am@fA^m2fc4yarp4c!h5F&UP`*Pa*K#EY9@=Eo& z7g@$Q7`DV6i)^i|O@j6s2Z(#&NiQUgC^b_sG+A^`6zG&dMPVAJvm#c9=wX6jzKhLm z&73^2opdU?LUwv}j-EWxSM*>AWzMt?>c<6y<0YN2xy2fy>kf2KJ;^Y?V-5z}rW^j# z?TU$vQlosCy*cMUxduBLxMxwz!z@cR+us7) zh<@g@0P8CfFjo_#sC5=~zZmS=YCB|kuw!qy)f%Fqb$`)wa;${2TY=evMP z+SOaE92lz3sWiR|Soc6DcQ}fUj?B{UR$)Q+-ByY8vX~76qJ`?1VvN+R{LvWvYN|k@ zrNcr-l$r8TDHW)L(R!8UO?Ui4&py@W!}?jWSNR@g9&FlF%pwPYOBbV$%1DsLQ9g{@ zgT?k;u*f{A>^|G02N_6ag}?i3EGx*A}a`yBirkDjd{E^P=N4#*| zBeEGk(j?U}yu$rhEE)quOX$fC@%Z-fjQDo$u$cbgHMn?r{H@iHaD}b@yRVS!XKSUd zX!YIQ*{Y*UN^2=^B!NgIDDj>RyNi8a=D+nwisIYm)Q^yH>it;Ca2MHup=3Vig%SW! zv-4k!RWN}75lc&VXOl+6X)WrCBb3zuRDf3`#{?@QBJS*8FU*B$;?OQXrSL6o#MCbr zdgM}{6#+)@8j=<$GD(|%+6)a3y)sU~@YbjBCNbo7e3k8!ZiZ=?bBj=S(r2qN8_ShM zJ!Xu&^&ebovmZpJX3>nol`9XYYiHMKVH1Lkbls={+ptim66gEKR=2)#w`q6nN4CPHY^lii(-@ri2Z1tj-L8$A^MAx;toQIrd}G^(jKh3D$G_CHwTOb?PEZI+rUhv& z{cc>>T$ZE2(?nWBpekY4lm;FNT%4z^URv5zAD8d_@9~rMrfG-(XV!vd*s0)e&3~dh z|D#(aCxMz#j|6?jt1Y_LB55@oRQTD7IM6|yA}R4}GUAtrr0V?on5I-bp_KZVLo*k< zdab2m^*6K+5P#BGj?m~y(LIzHE^UULvSG-kR$iMZ*D&}FX!dD#A^eGi7SStS2nLph ztPWtvMwya@?NPZsE;6FCn!-zp^M0PceM~FJZQ=-`J*aVo4Czz_nPc9B8T^CY3gpJN zYJ$ywhd-YlgsZ^sBFNaI4P))}c$!hw#%L?4BQwSgxAu?jlqrma!-!^nbQ#B^Cf!$B z$yUT+stcEJ!PlTW47ewy>H>i7|5I=V$ZDf|0&q~?R$q{24N|UA!iFvgg0~AGCXsSx zCd&Q_vua^P_prf#t)eh%j4f;AfL{;3@S2$321WfDe+sQ<*V3OD-%CRf3l?aO1N1(t z#DTJ`#K$zF*)x+6uyd3%JxBC;pTvZ65<*RnuDkl*l6xS~h1D%^G{$AyyiKxvFg|Ui z7g)C(W(!njK3sC%IA9;=-wLLWQtQAC#AT}SQd9a`ET{ry7j%&C(d<{5^2gnNnbZ^E zBP~x1>tW))Nq?ra(&oV~$ZG2-2z@@(HZp9-wN@JWj3mPn0{lF?gXn`SSZ81&7+??z zyxFjP6snw|_PCF}RCd?u2Uz-CsIpG56L{sD-!FeFce2aW6#6GRX%C{|&0L8bqof zAN8m&Z<*;QUw+C`NN%SbHa&@5IbqeVr=pR-VlW!Jtj?qhpYSutuE{d?- zCp+U>A9xvD>2a%4mi`2TT-J!AKXBg$_fE{u!UMH5B`PJ4wbLJ{JTxCj*oI_M)~%!9 zmSSu-84-7IY6FqCcuZ)?C}>H<;2_%2CiOKqO|ndULUv-NwGvn?@HSC-tUrepwk6S| zG8y3E<$H3kn^=BgI_ixwd&-o=e&8~Z1za^Mkbx5E{1Cr025_X(69JRte2IN?F>I2m z!^QQG7Mg(ve?pBIj==Z^zc^?eF(WD<3sJ|L7=HD!JTwOb{?M@L*`%VMN8A~zLauQW z>*u!ZI^Pohr>@SVJJ$jy9H)|x$_$XkwT;uMy!IoU&e79)bF3`4%kjUf zN62=9^DJ8gB0sEW8^kLc>U@^r9Qz9F3EIv1_r<3)v_Gy760g#!H#kL_4MpAgwvUy} z&g8&)rKL~?0(FP)Cw=kGh>P3^M~jbW8cqxvbUuB=BHjM*Dk=6JpTqL?5atsUJ3jX{ zU7E2{j9DU`!@@uwZ`e`NbGOM>OK8W(X#d2EJ2CyEfMJ0fX67|wc{WYq&ncv*i-UVW z7gz01+$sfJ4Enus973Ko95_A!vo7V|h+hY{nK~ZUOl|qMU{F0_i@quNgNKTk@x+N( z2Q?;{LV}J#{Df-EAu*!h-iGiTQ*SG8=rgisYMyw#hONBzd1X z55H=bs*_=~+z2?JDfQ;P~j> znWl6c3dcqLAH$BcSBMuyi1~0lpnzm`G34Y*X3=D-K zX&^gq2f@fP$q-M2s@I-bM1AyxAlo4poOZs!=3rHS2dRogbHXMJOMX_n)es+f!aWI# z`MKMB1TEbedwdWtutky;`mdg0lMYsEp`3qH$he0xAGl9;`s?iTPDZ(-uQx1RzsSeH z!yae`Xw(NBi+!LSZ{)Pzo)KIsm9>irf>(` zPS0aDd?ik7h(_Y@+uR^mBVhrj?3XM)Q+k6dIHDpzs~`p-m!iYpg)DVF+xXcnmD#4{ za9a^7#Ty((w1h;hF9o-3n?McKMj@Lt7f(JsRz{O~zp~2^a0mDbo3qgy3ePiK zYt8<53@vbb)XB2kDy3tFHLIUUhy;Rmh(lv$!Rr`DV(pm$Fozl&Zr!C_~M(O$qEFRFm+e5`i^k(0LspB3|| zb*VUbqf#Lt_v8oK-BYyYp9UH)bleGOzHnKFa_%c1yz&=OIV`S|eKhAZ8rvAlPU0~A zzx~4sUUJQwi;=f+;`%FMJ$#w7g05scqF*cGgN->WahyTnpZH!p+5x@IDjGcE?iz6@|$agF9 ztgFv#B9UbSfh{g^9%4#TLsz2Dkbn6yK(&lg54V$1*p(Lo+;u4qOeK|kSm&O|RCGOk zS-&O!ut0lkGA$h%NUxK4BpVG;xEJcdNQ`=DUf2hQDaP(B>lXMO zYaEZdqD4ru`u@yceKmbkaH!0%-W(6DNWjq!3q7H{dmY>Li&jH%XOmnTT0?;W_!xLK z!Xzz&B1!In2o0TWP`Ez@37xKhEQV~j?p*#N>AcNfz%uxnx~=wa*Y*0}^{URwd!){S zY3)c#I8}v2GzvKdx#EyK@_|gA8eBf|@HF27m+iz8kGM~-HU9e#@;TbySWV+Ba;dKt z&mwcB(a8t3*I`5pK^5jobuh2)lq%65l1sV1W4ftY?KeAV&h+nzkDIv-anE0d!ZK{a< z@_UD=!_ofBji+saPky~ylfyGBkR$QlRU@&mS^dDUmPG+j)u=7{C8X>n^?~`fzJ7ld zA8$S)SLG>fCFiPAnuRcSwZ8c&U9s*$L=hwgQU|M3e`0GP#T7+9*;*#s&eeMJ&eL~k z^uH6E0m#{Svn1O#Vo1%fg9ZiqYp1!;nKxl;`bWp>U~*)9?lEJEiw_v0T0IuE7Mu>} zo&P-l!W8{F88I?^MWmbI7>*rp%{1f*_tQe`cw{j2>a8DAT460NsWmtEKi7_puPb7A zmi9XWxB~d^gdl6zEAw!+y&s8=1c`|wv0jw0pHg?i43@B@m!f%2(WjXBRgdCXSSlp& zF7XuC?7T&LGQe!7UAg;ubQEigI7P~^Qi3aGsCJKi*pqy!p4eN9N$TaSIx4W>A{43;^QcIGDh5ndm;E4(Ryf+Ez z`!izNy!Q&HfjC}T)xojrjT7$S-vSI4E?;s(qSs&}F#(4E?0&#-1qOV!Qa%dZgo>b+ zEzT~u#RplPSXnuBra1iUn^tURta+U7q_KeG2lsV4vh-|xhX}S*&DdP1CT9ITiRGYr z7mS5Bk(d@Fj$Z}d0bld%5g?iQjLX3IvYRZ(9L7QiR>_KJ-+0LDTZH4Y0dRYQ7dTTQ z2qtDhNf1A1Ixr|)skv7Rf*D#Ke0_#1HU77LI)nmV-)QAAqUk#-Ct) z+%M0s#kPNAOR(m-R;#MY7{OE9hlVuF&mVnT&gzVB2tmU=o=L*am8?YmB3o-+Y$Uwl zcL3R|v4K3#&y|Ca7VSnl`Y)&hoA3T3^VEg)9A-2Hf@pKGcu_%di2H*U>Bu*m zd^>!Q64J*RnraGhgMxHHTfHHM2Xzp)Z(N(x-{*>jpc%U`s$AAplJNNm^KA|v8|YDe zCc29^0@@^jaHT8)`Gm#x83mcEedG{0utI*O%{}M}mx?X-mk3Eg@oa@;*!1H=a-HU> z3ATNd@ZS>p@b?_ki&8?iI4%7ra|)r}K9iDM?@_ z74VqWM*{@j34K#g)lT{K^i;o#w9lAN?xv;MDz?HeBj7?{o9U zAaXR&P+r$FJ%OdpM6$axay8bsI?#vFd06?dx;ynAsEmKWRfp==O*rX>>=2*^KEj^4 z7_`=rWXaCAep4mOZVzNj@Ibg3$vqzLxRsKQYzDWojfa;}hZBGJ{SXJ|6DgT7)bM53S_pO`q|rrk|9U`} z&ud&yKQ}V``}RtIDF!LuZ$hHf{}>Wv!9HJ|Kg;;4k0|b9od*|HVt-3HZ9V@e7gecu z7iEKY<{LL)MWQ_<@L<`CtjMQoILgRqUK^iZtTyGFwEM?G-q>mw_XrQ3hw?Y2ehYS- z=MXbCd#~=Vn>s!8>|EqOET0TT@J?B%pNtqVt{kw_7ZxlhIy2FW_0t`Y$XfumXVDUH zj`#bkq}Oz*XTE5wtUDBgC`w)VmwnzdUMzeX@!ewOmtEIV8~ zH9Q;oSw>u~HqAzb*9P@|H$B8@Vz?uptBd+4VWOV?b>bGeLVi&tKNL4LT7^7tF4rtu zU3@nui6TvyFP=mYp#6!~-tpYV^mkUw-)%Gs&;mmsm0BUUS%2z>p*TSN}<$oh%&O!kI?X2|Blw_s2RC zExZ`bxz#lTL-E&S)z!<| zM{FC93*AoNb9jflfK;F^0DeF^BYjOfYlqNxzP!J;qXvT_th35waNo+_OL{uYOF@9` z+Cm(beXD}<4a&8@rRZ?OA$OHARdSB)Z4=@r8T!3mi5r7wm)=Xfz1HQOt#JZSLb^w3Z~RnM7cNL<{H6fBJU~fj(t=CeQl!a{in`kI(+iXxk)#5I=TY8SA%* zAErQaH~}sL!$qha_ROqFWPAz@F@GPL5Hd;=P1@z~vTllU(z-ZV8n#B)h5L*Xf}hB~ zR_E%`^70HGVyb?%=6&1H^uOH@hn67nZCqs8+XVc}-v9k921a-Hb^gX0{S$>~xGep#kCHFSz z3{dGE#}S>2;pvs%zH}3bUVslByH&W~f_@LS_4bf6mHyJLL-@Q!BHVd)u*Y5t8|Rhl z74VI3kOVZ)#y3Yp&+A|cp)Ykr@gM&%BCGLJJ=!PtLl8)l1*b6|qd*ifyQ9es0C zU(905?DfBsYEx8eNzvlnqy4FC^#VE5ch~!OoYs{{`4>W}@>kLf)d(GrNrRtC;kfjM z_AIyAtd8s2<9i!KMjhMnNa+}*`W5S-LI3xoU;rdhOn`>6j5&gpF zBXO0}+8hI5v0l>8A1@A5$19n8-TyeJR^DZ53$xZ`B!u(jOaf#fE=(y#7+HaC-J-%N zn-N|gClHisMKGe8jh0}q2Fl<;Z3y9U!FAm&*ZPx2^?Ka>*T`NI>mMpwlmX4yAeG3E ze#*DMQU8wrTd`t1I)aF%(`-5k2O-nICP@oLeX%2Dnd z!Z-dFMz{C(N5qkIlZu>Bag#=I^-@PeBX}%_yr&~A%`-p5u74(bd+#j3RWh9S`*a?1 zNXahFAL~Nwdfd}K4-V#I`ZKUUdXNKfUTa`LKb|@!gKpfg&EFD6%5r{7ce_F%ESzWd zbcC9wXm#}D>*+Do`T-pLMTgu_`gX5eB#1Ug`^zJ>j6chW#EIYzOCU) z6|$>CD5FNlNXo|5Z6HdfVd2;G?W5%ZwMi!JaEf(*+n3dfvP-iM5uS;X`d2Wi6Z~6<73n2Bg??$X6?=$9<&x)&k1zB{UHY6Z4m_sTO-~7L`SkQ-Ygp?S|hf1 z%Jrg-v=55`1Pu@8rOL4xQOq1mjjyax3vQqN1M0RJSLAw*d{68lk^;Y6fF=&N>1Sm& z?xSCMw7in5GMiH8`gV0`fFa9%Jn{b!7~i{P6XC#U@W1W?Nyr(z>DW*fQuywx?w3Q0 zR*o)ZR&ATaq4>ZTZExMsb4@+)r&xkJy*_7G_@lxqX7?`WmA#5z$5oXX*&ndp{7(6* z73wweRss9u_gqX45)+#cKKs4ZRl6uyCq+0rlhgCZz~kfPrb7%GUx+4NVmO7n&TfNC z|D^vfuV%eH!0SRCDUdYgXJo5PO~T#WFu7yO3XDZ_F2q57y#!6aI!_$ObN1$47V94y zCkC_Px_@;gV<}jYezhWjnZ<(Kf}y24dT>gnfltoBP82R za1m@uX#J;NnPbPX7Jp9HXL8O|^zVcZr=E8AR@Caj1+!Y$I^{6ce>6+Tk_ARLe7>EA ztK5~uah&;>f#OF}(~;S#KifAKeCSF8Qo*ZJ!ISuGHjq$d$MZ2X;Do!@*Utn=UC{zl z>|uKj2fl8EC5lcOW7qPZa-}`hxbkzyg3tSl^6xFpHQiSEd%pc9%&J8HgYHi_KAN!pI|rZNmh6Ej^-)=i|19T>*2hq#AzMO+yn6;S0qf zA)Qsj^2D=S#C1Y7$?jNpD$VbqU$sS;YND5JziqMGkdROQrzZ{Y&cUOjQ?@!`1)kt7 zDtGEbp^!F#zLnGQU@GDTgvis>`6_j+`iK{`AM$q7%a$=iTJ(b*INiJ_z4En3tnR(( z8jd|V=Vxfij$rzF?6moXG*g$h)!0jy*MkGW+1}o?e~Kmf9$E?1`yln{hd|qqT+Bs) z=z_ax*I>Na9`V37F!MNYB@0rW1S4P^HV~gtX5pm1?Ar+d8H2Zo$zJ8b9}boQ=&q zV0mUf2t=w@q=j*5xw}y7J&L@{I&ND-pXuy|bH2L#j%49e0FmU3)e;A1KGjYe+fgCm zh->JiwGbT&#Z;HJK)HZG9?4=`vFmlcF8v5pHH0(Y4`yRfKhNIv#jxNdp9oR=ZG$IY zddJhua~%yFB>1*Pt#2gVcZMM53;SpT>||?fBN{q_Dml|b;WT4aDW^b(MesRkB_c zoKyw1pQ`Y-9H6JzxGN}z9=gX1MZ_f5`-PJ@gYI_8>aN$=g$a$?2(+wbKN11XO~)VS zJ*I*~W6vHpw6|}`Du$RGSg3l$!K@ds?YS%>D|E^;O1>elSIYj6C*j8d$DzviZJS2O zy8djyzQ;I*wKix~jSl^*-1uZUKA4kNb?K&7v!$L`u9NakaG%%TqNzFo#V#61(-nT41LVd zXmW*Tg%)qnHrM-uWPXP;ILz;3Fo09On6Y_@x=~Nr+3@Ppxl8wpLvX@}A<$mQMR31J zR)vfTb8;2kcdpkvz3!n#XLsStOdxxRfu@A%O@rlhhw&w$5vCNi%b_{ZT7`g|BKy;f zfmxYAs^V>^P?`rkR138JM1+*eEVOzRwxIk>D)1x22-_L%{>c6O@E#^xFIjjAje1T< zt%@=XrI%9wEutFBQP+4SN0^3!uZVUJ?N5Zu@Yw6UB=@H^)B238nB{8fe`S$+4NwbG zj5SS|-Ju?7UoOL~;}^j=*bZ{$FN8hIW4+bCqvDA|r>h_)W#~2iMwsFDX`2No9Y4K9 z%x-Fn=^7*ivPFA>C-K(BXN6}ZRfkE3*tA*9HoDWtAO{N&&+k+s{qnvWkiqr z>s;(oU|{we!$M2l4O7oUGE^%v{bo=}t%>)@t|FMleyVXfDq zMJC#O5D*cABC(-{N)Oz|!%(b~Velt_eS2Eo1{KquA0zGz?kSMe2;L8zd2~!1!V%m% zQH&22mVW`@;0qs zl|p|>hh0n_BFF`(&xMEkFQlO{&%&f84liN?H&6I(O%zwS7x*8T{{9FGVqkIF=p`H# z_JhBM-d4$(^#_eiv!W?ce6iTvUFdY9iV&M7lJYP1Na=W>D?I0019k*^D?Rz(NzQby z5ge`;o%YChb)Ii_6RkU*V0^b8B!G4uU30T(X+38#kBCX3PMmx^sfgSJjaO2@ zApC>8ah0s9b6>%Pcj{>1i2j$vggUQSKIE2~X%6%V ziGMmhY&Tmm;buPq(+e80?FABU1lDRwc{eFFAlFqAnF)qURL3hMHfWms#Mh!q#Ca)q zdc+TV?PPo%aPwFqd_vK)bHc`Iw{I<0B+U17xkN6al+XBv{akzp3=p%@kAjc)*Xbjs zRS)x73E+PGqks6s0=VjOw?>NJVcLH_!aAt+gBau%Dxn6%w~BW5^gs+`0#Pe2z(eer zRTN)SyYa(HIpERBK`NkrC0s!1VMg8=ub%e0oSj8xGYwf-^363~ZLNm;;(i|*joNJ( zMt-V$HqQu+?_t7#daUnZ+2kWDkMq*Q$hvGBwrP* zcQuOEkjpO5>xv(cFUJF?WLbR_TplP=!R-v2&x z!adY;L3q;0V%I^l@nzW1yz#h$vPq%fqKd)4IP}b}(0w2!);Eh!v0{Af1v;*aH+hu~gqgX-M^0nHK1R+?%5Pt5;Fn2o6(d=z!eEom z7KAHim317}DI8mozJJ=jy4jAmZ}|=-rPP>DXQ-dqK*4KOK`*D%pa$H_4~YP-#x=6> zbHJYmNX7sC1dezr4|@>{t3;%Qq2$Sx`1go=x%Rj)Rf>= zuu!weJ3hIcM6WmDmFC59=<5y-O;UohCmPaI&alNES;*fAKJSPZrcq$Oncc?wGtn)k zKW-I}WsZ<}IQExwTMh^@coYF`A|sQ?UwfDQcvi^N<@Bj1orr_XhKCHaI3VO8il~z7 zyadg1GMz|%K8A@H4LDz#xo2n_3rqU-vGpUpZZM6KkgOPR@o`sUO& zUZY%1{}H=D1358}_cvgIng0J#?B6c-iwZbWc$2Z(_(F{b34TP*BmHPqjV+X|uul<+ zT)L$&8|$U;=(W4zf1$KNhJ#i?3#9p@wg)Cp9vH2Wl9u^Xa~{kyg|v@M^`oiT9# zzH;cWk$#u>)R6_v!c%ugotQ=c4UXCw&?vJpBmbo54ZE~AY5q+ zg>x`u^);5|agmU{0Ff9gNbGcy^G{!*;Nl-*34!_Iik8$To?Oq=SWoXT2(@5#Pi{70 z9eYcZMBc)vUN6Aov}ON+A0D_X4it~Zeb_$>n>c?W$Ro<^q(js$?3t;IcWwIh@xO+# z%rD}si;f*2<$~I%!;3rf;TCb!n;Pq_=LPAx&jkyk@A(8RLWyau9#_i zpf$EOhs$d(I2f1FR$l$IqDWN z4YP6`)*v2x*s@nM4^lSq+Vf_-_Qg*3Jc$&Tn^w1#ObjKNhYi)KJlmB&<1Ev`k&TZl z1GC42brz_{4)n!wfkI4a#>HW!xM^ypu5U7INF@gUDZegz>4hok zg+FMam#sS7)A6Cai%Wtf14T{FR_+qh<>h4D_`M!nQNlc`lyCwJZxhaZAJ8%e*?0Ee zTmtkcOBa||*zwGuV)N>T6W_Ti=Y?JBUn#CTD!q55)LVdF#155PtLO@2Hz+kKF!?A8 zO@Tg*LEF<05@z$L%f13A%#sJIV}OaxvB{()C{^j5`$r>2lE}(R)+zi!Sa{bjRY>R} zEbs?R^2v_Ogj=Q1Fw-!2*$dQucuj`#DX1q#N;7wEt3@&s+6~?BIRlb5vuD$IS%K&f z_FZl9QFN=v#at5`9ga)Kq2z2@lwfcYtHhI|H09~S#wt*z0ry%0V(^8{+Q@o^w%7%{ zC|Sb%=9erDLPCtfi$8eS2p6i%V^W$kI0bkNW0Z`2&|yniEkis~`C*Q#B*rMgS{zvWOMPQu{reg9*iK7EX@451q@8`Z#CAlX`Y3s)4hB3)4G;$LkDjAK=2 zO0hCfE+f6I56j_rJ(SIQPzHk|`*HBd~dMU0|A^2(CE1O>u!; z@JEK84H^|vnTA*?oiIxiPie~OTQCSY^Ri=TVZB>0`defDtT5Wo_$$Cj4CF0QP)f1a zHf^pN?V~iE?5eo=VC%P%VR8Rwczv1FBq(vGz{ZSnp|Fbwum= zBqSM6)!U5BXpm2C_|{hwvR8>!#AKK6?P#zX<&e+iId`9dFc%-lwZLNNc&AD4wJ$LL z7YEwVaR^ktPftoEZ%LQaarhlX7kjX8VG9<~y`NN?qlJT2Yh=F;8CO5YOk092XtR-3 zimtdm+wjEIWFA9xX|OKClo#5d+Qr82RQOX+?tFdGjhx)B_Cw>2+inZ&g4YvZ8T(ik zoG;BFNl;^y+a>rTNPtJk4wJZrJaB}J1Xba1tQmIh`#d$mTBM~?7KE&4exHOt?4hB3 zqd5kfFyf&|BB~^(=`S!TIXvo7gE7Zh5jfe8hnRz9j^oCK?wGgPQr{T6VmK~c(H|C? zR2KTVv{;79zY+f95fXY}D1g8RLoxjFzqI5Q+tYJ|ikqy0L+Q%bb;I&(#UDW&eY+fi zLPqaiL;OsJR^bLxDe(>oD^s$%#=x*e*81x~Y~`cMZH%E2hwXVc>W{N)eHZnF~nW|S=+`hub_{_~`1u7G=keZQK_Dvu-L zJe}^}5a~b#SYQk-9EsmQw}O8ORuEG5Ff~OpEEw{N#4y}{t`A(OBcv!;@w?ieDOA$~I+rDfVmqjMJ%X0FT_0*z|Y1!TY| zhElQkI|3OQd)2^MnHt~7_O8E;s!C?HCqu;$w&f@>dZgxoGQEqTH;);Z+`*b5KHvUG zu$ML-x9SW#<5_!`C#Y?9Og-gxBszq_zsAaF)wQf@kNMl)@ky|-_Sxa3lIpyNqkEOhc$ggxeGs2atzwXd^=kAsp>wP#XXc`LGFjgtw9vv(L}?@krg~lDW2S z7DmXXiAZEY?9GE<8bfa0_^|yeZp@c1U8zwg4WYoWKV9nV%$kMigZ#Q=&;psSKV$(6!5g5QeYMO=D6A=qa!kW-=c z4@|w`Q7`wFw6y_WeJYKF+Kjx8OkX+~GL?4q-c2+$lQa0>D9sKGSJOQDgpK3rq~@!o z4&wceWkxfX_&NriO!EmHkemkIW$32j19AU5>#UL%xE3U2E8@a2h{(`5?xO>}lyE*M zpe}NJvOakzx0v^T`1`eEf-1#GK2*{51dz)&-(I*s`G#8&n&@O9|Oa?Dz!6z8z zk{%Lw+YCXmMm?(4etugW;JpejK4_-%e_jA*uDI2U4cfoAbc`fir-|`uCgqHnAOrOc zMl(2An(|P~?F_EA?(hE4{ihIM|E`Q^Cf@`9-wJR`3K*BMPHC_Ndv0!=80CAk=jVi* z#Q?``Zc0nxr*7ndEyXW_tgv6%L=@(=L6@i;6JtIzH(u3=@r<-n@-}mmFL_zXyT?D7 zh?g#?hTV*_*$$kRemf!PC6K{j&9735_9h@fa$*>LR;(mCMw4yK?Wk#Gl^^5q;4Kc?P6? zfSe)$$jf}N>EZt!^!J}rQXo7D*uZK6@9g@S?9e3&#euYSaN5`WrKpphDu^h?Y+5#2 z2^6`I<4<|Mn!8H54b!RC2#F*uprn-(3UCf)$C*o{Bw@Nk8%oC2cKVnaHCxIMb@HCO zB=%l$!E!b|A+VNrshk|BUQg!nk#vsfDR-<|SwV_dy`0!pANMmN%`{EQYYgld)3%^P zY$hr{$7Y)!)8DakKNJwNDw!P`vbfZ8xV;U0(~y5mixGAoj~4T?JAA18bRw75VBM#0 z;0q2EiqGNyZZICW!5>3e8~={_@6qkw$3m*W-)fj|=IK|-#Zh}ByA&$LEXd)ST7z8= z9TO2l#_s>e)>}r^wRBCRxVyW%6C}7h!CitAAh^4`L-61h+}$05ySqbhcetD6bf;ulAC6*ATMCCdBSdi8;_OA-!{p??rIb253Y8W}=0o?H z_|Z3be4!Noep`2Bw)kdz1Lb;8hNP&?>hZ1xW=OVs4f-8*s*1gJ&9)52q}QrH)WGhQMR#Lw=2mL8anrXy8RQCI)qEh; zJ8o_Dds>E@YpAKWSFiir_xz%`_Oaq^w&QuWVYsyC7~#F7m>~mnf#!e_t&Yfcr5lfn6r%e^%WYKs?W$3JPzYaYG;#jzX zpy94(_D+9`OjcEXi2_F#C6dC6Lhfi>NXgp3k+-=b5M?U<2U-WFkN7+LCI#ht{f`#} z!{068i5f_JdC4aD$yO4L-|P*0f)c`uzJP-bwhw#$nTE!eal7w(bNd^ zfrxKufouM{ER^~w26BcR!%56@I24b9;+O*VRVD088rkL@`(_C}Qm4w7>7EpJ09TQQ znK9Bmn+->IwYz;K0PNP!2hHDq470fd3n9-+RCz;ig&M&C;hph)UX0o5v?w4%r*LSOmTnD41J95o6YE*E83XtG+=8`sS40%breexwwZDR z!?ePDoP{W$PyI|1@qomoWEh!fksu0WrbCV=IRd{jk0eT6HoX96JM{3tiw)>cJ=EKhh}*Ka?8#P@1YNN^HD< z87Xs$QDaexz$$-~k?$PH&N4*ndLp)bT$-z%VmkNBtQ?YICWxgtba5nZt*0|<1p=$T zBxVZWsuS{<8D>j$lN01*9N|mLSCx!*v*7vsF(H0#IO`f==&9XrW|5KD%gqhY*^7!O zqpbaA^BvOwulP@&m7Dp6%%4DAp(XZNHrjvOie=KQ-D#jaJuP*a!L*nm$3(m%^da7jjQsQQUh{VlAOwC?9pB4xt%%|f)|SqZ~*j0JYeEM{p2*n9?a{MP)ra6`2oY1##Vv-9Yp zEiB3c8wlak)?11NRKB7PS%zKg*_u}s^J7m`E+0efL9bf@vRauVO|`u)$Rcw0{c;cJ zAjR>V1-cNBeYH+6mj(9AC{fCY+o8rmQYEXqB<3~ErxfhGL)~#kx&_OB(1W4)_ai`q zh(J%@Xx#6$%rC2bV9GO?e`T)EUa%j0Ck9Z=q)hV-9 z%mVDj+R&9H)1N@oNZ2hF#S8;FDYSuQ@xYHWZZ1m-bkQkEq)>8j&@TEeVQn@8frK`B%RQH;;& zx4!8hpIrjWH(^v|hun}+wq6&tTpIvjnZ%{B%avkcXynD$Bs|Tv1L^sQ@Cgk-i6hopT+V2TeqK|aps4c`gZbBK&uuGNO`!TX%x z9qcmfQu{ZUlgZ0~v3d6ci+Lsrp4E$Yz-%Ly! zk-oZ_lg7QwPVzU__?EJX$7=TFJ(TMHA-eK2M{*U}WFG{9R2BeuTZs!6kHvAwgTsj@ z<)+CN`UTms$5RYUeZ5f5plsTb8yM6WW!@U*>N6Jdt~#RaXbo=n;@TOL6G457L6~Y5 z6MOD+GY6>f^_^pt3m1|d^k$Xj&Pv~Mkkr`pGA$6n?;AaU_y>NX-Q6a?Ixvt^$^i{o@yqPZ?qPaP1x&c~5c~d}yMqDzGG0E!lgEh;rAm5GWS8 z7V@C5FcZm4#qfe-H?D@QmONYlpDcg}DvR#@i@N<$`<_7Z_QW(lLgZOboEE2>zU!%HOX$$nCTVWo$U3-mUm$t-7Cagd0s;y%` zELoSSEM+a|{;AQl09fEo%HRAASbG%!g!owuI!=6MBqzL9LR#>PX2kej48))tY0WH? z?>GXS3wUlSo?IOfSS5HEfq9UJhiI@Ch?w)?noj zeBl9Yjd0wM*$1vr#^0m5<$b@)SS-r{?GX~kXe#lM9iGQLSV*qs0Bi;ZQ?O>H1# zk8TtNVIRVbqLW;K*0l9<(r=*3D9ir#{n?$RcIb?4MTOCK2HUdNT>mg)+;|>CO_wjd zZh*vM2GY65v+9Mi5=W=0#nEs|&EVE=&YpE~qENR?Bb+jTT*)1-rNCj=0!H(7UA( zU`^$#-oJtRWYzZnd;?}+Fg2X#O2oPFW~RsIq%d6TQ8{xTfg;s(n>Mce5n`7gg#MS1 zVY~|Bu(z@jgbbilwSu!j*Y?GF-5FM#3v5@%q~6J#v$gVQhqZmO*WA7t1Fg8goIYq1 z`oy{If^F=%xHdZME0)6TclKb_jmjpr{GNkgd*Xea5u;GvC`Aw~3*Y9?$2Yfd-#LkS zSU8HH+wjFVhrucaLu$jZ0_fkEjocl%Y#w-_O|o=$=uJ^IH7O(5wPPU9PeSrUa?DqP zq)%?A%lPlDT~R9`q#6UD%p&9GnqcdE`@oDigVxzlmy%QEjdXAPHinkM+S&QN$YCj& zv^r3pD*qrx%3Od@NBi0DnE(G&bQV%XWeA?GYq03czwpEzh?mYPXMP|eL#E3^iL$Sz z6U~;y%dI;#|MIbqnYCWJf%__^MN4j})7uz8 z(~jv#i7ZLIOE)LCA30~OhtOUO;!3JJGR|nEn$(wI4A6y3;`_srbC(6+DZH4#-2Zdt z0lR}+dSho0VZXJ8UlS9?@kxl#vF@PnV?FUTV^ht#_LX?UjQ~EC0zMcQW@k%bz8AGB zq5CS{AyjV&pz+<4i(Lh_VOqqGf_0UUzQBS@i0%wotLI+V9$Ytgf!BjUZgh%N7d9H7 znK`^jjo2zON~u13A6)lNB-h5q*Jq}C%8BBM$PX1B`#n?*Q!Pe>9p5l1E{%Yn6v{kc z?S0_*+{JuQfCHbvADDam*2pqX5?B(?zI%((%ma+A8#wwvf_KC~Vt1>knsTU2w9nXn zE#(BrZeJp(-J7cY-}k=F8{j0gdVg8*|1aGG@;*&iXCBhemoP3z5{^?Ta6?h*=5Ikm zpJPZq;b$mM{aE%`!Lo-!28}wmkBjZBq9&Vn&W3%4K|vxZGVE4}rY(X%PQN6JVXC&9 zzUs!I35-6f2MTo6$&y(5(ef^^?+Z!dQzFB6k&j@Kd2p^MH?S(iM+ys_A{4tS+=xUd ztU5msFjv?>&uuHyEk>=~YHfb1Sn(jxJ8WFw44=TBU=AED`turRPO9MIk?r#gWBBo7 zy!r?l7tYq})e{9M^CM5$k&z;Y|V>vrgz^xHzaGeq8qL+hZ zeICthxG;s~nyYWs7lcd>E+J?(Qei6Kq_Nv>lOcXk3le(HPyylPX!_`)G;L&K5~&o- zwSa}3T(AC`uvh4D2hrH(=azs<>L2oqU39=)bwwth2}%yAo3-7%X`9qCllBtmDou0^$4eHaB0B$8odyatp5OvM0_j4QY!wY5N_ znsU~_RmtnNgztZy-Y#7YK9E>{rX(Y@MKvcm3rn z1Qo_V4d)MTu5$XFBewSwjXLE8-6siH^bCgb;NFQC(x70=T8xwa7K-riPb8dxcA7p& zq<0e7>rMLLxoC6!noi)J8je`H(PA72KjJ6bTSpn@b?bdkZJVlVn-xq9ZcOJ7Fe!Vb z%UDm@iUr0GjycpjgWD1pkG3Mr-Y6+Ln>(Q5gv5p%ifCQ&E_3>tR3CRWp>Y=+<$TOA zinLV_obyC~I>AK|dz07N^U;R0#71N~;#qqdKUbF_j{Fm^N#El&vY>tPzpn{+s1w%% zFeGw4m0}^{pb&!Np9-0pF~j&$Uzx$kiM~?L5yZ9ORc^f|Fv35+vhlqKzy$ zm*&qr8S$C?>bFG4fZu02orwSfQIoOqAAiJui*lN90o@G|NylR&6OjB!FHAjwNB$&10v8HoEfj+`7!Nl9&ITxe?G=qx;&!#18%O zUM9*xMmty~SHTTPIySmTz|1ku$#N=;TOV?cS|;DMI9@FM6*x7E{wmtCO!qK1j+4&* zSQApIq&3KW%6uwzKOPyt(Zlo;7^$eZSL>Tu8j6;CA)I5*o5}Eg9ix2*1>YftcQXQW z!67`-|4B#!GAK}#J)3@pns|m$0uOf_B;hFW>D59TAQxVUk$yT(V!gRikmmK5L_b?PG2rVt8oEp~l(q;=Qu70>oggo^QX) zYl$qecYau|-+tx4XdvLfE&dL)RS1DkuQC(cjLiLTK5L)Bj>Myj(7)f)^M z+)*smZSyBr12H9;eV#hBrp5-O$IigB< zT}8`a0XlLDNs$aq;awUi0Da9{%+zrb(T*J4y)H6&o7gvGw!24J{6LY3GRLYN)XHo~v7*!!-;VcP>)E=Sssnu*Il*GkY2hb5fXS)Dsxs;C z3n0d2QKJmvs_Z{nrA~zWh|iy?a8PVa3doijP=VfUt~`WHVp59Qt@9dfVSXDsKR^3& zR)@R(?tJD70!qo9Mutb4rcO1ZSV}vaa*h80MMBLV4tv6JYs#*<{jFyxU`&Z0u~KNA z8km)gHfEw!|eClI`k*L0# znNz;9;fYSmg(o26W|GIK26t}~>~aN*{^Znw(-Nm9cF-djsH-D1N6yP>XTiKkysNpU zd9WVI6#e+Oi;i-%{yQyQm|3vJT^y`RV5cFOiMP@Am3yf#w>1(yj$ zgV18ys>t(0K*+i^kI8_Gspod)%A=2d}OYSEhToNWi#fNC6>-GT{ns zDjm^4pv*}=q+D7b`&+j(H)fRzBygz;T(ywiD_V|E@F-GMNX#N(QO?`8--JDs+PI4j zPtq`5x$-~^C(NJDF#VlhAv?8O^}pv;LJtwDk;ZRHjsjX(6jZ3_SM2v;F_o$Wcwk&% zGZLvG2ty;xuP(f33TpyCy0l-?9)qVhiL3Z{cs`LzF8(Z0&l^5DbU z5HTZj#-jY8^D!fb^`|6t_&Jig-Mrm&)6v69pHjs_p%fSVN*p$Sp)p9NG#@fcaXWEd z4*rz=Qn*wtb#Aw05nd@j0!&%-#&<3tvHYJ>+L8qN1%%xSp97dMZB_zqTY= ziA-#r9~?Aed9HE6G8u2KW?!solKM~$?QeDLj0VF%W7`QY*&DB1d=FD>;1*hH0!(xl z!;dH_SWmwwvg)5q!sQx~M#MFw=bw%UI%k-}8}vnEUS-Q%eXUlv`a-0&@?{4ntxVPs z-(D5>A?m}IRkdPyI*f9Nqm+lU)6|jB{glVLE%Na{8JPhkYsvsq|ElEQPx1bsR{+Ix z^=Zk>m1oy6BuI9qhzG`AJ$NRhoK@A<)Y8zxSfcZlKw3Zt5-AYHl)T__DU*XiQQFXW zLBpx26&fz$V_}w79dYR)l3&uJ9+RmrGQ#c9<>}qpt*plG6Ug51Q6mClrvoQ{@`{NV z)?;0R!Dd4ex^I_DN5jf-o>1Qb@BsSFPnZoHGfk#>2LmroKi9p=7;;Exqkz8exoEs* z)3UU!KWwW@10FWg1;y0jd|N4PrJKT<6otD>#2_oO2oBA`_4^YO%lC4oBlnbV89|vp z7~u0!Jwxt~^1g5OEQJT z4dbS(u>QW0RzkW(jO`_z5ztvKx_u^RK2yU}A%r*`Hnv6qu>#J!eILz31T=3Dp)sRa z#_Y)C9b@O*)EapOe|ks}_tmm~fG|`6xsryNk4iVOpa|x|su3!TwWLg6jDQkUQIs)p$5E)s5~s3U;>B(K~aDWx{A5a3|97b$I?%$@S9P6&L|>b)EhXnG%J zYLj(&y;o)b{yHIvYy?ML=w;1U6!yR@P&1p$c#O)15IY_Ao#|&!VT7Tvf+ooja(BJt zhCDYVR=f3v^=w7pDo#8I@8J^w%^n1V71s@+D{DeX?~>l}Y2VE{q`M$xf1suW=F+CEXVoMJ52X+Y%K3ypqaT-ste4mt8sbQcc1vzY0qg%k{h+ zB9pR8DM^XQtl0)NvyHc|f6`b6qxHUS3|5CV#;_-yBmNMrH3%|CZM{88NG~h*I=jB7 zGuV|q^kZmG=Er5kh~fH9F_2!kHg1fS*?vQaC1`!sk8 zp-MO73~I8qa)s>Y<3iogT@@uS;EL(^qJAdni1diWtU1)In%~>^D$v*hXAf6!_O}AJ z4Bw<+uGNM)11NK@AfMCmWj5u18UDO>?S&q++WA%=8&6NA=mOOLLY0<{wujZagQt{F z8P2Bs7!uzGr_k{wLhP3sXJ~H)YWbONn)i{AV8oQXMt=2vgV&wfyo`XfkO$mJvT}r0*D0h$qhVQuh6E8Vz6>|loahMX`UC3bFO$* zB1cGSO!$)$6hsLbpV-{EqAJiQ77G=TEFjK(X38%YtqhSGeIHPQq%KG!E^rd5K8AyP zQ@2#Me&BlKIZ{xK-QYxf&rej8fXtj2$GU*|J6ru8ur6SLFv;T_3RfuyPz;Xmdg5@` z2b#MQ7;#=2<@HHBl8~GQ#CD0tB%Dx{erCR&%ciK}F?O2Q5rmDnE6Zs_cH2-UK2Pbs zE6=*$dxGA<+4@jydxJX@jarQ!=LwTZT6dm)9dWk)y<(jl2%cw!6T@av1`ULlw}Z8T zrd@Er$NAx0bQHznH>R-s^){WitvyDDr4R)=AX~o@*f<9CM66-jfZgA zI>{p9n)*Spcj|&7&_4>#qVQHssVQvZ{qEX$GI{jKdhmO-6HrZ7#Zy5$h=`L3r3b&m5(4 z)act#K~2p_d;-VRZd58nlN+4G;G0Kpx2LVe&|KV=H|#%WJI;lia`siL7F1z*tjUn5RcPzc)$fY9|9-a(WQXnv^N76q9%-4#L)UthYh( zKtrei_vJjpw0mf=?7gGO6nK;8LgNT5ENKggVKARjX_qKVp^i#9Nj8lCQ10Jps-F;O z!=p#)dk1xWd+N+GDPJJJ2W_}ha}UsSx5c7)zV|HGP%D({4nILf;X{O~kS1Xf z<}D9T93o^DuOtRGB)U~h2~lJvC!uC03}Y_kY>%E-OV3H6Gi}q3?;6T9dHs%nhuggq z{3pI~3;OUIIsI=xRe1uY7he^WoO~`+IAEML5{$^Syb6ug1h?D6mVM)@K&4|o82@W{ z#Z#+Ys|#%Em&@?081_|jmdCH4gpzEd-U8?jKVuk4fP4M@X%8qPGI_xcqI3l|gW9Cs z>gky7U}?)Je6=Li8BqkB+?Ipc7PX!AP%;J^TmtxWi$z{DQ=N-f?;37!aBzz2#@fQY zq%lg2u(0q~*D^+wHyf=LSkYfg@u_g}Auh74`RQ5EeZU!FXscN=cVXtBZh~TlYCj6k zD&}JVcD*lSJ@fW3cM;gn-@YsLx0Z+PK|UNm&NO7cOns?^UY1>*c#t z+&>>hWW%MHHhbF&SNYCU!f_s&aRVtwGWqnhywwr-uysyv{4>mt#JQ{pMDAfvp-{Nfe|cfNBob zvk`;DMP{HwD*giWRs-4<6~!Cde)CA|09KJp1NCPU+o7DUdRi@Y^*_V}3BCV+Hq)Yr zfg;BnIE0Ge^eY^)!lFU;G%7S|!WEzf6d^7#oLjtRREP<-5CTYP?}xh2mjxfnDc z2)B#WYoXMrVNR~ah7>c^qn*UM#DB^EGS)yK&Q~wF-+w#>=#7_ZD_eh*2=*g#1dV4r zyD3rO9U=s9g%la3u)ItMuF^)91(lpI>Q;m)R=eS0o4p@$>J)?|F#)d8w2NU+h>Kc#nlG?4d< z1)(%S=wJL=4-&djin7k(R?yWOO~L;OnH)LDq>^p!c%wn}IJ<6+#3t+kC`_G(kVZ8E z*SVEE?%NM+WE3#~)ig9XY$~XZxd!HmHB5P|>?i0GGx9fm5&uXdH{7w%>}-&VBbc}y zcIS^7Ar8{{F^?)dp)p;gHnP4~2xoz~dI(vi9ngI**k(J3_L{9M6#XEv1V1LdK~0|v z?VuV5je_k)Y)3$OqmatFO|?E`19;40rEx76&G4Dz7alG3b)R{99L81Kz#=sK_3c3H zUXkZQF;4_Q@jtmvwH=hE9<4uijE}G4cr1lxZTuGI5CCz1cjo2A0P6UI3cvRu z=3pDd2)Pkv0oBHYITA>MUo2*jj}tBKNMbtXAw4?$pz~%sJ7xCogZbBx$kII}fES@X z4e`t25g}k{2x!%-oe$lhkeO8LUqWE*0X~=_b;)iFuhP=%XdzIjX1MhIs@z~ZgK@gf z<1Jq5joDUt=k8d)c5|`3C<&fFdq-b&V$}qEYEqKG@y2M?5uO}kY1i%m_UEt2bZ6RL z-j(@1>vj2D&3P!+bHjTfHoMEah3~FvflG*{zTT6KN zB!Wzv*I)F8)x}0=PP7#Bi|vO6DydWzW0?JJ72RaQV84wt{L);}FXffh+8;Cf*tLb# zDgH?gyP`h)Ux%a#jsXgKe~R`_UMMte^q@rWjIHh;%@&=AHkid2KYZID8QVXngF!$B z{yKeip$g%a0H!7s&y&w&ZibekNlF|lj%!l;Ae7sm?B~I}?%32{qKnc81vl4qPzazc z{SxsS2OcDz$!;MS6JKsi{X>1D+0IB+LUp+Rv zojWe_wWyH?gWq-T08>LWL&N-KkDT^)L06q5??2`yFhvDoHaK_OJbcy3r&`M^veDYY#v>onF`X;BN`FDNc-((xSbO3M@H{9 zG>xX4TzkOnpg-jxE}%p_g?IJ>Ff{-9BAzHv(2&%+b>W%2`Ys{vHpD-&FZrJ$`Oa|ov8Acf4LQXiVK5u9BfBz#}Y*Y z*NQ}v7|y&tyW?v;n2}cE@qs(QXW}EuCncr%$PYZiF$eFxk9#3Tf*YZW+mW&AK?v|c zHWn7RLCjyxfQ>|+eU8``7n)L;Kov4)6#Kq7` zK$$?YMYh*Mmi&SwYKA0W_9fuk`km*S%KXnFo`|GEjqjfU%3HE`n)zfLza2pVRs;Y= zcVm^%IRAfuE8kz_J|q!Swpqm=m%0!gaA-=@X7Cmvz)+xdLvv84kXIp&UWDa8u?Y$W zI#@@1UjWiV_b}>~7rW~cHynZvoWog;EE8=}1qaK^>%2yjtgKZe_ zy2;lgl;S`8ygX0<~71W<{xMS6UHB(TGnN)s8*ywC?miedd=*!&`_w6+ z0!bL?2A7*{5Y!!I_0g9Ni&`$X{6<;`l7A9hLs@a3RBY|%dh%z#>?tnRcXzb+%_h+I zeqCitq#xm*r2YHPGdRFACH5Ga{2FIsxZHKD;tD5h$C*`JMET-CM8!t9w1*2*ry_p zrLSpvT8PEdl1TmKh%xj`t9el4i*{AiIk@iW4!E#_EXz$} z_Q?iJ;fB(t;Ov89@A)xtF;_t0FZqY-G~Pu)kdW`J*c@~+Tig_trz}j0W81ARv!;$> z6;JziUR`orp`D``)o(hjrb@jmwN8-W-NJuf^ce3Q?vA35{+IUtyGB_S(qmsct1DDb zRoz3TqRI5-dR55tiR{uloKkM04;g+Tf+-%rx{kIKB7Lb~H76#vhtK|j$0ciM+ys!! zxvtO=MHO5)?5ul3+OdvIpl9kQ&kDWe>(noCQ0q;F@tp~_gAN*M0M&mb@a|BcyPy8} zh2prbTMT4Z1gPPx77q{YtK-d=LscCcnG%I9=z$A_F0$E37B0UjNK1|?#LY>cD=s5B zyC2>Rl+0G%x|Q`Tgz1socgX01WC!Sfp|avs0nL2nhW(%wv0TSYq+h~Jsy71u=)O*IH(DiH_x#+=SVrri zRN;LBoZ(Z9tuHmW=V!$vL~6Y0B40aXMP{#s6;^{oimA%o#gx}nM*79%7=$~#@#oT* z=Q$V|c3I|E{d90X<5RCVVzx_yxQpnS9_WfBrsfPbyHq!=;?%GeH1w7yC#^htJaF4W6&vVLR)qcvia@Y<~|Hand+G%>I-CUuIbH1%#cXmCTsd43{`GI7P^F zDqL~UEDbhJDD|jPE0fb*C7qw49oOTDF^DZ@srZz)YZ~ zDpO=q?u*5TBd1;b8VjV@)g@tUq1lP1*vTd}Fw?;QpuROR-FAdo5ahwk1DE?=kygsW z3@q^@GnZS;^g9UcwaJ?_Y%hsFsudO$6|{#Z@1o>HRctXs@V+)`J6tg#m|@YLRnxDN z_u;N)e|k;81W6C9dvJnJd{7)o^bQM6Qv$R^SYE}m(%+ z6;G+@Tk3IjmKX0=?gF_MlbzUTl>*D*#8nngCf>3{qiMxqj2*?3z$FQrbxey;{GTsv zArB;j#UvWa$O6a$47zv}u_-POI=zgENsYQI?!t0t1#7Pd^}4B#xXdHZ32aL>4QfyA zmb~d)r3jtU=g=+-JaF3%FwwXm5cprM_KkJbE*mA8qte<<95@>xvR31Itz+kVex_YmVj4fW8W2Xow zF=ovdRE5Y$n3ZqIdZRr}MI{X9m*l8_f9QISR%^sI8+H#v|EEj=13`OtqGtrSBmeE^ z01rpxS=x)iJb@iqwXQG_Wo<|_hqhHZ$&Oc?E{ix-h^Oe5=OoLy!o(eEL zEv)@?9Ym@_wpjida1*PCKT>~@E-y^qL5%p5t(CRQN98N<5t9Bca*qz~FnEbv-wIs} zl4ROcySdafMg)^~wIJt4c*NnqWMTl&UL!kzK%({tyRh(H-QpbB-c z8wyGYtaPrQy7b#Yg4m&0X9(VpV9I2z--dO4vUBwl+QpZ+D2pWZX`g{nnc`oK? zH)tfv;AKPfh@*@%I~$)wA#yUE*DiaRdP|tPXi+c1kvf6A;AP7{0H=SwMx%RRgf7#C zHFtb2R!ShkgwMJB0=wQLCsp%Sx3DOkcn6NltZ}a4ENIPRMl!9cV&agmRV~ zkQ9s$6D*8?$-mX#7A#;w_nj)=ri&B=I*PquMu36Z&KPh@==;tWG%7Z3STl*f8PG3U z#Y1@CHFC$opV7g#b0lGiWI+4RJOl`gO4SbQ-*^38@US5Rn0z^oozoe=;-g&Tshc2M z&X*NLcZ!XOeYK#8_BG(FFg+Dh4tv)U6BzgS_^)`GTRn~xJXAmdLLTxLTY0R^3wUkA%-YiMx9|V$7UEG|$dOR#id}*u{o!vCXjp!U3Ahbl+Y0O== z{T^v&(9MR-p>B0YZUht(0ba-Q-5a-nJT@NAS1pI3UpE2Wy0Esht9Znn=@&?Eq!+9VV+ zC0O5(GxqFIT2{U(n!mN_6c|(0YXeMRfZ5Jj(Xol*~JbM z=iC)40a5?dS!hX*VT${v5S=EFN{TcoU~0HK*i?h6ofK~65Y;0Zj1Lajg%7rY@?p}3 z89NFcbrfJS2Y+=HW4kIRX-Uvka?+iQwO5v2Gj`Kd6058JVdW^8Sl2$Y?-#uhv=F&a z8_CCfda*Q7+0}iS#ph{dv%}h-8*MKAgo9BD$d?I6s^BPZ?@GS!zaZaTtbdpJ{Q+R= zcHXzMZ@9^Bn$W!n8=bw%4-uI|}~NTEpmt5n<~#K~#!-T$zu;FRutO+?P%(8b8Q<_&d!Dmxd0p&B!ON;Qj}~ zrE3z5LR*huckHqt@qGF{1C0=+3%@3=%Yy6I_OXDszlh-z^hC|&%cuL_7n=T@+Zifg zGx$cP?JZ#Q?{?a)Uy6u9s*9-O&+!|ya6O@JPW_Ruo8>ixBlT1oLV#Lbs7O%)D0>WlfU4`vbIkE#j9>TbUlAoBRaHXM3h%H=XuF%n&=J^ZrGG7H5 zjH?N!vt%&#X&nMrn#`Y7T;O=$zftt#|I?17N_U!KNf{A9oTkM>JRG43OIunYdK{Dh z9LMj1T}00KdzPh5r;fc`Gp-asq#OF=hP?VN*OS6u^(lUEysloV~> z8nS=>hzP(w(nZczK3c<{awJd{`j`~)sZsHIiyNbr3f^l;yK4dQi@gGldo=sGX+>eu zQ6mAr;x-t@k>g=C* zwV)2d>R~~ro00w(H~ej@P0){$T4B|1S{0ulDw1wc1PvaR&ctS#{6 z%ASEf7)fX9E=^T!h>wR4K~)^c-1tD=+*vuGO`c#gITZvS7S9n%XDl-aVKFdMGNKJ*B@X!qK4)HF zXB&2Yj+$!5XYY$KrPoq95DAJXX8BI%4?DwbqTE20f;J%LQ_}5o1@Y`kAw%toAKWHC z56V0raKFv%l^OlZ+AWim&y7CO(Yk^^vD{qf~lQN@uH0!gqEmDG%+)e zD^n}BRQrt=iN?9>G4NUK2fPy#W)L$?Lfu5DmbUo9NE}o&wjf+{j`COPgrcRdGfgnlfoG{`&gkC#u`l1*?G z)8-2?_EMiSc| zBA-(`)QjrwQnVrM!daM`%|_2gNd<{a?rltNuZp!0f_NmCZaMVM~&6ro_Aot@Bz+A z^n)^7r?8M-+&gu>TCqkP#t~~l6Tb9~td}!Op@tPG~uigZpIX|`-up_qi3+t~k^EDGl*9oYrxxxwEG8f(0woq;UXdxT!k_^z#d^{!ecEq-} zjbZJ**CYK?-mv=t^$kU44cY&DnHyk9f+R0CB2a=A7<-bOam^3~=N-64p*4Yc)MPY> zUKTY4sdvl;MLSQB{F6w%bpO*c95fcztZ}MC+KW2s9xrlACL)c_+;wevbr&*pnuOjb z%1cHo;aRRpYxZONgxPA%V$#^SMLJ;t&7dzajuHOzbnnJCa{Q|&BQ3$*qIE0rA>uTf z+MsI31H5-i$zFtA*k}G&j?af#F^cNEa=%~N}2lTTjKKU|0@$x)#*Optt?ZI=Fd?P_1 zHA8GQaPBNBh81HD@C6idbts)QM8nb5<71fD2f3 ze*v@O-rE57h!m2QIz`iDnc;c{Y8Sy|LfNyC^TanF*Mb61>$y+HXy?N;^(;b29ijLK zXzNTw%~EgL{oD!jUpd;zO9CVf1J}f59yXUd6_$WTcZR$a$tk0W@AYF;ddI-lsNkp` z1eGVKUeKsopLkV@>}O;X)41k3SgErP%eWkm-)jeZH5{EsC}k&cZ1Vgo3=zhHO~tt>3gcHxopg;R zI|GCEPNd3)tgY~6s7`3inj=!V7GY1w&sAmQ$SB!1lEf^vN5}nRE9?vQl+a)s8WgRl3I=G<4WweU@fn!q1aff6CSl$vDXnZ5_EA|EVWL%Upu4HT<2MXT! zU?Sz^k0lNorwL$!38%#Fnuj6{HXKOC^`fD7ygVQ>;$x_2 z-zvWtAlT(j(39aF2d4RictV4AzqW?y+prLeSS*Htvnk!F&)VHu7O}TR!Pq@LI%cz_gr}&P=8pd8paq5L6R` z7tjS_EQa}>kKBb22RBiT)-0J*6G?>J^Bx#yVcei1TXF;wX`9pMbn9yp8HzH6JR zbY8zhVx6k_a2jWP3{PuNBLUnn%43ygC{&Dk|7weDxc8M42~}q@6UGE%|84pq$&>l9 z^d+M^5+#yVYC-jPt?Mg8E>LBsWP4@szpw+DUVdKf^G!wX`R5fg|EgL-h^ZH*Jg07# zFr*B4ts&Eg4-r8o`T}qf@ojq3QFm0T<%Sa4^Q|(l5X*v0_`xVne4G8UW!uWnKLHok zCnvWOg(x-w*1AC#PeioV!n%FO5Dob{EwQ#q&4(Olt&f_-VwOEGHBOe7VN(=74 z`9fea!zD7K>@hL?*tFyhJ;NUen53+v&^@>B+8G?lZ>rMwoj5de=TSTC$04`))2Rbu zIv{d@Pq<3{*VqA^`6vL)TDZ_3@w^z`U5ZUnHlmdE{S z=1Y_ro^sB;izwB zbWPt<uI2QljR?)&xbUM<_hpvJh#<$_nV7`0<@w0K7fkHFHnylt zZl4jD1a?YtE84SHUDu&E93LNastZxjRo(7s5U@cwP2MQ2P4EC|evR7~<^YJXM$PeL z16zd=lN!SwvzE1UokgG?e;I(31fYZlP`TjE;ffHROTqt37%>95$XHa@!J^jYNf$O@I<`+e#r zO`!sZ&GKgD`aRv8s3F5CefHC&>#~@(aDo1*0&F`aW+wIw*tG#FknAsD3Ip(g zku%ZyZSG*CJA7~`JAP$5xvk6%R&c3DAB=?!%n!uW0;GJA%29N_86ZT%84V9hgYAjXTbn~o>D(qJ@kKTB)|hsaA()*(^73NqA9tT0`?7= z=9)kLYb4(5&FWY%rv~H@^`L-mZ2N2WMd`l32!gae=S`bCQD$kRk8%sr(%9DyW_>9c zPf$>Ael8k}c_$Qt7k#KagBHz|!kTf3eU^h@x$ZtlogRoyUE*N{fhPPD9y{15;8D2* z!sk-c%Ou4`=CGp%rLPn7!Mavg--5gEgiYPRGVJbPx9hNSs}{wbNRG{6Sc=it?j>9I zR=!R!+nLuO+i2l*Y{`UHRv=NI1QlZ9AL^jB^PiftR1EP6eJUu+@f4nIzk%}*{oC_b za=zDx2qrp#|J8?pcc%f%`(PV@cZ3k&AwhEiWMMdZFWR$b9Dt7OntL5Kv4!H2rlL8L z6v3~ggTyk4!1y)((68tMi9Uqz3kY_AFZ$eYHBmwpi1D?GUE_a2+g3VZ25Ed!ngaoN- zB_s^4{SF-gEEckKOr>u3UBteWpg!JU)jq}$Cx6^vybXre=si&U^IvT-3yAmZDws0= ze=!1FFc9=cUkAewnR%G(a_~8256a+A^I1*+hfoqbnheyTRw9tA9O^^bK6?O0AG-hS zJ^5HdtI73Kmpc2z4yr8G2bq8;%3vrYz}FOmI&QC7qx{Z4!vT+8=o}+pAj#B^s9*vX zZ?@q)fXD2!Pd=URCxmUshnD$QD-HR=)<8wlwuQTq(jUIHAryR0Kwheg9iu@EVyfMcXtW4ad&rnJMW(4o?FEa>iY##Ypt2->F%*T z3dU`Q7zn*+j1Mb&9T*d^Bptn5M^Gfs=$x?eRRzB3blmN2lo@2|2?{9V;mR!Y>oedB z|L~(B?cMn7Bmfb2^wt*Igl(!=CYd{1=BWl8Y?$EOCqJxuW z<;e4G+e=Q!bmj{-K!(azB8YrpiV6!0QO=s~CUIk(m8Ok5QsWfMi`poR#5yg&l~}P% zYCSq(Y4J5>Mg4UC(-0qK=#jg>e;Jnkt$DVKTYQ9s{yLE10b!G)l~(Hbk~GCg z1P+27N`GKzLj6x}A*m{-+@P->P`-SZE_7=Y=Eojofpnzo(KbL&N{k>IVcGam@1A+> z{xCI7N_1$Ro-VI~r#rm}P(Z5Mjc6mbt5VjAJ6n>eqbP{WrF}<+c!A+du|1r>u1Pm% z>J+F_ri;~6M|?e4?-Nfl$tN+mf->^}Mqi^O+XNwn|E%_%-}wdsHpvG*(`iqR%20of z??*{b!w=^Coyo}*@Aorj9?L6C`J-afPG7b6KhY%cp;A4I^kQLwwR z3_|T}4u~dpm8q+!GEPrj-acI5$RH&&2m=?j_kTd`iCtl&iZVawR$# z8LmSCi{RIk*-css{p02#C~F_;@=C=;-Nf5?h-9nDOno+37`?>T<%^oM;>v=W_YD|T znFC%4Z5#INIf$5UAw&mgXgkGWs6@|^aak&vz27Ot2?AB=`(d0;R*|c!4W2ZaFHvbO zRyq?eTt34$?>Ia^x3hGa(XI#|7&RQl?9~Tf{|M|xQ=%_(x@-Scc+#kI0|8pz~ zxDnbHa)T8nfZm;G9&lz|lv0;e9xWz6Is0Qe7H^{_=cbRo>e|EjnW+SC##{M82DfTH zs-zRHahjcw_ey+@V1GYVUAJd$ztLbcoMk;6rK05)m5FVzABL?VjJtF_4#55AXZMeC zKZ%KiuHoC08g35jj2}E;QS6Loy6FqHJ6=|XI@$(7T}oidfCfsPD_6056#JkHO7L{1?FiIZ7puvM@{MV7|0s;JMeb7u?>2#cKj6DsI)EKN&|w-$5*ooVmH%% zu7BnPAP(#~%1p^Ak@|m@sQkee4inxvQZscuZ9rLWJ4vtKl_Vr%2vz3CV6X)Q-X%?) z_xDc7E^w7TEDYK)fL@#T@+2sVSBSeH=Q{N_0UBtWFHMHfqCq$Hro~R+RA>h`gb%cq zqvRHcwhSld@1$nIjCe_pr4CyktXIQG4H3HsBHv<=xJ|GWWjD6b*xZdif9C1A+3NA% zG5_c9G(7q}!{NPc1+Dn_f1*ZQ=OL^nEBFUmJlZJ3P|X!{cT6}{n1C*kyYrw9+{h+{ zHth(Q4T*(F=g6VMBB1(wH|7Q<4_IutTnz+b7sBv zE03^lh0C|kM1^-8V*fC9vwb1MS=OMd z(PbwY$_aXMgIfq6ZHA;u+(OjgOJzUtsD<-OT_FaFKWDgz6?B`e%6c^Q{yEeZ!oP>` zbO5jT?r?ooq=mQlE8E$#IBhi+vP~6tvoR7ZilMY5f6kP9?DV2n%M5g?RKL#pqRyCtQ9 z8mW;VRvuXQyG!pGP?`{atAgg+UWBI`QH`P=Fh_R>wJe*9hWvfAPL%O zg5OtE`S)jaK0ZK;(yvpW8uF&N$aTpm(l)hOCeU;u-L?A?o{qL;Qx z%BU&9Sv+^u?{N6dNJMH|=U+5s^7{n`5xN<&GHHg|R~PM7Vriu)@{XM0kPdKC8I@z-4ruR$p-vyA6R-i!0mK+oOJ%Jfj`BX&wx1bzsQm)>do@Cm43gyXie^J8 zkiwfnY*<-f3G%7x?pS8FjZEEGvX^9+YXcg!bn~|AbDH$}${C!f{6>vaqZa9N3()|8 zm#WTPEKNnC3=v$JC1m>f;vwRhNJq=^ehCL0L0($ona+F?hBSyJ9_ucyQdk=Vb zX|W$lBe2_^1XuS-oy-Q3)(!c@h<7F`C~rW{=%_p&R`6I^(rAIHe$sp7e*G@0Ci1#fR@p^7K6U5ywlkoRRjshGve3kb< z(clcPzDCy@&O;$$B=p>Cb~k&-%Q|5fmyCq>v(VNF=7PIyc07kwX4;8MTC@N2aB+Zx z3e@Py5$iuna*&8gXuGzX{v?j$kpvNkLGK0Yk07m=SrUrF+r1t*b;7hBI=BVPlFYH!cHhwU~LQg>ZmwCcFC zDHX<E5Nt0decj^m9D9(@tF()LCYNV*OWte(!tyRTVa3N8YV$ z4~)ylHW|gbMrFk&K2qTqvR|n%4p&DkOX3@d#334Yj2rq5HJ7cfAYzTth5|0V7#tZT zQIgjr_pdRu+&Kh^a)ba{)9M4O#qGKkrJg^01q!9Y-xt?%phoM@O=gD7IhSQuISH*U z#j!c;4qBzXnQn3c#`Fku;9{&Wp0rP)APo2roT{(%@574A@!Ry~WUH32;dOvRY)4IR zPS^f)?DDfBdlEQ$-xNB{gReKucp2!rgG_#-zc2g?BhHKva+3HSCf0@V?lbPFN59x$ z+qEUUjq%(7w1~Zuf?5Lyh$pIAAY1oe>HL+wZ+l)5vMch`LSFC&c%7m zv2RmF)#A=hSANo-$`igYqe;qk|IHb94ZtM3*6M0@ad;83Gylb;r{~ry@TT=&^_vOk znjSSeE&lP#D}n)EQf763u?`aXZLG*yJ5(CxT8(t0@S}--jsfCL@TA0`tMNsmww{nT ze@t!hM-G(Z2RI0Gb|bNtu}z895v;LTv}Kp_9lnq=9O&dH^ZKyI-C7m7^%kmXr}FvI zv#pI2`Y}#eDOpHOv-~Ey(0)ll5;8lVt^2rgr=$tnmXcu znA(%`(uM~b{OeVXT%VTIIZm?9ZhNe)9mcXGDHoCt-(+7GYqHY3UZ3Mz0k~Zn(D!;Z ze<8$K0nkNrS?ja@1EkM#gY9$=T6MGdl2T_}(1C4RT>Dghj1Gv0G5RS^IWW-qH%#(EE!OuswAlUi{W5_gY@geHgPZpT#wCj1 z%doqHk>~ckJy@vmmoB$09**s2*@40|(T!eY_vh1)10ODTR}=ZocD2;IR;#uirQ&zl zKlWHJsO1d{_H?t12-l20?g(Z1KI*K>Yr4oVCw6ORf;N3WxKly+=PZa5?SksufmPifJ`21up@8$(&0wBVfjEj+L-=_f4R_4lyZ z5`InVMsN*2f{&GYW!_8msKqy&`M7DWluDa=+Ff zj!eK`jw^Js2tv`@>tj|kXPA|On8jVSTTf)*sRB$%HLHoY0UJ6G9bj)k1DQ%%0IEvE zTOzggH}BD+QVn)FGgh|N%qm;JrRB%VH}C0-^aeBkM1N#(Irs>rmW4@Sl+3yq)&ck< zR2<%H=4*V#auV+g1XiwZ_&|aESlBN~ZV*c#TU8~F%&)SiD*eZOyLj}fRL6TPnpzAn zz}^kB!>x#$s!SAcb`3--8ZDBIIu4Hc*W36tXwP$Jb)f&6n?#g(v05=#JEhQiOA>oQS;gxdU`SqNzgb1>f!^ z_&yCPe_Lt_N~BB;G0Dt}AnvwRbym7Z?G`=7=H)8nGl|T0pL4(b{0DHNr6gDY;+z4YfM!TtoFjZ4UV{^{i5cFNFWKbdjS4H^hKwrheNG%L zGj`8Fb$rBMIO_)~Xe?$uXltJPPe zkOkxH$o`AJLZeg-@exX#NZ)~k)8Dx<6>?% zql3fY1^e$rs&njA+w0lc(mI0*ysQ&RMst`XDETUzTd>v__(cU+l!VSSoa_sGNd%in zX<<#C&E?uw#>1#|CqCqnd;>RUd9tksPmf{o!Wmkld!I5?2JJ)ytzeUG?^-)ltu$)% z|EW2uB7UQ*WY+rszv1IQ;PR;eSQ?5_;;@M2LC4Ethjw=Ia2s`N0Xy_`fR+E){2U^? zk6h25W=K4`V9X3^Hxu5PE*cb12UVsUkNd#XEyj_=q^+0}#8j}7+&l@?=%jdbx*(g2v8A*~woX_@VJR9W%wo{OSWI+b{0S)Jfb z;PmIDscdGg+D$$TMx{Q#y0!PGCldU>TiaDL$PPM@4%(QJrOC<5;LMJ8i12v?*JxD`R%Eq9kRqXdZ)1Ay;_PtK0 z1MW|Vke9yOB`4jjdut14!su+Bq0v~@Kw)2ACoO67b{5vcgrSq@HtzNjbGac%%j)81Rf$-8R^vJlMA_ zyy0~S<$6sby7kjhOASjB^M{NHzdLEZGfK7jfHKs7%6(NBuvbzw!k13%e@A7O=J#qa z{1eN_I%l_Qa`R0o)a!F2nj}3`hN+y;+M(pBOYkLMqIWR}wA7_I4c4wnFBP!qqZT7l4;54eT4Q;qTyn-BLfg~2FhiJyk&-J;}4y~Zs zB=Vlq7qJ&8eCyZB>gA;*+fDLh|r$fZxj{yMcz^QwBZJYo!e$>DUsvy3&gmi zpIIF-lU!Tve5yZi z*@m(T^moY`Hx7?7sUQ|xSf?}zWJ^4m35cgwU6p4ze9o~MdN|Gz`j#R-I4@*7$SnDO zDy@v-pGaA=g1v6E_YroE{Er}q1FR_>Gh5u;NrlEe*YbuI;BgkV!30%Zp^Sw<+;0P5 z9+QC#!oSFOQrW&_|2Z&`I5~3%l(zKI+#oe|GI@OKnSb*fc0Y`Qm8ZYX$-@Gk3%>1Y zJz)k-B4nfIRNlJC^&-6|6nu_eAB-2Gsd!O!xr2MSo>_CGhU`Y9P9T)sw?Xx4COxh- zB#}ftM(sJxM7h!q4o5;TCbH@>gVm?5vtPYTmfHfcgCEEQ^1tH_ zK6GK&HqyHCTy_Gk8aT-{0o3u+pm>~a39&u7;GmcQ2Nivhg@J~2U0?pAiaP*PyaDans@|Ifi+wbA?YapW*yuHSn-K*I}n7EFa zwjyUMvP@upQWJ5p;GI!=T~`aN@{jl{jJG+hg!wsw^OSyHq)~}0>|g!W!0FAMt1Aq- z&1SdvbCoX2dTU|rDbL;v1XsNB(l@jklqXtc(h;v70IMC+*29`Jqy11;Pn!h|cbK1X zofD*ny==ZtaNzl4B5nSi8%|4*)bcVNDqramXrA(;v>B+WUM?HLl8>n<|KMPth-hMg zT7c5--k^Wa1Ets1!NpMN5I_tOz73_H&Sp4>tr;xu8b}?9E-CTw18ckBp9_QGI!R&V z?#ZIoaXWM~HMMlL_*FcSi9FKQ73x&e*%jiQrUNeYB5YNQ&O*abTZ3uH$}NRu(E>~7 znDXPDCY2>{Be%~VLUHIDK#Zse3vM$^l^2pYJDT``2MxN2sLqcj~yb7IIRrc}@H66v`_mjZ&8Im^7v6feV=yI>J zVDjU73No{nUO11IIVSvD3p`SQKySgPr1HPW4=8vGhT!z{SyfwvvzH?``89btaXHdJ}! zu6KT7{Pnylxwm7UR6&SAdc@tLlB9zYAlg``mcH&p>fr(V2L?=df=c`@eULEXK_aSz zyPr?g%F%iSI00bZi$>0zz?QZ1wmUp4?A_lj1LK;{7Ree}N%d7E_-tbf7a=W@EHLj- zZ7H_sooLWI;WOU^2tg}l3B{tkg(jpewd4$zElPj_E^Dy(T61eeH`%lu`>DWRS4Wyp z80=p!2YUN50dQq>;?cu?{`Zycd;~$xy2M<*|4RDOKf2(8&*UT#hEF26FLP1pp+jI# zgNh(FM1>nIdR5Tqn7h>{JHzm>(9e;k|@qISWf8zDsXsvXSri1xF zyo<4)r6}53>-WTAu~r7-C*l3Gl^^z7CJQX=hzjYCAhzk65Zx%+wD}2JC6d%-IBB#_ z`gyxsfvimRhMvXF`GZ<-M^AIv{#JuH$usp#@o?igWaT!PtyxdaP`jq)m7Xq9aG_ZL zLCi2=GVR^5F; ze{1aD7v~*l>)Z}=iTkLs0Lx~ViG(+HpeANV^`=Db?h~CzSsQ%N?oj~qYen3|gtwo& zrBipuDhCaSF>r$;gx!7{cO|UPeIcPZsO}!fA0b%tBHDFArC#a{e@2fH$ft1W=KIFH zJTM&Mz4ja%*@KkgWq(e8AT2KOb?GAhZo;r#M62ULa@|BA>b8o9YvIR?bHhz+vzzQn!Wh4(%|c9aI?i6iTd z@PPwXDv>z41_pYW=QjJ&-;l`OW!Jp_7Jk;VQi#GM>Xpw)7gvA}PU%=OY)d0EhDuld z)mp5bclH-o5&7Xpt;)B_C+^rF4#+PPIsn9@30+RGVcESQpUadaOQbp zv}DywwgaEIggCl^8;*(Kl>e|98`{7orKfFf-mYbPioGaYf*U@hF)4L&{%jq(|LLhj zxy@i+kT)MzJq`cy$*7U(1(w~d*DJ(cmHeXaBUkQjb5-yMrALd1p zDgSBB)PkC&GA$YI9pwVhb3Nl?W%!9=+^a+!ujqJAw_Qsk?nYJ@h z&tem?NAk#`_F<$BVH#~CUDf1WUem`uSX=v|AbqBmHt{$29DV~~D9tC@oKgScXc&^i zUe~#{Y@~z%4Lq5Hhanmz2PAb13&t%+Ir!xjN#AYYG6oKPO{gRL_3hirMT*c?k**3% za#SL74qKRE;z^KlJ=BCvqy9HFv^ZE|%dhUop$+QtG<#~y+qK)gWKPEGmIhIRR$^eB z!ZLEXrudLN^eU%a^}!zix3r!Ru)DM1j^FjsW!o5o*7H?BhxuV!V8byIkH-pDtqaNopPX?Vi|v2n-44mT$0hCKj{b#-;%G+gjw&6~T>6r{R4# zzvL)??-1gWJFXQF3N}&72P2&^c`SH#1VL)9I7y0{`sF7Q;IT#UDdSJN0ZHFM`N#7q z^!@(~UD?1ng%)HR0UC7m7(@(rJ<@)#YR4rtpKX0zq8efQHr23F=C1<$lyxz6h={H? z`{aCUf%V6BR(u8P?{o5Kd)#AngUFyO$w4Im5hW)xxi|_03L`B#R{V#Eij;(ur~4kS zmpv)8$ApQ$;813hP$zGPd+LX&tmoYRj0T(HZ-^)`@$gpA=FTzlDe8ZBJQpsihfGY ziG?RrP7I(bh-U~Hq_{?E*hcn#*BWh$DsqSq!RHB{6ED4Q$+z3WK?UYhi6+y;`0l4~ z2zD9t>3yMzKhM0s3;p*&HiQ68Y|D^>M?U^fnT!SI;WF?sn=@Ye^Ukr#5)cM=Pq3Cn zU!z=C(Il_Qy4H7WD1xi~sn8%pe}eY(#@u%Mqi(lHteB}FrQ6#Qa=6VMspKZ7>3q}{ zk59}maKhHOZ?hrqrs2fgDvwfAGlo`ySE3A+I~?y_%LoYMOO^6UX)&XnEp3)q_fEXc z@8|D$r{O_uLjgvP((|I<>#ka`?gw`HZ7=U%_s7jj4;H5z?)4ujR-_r0=+G~|&JJ}# zwi&ifux_%e6vtLv^zyfEz!{Ffb+?QDVA$H_3K~enb|e^*pICo=q3Y)9c;I?_H6XHc zmxuhTzpOI*-IL>b>ZkncHvI^Nr3r3zb{#s65l(Uwt2+p`h!=jr7eu6J#ftV{CL=@X zM%C`a3kmHAclHK6ZJa>8p#{j>F_cpK6G=t{uH~MqCN0Hlr;<5lL=?|u<<-XoD;nUtQ#gAX`J{2DU?zGGD&+?0Lj;bYnA!rQPzO zk4s9G==v_6$ZR{RB&M!?)uM(sNk*y%4T+-qOioBHr{XID;bn~H=y{v9OQ+!U=c2E& z)jIgOtgqBjNAk$NJ3_jnrZ`R@rXjuVuaEJ@4fX<9(PY&+#M}3Z*$x8kBvR$uYg6@w z(VAU|-`R)djmgF$91RDAA(+Ck`yWR(%-g3Z#A|7Hc}cS~f-h9@T|urJaCbBorvut` z5Sk~uDJ;IC8eb7j+I)dXw=%$+V6EO~T}g2;*d*gqPhZ)qpZVUW#C*XGjvk)bG@H17 z+na;m!tCs-#*O}A3xgh1TM*PxV++xp{O`C>*z*Mx>Ijuq1V`%sw7Ok)i`}Y536$U? zxYh;4*a@}18i2@zuvpy$5?5J41DmBrTJ2w%aW2&s?>CHW+F$z;&V!<}8)Q*4hf%eN zB=sKdCh>R?jSS1F9bolq2Um*RdU9`tHFW4^X44y4)Xj;$VO0)0>J%*^40xB5Vir@h z7H??L@keDqr(d5D(+qy}z&%%5X*$ zr~_i%dh+dsAe(K9+|Vb~AeN#a03(qszD%9yo=oRsSK3%i&?EUxJ2Mz+M|y=LI}Rt! znWd=1s;M+l^)~xru;XMA^&Ey=6<)hqcAEh45~9ZAW3`HOIGA{k^m35Sr639E?Yq4W zpPb4q?Xr5bZW1Ql$&Y}UteX;Ss4~Cg^@f|!*+=&UH|8wuc9mL~s%LL-;fNQ6K5Uyf``<-c?0?6z^_W-=s#kPd<2+Gc&h3f6gFzVcy~s> z;P0=Hg*ns&Mngt&Zu4}rKLI}Gy5Hh)V(HRYwWUn@7Ng#?lc#P30&uIRP+6X>pTYjs zB`#=#z|n?pLX{u>uqi>0j8Y$DXlSS^YZI3WNHY;%HG{Cle;Ee%%wfYqB85LuT!XHH zjAjsW^CLa1aAhaN@!&*y$l(6VO8+@GL&)6|Tg}ENVVkaxkG+RN+AmVbNYO*W-W4*QB{)Hw%E5}jFakT&M*I~F z9KoR+^uxvR8=lri*!SDwAJPzn?uFj^I97Abf9Zv~Iazt>h>E*CR4g6?%^?#Rv@MOo4iO71EGL`QCoRQ+mFl0kR;bLueQsi zXLe;uwR&a~+snIN;7mOF*6}X;lBC}U{EC>=5Z@zZ0jo37hDL__AwyVmC{pAHj%mH2 z03EG2kh2q2c0qw?9~rdzR~K>`E=*U8t$>(EkXWK|UW&yp?hSL@R3fid)C>{DD%WyU zchG`+r3<*_*`nlHS(9nBA4pL3%rf%nEGg z*uMqL0{ZVm1w8rGkqCkvs_A@Ov=wf7J91dLlK1Wll$*Ao09<95xCsISc(1jn-%#FqwQYK$2y;IsmgEu z#7xb$+>3}?m$rk>v10h44qB4u9`5ZN`dz|7oKV@_DXiPYPcr(D)Rou>4^!sUpL-H) z-8CnWYrl~x)|EH1wfe_>gH3=@j%K&;3DP24D@60EW$gfeXy^L`JiECGjfwu^EE4Xl zpb|acw>Sd510b+7iThTD^S%wZicgqA5A8!g5JKFF$a?4QF*TvgH*TlmVmK3qMVr7yJh4YnB?%68+9xNO)-W>t>{o&PQ-z0K0*!$? z-*ET-Ie3Mo`!B-*#Gd;d1qBxz`hP`+3syQ{P@fFpy&)cSX_S4NikK92>m7uc??GzE zhr_rfeNK_ABW|y_@@kmY+;emLPP_&DGQdyBiD^X0_Js3Iz=-(^ySX{DB8ac%6IX;~ zGz=OX9Nqa|7VB!3YLULooFjS>&Ygw8=fxO!O+hhvcpn)1s zotM6)f2janz<=2@^r{Wg6|QS})N3;Ah3~GSYqIT}C}W-8KMD-^&42aq(}_?RPh#L?K3!!*&}=V0p$I0cy_(> zn`%v}>HG(f4|o%bo{CTJ$=#Qo0>Y?wU2J zU9izL1;7x~;0RvW91rw^xt`uz2AU0ogXZIW4z>=gT$~J54*Pnsx7sbtl|+!S{}F?L zV4NZy(8F_7Z?(ws7vAHgt^zmNe;=I8XI0y-guU~93{4~BCGng7tW_9ml_EkNvHFfp zk-3-`u#8yur%S3e_3ah50_S0L4}kfMU{00v-Pq_sDI@_{5jvD_r+pJur`{= z*y?-SIY!VfxSb9TW&&#MU4IhagHCbJ&QNyOL;S{CLmFL4n{+^2hJn1VAa>*+woM=e zs@~IvLkrHZ3J%?wnim9Ty)Wk|cfA#$I=rI21j4CCl_|^X2{;GrLsQ1z$l`i8`8xxY z@nBmqLGP$fxX_8_Iiy20%J9Q!x7fGr2a{8_I!3=_V6|4R3DKdODKMqs3&$5ezXRt4 zvT-!x!>+6H+N`O z|8hrhBa6e5jqZ8$Se@(YD=3v4RdlA7J@Qh#MSLU^8y3NCM5}r-B~ZNCS4S>=g4OA-(EwTnq8#(aU7gX^`|}DB)Uu}pr`Nl9snGE8FqvZ0{&v%P+kXL8T-VW=& zX5sqWTDeB&3&X+wruzQp=SBn+DW7X{oxheilNOLsG@VBZlbA86`N-w<8eH(RneSD@jV00ib?n8UJY)Evfj%S za^b-R);Pz{V=ht?2Yr2lY$PZnun`A$i0Avkvj}VeJxsFTSZ8L@?+c@%i6=WLPn$N` z`hRIzLwF$F70l30{*>HLE%=%;rpUZ28J1k8WGMl%j`7j-R~UDGh18*NI8U$sXu&9tSb$}j24n(u!Pj}?ex?|3qL z5BDc7zg;{$DOk93z7}U!u^swiIQlAlUWt8|>@#UZ(#??vhnGn-9eTl!Y|zs&MJezt zgV}&5p)HtS`{v{2{H|lf?zWsQLo4J2R;_~8gzT53o0&d08<_>UCBazom_66g2h3eB z^vaAD-zqR<&@31Z))BM}^Umzvhj0v&Ni%jal&)erB7C-Oq3FV@o0~X@I30qO7MjU5 zor4P#k<*nN7IFbI?!BZz*Qr0q&O(E={R8bbxxu%t>Ecg9ZpsWvG^)0co|y@M+N~eo zf9uc+Rt@$3+kb)f_r!Ewg5jRPB|4^KyJOyp6fHwf<-o;;K95`PXjw*~Aj{R1F(Y*F zH`!lY4lhVAg=Uqefiq7Tu6H(kdV(K^;ySD+JJV$s)u*y^*H}XBR39|fVg!S@kQ|2S z#`@TCadU>byZ4DH+WQFwNB!vnBsM+2YfqK-7~&jA@By5mBS-y-Vra?@Aad37|6y~6g2bQEjC?Q1;*|dlvW$A&+5LNcYH%-QnT?d0&2?75fRe>pPp| zk|7sEj;OB01?VRyaG@Sl7Q;ka{t4NXwQ_Sae<>|Xp$6^-m9oO~N-iW4_Q&J-VVJCk zqs2gU>K;jPRAfxvXo6tYCR{x`Gx`!VF0iK`g{Tipq^tbUJW`=ia1C5_&jK-(veh+X zaCL)KKXE*-3rR+W0z6hDQi*J=v!`Y4po#iX6@$40)z)`(o19h5Z;to(f5NJ1x$X1= zKWtGG1qId27NWG6z~C!9J4Fo3xm)b1%W#Br{(b3 z&q$)5(mqNSXKmaZ4Kp($oJ^P_JdB!^t4qFZqf}Y`d%BDFTNmAbU{#;^=V*cYd62ea z`cQ7-SPr0dik>+W1`L7OxHJ@dA~n~OD6;0aszsAiV))d#K~eKFgGSD+FFNdqN^vJ6 zw5x9CXFk;&JBDLVvLU~%$ePfXE&q2Dr`KTZZc^auW=?9ZV%y)vQbyrUn$^-;*vM9B zIH~j2Wju)a_ipLj)pAae-niHvCkF-%M1{A1dUSZVr)XuS#e^Za9iQX*I=MYElf@dq z8SkVlsb|zCx7oOlTO()Sy9B2BNy1G03g}?L7PA zx2m%pwsv*X^C|FOnQ&40PMU6#(RTgMqDr^&MGO3V8u!Y(UN?=bhBm$Ke^-19_n=wa z3-#hv3@jS{^NtiTf}=}{Sx~YZ%&NC(E#r}~aMP&D9AGn}ABx>iC<1JV{EhH3IewMa z7`f1;C7%X<-F@$lMR;@h>EQlZTrV<-yhY;R+}c;9lmc+@LgR8428=H2Gh)IO~I)?&Eo0n-T}d&I2|KY)3#fghYNm}Xu0Ob=jB z-+#bTwO8mo+vuwIJ0_1E2t0e*3c1|ej_-H~GHb1HVQ{ptkj@ZVE8*oMR*DF&?5(x9 z)e$4CP;Hqy%!qOHq$l;4=xcdZ2Esf}TD!yRfIT%wx}2B@TWN9z2vg3MBBe$>1lwUj z-=UKxZ`3_=>Sy&b*ECj}vh-Il?mAvGFK7Jm0w{bvO?!JBrc(Wq{5L;=oRfZAXO*;s zCH>R3282@mfQA7jHt<`qY)s&a1%>tgMU_!>tmHDm0P6|ts4ML4zCobH6ij6f)w46+ zeBt=81%TwUx!60w*Pf z7wPJ1wcBoEt+%_x%GNK|Dp#8t*|pNkt0h;zMage7uHgdSvEsr-paOee?ALkpjA*^k z60S(CW%s4TP_$5F2j$hPJ_L#(-a+zFX-XSLL)zbAIznv?hN^}tS$<>fw>Q9g3r0d` z2IPKI(BI3Ap%MT2!8MwC?~i`uHzJe_!a#nRHPk5olgN~=ATbdmZ8>JK9rD9d-Yw>? zo4}D9k8wpI6$yerRPZcr*M}srGM;aoh#)QFuW~a|I+~?QV1yUHJqdZkdDP+MbjGA} z(%nm{du_-Vwc_NLP*f5KAGvK#O`&3*>XBo>dNqFZJf+U5IC|7~a6X@$ydE4J9Bymr zeH>4WF1q~|>_(iP30+0HiZMy6`Uh&V=A1PN>Tdhn?6W(=1bBXHGl_I>H=5R`yco|^g+)m4 znqd5451`mMZtg~T?BpRTgM%VrTQiHt?ZeKz<2gq|X7YavLQqV&Kv{2F>F@CZ1tBPi zE=e{7oi{$Xiz7g~iZoohvQiV-QW%umzgx zdFtf|2)#puY;EY=fyvfAf3_;I+Bt6M(C!|Z%Ba(U2C1h9Cys5BmxRLMp1JvHiN6hd z2*aObo29IgMM0AtbJaNia{Xx4kZ@SJD*@ALhc_HhtFcS1Ud*SQdp!;;l zQ>cLKw*zJ`Q{YNum7gL>^{g1Td0E#S4gT$QdOS#)edbNRJ@Vky)l@JZ(E7z3w0a3A z3;COdai7GN2b8;R7eqmqRKGUgROoafs(-L;fQ~n{_zyzKzE8+PSJB7U2m_b7xf8aj z1NxeD^Wh{h-equ%62Q<$YtsQA*vk=32{p1yM_MPJp$ z#1uB3V{SRUE%!w<8glG(rrHTpxUUHVE)%lk*6_Gr+8@ZuC8Go@5 zS@0EWR0WI!|M7D4XR%OvPV6+k8D-i^VO{S0fzTbn8A2mu{ z|1QQzH>{1sh!Ul|DIw>hJ{R1``vOeS&)p_S_+Z+s^{yTY31caQ_Jw$Q6he z#MVfQNyquy`#0hTq~JT~<$pIqSwaBiBLGgCktXuWi4&;SDoYX`?6fFfcOa*08g3>j zatByh2`G#a8?ZKZ&%q*T1#=DN3#W}-g(NvR@P90N==TYS1~C3ypm4wgHw&A@6Riiv z%q;S|F_cmmw*6vhCqXsZg6r4lWp#3({@!z?fCR(Go#L94;r0CtA)>9Zf&X1Vm*oi0ff;GCG!2E}iXKjz5QzEJh*WfcOY*Mo$t#{j12= zZaC>Q38;z3pDf>SwQ0@z++Q5zsZm+t zxh9TT(tJ4Qm6|o`UCGyR_VlEeESWVE;IoY5JH#B~T1*C^g0tL zd#pmC3jJMPzhDfGtC^ynH}CHrplJaNftn@M6qc~~5V@w)Sl`&!rd%49K&>cv)<+(g3N3=b+FkTo30;>lJM_^Pob63B9+G%_ zG%)fbd!{c&Wx|MBV>SaA(|Xxryy)2doLm#fVyM1*82umCJx<*fKUx0Z+5*Y|Jk#{^ zxJjO^MQi)=?<}2xTc|%!)(4}f+RE19BU{*o+oReYj7Jjfj#U{7chkPusaBMtGs$iz z-ehS%N5#JD8E>M8*Pq<}Tk=XWdn?!5%^J{lTGbX4nr?Kx<#NOSQp&tHE{0z%M@vBGzH2fti zE$D(nKuoXAL1_thUWbO5lH#4)M@H!y0d+6Ymb@fSA8_$8 zX`WIOXE5;51kQAJgINgeYV`QEIpwYv?G}#VGqFgDa4>AtE{j-ceC9NF!?IflvH?n2 zQvv+O^Z;m60Zd!lquEs2TYly9P+;9E#d9JCs%t^O55fuB^sF2ni(i7!=~a1u@daAHv03N1`FGH}!)pU5!FFN)j1M$vE&}vZs9zPo`fC zrp6qxOpA5FPd&MrqH#qR?n%RwxbmwZ=;cDv6!OJS^EXE%rk0O@$pofJ%VA}>f8rvH z^_#;4mC;N0Unm*$zM=+Xf_YfyGiAy<^BV>~b1fW+X)c`hYP&-EG3z5iL<|;?#onTX zsXw>rRtvRqxH*0Lp}`WhVk5?+120<~oRTn&pClP&JW66(HR6Y(9P-4;Y2_JFwF
3E7B|d3U@gL^J0gV^oW9zOhLhet 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 literal 0 HcmV?d00001 diff --git a/fuware-fe/src/components/Header.jsx b/fuware-fe/src/components/Header.jsx index d2c8250..9b11a6b 100644 --- a/fuware-fe/src/components/Header.jsx +++ b/fuware-fe/src/components/Header.jsx @@ -67,7 +67,7 @@ export default function Header() { colorScheme="info" onClick={logOut} > - {language.logout} + {language.ui.logout} diff --git a/fuware-fe/src/components/Navbar/Navbar.jsx b/fuware-fe/src/components/Navbar/Navbar.jsx index 7c724bf..652bc69 100644 --- a/fuware-fe/src/components/Navbar/Navbar.jsx +++ b/fuware-fe/src/components/Navbar/Navbar.jsx @@ -12,7 +12,7 @@ const NAVBAR_ITEM = [ { path: '/dashboard', icon: IconDashboard, - text: language?.dashboard, + text: language?.ui.dashboard, }, ] diff --git a/fuware-fe/src/lang/vi.json b/fuware-fe/src/lang/vi.json index 67bd3a9..d9ea066 100644 --- a/fuware-fe/src/lang/vi.json +++ b/fuware-fe/src/lang/vi.json @@ -1,10 +1,14 @@ { - "login": "Đăng Nhập", - "logout": "Đăng xuất", - "dashboard": "Bảng điều khiển", - "champion": "Tướng", - "skin": "Trang phục", - "list": "Danh sách", - "favourite": "Yêu thích", - "bought": "Đã Mua" + "ui": { + "username": "Tên người dùng", + "password": "Mật khẩu", + "login": "Đăng Nhập", + "logout": "Đăng xuất", + "dashboard": "Bảng điều khiển" + }, + "message": { + "CREATED_USER": "Username already registered!", + "LOGIN_WRONG": "Your username or password input is wrong!", + "USER_LOCK": "Your Account was locked" + } } diff --git a/fuware-fe/src/pages/Login.jsx b/fuware-fe/src/pages/Login.jsx index 4db7da4..e22b321 100644 --- a/fuware-fe/src/pages/Login.jsx +++ b/fuware-fe/src/pages/Login.jsx @@ -23,12 +23,22 @@ const LoginPage = styled('div')` width: 100%; height: 100svh; display: flex; + padding-left: 15px; + padding-right: 15px; place-items: center; .login-wrap { - width: 500px; + width: 40%; + max-width: 500px; + min-width: 320px; margin: 0 auto; + .logo { + width: 40%; + max-width: 150px; + min-width: 100px; + } + .login-box { box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.25); border-radius: 5px; @@ -87,14 +97,21 @@ export default function Login() {